Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/entities/enum/error-codes.enum.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,5 @@ export enum ErrorCodes {
CouldntGetApplications = "MESSAGE.COULD-NOT-GET-CS-APPLICATIONS",
DifferentServiceProfile = "MESSAGE.DIFFERENT-CREATION-SERVICE-PROFILE",
OrganizationCannotBeDeletedHasGateways = "MESSAGE.ORGANIZATION-GATEWAYS-EXISTS",
DirtyPermissionDelete = "PERMISSION.ERRORS.DIRTY-DELETE",
}
208 changes: 106 additions & 102 deletions src/services/user-management/permission.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import { PermissionMinimalDto } from "@dto/permission-minimal.dto";
import { UserPermissions } from "@dto/permission-organization-application.dto";
import { CreatePermissionDto } from "@dto/user-management/create-permission.dto";
import { UpdatePermissionDto } from "@dto/user-management/update-permission.dto";
import { Application } from "@entities/application.entity";
import { ActionType } from "@entities/audit-log-entry";
import { Organization } from "@entities/organization.entity";
import { PermissionTypeEntity } from "@entities/permissions/permission-type.entity";
Expand All @@ -16,15 +15,15 @@ import { User } from "@entities/user.entity";
import { PermissionType } from "@enum/permission-type.enum";
import { PermissionCreator } from "@helpers/permission.helper";
import { isOrganizationApplicationPermission } from "@helpers/security-helper";
import { nameof } from "@helpers/type-helper";
import { forwardRef, Inject, Injectable } from "@nestjs/common";
import { BadRequestException, forwardRef, Inject, Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { AuditLog } from "@services/audit-log.service";
import { ApplicationService } from "@services/device-management/application.service";
import { OrganizationService } from "@services/user-management/organization.service";
import * as _ from "lodash";
import { In, Repository, SelectQueryBuilder } from "typeorm";
import { UserService } from "./user.service";
import { ErrorCodes } from "@enum/error-codes.enum";

@Injectable()
export class PermissionService {
Expand Down Expand Up @@ -55,53 +54,6 @@ export class PermissionService {
return res;
}

private instantiateDefaultPermissions(org: Organization, userId: number) {
const nameSuffixSeparator = " - ";
const allAdminSuffix = `${nameSuffixSeparator}${Translations.OrganizationAdmin}`;
const organizationApplicationAdminSuffix = `${nameSuffixSeparator}${Translations.ApplicationAdmin}`;
const readSuffix = `${nameSuffixSeparator}${Translations.ReadLevel}`;

const readPermission = PermissionCreator.createRead(org.name + readSuffix, org, true);
const orgApplicationAdminPermission = PermissionCreator.createApplicationAdmin(
org.name + organizationApplicationAdminSuffix,
org,
true
);
orgApplicationAdminPermission.type.push({
type: PermissionType.Read,
} as PermissionTypeEntity);

const orgAllAdminPermission = PermissionCreator.createUserAdmin(org.name + allAdminSuffix, org);
orgAllAdminPermission.type.push({
type: PermissionType.OrganizationApplicationAdmin,
} as PermissionTypeEntity);
orgAllAdminPermission.type.push({
type: PermissionType.OrganizationGatewayAdmin,
} as PermissionTypeEntity);
orgAllAdminPermission.type.push({
type: PermissionType.Read,
} as PermissionTypeEntity);

this.setUserIdOnPermissions(readPermission, userId);
this.setUserIdOnPermissions(orgApplicationAdminPermission, userId);
this.setUserIdOnPermissions(orgAllAdminPermission, userId);

readPermission.createdBy = userId;
readPermission.updatedBy = userId;
orgApplicationAdminPermission.createdBy = userId;
orgApplicationAdminPermission.updatedBy = userId;
orgAllAdminPermission.createdBy = userId;
orgAllAdminPermission.updatedBy = userId;
return { readPermission, orgApplicationAdminPermission, orgAllAdminPermission };
}

private setUserIdOnPermissions(permission: Permission, userId: number) {
permission.type.forEach(type => {
type.createdBy = userId;
type.updatedBy = userId;
});
}

async findOrCreateGlobalAdminPermission(): Promise<Permission> {
// Use query builder since the other syntax doesn't support one-to-many for property querying
const globalAdmin = await this.permissionRepository
Expand Down Expand Up @@ -145,6 +97,7 @@ export class PermissionService {
x.permissions = _.union(x.permissions, [permission]);
});
}

async removeUserFromPermission(permission: Permission, user: User): Promise<void> {
user.permissions = user.permissions.filter(x => x.id != permission.id);
}
Expand Down Expand Up @@ -183,20 +136,13 @@ export class PermissionService {
return savedPermission;
}

private async mapToPermission(permission: Permission, dto: UpdatePermissionDto): Promise<void> {
if (isOrganizationApplicationPermission(permission)) {
permission.applications = await this.applicationService.findManyByIds(dto.applicationIds);

permission.automaticallyAddNewApplications = dto.automaticallyAddNewApplications;
}
if (dto?.userIds?.length >= 0) {
permission.users = await this.userService.findManyUsersByIds(dto.userIds);
}
}

async deletePermission(id: number): Promise<DeleteResponseDto> {
const res = await this.permissionRepository.delete(id);
return new DeleteResponseDto(res.affected);
try {
const res = await this.permissionRepository.delete(id);
return new DeleteResponseDto(res.affected);
} catch (e) {
throw new BadRequestException(ErrorCodes.DirtyPermissionDelete);
}
}

async getAllPermissions(query?: ListAllPermissionsDto, orgs?: number[]): Promise<ListAllPermissionsResponseDto> {
Expand Down Expand Up @@ -261,27 +207,6 @@ export class PermissionService {
};
}

private getSorting(query: ListAllPermissionsDto | undefined) {
let orderBy = `permission.id`;
if (
query &&
query?.orderOn !== null &&
(query.orderOn === "id" ||
query.orderOn === "name" ||
query.orderOn === "type" ||
query.orderOn === "organisations")
) {
if (query.orderOn === "organisations") {
orderBy = "org.name";
} else if (query.orderOn === "type") {
orderBy = `permission_type.${query.orderOn}`;
} else {
orderBy = `permission.${query.orderOn}`;
}
}
return orderBy;
}

async getAllPermissionsInOrganizations(
orgs: number[],
query?: ListAllEntitiesDto
Expand Down Expand Up @@ -396,6 +321,103 @@ export class PermissionService {
return this.createUserPermissionsFromPermissions(permissions);
}

async findManyByIds(ids: number[]): Promise<Permission[]> {
if (ids == null || ids?.length == 0) {
return [];
}
return await this.permissionRepository.findBy({ id: In(ids) });
}

async findManyByIdsIncludeOrgs(ids: number[]): Promise<Permission[]> {
if (!ids || ids.length === 0) {
return [];
}

return await this.permissionRepository.find({
where: { id: In(ids) },
relations: ["organization"],
});
}

private instantiateDefaultPermissions(org: Organization, userId: number) {
const nameSuffixSeparator = " - ";
const allAdminSuffix = `${nameSuffixSeparator}${Translations.OrganizationAdmin}`;
const organizationApplicationAdminSuffix = `${nameSuffixSeparator}${Translations.ApplicationAdmin}`;
const readSuffix = `${nameSuffixSeparator}${Translations.ReadLevel}`;

const readPermission = PermissionCreator.createRead(org.name + readSuffix, org, true);
const orgApplicationAdminPermission = PermissionCreator.createApplicationAdmin(
org.name + organizationApplicationAdminSuffix,
org,
true
);
orgApplicationAdminPermission.type.push({
type: PermissionType.Read,
} as PermissionTypeEntity);

const orgAllAdminPermission = PermissionCreator.createUserAdmin(org.name + allAdminSuffix, org);
orgAllAdminPermission.type.push({
type: PermissionType.OrganizationApplicationAdmin,
} as PermissionTypeEntity);
orgAllAdminPermission.type.push({
type: PermissionType.OrganizationGatewayAdmin,
} as PermissionTypeEntity);
orgAllAdminPermission.type.push({
type: PermissionType.Read,
} as PermissionTypeEntity);

this.setUserIdOnPermissions(readPermission, userId);
this.setUserIdOnPermissions(orgApplicationAdminPermission, userId);
this.setUserIdOnPermissions(orgAllAdminPermission, userId);

readPermission.createdBy = userId;
readPermission.updatedBy = userId;
orgApplicationAdminPermission.createdBy = userId;
orgApplicationAdminPermission.updatedBy = userId;
orgAllAdminPermission.createdBy = userId;
orgAllAdminPermission.updatedBy = userId;
return { readPermission, orgApplicationAdminPermission, orgAllAdminPermission };
}

private setUserIdOnPermissions(permission: Permission, userId: number) {
permission.type.forEach(type => {
type.createdBy = userId;
type.updatedBy = userId;
});
}

private async mapToPermission(permission: Permission, dto: UpdatePermissionDto): Promise<void> {
if (isOrganizationApplicationPermission(permission)) {
permission.applications = await this.applicationService.findManyByIds(dto.applicationIds);

permission.automaticallyAddNewApplications = dto.automaticallyAddNewApplications;
}
if (dto?.userIds?.length >= 0) {
permission.users = await this.userService.findManyUsersByIds(dto.userIds);
}
}

private getSorting(query: ListAllPermissionsDto | undefined) {
let orderBy = `permission.id`;
if (
query &&
query?.orderOn !== null &&
(query.orderOn === "id" ||
query.orderOn === "name" ||
query.orderOn === "type" ||
query.orderOn === "organisations")
) {
if (query.orderOn === "organisations") {
orderBy = "org.name";
} else if (query.orderOn === "type") {
orderBy = `permission_type.${query.orderOn}`;
} else {
orderBy = `permission.${query.orderOn}`;
}
}
return orderBy;
}

private createUserPermissionsFromPermissions(permissions: PermissionMinimalDto[]): UserPermissions {
const res = new UserPermissions();

Expand All @@ -418,24 +440,6 @@ export class PermissionService {
return res;
}

async findManyByIds(ids: number[]): Promise<Permission[]> {
if (ids == null || ids?.length == 0) {
return [];
}
return await this.permissionRepository.findBy({ id: In(ids) });
}

async findManyByIdsIncludeOrgs(ids: number[]): Promise<Permission[]> {
if (!ids || ids.length === 0) {
return [];
}

return await this.permissionRepository.find({
where: { id: In(ids) },
relations: ["organization"],
});
}

private hasAccessToAllApplicationsInOrganization(permissions: PermissionMinimalDto[]) {
return permissions.some(x => x.permission_type_type == PermissionType.OrganizationUserAdmin);
}
Expand Down