import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; import { Deeds, Prisma } from "@prisma/client"; import { Deed } from "le-coffre-resources/dist/Notary"; @Service() export default class DeedsRepository extends BaseRepository { constructor(private database: Database) { super(); } protected get model() { return this.database.getClient().deeds; } protected get instanceDb() { return this.database.getClient(); } /** * @description : Find many users */ public async findMany(query: any): Promise { query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); return this.model.findMany(query); } /** * @description : Create a deed based on a deed type */ public async create(deed: Deed): Promise { const createArgs: Prisma.DeedsCreateArgs = { data: { deed_type: { connect: { uuid: deed.deed_type.uid, }, }, }, }; const deedTypeWithDocumentTypes = await this.instanceDb.deedTypes.findUniqueOrThrow({ where: { uuid: deed.deed_type.uid, }, include: { deed_type_has_document_types: true }, }); if (deedTypeWithDocumentTypes.archived_at) throw new Error("deed type is archived"); if (deedTypeWithDocumentTypes.deed_type_has_document_types) { createArgs.data.deed_has_document_types = { createMany: { data: deedTypeWithDocumentTypes.deed_type_has_document_types.map((relation) => ({ document_type_uuid: relation.document_type_uuid, })), skipDuplicates: true, }, }; } return this.model.create(createArgs); } /** * @description : Update data of a deed type */ public async update(uid: string, deed: Deed): Promise { const updateArgs: Prisma.DeedsUpdateArgs = { where: { uuid: uid, }, data: {}, include: { deed_has_document_types: true, }, }; if (deed.deed_has_document_types) { updateArgs.data.deed_has_document_types = { deleteMany: { deed_uuid: uid }, createMany: { data: deed.deed_has_document_types.map((relation) => ({ document_type_uuid: relation.document_type.uid!, })), skipDuplicates: true, }, }; } return this.model.update(updateArgs); } /** * @description : Find unique deed */ public async findOneByUid(uid: string): Promise { const deedTypeEntity = await this.model.findUnique({ where: { uuid: uid, }, }); if (!deedTypeEntity) { throw new Error("deed not found"); } return deedTypeEntity; } }