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: Prisma.DeedsFindManyArgs) { 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: { uid: deed.deed_type!.uid, }, }, }, }; const deedTypeWithDocumentTypes = await this.instanceDb.deedTypes.findUniqueOrThrow({ where: { uid: deed.deed_type!.uid, }, include: { document_types: true }, }); if (deedTypeWithDocumentTypes.archived_at) throw new Error("deed type is archived"); if (deedTypeWithDocumentTypes.document_types) { createArgs.data.document_types = { connect: deedTypeWithDocumentTypes.document_types.map((documentType) => ({ uid: documentType.uid, })), }; } return this.model.create({ ...createArgs, include: { document_types: true } }); } /** * @description : Update data of a deed type */ public async update(uid: string, deed: Deed): Promise { const updateArgs: Prisma.DeedsUpdateArgs = { where: { uid: uid, }, data: { document_types: { set: deed.document_types?.map((documentType) => ({ uid: documentType.uid!, })), }, }, include: { document_types: true, }, }; return this.model.update({ ...updateArgs, include: { document_types: true } }); } /** * @description : Find unique deed */ public async findOneByUid(uid: string, query?: Prisma.DeedsInclude): Promise { return this.model.findUnique({ where: { uid: uid, }, include: query, }); } /** * @description : Find unique deed */ public async findOneByUidWithOffice(uid: string) { return this.model.findUnique({ where: { uid: uid, }, include: { deed_type: { include: { office: true } }, document_types: { include: { office: true } }, }, }); } }