import { AbstractRepository, EntityManager, EntityRepository, getManager, In, Transaction, TransactionManager, } from 'typeorm'; import { AggregateProductVariant, AggregateProductVariantSavesList, User, } from '@/entities'; import { checkEditListPermission } from './utils'; /** * Repository for the AggregateProductVariantSavesList entity. */ @EntityRepository(AggregateProductVariantSavesList) // eslint-disable-next-line max-len export default class AggregateProductVariantSavesListRepository extends AbstractRepository { @Transaction() async create( { variantIds, collaboratorIds, }: { variantIds?: string[]; collaboratorIds?: string[] }, user: User, @TransactionManager() manager: EntityManager = getManager() ): Promise { const list = manager.create(AggregateProductVariantSavesList, { createdBy: user, }); return this.updateListFieldsAndSave( list, { variantIds, collaboratorIds }, user, manager ); } @Transaction() async update( { id, variantIds, collaboratorIds, }: { id: string; variantIds?: string[]; collaboratorIds?: string[]; }, user: User, @TransactionManager() manager: EntityManager = getManager() ): Promise { const list = await manager.findOneOrFail( AggregateProductVariantSavesList, id, { relations: ['collaborators', 'createdBy'] } ); return this.updateListFieldsAndSave( list, { variantIds, collaboratorIds }, user, manager ); } @Transaction() async updateListFieldsAndSave( list: AggregateProductVariantSavesList, { variantIds, collaboratorIds, }: { variantIds?: string[]; collaboratorIds?: string[] }, authenticatedUser: User, @TransactionManager() manager: EntityManager = getManager() ): Promise { // we need to manually load collaborators instead of left joining at the top due to https://github.com/typeorm/typeorm/issues/2661#issuecomment-683340138 const collaborators = await manager .createQueryBuilder(User, 'User') .leftJoin('User.savesLists', 'savesList') .where('savesList.id = :id', { id: list.id }) .getMany(); await checkEditListPermission({ list, user: authenticatedUser, collaborators, }); if (variantIds) { list.variants = await manager.find(AggregateProductVariant, { where: [ { id: In(variantIds), }, ], }); } // only owners can edit collaborators if (list.createdById === authenticatedUser.id && collaboratorIds) { list.collaborators = await manager.findByIds(User, collaboratorIds); } return manager.save(list); } }