diff --git a/src/app-storage/app-storage.service.ts b/src/app-storage/app-storage.service.ts index 0033827..4de9203 100644 --- a/src/app-storage/app-storage.service.ts +++ b/src/app-storage/app-storage.service.ts @@ -114,7 +114,13 @@ export class AppStorageService { set.storages = [...(set.storages || []), storage]; - return this.formatStorageSetNoItems(set); + // Remove circular set reference + const respondWith = { + ...set, + storages: set.storages.map((storage) => omit(storage, ['set'])), + }; + + return this.formatStorageSetNoItems(respondWith); } async removeFromSet(set: StorageSet, storage: Storage) { @@ -421,7 +427,7 @@ export class AppStorageService { ...omit(storage, ['room', 'set']), items: !!storage.items?.length ? storage.items.map((item) => this.formatStoredItem(item)) - : null, + : [], addedBy: storage.addedBy && this.formatActor(storage.addedBy), }; } diff --git a/src/objects/building/building.module.ts b/src/objects/building/building.module.ts index fb29785..5816a51 100644 --- a/src/objects/building/building.module.ts +++ b/src/objects/building/building.module.ts @@ -5,9 +5,18 @@ import { Building } from './entities/building.entity'; import { BuildingService } from './building.service'; import { Floor } from './entities/floor.entity'; import { Room } from './entities/room.entity'; +import { UserBuildingAccessControl } from './entities/acl.entity'; @Module({ - imports: [GroupModule, TypeOrmModule.forFeature([Building, Floor, Room])], + imports: [ + GroupModule, + TypeOrmModule.forFeature([ + Building, + Floor, + Room, + UserBuildingAccessControl, + ]), + ], providers: [BuildingService], exports: [TypeOrmModule, BuildingService], }) diff --git a/src/objects/building/building.service.ts b/src/objects/building/building.service.ts index 67c6df0..2192f02 100644 --- a/src/objects/building/building.service.ts +++ b/src/objects/building/building.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { GroupService } from '../group/group.service'; +import { UserBuildingAccessControl } from './entities/acl.entity'; import { Building } from './entities/building.entity'; import { Floor } from './entities/floor.entity'; import { Room } from './entities/room.entity'; @@ -15,6 +16,8 @@ export class BuildingService { private readonly floorRepository: Repository, @InjectRepository(Room) private readonly roomRepository: Repository, + @InjectRepository(UserBuildingAccessControl) + private readonly aclRepository: Repository, private readonly groupService: GroupService, ) {} diff --git a/src/objects/building/entities/acl.entity.ts b/src/objects/building/entities/acl.entity.ts new file mode 100644 index 0000000..ec253b9 --- /dev/null +++ b/src/objects/building/entities/acl.entity.ts @@ -0,0 +1,37 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { User } from 'src/objects/user/user.entity'; +import { Building } from 'src/objects/building/entities/building.entity'; +import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'; +import { Group } from 'src/objects/group/group.entity'; +import { Access } from 'src/objects/enums/access-control.enum'; + +@Entity() +export class UserBuildingAccessControl { + @PrimaryGeneratedColumn() + id: number; + + @ApiProperty({ type: () => User }) + @ManyToOne(() => User, { + onDelete: 'CASCADE', + onUpdate: 'CASCADE', + }) + user: User; + + @ApiProperty({ type: () => Building }) + @ManyToOne(() => Building, { + onDelete: 'CASCADE', + onUpdate: 'CASCADE', + }) + building: Building; + + @ApiProperty({ type: () => Group }) + @ManyToOne(() => Group, { + onDelete: 'CASCADE', + onUpdate: 'CASCADE', + }) + group: Group; + + @ApiProperty({ enum: Access }) + @Column({ type: String }) + access: Access; +} diff --git a/src/objects/enums/access-control.enum.ts b/src/objects/enums/access-control.enum.ts new file mode 100644 index 0000000..e648ec3 --- /dev/null +++ b/src/objects/enums/access-control.enum.ts @@ -0,0 +1,8 @@ +export enum Access { + ADMIN = 'ADMIN', + EDIT_FLOOR_PLAN = 'EDIT_FLOOR_PLAN', + MANAGE_STORAGE = 'MANAGE_STORAGE', + MANAGE_ACCESS = 'MANAGE_ACCESS', + MANAGE_FINANCE = 'MANAGE_FINANCE', + TODOLIST = 'TODOLIST', +}