import { Documents, Prisma } from "@prisma/client"; import { Document } from "le-coffre-resources/dist/Admin"; import DocumentsRepository from "@Repositories/DocumentsRepository"; import BaseService from "@Services/BaseService"; import { Service } from "typedi"; import FilesRepository from "@Repositories/FilesRepository"; @Service() export default class DocumentsService extends BaseService { constructor(private documentsRepository: DocumentsRepository, private filesRepository: FilesRepository) { super(); } /** * @description : Get all documents * @throws {Error} If documents cannot be get */ public async get(query: Prisma.DocumentsFindManyArgs) { return this.documentsRepository.findMany(query); } /** * @description : Create a new document * @throws {Error} If document cannot be created */ public async create(document: Document): Promise { return this.documentsRepository.create(document); } /** * @description : Create new documents * @throws {Error} If documents or one of them cannot be created */ public async createMany(documents: Document[]): Promise { return this.documentsRepository.createMany(documents); } /** * @description : Modify a document * @throws {Error} If document cannot be modified */ public async update(uid: string, document: Partial): Promise { return this.documentsRepository.update(uid, document); } public async refuse(uid: string, document: Partial, refused_reason: string): Promise { if (document.files) { for (let i = 0; i < document.files.length; i++) { await this.filesRepository.deleteKeyAndArchive(document.files[i]?.uid as string); } } return this.documentsRepository.refuse(uid, refused_reason); } /** * @description : Delete a document * @throws {Error} If document cannot be deleted */ public async delete(uid: string): Promise { const documentEntity = await this.documentsRepository.findOneByUid(uid, { files: true }); if (!documentEntity) throw new Error("document not found"); const document = Document.hydrate(documentEntity, { strategy: "excludeAll" }); const isDocumentEmpty = document.files && !document!.files.find((file) => file.archived_at === null); if (!isDocumentEmpty) { throw new Error("Can't delete a document with file"); } return this.documentsRepository.delete(uid); } /** * @description : Get a document by uid * @throws {Error} If document cannot be get by uid */ public async getByUid(uid: string, query?: Prisma.DocumentsInclude): Promise { return this.documentsRepository.findOneByUid(uid, query); } /** * @description : Get a document by uid * @throws {Error} If document cannot be get by uid */ public async getByUidWithOffice(uid: string) { return this.documentsRepository.findOneByUidWithOffice(uid); } }