import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { StackEntity } from 'src/entities/stack.entity'; import { IStackRepository } from 'src/interfaces/stack.interface'; import { Instrumentation } from 'src/utils/instrumentation'; import { In, Repository } from 'typeorm'; @Instrumentation() @Injectable() export class StackRepository implements IStackRepository { constructor(@InjectRepository(StackEntity) private repository: Repository) {} create(entity: Partial) { return this.save(entity); } async delete(id: string): Promise { await this.repository.delete(id); } update(entity: Partial) { return this.save(entity); } async getById(id: string): Promise { return this.repository.findOne({ where: { id, }, relations: { primaryAsset: true, assets: true, }, }); } async deleteAll(userId: string): Promise { // TODO add owner to stack entity const stacks = await this.repository.find({ where: { primaryAsset: { ownerId: userId } } }); const stackIds = new Set(stacks.map((stack) => stack.id)); await this.repository.delete({ id: In([...stackIds]) }); } private async save(entity: Partial) { const { id } = await this.repository.save(entity); return this.repository.findOneOrFail({ where: { id, }, relations: { primaryAsset: true, assets: true, }, }); } }