homemanager-be/src/app-storage/app-storage.service.ts

122 lines
3.6 KiB
TypeScript

import { Injectable } from '@nestjs/common';
import omit from 'lodash.omit';
import pick from 'lodash.pick';
import { BuildingService } from 'src/objects/building/building.service';
import { Room } from 'src/objects/building/entities/room.entity';
import { StorageSet } from 'src/objects/storage/entities/storage-set.entity';
import { Storage } from 'src/objects/storage/entities/storage.entity';
import { StorageService } from 'src/objects/storage/storage.service';
import { User } from 'src/objects/user/user.entity';
import {
StorageCreateRequestDto,
StorageUpdateRequestDto,
} from './dto/storage-request.dto';
import {
StorageActorResponse,
StorageResponseDto,
} from './dto/storage-response.dto';
import {
StorageSetCreateRequestDto,
StorageSetUpdateRequestDto,
} from './dto/storage-set-request.dto';
import { StorageSetResponseDto } from './dto/storage-set-response.dto';
@Injectable()
export class AppStorageService {
constructor(
private readonly buildingService: BuildingService,
private readonly storageService: StorageService,
) {}
async getStoragesInRoom(roomId: number) {
const storages = await this.storageService.getStoragesInRoom(roomId);
return storages.map((storage) => this.formatStorageNoItems(storage));
}
async getStorageSetsInRoom(roomId: number) {
const sets = await this.storageService.getStorageSetsInRoom(roomId);
return sets.map((set) => this.formatStorageSetNoItems(set));
}
async createStorage(user: User, room: Room, body: StorageCreateRequestDto) {
// TODO: validate color and location
const newStorage = await this.storageService.saveStorage({
...body,
addedBy: user,
room,
});
return this.formatStorageNoItems(newStorage);
}
async createStorageSet(
user: User,
room: Room,
body: StorageSetCreateRequestDto,
) {
// TODO: validate color and location
const newStorageSet = await this.storageService.saveStorageSet({
...body,
addedBy: user,
room,
});
return this.formatStorageSetNoItems(newStorageSet);
}
async updateStorage(storage: Storage, body: StorageUpdateRequestDto) {
Object.assign(storage, body);
await this.storageService.saveStorage(storage);
return this.formatStorageNoItems(storage);
}
async updateStorageSet(
storageSet: StorageSet,
body: StorageSetUpdateRequestDto,
) {
Object.assign(storageSet, body);
await this.storageService.saveStorageSet(storageSet);
return this.formatStorageSetNoItems(storageSet);
}
async moveStorage(set: StorageSet, storage: Storage) {
storage.set = set;
await this.storageService.saveStorage(storage);
set.storages = [...(set.storages || []), storage];
return this.formatStorageSetNoItems(set);
}
async removeFromSet(set: StorageSet, storage: Storage) {
storage.set = null;
await this.storageService.saveStorage(storage);
set.storages = (set.storages || []).filter(
(entry) => entry.id !== storage.id,
);
return this.formatStorageSetNoItems(set);
}
formatActor(input: User): StorageActorResponse {
return pick(input, ['name', 'sub', 'color']);
}
formatStorageNoItems(storage: Storage): StorageResponseDto {
return {
...omit(storage, ['room', 'set', 'items']),
addedBy: storage.addedBy && this.formatActor(storage.addedBy),
};
}
formatStorageSetNoItems(set: StorageSet): StorageSetResponseDto {
return {
...omit(set, ['room']),
addedBy: set.addedBy && this.formatActor(set.addedBy),
storages: set.storages?.length
? set.storages.map((storage) => this.formatStorageNoItems(storage))
: [],
};
}
}