140 lines
4.2 KiB
TypeScript
140 lines
4.2 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 { StorageItemRequestQueryDto } from './dto/storage-item-request.dto';
|
|
import { StorageItemSearchResponseDto } from './dto/storage-item-response.dto';
|
|
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);
|
|
}
|
|
|
|
async searchForItems(user: User, query: StorageItemRequestQueryDto) {
|
|
let responses: StorageItemSearchResponseDto[];
|
|
if (query.searchTerm) {
|
|
responses = await this.storageService.searchForItem(
|
|
query.searchTerm,
|
|
user.sub,
|
|
);
|
|
} else {
|
|
responses = await this.storageService.searchForItemByBarcode(
|
|
query.barcode,
|
|
user.sub,
|
|
);
|
|
}
|
|
return responses;
|
|
}
|
|
|
|
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))
|
|
: [],
|
|
};
|
|
}
|
|
}
|