import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; import { Documents, EDocumentStatus, Prisma } from "@prisma/client"; import { Document } from "le-coffre-resources/dist/SuperAdmin"; @Service() export default class DocumentsRepository extends BaseRepository { constructor(private database: Database) { super(); } protected get model() { return this.database.getClient().documents; } protected get instanceDb() { return this.database.getClient(); } /** * @description : Find many documents */ public async findMany(query: any): Promise { query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); return this.model.findMany(query); } /** * @description : Create a document */ public async create(document: Document): Promise { const documentCreated = await this.model.create({ data: { folder: { connect: { uuid: document.folder.uid, }, }, depositor: { connect: { uuid: document.depositor.uid, }, }, document_type: { connect: { uuid: document.document_type.uid, }, }, }, }); await this.instanceDb.documentHistory.create({ data: { document: { connect: { uuid: documentCreated.uuid, }, }, }, }); return documentCreated; } /** * @description : Create many documents linked to an office folder */ public async createMany(documents: Document[]): Promise { return this.model.createMany({ data: documents.map((document) => ({ folder_uuid: document.folder.uid!, depositor_uuid: document.depositor.uid!, document_type_uuid: document.document_type.uid!, })), skipDuplicates: true, }); } /** * @description : Update data of a document */ public async update(uid: string, document: Document, refusedReason?: string): Promise { return this.model.update({ where: { uuid: uid, }, data: { document_status: EDocumentStatus[document.document_status as keyof typeof EDocumentStatus], document_history: { create: { document_status: EDocumentStatus[document.document_status as keyof typeof EDocumentStatus], refused_reason: refusedReason, }, }, depositor: { connect: { uuid: document.depositor.uid, }, }, }, }); } /** * @description : Delete a document */ public async delete(uid: string): Promise { return this.model.delete({ where: { uuid: uid, }, }); } /** * @description : Find unique document */ public async findOneByUid(uid: string): Promise { const documentEntity = await this.model.findUnique({ where: { uuid: uid, }, }); if (!documentEntity) { throw new Error("Document not found"); } return documentEntity; } }