Skip to content

Commit 6a64d47

Browse files
added filter endpoint on application.controller
1 parent d18b189 commit 6a64d47

File tree

3 files changed

+75
-8
lines changed

3 files changed

+75
-8
lines changed

src/controllers/admin-controller/application.controller.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,22 @@ export class ApplicationController {
8787
return await this.getApplicationsForNonGlobalAdmin(req, query);
8888
}
8989

90+
@Read()
91+
@Get(":id/filter-information")
92+
@ApiProduces("application/json")
93+
@ApiOperation({ summary: "returns filter information for application" })
94+
@ApiNotFoundResponse()
95+
async findFilterInformation(
96+
@Req() req: AuthenticatedRequest,
97+
@Param("id", new ParseIntPipe()) id: number
98+
): Promise<string[]> {
99+
try {
100+
return await this.getFilterInformationInOrganization(req, id, req.user.permissions.isGlobalAdmin);
101+
} catch (err) {
102+
throw new NotFoundException(ErrorCodes.IdDoesNotExists);
103+
}
104+
}
105+
90106
@Read()
91107
@Get(":id")
92108
@ApiOperation({ summary: "Find one Application by id" })
@@ -263,4 +279,23 @@ export class ApplicationController {
263279
const allowedApplications = req.user.permissions.getAllApplicationsWithAtLeastRead();
264280
return await this.applicationService.findAndCountInList(query, allowedApplications, [query.organizationId]);
265281
}
282+
283+
private async getFilterInformationInOrganization(
284+
req: AuthenticatedRequest,
285+
organizationId: number,
286+
isGlobalAdmin: boolean
287+
) {
288+
if (isGlobalAdmin) {
289+
return await this.applicationService.findFilterInformation("admin", organizationId);
290+
}
291+
292+
const allFromOrg = req.user.permissions.getAllOrganizationsWithUserAdmin();
293+
294+
if (allFromOrg.some(x => x === organizationId)) {
295+
return await this.applicationService.findFilterInformation("admin", organizationId);
296+
}
297+
298+
const allowedApplications = req.user.permissions.getAllApplicationsWithAtLeastRead();
299+
return await this.applicationService.findFilterInformation(allowedApplications, organizationId);
300+
}
266301
}

src/entities/dto/list-all-applications.dto.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { IsSwaggerOptional } from "@helpers/optional-validator";
44
import { NullableStringToNumber, StringToNumber } from "@helpers/string-to-number-validator";
55
import { ApiProperty, OmitType } from "@nestjs/swagger";
66
import { Transform } from "class-transformer";
7-
import { IsOptional, IsNumber } from "class-validator";
7+
import { IsNumber, IsOptional, IsString } from "class-validator";
88

99
export class ListAllApplicationsDto extends OmitType(ListAllEntitiesDto, ["limit", "offset"]) {
1010
@IsSwaggerOptional({ description: "Filter to one organization" })
@@ -22,4 +22,19 @@ export class ListAllApplicationsDto extends OmitType(ListAllEntitiesDto, ["limit
2222
@IsNumber()
2323
@Transform(({ value }) => NullableStringToNumber(value))
2424
offset? = DefaultOffset;
25+
26+
@ApiProperty({ type: Number, required: false })
27+
@IsOptional()
28+
@IsString()
29+
status? = "";
30+
31+
@ApiProperty({ type: String, required: false })
32+
@IsOptional()
33+
@IsString()
34+
state? = "";
35+
36+
@ApiProperty({ type: Number, required: false })
37+
@IsOptional()
38+
@IsString()
39+
owner? = "";
2540
}

src/services/device-management/application.service.ts

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,31 @@ import { ListAllApplicationsResponseDto } from "@dto/list-all-applications-respo
33
import { ListAllApplicationsDto } from "@dto/list-all-applications.dto";
44
import { ListAllEntitiesDto } from "@dto/list-all-entities.dto";
55
import { ListAllIoTDevicesResponseDto } from "@dto/list-all-iot-devices-response.dto";
6+
import { IoTDevicesListToMapResponseDto } from "@dto/list-all-iot-devices-to-map-response.dto";
67
import { LoRaWANDeviceWithChirpstackDataDto } from "@dto/lorawan-device-with-chirpstack-data.dto";
8+
import { UpdateApplicationOrganizationDto } from "@dto/update-application-organization.dto";
79
import { UpdateApplicationDto } from "@dto/update-application.dto";
810
import { ApplicationDeviceType } from "@entities/application-device-type.entity";
911
import { Application } from "@entities/application.entity";
1012
import { ControlledProperty } from "@entities/controlled-property.entity";
1113
import { IoTDevice } from "@entities/iot-device.entity";
1214
import { LoRaWANDevice } from "@entities/lorawan-device.entity";
15+
import { Permission } from "@entities/permissions/permission.entity";
1316
import { ControlledPropertyTypes } from "@enum/controlled-property.enum";
17+
import { DataTargetType } from "@enum/data-target-type.enum";
1418
import { ApplicationDeviceTypes, ApplicationDeviceTypeUnion, IoTDeviceType } from "@enum/device-type.enum";
1519
import { ErrorCodes } from "@enum/error-codes.enum";
1620
import { findValuesInRecord } from "@helpers/record.helper";
1721
import { nameof } from "@helpers/type-helper";
1822
import { BadRequestException, ConflictException, forwardRef, Inject, Injectable } from "@nestjs/common";
1923
import { InjectRepository } from "@nestjs/typeorm";
24+
import { ApplicationChirpstackService } from "@services/chirpstack/chirpstack-application.service";
2025
import { ChirpstackDeviceService } from "@services/chirpstack/chirpstack-device.service";
26+
import { MulticastService } from "@services/chirpstack/multicast.service";
27+
import { DataTargetService } from "@services/data-targets/data-target.service";
2128
import { OrganizationService } from "@services/user-management/organization.service";
2229
import { PermissionService } from "@services/user-management/permission.service";
2330
import { DeleteResult, In, Repository } from "typeorm";
24-
import { DataTargetService } from "@services/data-targets/data-target.service";
25-
import { DataTargetType } from "@enum/data-target-type.enum";
26-
import { MulticastService } from "@services/chirpstack/multicast.service";
27-
import { ApplicationChirpstackService } from "@services/chirpstack/chirpstack-application.service";
28-
import { IoTDevicesListToMapResponseDto } from "@dto/list-all-iot-devices-to-map-response.dto";
29-
import { UpdateApplicationOrganizationDto } from "@dto/update-application-organization.dto";
30-
import { Permission } from "@entities/permissions/permission.entity";
3131

3232
@Injectable()
3333
export class ApplicationService {
@@ -172,6 +172,23 @@ export class ApplicationService {
172172
return await this.applicationRepository.findOneByOrFail({ id });
173173
}
174174

175+
async findFilterInformation(applicationIds: number[] | "admin", organizationId: number) {
176+
console.log(applicationIds);
177+
178+
const query = this.applicationRepository
179+
.createQueryBuilder("application")
180+
.leftJoinAndSelect("application.belongsTo", "organization")
181+
.where("organization.id = :organizationId", { organizationId });
182+
183+
if (applicationIds !== "admin") {
184+
query.where("application.id IN (:...applicationIds)", { applicationIds });
185+
}
186+
187+
const result = await query.getMany();
188+
189+
return [...new Set(result.map(app => app.owner))];
190+
}
191+
175192
async findOneWithOrganisation(id: number): Promise<Application> {
176193
return await this.applicationRepository.findOneOrFail({
177194
where: { id },

0 commit comments

Comments
 (0)