From 10c747e4095fc72d7180b785c9f0d102c2d1e5d1 Mon Sep 17 00:00:00 2001 From: Vincent Alamelle Date: Thu, 11 May 2023 17:19:42 +0200 Subject: [PATCH 001/134] Seeder --- src/common/databases/seeders/seeder2.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/databases/seeders/seeder2.ts b/src/common/databases/seeders/seeder2.ts index e0e6b892..65fe85b8 100644 --- a/src/common/databases/seeders/seeder2.ts +++ b/src/common/databases/seeders/seeder2.ts @@ -1493,7 +1493,7 @@ import { name: "RIB", office_uid: uidOffice1, private_description: "Ce document est confidentiel, et ne doit pas être divulgué", - public_description: "RIB.", + public_description: "Relevé d'identité bancaire ou IBAN.", created_at: new Date(), updated_at: new Date(), }, From a17ef2415bedbcf0154e2254d02d73ddd7dfff62 Mon Sep 17 00:00:00 2001 From: Vincent Alamelle Date: Thu, 11 May 2023 17:46:17 +0200 Subject: [PATCH 002/134] update seeder --- src/common/databases/seeders/seeder2.ts | 149 +++--------------------- 1 file changed, 18 insertions(+), 131 deletions(-) diff --git a/src/common/databases/seeders/seeder2.ts b/src/common/databases/seeders/seeder2.ts index 65fe85b8..192b038d 100644 --- a/src/common/databases/seeders/seeder2.ts +++ b/src/common/databases/seeders/seeder2.ts @@ -6,13 +6,10 @@ import { DeedTypeHasDocumentTypes, DeedTypes, Deeds, - DocumentHistory, DocumentTypes, Documents, - EDocumentStatus, EFolderStatus, EOfficeStatus, - Files, OfficeFolderHasCustomers, OfficeFolders, Offices, @@ -153,11 +150,6 @@ import { const uidDeedType3: string = randomString(); const uidDeedType4: string = randomString(); - const uidDocument1: string = randomString(); - const uidDocument2: string = randomString(); - const uidDocument3: string = randomString(); - const uidDocument4: string = randomString(); - const uidDocumentType1: string = randomString(); const uidDocumentType2: string = randomString(); const uidDocumentType3: string = randomString(); @@ -178,15 +170,10 @@ import { const uidDocumentType18: string = randomString(); const uidOfficeFolderHasCustomer1: string = randomString(); - const uidOfficeFolderHasCustomer2: string = randomString(); const uidOfficeFolderHasCustomer3: string = randomString(); const uidOfficeFolderHasCustomer4: string = randomString(); const uidOfficeFolderHasCustomer5: string = randomString(); - - const uidFiles1: string = randomString(); - const uidFiles2: string = randomString(); - const uidDeedHasDocumentType1: string = randomString(); const uidDeedHasDocumentType2: string = randomString(); const uidDeedHasDocumentType3: string = randomString(); @@ -254,10 +241,6 @@ import { - - const uidDocumentHistory1: string = randomString(); - const uidDocumentHistory2: string = randomString(); - const customers: Customers[] = [ { uid: uidCustomer1, @@ -1274,46 +1257,6 @@ import { ]; const documents: Documents[] = [ - { - uid: uidDocument1, - blockchain_anchor_uid: null, - depositor_uid: uidCustomer1, - document_status: EDocumentStatus.ASKED, - folder_uid: uidOfficeFolder1, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocument2, - blockchain_anchor_uid: null, - depositor_uid: uidCustomer2, - document_status: EDocumentStatus.ASKED, - folder_uid: uidOfficeFolder2, - document_type_uid: uidDocumentType2, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocument3, - blockchain_anchor_uid: null, - depositor_uid: uidCustomer3, - document_status: EDocumentStatus.ASKED, - folder_uid: uidOfficeFolder3, - document_type_uid: uidDocumentType3, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocument4, - blockchain_anchor_uid: null, - depositor_uid: uidCustomer4, - document_status: EDocumentStatus.ASKED, - folder_uid: uidOfficeFolder4, - document_type_uid: uidDocumentType4, - created_at: new Date(), - updated_at: new Date(), - }, ]; const documentTypes: DocumentTypes[] = [ @@ -1322,7 +1265,7 @@ import { archived_at: null, name: "Document d'identité", office_uid: uidOffice1, - private_description: "Ce document est confidentiel, demander un recto-verso au client", + private_description: "Document officiel d'identification utilisé par plusieurs personnes pour prouver leur identité et leur nationalité (CNI, passeport)", public_description: "Document officiel d'identification utilisé par plusieurs personnes pour prouver leur identité et leur nationalité (CNI, passeport)", created_at: new Date(), updated_at: new Date(), @@ -1332,7 +1275,7 @@ import { archived_at: null, name: "Taxe Foncière", office_uid: uidOffice1, - private_description: "Ce document est confidentiel, et ne doit pas être divulgué", + private_description: "Impôt annuel imposé sur les propriétés foncières et utilisé pour financer les services publics locaux.", public_description: "Impôt annuel imposé sur les propriétés foncières et utilisé pour financer les services publics locaux.", created_at: new Date(), updated_at: new Date(), @@ -1342,7 +1285,7 @@ import { archived_at: null, name: "Contrat Mariage", office_uid: uidOffice1, - private_description: "Ce document est confidentiel, et ne doit pas être divulgué", + private_description: "Accord légal qui établit les droits et les obligations entre deux personnes s'unissant en mariage.", public_description: "Accord légal qui établit les droits et les obligations entre deux personnes s'unissant en mariage.", created_at: new Date(), updated_at: new Date(), @@ -1352,7 +1295,7 @@ import { archived_at: null, name: "Livret de famille", office_uid: uidOffice1, - private_description: "Ce document est confidentiel, et ne doit pas être divulgué", + private_description: "Document officiel qui enregistre les détails et les événements familiaux tels que les mariages, les naissances et les décès d'un couple et de leurs enfants.", public_description: "Document officiel qui enregistre les détails et les événements familiaux tels que les mariages, les naissances et les décès d'un couple et de leurs enfants.", created_at: new Date(), updated_at: new Date(), @@ -1362,7 +1305,7 @@ import { archived_at: null, name: "Bail commercial", office_uid: uidOffice1, - private_description: "Ce document est confidentiel, et ne doit pas être divulgué", + private_description: "Contrat légal entre un propriétaire et un locataire pour la location d'un bien immobilier utilisé à des fins commerciales ou professionnelles.", public_description: "Contrat légal entre un propriétaire et un locataire pour la location d'un bien immobilier utilisé à des fins commerciales ou professionnelles.", created_at: new Date(), updated_at: new Date(), @@ -1372,7 +1315,7 @@ import { archived_at: null, name: "Statuts SCI", office_uid: uidOffice1, - private_description: "Ce document est confidentiel, et ne doit pas être divulgué", + private_description: "Document légal qui définit les règles et les dispositions régissant la Société Civile Immobilière (SCI).", public_description: "Document légal qui définit les règles et les dispositions régissant la Société Civile Immobilière (SCI).", created_at: new Date(), updated_at: new Date(), @@ -1382,7 +1325,7 @@ import { archived_at: null, name: "Avis de taxe foncière", office_uid: uidOffice1, - private_description: "Ce document est confidentiel, et ne doit pas être divulgué", + private_description: "Notification officielle indiquant le montant de l'impôt foncier dû sur une propriété.", public_description: "Notification officielle indiquant le montant de l'impôt foncier dû sur une propriété.", created_at: new Date(), updated_at: new Date(), @@ -1392,7 +1335,7 @@ import { archived_at: null, name: "Appel de charge de copropriété", office_uid: uidOffice1, - private_description: "Ce document est confidentiel, et ne doit pas être divulgué", + private_description: "Document envoyé aux copropriétaires pour les informer des dépenses et des charges communes liées à la gestion et à l'entretien de l'immeuble.", public_description: "Document envoyé aux copropriétaires pour les informer des dépenses et des charges communes liées à la gestion et à l'entretien de l'immeuble.", created_at: new Date(), updated_at: new Date(), @@ -1402,7 +1345,7 @@ import { archived_at: null, name: "PVAG", office_uid: uidOffice1, - private_description: "Ce document est confidentiel, et ne doit pas être divulgué", + private_description: "Compte rendu écrit des discussions, décisions et résolutions prises lors d'une réunion d'assemblée générale de copropriété.", public_description: "Compte rendu écrit des discussions, décisions et résolutions prises lors d'une réunion d'assemblée générale de copropriété.", created_at: new Date(), updated_at: new Date(), @@ -1412,7 +1355,7 @@ import { archived_at: null, name: "Règlement de copropriété", office_uid: uidOffice1, - private_description: "Ce document est confidentiel, et ne doit pas être divulgué", + private_description: "Document juridique qui établit les règles et les droits des copropriétaires d'un immeuble en copropriété.", public_description: "Document juridique qui établit les règles et les droits des copropriétaires d'un immeuble en copropriété.", created_at: new Date(), updated_at: new Date(), @@ -1422,7 +1365,7 @@ import { archived_at: null, name: "Titre de propriété", office_uid: uidOffice1, - private_description: "Ce document est confidentiel, et ne doit pas être divulgué", + private_description: "Document légal qui atteste de la propriété d'un bien immobilier et en identifie le propriétaire.", public_description: "Document légal qui atteste de la propriété d'un bien immobilier et en identifie le propriétaire.", created_at: new Date(), updated_at: new Date(), @@ -1432,7 +1375,7 @@ import { archived_at: null, name: "Plan et loi carrez", office_uid: uidOffice1, - private_description: "Ce document est confidentiel, et ne doit pas être divulgué", + private_description: "Document officiel qui mesure la superficie d'un lot ou d'un bien immobilier, conformément à la loi Carrez qui encadre les transactions immobilières.", public_description: "Document officiel qui mesure la superficie d'un lot ou d'un bien immobilier, conformément à la loi Carrez qui encadre les transactions immobilières.", created_at: new Date(), updated_at: new Date(), @@ -1442,7 +1385,7 @@ import { archived_at: null, name: "CNI", office_uid: uidOffice1, - private_description: "Ce document est confidentiel, et ne doit pas être divulgué", + private_description: "Document officiel d'identification délivré par l'État pour prouver l'identité et la nationalité d'une personne.", public_description: "Document officiel d'identification délivré par l'État pour prouver l'identité et la nationalité d'une personne.", created_at: new Date(), updated_at: new Date(), @@ -1452,7 +1395,7 @@ import { archived_at: null, name: "Modifications règlement copropriété (plusieurs)", office_uid: uidOffice1, - private_description: "Ce document est confidentiel, et ne doit pas être divulgué", + private_description: "Documents légaux qui apportent des changements ou des ajustements aux règles et dispositions du règlement de copropriété initial.", public_description: "Documents légaux qui apportent des changements ou des ajustements aux règles et dispositions du règlement de copropriété initial.", created_at: new Date(), updated_at: new Date(), @@ -1462,7 +1405,7 @@ import { archived_at: null, name: "Avis de décès", office_uid: uidOffice1, - private_description: "Ce document est confidentiel, et ne doit pas être divulgué", + private_description: "Notification officielle délivrée par les autorités compétentes pour informer du décès d'une personne.", public_description: "Notification officielle délivrée par les autorités compétentes pour informer du décès d'une personne.", created_at: new Date(), updated_at: new Date(), @@ -1472,7 +1415,7 @@ import { archived_at: null, name: "Lettre de mission", office_uid: uidOffice1, - private_description: "Ce document est confidentiel, et ne doit pas être divulgué", + private_description: "Document contractuel qui définit les termes et les objectifs d'une mission confiée à une personne ou à une entreprise.", public_description: "Document contractuel qui définit les termes et les objectifs d'une mission confiée à une personne ou à une entreprise.", created_at: new Date(), updated_at: new Date(), @@ -1482,7 +1425,7 @@ import { archived_at: null, name: "DPE", office_uid: uidOffice1, - private_description: "Ce document est confidentiel, et ne doit pas être divulgué", + private_description: "Diagnostic de Performance Energétique.", public_description: "Diagnostic de Performance Energétique.", created_at: new Date(), updated_at: new Date(), @@ -1492,7 +1435,7 @@ import { archived_at: null, name: "RIB", office_uid: uidOffice1, - private_description: "Ce document est confidentiel, et ne doit pas être divulgué", + private_description: "Relevé d'identité bancaire ou IBAN.", public_description: "Relevé d'identité bancaire ou IBAN.", created_at: new Date(), updated_at: new Date(), @@ -1507,13 +1450,6 @@ import { created_at: new Date(), updated_at: new Date(), }, - { - uid: uidOfficeFolderHasCustomer2, - customer_uid: uidCustomer2, - office_folder_uid: uidOfficeFolder2, - created_at: new Date(), - updated_at: new Date(), - }, { uid: uidOfficeFolderHasCustomer3, customer_uid: uidCustomer3, @@ -1538,29 +1474,6 @@ import { ]; - const files: Files[] = [ - { - uid: uidFiles1, - document_uid: uidDocument1, - file_name: "fileName1", - file_path: "https://www.google1.com", - key: '', - archived_at: null, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidFiles2, - document_uid: uidDocument2, - file_name: "fileName1", - file_path: "https://www.google2.com", - key: '', - archived_at: null, - created_at: new Date(), - updated_at: new Date(), - }, - ]; - const deedHasDocumentTypes: DeedHasDocumentTypes[] = [ { uid: uidDeedHasDocumentType1, @@ -2006,24 +1919,6 @@ import { }, ]; - const documentHistories: DocumentHistory[] = [ - { - uid: uidDocumentHistory1, - document_status: EDocumentStatus.ASKED, - document_uid: uidDocument1, - refused_reason: "", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentHistory2, - document_status: EDocumentStatus.DEPOSITED, - document_uid: uidDocument1, - refused_reason: "Le document n'est pas conforme", - created_at: new Date(), - updated_at: new Date(), - }, - ]; for (const address of addresses) { await prisma.addresses.create({ data: address }); @@ -2064,14 +1959,6 @@ import { await prisma.documents.create({ data: document }); } - for (const file of files) { - await prisma.files.create({ data: file }); - } - - for (const documentHistory of documentHistories) { - await prisma.documentHistory.create({ data: documentHistory }); - } - for (const officeFolderHasCustomer of officeFolderHasCustomers) { await prisma.officeFolderHasCustomers.create({ data: officeFolderHasCustomer }); } From 16f65aee501a8714a50c1462bab84c47bb7d371f Mon Sep 17 00:00:00 2001 From: Vincent Alamelle Date: Thu, 11 May 2023 20:41:58 +0200 Subject: [PATCH 003/134] Seeder updated --- src/common/databases/seeders/seeder2.ts | 690 ++++++++---------------- 1 file changed, 234 insertions(+), 456 deletions(-) diff --git a/src/common/databases/seeders/seeder2.ts b/src/common/databases/seeders/seeder2.ts index 192b038d..4b586c46 100644 --- a/src/common/databases/seeders/seeder2.ts +++ b/src/common/databases/seeders/seeder2.ts @@ -109,18 +109,6 @@ import { const uidOfficeFolder7: string = randomString(); const uidOfficeFolder8: string = randomString(); const uidOfficeFolder9: string = randomString(); - const uidOfficeFolder10: string = randomString(); - const uidOfficeFolder11: string = randomString(); - const uidOfficeFolder12: string = randomString(); - const uidOfficeFolder13: string = randomString(); - const uidOfficeFolder14: string = randomString(); - const uidOfficeFolder15: string = randomString(); - const uidOfficeFolder16: string = randomString(); - const uidOfficeFolder17: string = randomString(); - const uidOfficeFolder18: string = randomString(); - const uidOfficeFolder19: string = randomString(); - const uidOfficeFolder20: string = randomString(); - const uidOfficeFolder21: string = randomString(); const uidDeed1: string = randomString(); const uidDeed2: string = randomString(); @@ -172,7 +160,6 @@ import { const uidOfficeFolderHasCustomer1: string = randomString(); const uidOfficeFolderHasCustomer3: string = randomString(); const uidOfficeFolderHasCustomer4: string = randomString(); - const uidOfficeFolderHasCustomer5: string = randomString(); const uidDeedHasDocumentType1: string = randomString(); const uidDeedHasDocumentType2: string = randomString(); @@ -219,14 +206,6 @@ import { const uidDeedHasDocumentType43: string = randomString(); const uidDeedHasDocumentType44: string = randomString(); const uidDeedHasDocumentType45: string = randomString(); - const uidDeedHasDocumentType46: string = randomString(); - const uidDeedHasDocumentType47: string = randomString(); - const uidDeedHasDocumentType48: string = randomString(); - const uidDeedHasDocumentType49: string = randomString(); - const uidDeedHasDocumentType50: string = randomString(); - const uidDeedHasDocumentType51: string = randomString(); - const uidDeedHasDocumentType52: string = randomString(); - const uidDeedHasDocumentType53: string = randomString(); @@ -836,7 +815,7 @@ import { { uid: uidOfficeFolder1, folder_number: "0001", - name: "Dossier", + name: "Vente par Mme. Simon au profit de Mme. Lextrait", deed_uid: uidDeed1, status: EFolderStatus.LIVE, created_at: new Date(), @@ -848,7 +827,7 @@ import { { uid: uidOfficeFolder2, folder_number: "0002", - name: "Dossier", + name: "Donation des parts sociales de la société SARL FLORE", deed_uid: uidDeed2, status: EFolderStatus.LIVE, created_at: new Date(), @@ -860,7 +839,7 @@ import { { uid: uidOfficeFolder3, folder_number: "0003", - name: "Dossier", + name: "Vente par Mme. Lefebvre au profit de Mme. Mathieu", deed_uid: uidDeed3, status: EFolderStatus.LIVE, created_at: new Date(), @@ -872,7 +851,7 @@ import { { uid: uidOfficeFolder4, folder_number: "0004", - name: "Dossier", + name: "Vente par Mme. Chevalier au profit de M. Daveau", deed_uid: uidDeed4, status: EFolderStatus.LIVE, created_at: new Date(), @@ -884,7 +863,7 @@ import { { uid: uidOfficeFolder5, folder_number: "0005", - name: "Dossier", + name: "Vente par M. Lalo au profit de Mme. Pigale", deed_uid: uidDeed5, status: EFolderStatus.LIVE, created_at: new Date(), @@ -896,7 +875,7 @@ import { { uid: uidOfficeFolder6, folder_number: "0006", - name: "Dossier", + name: "Donation des parts sociales de la société SMART-TALENT", deed_uid: uidDeed6, status: EFolderStatus.LIVE, created_at: new Date(), @@ -908,7 +887,7 @@ import { { uid: uidOfficeFolder7, folder_number: "0007", - name: "Dossier", + name: "Vente par M. Girard au profit de M. Louis", deed_uid: uidDeed7, status: EFolderStatus.LIVE, created_at: new Date(), @@ -920,7 +899,7 @@ import { { uid: uidOfficeFolder8, folder_number: "0008", - name: "Dossier", + name: "Vente par Mme. Leclerc au profit de M. Louis", deed_uid: uidDeed8, status: EFolderStatus.LIVE, created_at: new Date(), @@ -932,7 +911,7 @@ import { { uid: uidOfficeFolder9, folder_number: "0009", - name: "Dossier", + name: "Vente par M. Lambert au profit de M. Holmes", deed_uid: uidDeed9, status: EFolderStatus.LIVE, created_at: new Date(), @@ -941,150 +920,6 @@ import { description: null, archived_description: null, }, - { - uid: uidOfficeFolder10, - folder_number: "00010", - name: "Dossier", - deed_uid: uidDeed10, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder11, - folder_number: "00011", - name: "Dossier", - deed_uid: uidDeed11, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder12, - folder_number: "00012", - name: "Dossier", - deed_uid: uidDeed12, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder13, - folder_number: "00013", - name: "Dossier", - deed_uid: uidDeed13, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder14, - folder_number: "00014", - name: "Dossier", - deed_uid: uidDeed14, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder15, - folder_number: "00015", - name: "Dossier", - deed_uid: uidDeed15, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder16, - folder_number: "00016", - name: "Dossier", - deed_uid: uidDeed16, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder17, - folder_number: "00017", - name: "Dossier", - deed_uid: uidDeed17, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder18, - folder_number: "00018", - name: "Dossier", - deed_uid: uidDeed18, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder19, - folder_number: "00019", - name: "Dossier", - deed_uid: uidDeed19, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder20, - folder_number: "00020", - name: "Dossier", - deed_uid: uidDeed20, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder21, - folder_number: "00021", - name: "Dossier", - deed_uid: uidDeed21, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, ]; const deeds: Deeds[] = [ @@ -1280,6 +1115,7 @@ import { created_at: new Date(), updated_at: new Date(), }, + { uid: uidDocumentType3, archived_at: null, @@ -1464,13 +1300,6 @@ import { created_at: new Date(), updated_at: new Date(), }, - { - uid: uidOfficeFolderHasCustomer5, - customer_uid: uidCustomer2, - office_folder_uid: uidOfficeFolder21, - created_at: new Date(), - updated_at: new Date(), - }, ]; @@ -1485,39 +1314,40 @@ import { { uid: uidDeedHasDocumentType2, deed_uid: uidDeed1, - document_type_uid: uidDocumentType2, + document_type_uid: uidDocumentType6, created_at: new Date(), updated_at: new Date(), }, { uid: uidDeedHasDocumentType3, deed_uid: uidDeed1, - document_type_uid: uidDocumentType3, + document_type_uid: uidDocumentType10, created_at: new Date(), updated_at: new Date(), }, { uid: uidDeedHasDocumentType4, deed_uid: uidDeed1, - document_type_uid: uidDocumentType4, + document_type_uid: uidDocumentType17, created_at: new Date(), updated_at: new Date(), }, { uid: uidDeedHasDocumentType5, deed_uid: uidDeed1, - document_type_uid: uidDocumentType16, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType6, - deed_uid: uidDeed1, - document_type_uid: uidDocumentType5, + document_type_uid: uidDocumentType18, created_at: new Date(), updated_at: new Date(), }, + + { + uid: uidDeedHasDocumentType6, + deed_uid: uidDeed2, + document_type_uid: uidDocumentType1, + created_at: new Date(), + updated_at: new Date(), + }, { uid: uidDeedHasDocumentType7, deed_uid: uidDeed2, @@ -1528,335 +1358,283 @@ import { { uid: uidDeedHasDocumentType8, deed_uid: uidDeed2, - document_type_uid: uidDocumentType7, + document_type_uid: uidDocumentType10, created_at: new Date(), updated_at: new Date(), }, { uid: uidDeedHasDocumentType9, deed_uid: uidDeed2, - document_type_uid: uidDocumentType8, + document_type_uid: uidDocumentType17, created_at: new Date(), updated_at: new Date(), }, { uid: uidDeedHasDocumentType10, deed_uid: uidDeed2, - document_type_uid: uidDocumentType9, + document_type_uid: uidDocumentType18, created_at: new Date(), updated_at: new Date(), }, + + { uid: uidDeedHasDocumentType11, - deed_uid: uidDeed2, - document_type_uid: uidDocumentType10, + deed_uid: uidDeed3, + document_type_uid: uidDocumentType1, created_at: new Date(), updated_at: new Date(), }, { uid: uidDeedHasDocumentType12, - deed_uid: uidDeed2, - document_type_uid: uidDocumentType11, + deed_uid: uidDeed3, + document_type_uid: uidDocumentType6, created_at: new Date(), updated_at: new Date(), }, { uid: uidDeedHasDocumentType13, - deed_uid: uidDeed2, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - - { - uid: uidDeedHasDocumentType19, - deed_uid: uidDeed3, - document_type_uid: uidDocumentType14, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType20, - deed_uid: uidDeed3, - document_type_uid: uidDocumentType15, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType21, - deed_uid: uidDeed3, - document_type_uid: uidDocumentType4, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType22, deed_uid: uidDeed3, document_type_uid: uidDocumentType10, created_at: new Date(), updated_at: new Date(), }, - { - uid: uidDeedHasDocumentType23, - deed_uid: uidDeed3, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - { uid: uidDeedHasDocumentType14, - deed_uid: uidDeed4, - document_type_uid: uidDocumentType14, + deed_uid: uidDeed3, + document_type_uid: uidDocumentType17, created_at: new Date(), updated_at: new Date(), }, { uid: uidDeedHasDocumentType15, - deed_uid: uidDeed4, - document_type_uid: uidDocumentType15, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType26, - deed_uid: uidDeed4, - document_type_uid: uidDocumentType4, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType27, - deed_uid: uidDeed4, - document_type_uid: uidDocumentType10, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType28, - deed_uid: uidDeed4, - document_type_uid: uidDocumentType1, + deed_uid: uidDeed3, + document_type_uid: uidDocumentType18, created_at: new Date(), updated_at: new Date(), }, - { - uid: uidDeedHasDocumentType29, - deed_uid: uidDeed5, - document_type_uid: uidDocumentType14, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType30, - deed_uid: uidDeed5, - document_type_uid: uidDocumentType15, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType31, - deed_uid: uidDeed5, - document_type_uid: uidDocumentType4, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType32, - deed_uid: uidDeed5, - document_type_uid: uidDocumentType10, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType33, - deed_uid: uidDeed5, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType34, - deed_uid: uidDeed6, - document_type_uid: uidDocumentType14, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType35, - deed_uid: uidDeed6, - document_type_uid: uidDocumentType15, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType36, - deed_uid: uidDeed6, - document_type_uid: uidDocumentType4, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType37, - deed_uid: uidDeed6, - document_type_uid: uidDocumentType10, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType38, - deed_uid: uidDeed6, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - - { - uid: uidDeedHasDocumentType39, - deed_uid: uidDeed7, - document_type_uid: uidDocumentType14, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType40, - deed_uid: uidDeed7, - document_type_uid: uidDocumentType15, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType41, - deed_uid: uidDeed7, - document_type_uid: uidDocumentType4, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType42, - deed_uid: uidDeed7, - document_type_uid: uidDocumentType10, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType43, - deed_uid: uidDeed7, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - - { - uid: uidDeedHasDocumentType44, - deed_uid: uidDeed8, - document_type_uid: uidDocumentType14, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType45, - deed_uid: uidDeed8, - document_type_uid: uidDocumentType15, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType46, - deed_uid: uidDeed8, - document_type_uid: uidDocumentType4, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType47, - deed_uid: uidDeed8, - document_type_uid: uidDocumentType10, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType48, - deed_uid: uidDeed8, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - - { - uid: uidDeedHasDocumentType49, - deed_uid: uidDeed9, - document_type_uid: uidDocumentType14, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType50, - deed_uid: uidDeed9, - document_type_uid: uidDocumentType15, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType51, - deed_uid: uidDeed9, - document_type_uid: uidDocumentType4, - created_at: new Date(), - updated_at: new Date(), - }, { uid: uidDeedHasDocumentType16, - deed_uid: uidDeed9, - document_type_uid: uidDocumentType10, + deed_uid: uidDeed4, + document_type_uid: uidDocumentType1, created_at: new Date(), updated_at: new Date(), }, { uid: uidDeedHasDocumentType17, - deed_uid: uidDeed9, - document_type_uid: uidDocumentType1, + deed_uid: uidDeed4, + document_type_uid: uidDocumentType6, created_at: new Date(), updated_at: new Date(), }, - { uid: uidDeedHasDocumentType18, - deed_uid: uidDeed10, - document_type_uid: uidDocumentType14, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType24, - deed_uid: uidDeed10, - document_type_uid: uidDocumentType15, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType25, - deed_uid: uidDeed10, - document_type_uid: uidDocumentType4, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType52, - deed_uid: uidDeed10, + deed_uid: uidDeed4, document_type_uid: uidDocumentType10, created_at: new Date(), updated_at: new Date(), }, { - uid: uidDeedHasDocumentType53, - deed_uid: uidDeed10, - document_type_uid: uidDocumentType1, + uid: uidDeedHasDocumentType19, + deed_uid: uidDeed4, + document_type_uid: uidDocumentType17, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType20, + deed_uid: uidDeed4, + document_type_uid: uidDocumentType18, created_at: new Date(), updated_at: new Date(), }, - + + { + uid: uidDeedHasDocumentType21, + deed_uid: uidDeed5, + document_type_uid: uidDocumentType1, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType22, + deed_uid: uidDeed5, + document_type_uid: uidDocumentType6, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType23, + deed_uid: uidDeed5, + document_type_uid: uidDocumentType10, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType24, + deed_uid: uidDeed5, + document_type_uid: uidDocumentType17, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType25, + deed_uid: uidDeed5, + document_type_uid: uidDocumentType18, + created_at: new Date(), + updated_at: new Date(), + }, + + + { + uid: uidDeedHasDocumentType26, + deed_uid: uidDeed6, + document_type_uid: uidDocumentType1, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType27, + deed_uid: uidDeed6, + document_type_uid: uidDocumentType6, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType28, + deed_uid: uidDeed6, + document_type_uid: uidDocumentType10, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType29, + deed_uid: uidDeed6, + document_type_uid: uidDocumentType17, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType30, + deed_uid: uidDeed6, + document_type_uid: uidDocumentType18, + created_at: new Date(), + updated_at: new Date(), + }, + + + { + uid: uidDeedHasDocumentType31, + deed_uid: uidDeed7, + document_type_uid: uidDocumentType1, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType32, + deed_uid: uidDeed7, + document_type_uid: uidDocumentType6, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType33, + deed_uid: uidDeed7, + document_type_uid: uidDocumentType10, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType34, + deed_uid: uidDeed7, + document_type_uid: uidDocumentType17, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType35, + deed_uid: uidDeed7, + document_type_uid: uidDocumentType18, + created_at: new Date(), + updated_at: new Date(), + }, + + + { + uid: uidDeedHasDocumentType36, + deed_uid: uidDeed8, + document_type_uid: uidDocumentType1, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType37, + deed_uid: uidDeed8, + document_type_uid: uidDocumentType6, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType38, + deed_uid: uidDeed8, + document_type_uid: uidDocumentType10, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType39, + deed_uid: uidDeed8, + document_type_uid: uidDocumentType17, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType40, + deed_uid: uidDeed8, + document_type_uid: uidDocumentType18, + created_at: new Date(), + updated_at: new Date(), + }, + + + { + uid: uidDeedHasDocumentType41, + deed_uid: uidDeed9, + document_type_uid: uidDocumentType1, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType42, + deed_uid: uidDeed9, + document_type_uid: uidDocumentType6, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType43, + deed_uid: uidDeed9, + document_type_uid: uidDocumentType10, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType44, + deed_uid: uidDeed9, + document_type_uid: uidDocumentType17, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedHasDocumentType45, + deed_uid: uidDeed9, + document_type_uid: uidDocumentType18, + created_at: new Date(), + updated_at: new Date(), + }, ]; const deedTypeHasDocumentTypes: DeedTypeHasDocumentTypes[] = [ From 6aefea27112918a398899325d989835e66a6ea5a Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Thu, 11 May 2023 22:03:53 +0200 Subject: [PATCH 004/134] refacto file upload --- src/app/api/super-admin/FilesController.ts | 59 ++++++++++++------- src/common/repositories/FilesRepository.ts | 11 +--- .../controller-pattern/BaseController.ts | 2 +- src/entries/App.ts | 7 ++- .../FilesService/FilesService.ts | 22 +++---- 5 files changed, 60 insertions(+), 41 deletions(-) diff --git a/src/app/api/super-admin/FilesController.ts b/src/app/api/super-admin/FilesController.ts index 68c2dfd1..b3be77f3 100644 --- a/src/app/api/super-admin/FilesController.ts +++ b/src/app/api/super-admin/FilesController.ts @@ -42,19 +42,28 @@ export default class FilesController extends ApiController { /** * @description Get a specific File by uid */ - @Get("/api/v1/super-admin/files/upload/:uid") - protected async getFileData(req: Request, response: Response) { + @Get("/api/v1/super-admin/files/download/:uid") + protected async download(req: Request, response: Response) { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "uid not found"); + return; + } try { - const uid = req.params["uid"]; - if (!uid) { - throw new Error("No uid provided"); + const fileInfo = await this.filesService.download(uid); + + if (!fileInfo) { + this.httpNotFoundRequest(response); + return; } - const file = await this.filesService.updload(uid); - - this.httpSuccess(response, file); + const type = fileInfo.file.file_name.split(".").pop(); + if (type?.toLowerCase() === "pdf") response.setHeader("Content-Type", "application/pdf"); + response.setHeader("Content-Disposition", `inline; filename=${encodeURIComponent(fileInfo.file.file_name)}`); + + this.httpSuccess(response, fileInfo.buffer); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -66,23 +75,22 @@ export default class FilesController extends ApiController { @Post("/api/v1/super-admin/files") protected async post(req: Request, response: Response) { try { - //get file - if(!req.file) throw new Error('No file provided') + if (!req.file) throw new Error("No file provided"); //init File resource with request body values const fileEntity = File.hydrate(JSON.parse(req.body["q"])); - + //validate File await validateOrReject(fileEntity, { groups: ["createFile"] }); //call service to get prisma entity const prismaEntityCreated = await this.filesService.create(fileEntity, req.file); - const document: Document = await this.documentService.getByUid(fileEntity.document!.uid!) + const document: Document = await this.documentService.getByUid(fileEntity.document!.uid!); document.document_status = "DEPOSITED"; await this.documentService.update(document.uid!, document); - + //Hydrate ressource with prisma entity const fileEntityCreated = File.hydrate(prismaEntityCreated, { strategy: "excludeAll", @@ -135,19 +143,24 @@ export default class FilesController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } //call service to get prisma entity - const fileEntity: Files = await this.filesService.delete(uid); + const fileEntity = await this.filesService.deleteKeyAndArchive(uid); + if (!fileEntity) { + this.httpNotFoundRequest(response, "file not found"); + return; + } //Hydrate ressource with prisma entity const file = File.hydrate(fileEntity, { strategy: "excludeAll" }); //success this.httpSuccess(response, file); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -160,18 +173,24 @@ export default class FilesController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } const fileEntity = await this.filesService.getByUid(uid); - + + if (!fileEntity) { + this.httpNotFoundRequest(response, "file not found"); + return; + } + //Hydrate ressource with prisma entity const file = File.hydrate(fileEntity, { strategy: "excludeAll" }); //success this.httpSuccess(response, file); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } diff --git a/src/common/repositories/FilesRepository.ts b/src/common/repositories/FilesRepository.ts index 34f2f89c..f3003b40 100644 --- a/src/common/repositories/FilesRepository.ts +++ b/src/common/repositories/FilesRepository.ts @@ -58,9 +58,9 @@ export default class FilesRepository extends BaseRepository { } /** - * @description : Delete a file + * @description : Delete a file key and archive */ - public async delete(uid: string): Promise { + public async deleteKeyAndArchive(uid: string): Promise { return this.model.update({ where: { uid: uid, @@ -75,17 +75,12 @@ export default class FilesRepository extends BaseRepository { /** * @description : Find unique file */ - public async findOneByUid(uid: string): Promise { + public async findOneByUid(uid: string): Promise { const fileEntity = await this.model.findUnique({ where: { uid: uid, }, }); - - if (!fileEntity) { - throw new Error("File not found"); - } - return fileEntity; } } diff --git a/src/common/system/controller-pattern/BaseController.ts b/src/common/system/controller-pattern/BaseController.ts index 3b128b1f..24906610 100644 --- a/src/common/system/controller-pattern/BaseController.ts +++ b/src/common/system/controller-pattern/BaseController.ts @@ -24,7 +24,7 @@ export default abstract class BaseController { return this.httpResponse(response, HttpCodes.NOT_FOUND, responseData); } - protected httpInternaleError(response: Response, responseData: IResponseData = "http Internal Server Error") { + protected httpInternalError(response: Response, responseData: IResponseData = "http Internal Server Error") { return this.httpResponse(response, HttpCodes.INTERNAL_ERROR, responseData); } diff --git a/src/entries/App.ts b/src/entries/App.ts index da76f6ae..d9874748 100644 --- a/src/entries/App.ts +++ b/src/entries/App.ts @@ -8,7 +8,10 @@ import bodyParser from "body-parser"; // import TezosLink from "@Common/databases/TezosLink"; import errorHandler from "@App/middlewares/ErrorHandler"; import { BackendVariables } from "@Common/config/variables/Variables"; -import fileHandler from "@App/middlewares/FileHandler"; +//import fileHandler from "@App/middlewares/FileHandler"; +import multer from "multer"; + +const storage = multer.memoryStorage(); (async () => { try { @@ -23,7 +26,7 @@ import fileHandler from "@App/middlewares/FileHandler"; label, port: parseInt(port), rootUrl, - middlwares: [cors({ origin: "*" }), fileHandler, bodyParser.urlencoded({ extended: true }), bodyParser.json()], + middlwares: [cors({ origin: "*" }), multer({storage:storage}).single('file'), bodyParser.urlencoded({ extended: true }), bodyParser.json()], errorHandler, }); diff --git a/src/services/private-services/FilesService/FilesService.ts b/src/services/private-services/FilesService/FilesService.ts index 88e5948b..6aacc1d0 100644 --- a/src/services/private-services/FilesService/FilesService.ts +++ b/src/services/private-services/FilesService/FilesService.ts @@ -39,12 +39,12 @@ export default class FilesService extends BaseService { * @description : view a file * @throws {Error} If file cannot be deleted */ - public async updload(uid: string) { + public async download(uid: string) { const file = await this.filesRepository.findOneByUid(uid); - if (!file.key) throw new Error("file deleted"); + if (!file?.key) return null; const fileResult = await fetch(file.file_path); const fileContent = await fileResult.arrayBuffer(); - return await this.cryptoService.decrypt(Buffer.from(fileContent), file.key); + return {file: file, buffer: await this.cryptoService.decrypt(Buffer.from(fileContent), file.key)}; } /** @@ -53,8 +53,9 @@ export default class FilesService extends BaseService { */ public async create(file: File, fileData: Express.Multer.File) { const key = v4(); + fileData.mimetype; + fileData.size; const encryptedFile = await this.cryptoService.encrypt(fileData.buffer, key); - //const encryptedFileName = await this.cryptoService.encrypt(Buffer.from(fileData.originalname, 'utf-8'), key); const upload = await this.ipfsService.pinFile(Readable.from(encryptedFile), fileData.originalname); file.file_name = fileData.originalname; //encryptedFileName.toString('utf-8') file.file_path = this.variables.PINATA_GATEWAY.concat(upload.IpfsHash); @@ -71,18 +72,19 @@ export default class FilesService extends BaseService { } /** - * @description : Delete a file - * @throws {Error} If file cannot be deleted + * @description : Delete a file key and archive + * @throws {Error} If file key cannot be deleted or archived */ - public async delete(uid: string) { + public async deleteKeyAndArchive(uid: string) { try { const fileToUnpin = await this.filesRepository.findOneByUid(uid); - const fileHash = fileToUnpin.file_path.substring(this.variables.PINATA_GATEWAY.length); - await this.ipfsService.unpinFile(fileHash); + if(!fileToUnpin) return null; + const fileHash = fileToUnpin.file_path.substring(this.variables.PINATA_GATEWAY.length); + await this.ipfsService.unpinFile(fileHash); } catch(error) { console.error(error); } - return this.filesRepository.delete(uid); + return this.filesRepository.deleteKeyAndArchive(uid); } } From d2b07997149e78e90b62ffc04cbe4976efba16d3 Mon Sep 17 00:00:00 2001 From: Vincent Alamelle Date: Fri, 12 May 2023 10:29:11 +0200 Subject: [PATCH 005/134] Seeder update --- src/common/databases/seeders/seeder2.ts | 134 +++++++++++++++++++++++- 1 file changed, 132 insertions(+), 2 deletions(-) diff --git a/src/common/databases/seeders/seeder2.ts b/src/common/databases/seeders/seeder2.ts index 4b586c46..7a3c82fe 100644 --- a/src/common/databases/seeders/seeder2.ts +++ b/src/common/databases/seeders/seeder2.ts @@ -156,6 +156,8 @@ import { const uidDocumentType16: string = randomString(); const uidDocumentType17: string = randomString(); const uidDocumentType18: string = randomString(); + const uidDocumentType19: string = randomString(); + const uidOfficeFolderHasCustomer1: string = randomString(); const uidOfficeFolderHasCustomer3: string = randomString(); @@ -217,6 +219,21 @@ import { const uidDeedTypeHasDocumentType6: string = randomString(); const uidDeedTypeHasDocumentType7: string = randomString(); const uidDeedTypeHasDocumentType8: string = randomString(); + const uidDeedTypeHasDocumentType9: string = randomString(); + const uidDeedTypeHasDocumentType10: string = randomString(); + const uidDeedTypeHasDocumentType11: string = randomString(); + const uidDeedTypeHasDocumentType12: string = randomString(); + const uidDeedTypeHasDocumentType13: string = randomString(); + const uidDeedTypeHasDocumentType14: string = randomString(); + const uidDeedTypeHasDocumentType15: string = randomString(); + const uidDeedTypeHasDocumentType16: string = randomString(); + const uidDeedTypeHasDocumentType17: string = randomString(); + const uidDeedTypeHasDocumentType18: string = randomString(); + const uidDeedTypeHasDocumentType19: string = randomString(); + const uidDeedTypeHasDocumentType20: string = randomString(); + const uidDeedTypeHasDocumentType21: string = randomString(); + const uidDeedTypeHasDocumentType22: string = randomString(); + @@ -1276,6 +1293,16 @@ import { created_at: new Date(), updated_at: new Date(), }, + { + uid: uidDocumentType19, + archived_at: null, + name: "Acte d'achat par la SCI", + office_uid: uidOffice1, + private_description: "Acte d'achat par la SCI.", + public_description: "Acte d'achat par la SCI.", + created_at: new Date(), + updated_at: new Date(), + }, ]; const officeFolderHasCustomers: OfficeFolderHasCustomers[] = [ @@ -1647,18 +1674,121 @@ import { }, { uid: uidDeedTypeHasDocumentType2, - deed_type_uid: uidDeedType2, + deed_type_uid: uidDeedType1, document_type_uid: uidDocumentType2, created_at: new Date(), updated_at: new Date(), }, { uid: uidDeedTypeHasDocumentType3, - deed_type_uid: uidDeedType3, + deed_type_uid: uidDeedType1, document_type_uid: uidDocumentType3, created_at: new Date(), updated_at: new Date(), }, + { + uid: uidDeedTypeHasDocumentType9, + deed_type_uid: uidDeedType1, + document_type_uid: uidDocumentType4, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedTypeHasDocumentType10, + deed_type_uid: uidDeedType1, + document_type_uid: uidDocumentType16, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedTypeHasDocumentType11, + deed_type_uid: uidDeedType1, + document_type_uid: uidDocumentType5, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedTypeHasDocumentType12, + deed_type_uid: uidDeedType1, + document_type_uid: uidDocumentType19, + created_at: new Date(), + updated_at: new Date(), + }, + + + { + uid: uidDeedTypeHasDocumentType13, + deed_type_uid: uidDeedType2, + document_type_uid: uidDocumentType1, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedTypeHasDocumentType14, + deed_type_uid: uidDeedType2, + document_type_uid: uidDocumentType13, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedTypeHasDocumentType15, + deed_type_uid: uidDeedType2, + document_type_uid: uidDocumentType2, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedTypeHasDocumentType16, + deed_type_uid: uidDeedType2, + document_type_uid: uidDocumentType8, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedTypeHasDocumentType17, + deed_type_uid: uidDeedType2, + document_type_uid: uidDocumentType10, + created_at: new Date(), + updated_at: new Date(), + }, + + + { + uid: uidDeedTypeHasDocumentType18, + deed_type_uid: uidDeedType3, + document_type_uid: uidDocumentType14, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedTypeHasDocumentType19, + deed_type_uid: uidDeedType3, + document_type_uid: uidDocumentType15, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedTypeHasDocumentType20, + deed_type_uid: uidDeedType3, + document_type_uid: uidDocumentType4, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedTypeHasDocumentType21, + deed_type_uid: uidDeedType3, + document_type_uid: uidDocumentType10, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidDeedTypeHasDocumentType22, + deed_type_uid: uidDeedType3, + document_type_uid: uidDocumentType1, + created_at: new Date(), + updated_at: new Date(), + }, + { uid: uidDeedTypeHasDocumentType4, From 2cf1067f03ba211ed406cfa81bba6c9e3be31cb8 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Mon, 15 May 2023 10:09:51 +0200 Subject: [PATCH 006/134] refacto errors and naming --- package.json | 2 +- src/app/api/customer/DocumentsController.ts | 30 ++++++++----- src/app/api/idnot-user/UserInfoController.ts | 2 +- .../api/super-admin/CustomersController.ts | 37 +++++++++------- .../api/super-admin/DeedTypesController.ts | 37 +++++++++------- src/app/api/super-admin/DeedsController.ts | 29 ++++++++----- .../super-admin/DocumentTypesController.ts | 35 +++++++++------- .../api/super-admin/DocumentsController.ts | 40 +++++++++++------- src/app/api/super-admin/FilesController.ts | 25 +++++++---- .../super-admin/OfficeFoldersController.ts | 42 +++++++++++-------- src/app/api/super-admin/OfficesController.ts | 38 ++++++++++------- src/app/api/super-admin/UsersController.ts | 37 +++++++++------- .../repositories/AddressesRepository.ts | 6 +-- src/common/repositories/ContactsRepository.ts | 6 +-- .../repositories/CustomersRepository.ts | 5 +-- .../DeedTypesHasDocumentTypesRepository.ts | 6 +-- .../repositories/DeedTypesRepository.ts | 6 +-- .../DeedsHasDocumentTypesRepository.ts | 6 +-- src/common/repositories/DeedsRepository.ts | 6 +-- .../repositories/DocumentTypesRepository.ts | 6 +-- .../repositories/DocumentsRepository.ts | 7 +--- src/common/repositories/FilesRepository.ts | 1 + .../OfficeFoldersHasCustomerRepository.ts | 6 +-- .../OfficeFoldersHasStakeholderRepository.ts | 6 +-- .../repositories/OfficeFoldersRepository.ts | 6 +-- src/common/repositories/OfficesRepository.ts | 6 +-- src/common/repositories/UsersRepository.ts | 6 +-- .../DocumentsService/DocumentsService.ts | 4 +- .../AddressesService/AddressesService.ts | 5 ++- .../ContactsService/ContactsService.ts | 5 ++- .../FilesService/FilesService.ts | 14 ++++--- .../CustomersService/CustomersService.ts | 2 +- .../DeedTypesService/DeedTypesService.ts | 2 +- .../super-admin/DeedsService/DeedsService.ts | 2 +- .../DocumentTypesService.ts | 4 +- .../DocumentsService/DocumentsService.ts | 4 +- .../OfficeFoldersService.ts | 8 ++-- .../OfficesService/OfficesService.ts | 2 +- .../super-admin/UsersService/UsersService.ts | 2 +- 39 files changed, 260 insertions(+), 233 deletions(-) diff --git a/package.json b/package.json index 8f6c3f38..45a5412f 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "cors": "^2.8.5", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.47", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.49", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", diff --git a/src/app/api/customer/DocumentsController.ts b/src/app/api/customer/DocumentsController.ts index ebfccb15..419062dc 100644 --- a/src/app/api/customer/DocumentsController.ts +++ b/src/app/api/customer/DocumentsController.ts @@ -25,10 +25,10 @@ export default class DocumentsController extends ApiController { const query = JSON.parse(req.query["q"] as string); //call service to get prisma entity - const prismaEntity: Documents[] = await this.documentsService.get(query); + const documentEntities: Documents[] = await this.documentsService.get(query); //Hydrate ressource with prisma entity - const documents = Document.map(Document, prismaEntity, { strategy: "excludeAll" }); + const documents = Document.hydrateArray(Document, documentEntities, { strategy: "excludeAll" }); //success this.httpSuccess(response, documents); @@ -52,15 +52,15 @@ export default class DocumentsController extends ApiController { await validateOrReject(documentEntity, { groups: ["createDocument"] }); //call service to get prisma entity - const prismaEntityCreated = await this.documentsService.create(documentEntity); + const documentEntityCreated = await this.documentsService.create(documentEntity); //Hydrate ressource with prisma entity - const documentEntityCreated = Document.hydrate(prismaEntityCreated, { + const document = Document.hydrate(documentEntityCreated, { strategy: "excludeAll", }); //success - this.httpSuccess(response, documentEntityCreated); + this.httpSuccess(response, document); } catch (error) { this.httpBadRequest(response, error); return; @@ -75,7 +75,8 @@ export default class DocumentsController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } //init Document resource with request body values @@ -86,10 +87,10 @@ export default class DocumentsController extends ApiController { await validateOrReject(documentEntity, { groups: ["createDocument"] }); //call service to get prisma entity - const prismaEntityUpdated: Documents = await this.documentsService.update(uid, documentEntity); + const documentEntityUpdated: Documents = await this.documentsService.update(uid, documentEntity); //Hydrate ressource with prisma entity - const document = Document.hydrate(prismaEntityUpdated, { strategy: "excludeAll" }); + const document = Document.hydrate(documentEntityUpdated, { strategy: "excludeAll" }); //success this.httpSuccess(response, document); @@ -107,7 +108,8 @@ export default class DocumentsController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } //call service to get prisma entity @@ -132,10 +134,11 @@ export default class DocumentsController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } - let documentEntity: Documents; + let documentEntity: Documents | null; //get query if (req.query["q"]) { const query = JSON.parse(req.query["q"] as string); @@ -145,6 +148,11 @@ export default class DocumentsController extends ApiController { documentEntity = await this.documentsService.getByUid(uid); } + if (!documentEntity) { + this.httpNotFoundRequest(response, "document not found"); + return; + } + //Hydrate ressource with prisma entity const document = Document.hydrate(documentEntity, { strategy: "excludeAll" }); diff --git a/src/app/api/idnot-user/UserInfoController.ts b/src/app/api/idnot-user/UserInfoController.ts index f3854a1d..afd5bf22 100644 --- a/src/app/api/idnot-user/UserInfoController.ts +++ b/src/app/api/idnot-user/UserInfoController.ts @@ -24,7 +24,7 @@ import AuthService from "@Services/private-services/AuthService/AuthService"; //success this.httpSuccess(response, user); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } diff --git a/src/app/api/super-admin/CustomersController.ts b/src/app/api/super-admin/CustomersController.ts index d283cb95..641fa2ef 100644 --- a/src/app/api/super-admin/CustomersController.ts +++ b/src/app/api/super-admin/CustomersController.ts @@ -24,15 +24,15 @@ export default class CustomersController extends ApiController { const query = JSON.parse(req.query["q"] as string); //call service to get prisma entity - const customersEntity = await this.customersService.get(query); + const customersEntities = await this.customersService.get(query); //Hydrate ressource with prisma entity - const customers = Customer.map(Customer, customersEntity, { strategy: "excludeAll" }); + const customers = Customer.hydrateArray(Customer, customersEntities, { strategy: "excludeAll" }); //success this.httpSuccess(response, customers); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -49,16 +49,16 @@ export default class CustomersController extends ApiController { await validateOrReject(customerEntity, { groups: ["createCustomer"], forbidUnknownValues: false }); //call service to get prisma entity - const prismaEntityCreated = await this.customersService.create(customerEntity); + const customerEntityCreated = await this.customersService.create(customerEntity); //Hydrate ressource with prisma entity - const customerEntityCreated = Customer.hydrate(prismaEntityCreated, { + const customer = Customer.hydrate(customerEntityCreated, { strategy: "excludeAll", }); //success - this.httpSuccess(response, customerEntityCreated); + this.httpSuccess(response, customer); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -71,7 +71,8 @@ export default class CustomersController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } //init IUser resource with request body values const customerEntity = Customer.hydrate(req.body); @@ -80,17 +81,17 @@ export default class CustomersController extends ApiController { await validateOrReject(customerEntity, { groups: ["updateCustomer"], forbidUnknownValues: false }); //call service to get prisma entity - const prismaEntityUpdated = await this.customersService.update(uid, customerEntity); + const customerEntityUpdated = await this.customersService.update(uid, customerEntity); //Hydrate ressource with prisma entity - const customerEntityUpdated = Customer.hydrate(prismaEntityUpdated, { + const customer = Customer.hydrate(customerEntityUpdated, { strategy: "excludeAll", }); //success - this.httpSuccess(response, customerEntityUpdated); + this.httpSuccess(response, customer); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -103,10 +104,11 @@ export default class CustomersController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } - let customerEntity: Customers; + let customerEntity: Customers | null; //get query if (req.query["q"]) { const query = JSON.parse(req.query["q"] as string); @@ -116,13 +118,18 @@ export default class CustomersController extends ApiController { customerEntity = await this.customersService.getByUid(uid); } + if (!customerEntity) { + this.httpNotFoundRequest(response, "customer not found"); + return; + } + //Hydrate ressource with prisma entity const customer = Customer.hydrate(customerEntity, { strategy: "excludeAll" }); //success this.httpSuccess(response, customer); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } diff --git a/src/app/api/super-admin/DeedTypesController.ts b/src/app/api/super-admin/DeedTypesController.ts index aba5721c..ba9c6e03 100644 --- a/src/app/api/super-admin/DeedTypesController.ts +++ b/src/app/api/super-admin/DeedTypesController.ts @@ -24,15 +24,15 @@ export default class DeedTypesController extends ApiController { //get query const query = JSON.parse(req.query["q"] as string); //call service to get prisma entity - const prismaEntity: DeedTypes[] = await this.deedTypesService.get(query); + const deedTypeEntities: DeedTypes[] = await this.deedTypesService.get(query); //Hydrate ressource with prisma entity - const DeedTypes = DeedType.map(DeedType, prismaEntity, { strategy: "excludeAll" }); + const DeedTypes = DeedType.hydrateArray(DeedType, deedTypeEntities, { strategy: "excludeAll" }); //success this.httpSuccess(response, DeedTypes); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -51,17 +51,17 @@ export default class DeedTypesController extends ApiController { await validateOrReject(deedTypeEntity, { groups: ["createDeedType"], forbidUnknownValues: false }); //call service to get prisma entity - const prismaEntityCreated = await this.deedTypesService.create(deedTypeEntity); + const deedTypeEntityCreated = await this.deedTypesService.create(deedTypeEntity); //Hydrate ressource with prisma entity - const deedTypeEntityCreated = DeedType.hydrate(prismaEntityCreated, { + const deedType = DeedType.hydrate(deedTypeEntityCreated, { strategy: "excludeAll", }); //success - this.httpSuccess(response, deedTypeEntityCreated); + this.httpSuccess(response, deedType); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -75,7 +75,8 @@ export default class DeedTypesController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } //init DeedType resource with request body values const deedTypeEntity = DeedType.hydrate(req.body); @@ -84,17 +85,17 @@ export default class DeedTypesController extends ApiController { await validateOrReject(deedTypeEntity, { groups: ["updateDeedType"] }); //call service to get prisma entity - const prismaEntityUpdated = await this.deedTypesService.update(uid, deedTypeEntity); + const deedTypeEntityUpdated = await this.deedTypesService.update(uid, deedTypeEntity); //Hydrate ressource with prisma entity - const deedTypeEntityUpdated = DeedType.hydrate(prismaEntityUpdated, { + const deedType = DeedType.hydrate(deedTypeEntityUpdated, { strategy: "excludeAll", }); //success - this.httpSuccess(response, deedTypeEntityUpdated); + this.httpSuccess(response, deedType); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -108,10 +109,11 @@ export default class DeedTypesController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } - let deedTypeEntity: DeedTypes; + let deedTypeEntity: DeedTypes | null; //get query if (req.query["q"]) { const query = JSON.parse(req.query["q"] as string); @@ -121,13 +123,18 @@ export default class DeedTypesController extends ApiController { deedTypeEntity = await this.deedTypesService.getByUid(uid); } + if (!deedTypeEntity) { + this.httpNotFoundRequest(response, "deed type not found"); + return; + } + //Hydrate ressource with prisma entity const deedType = DeedType.hydrate(deedTypeEntity, { strategy: "excludeAll" }); //success this.httpSuccess(response, deedType); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } diff --git a/src/app/api/super-admin/DeedsController.ts b/src/app/api/super-admin/DeedsController.ts index f8ff9da7..676c5f79 100644 --- a/src/app/api/super-admin/DeedsController.ts +++ b/src/app/api/super-admin/DeedsController.ts @@ -24,15 +24,15 @@ export default class DeedsController extends ApiController { //get query const query = JSON.parse(req.query["q"] as string); //call service to get prisma entity - const prismaEntity: Deeds[] = await this.deedsService.get(query); + const deedEntities: Deeds[] = await this.deedsService.get(query); //Hydrate ressource with prisma entity - const deeds = Deed.map(Deed, prismaEntity, { strategy: "excludeAll" }); + const deeds = Deed.hydrateArray(Deed, deedEntities, { strategy: "excludeAll" }); //success this.httpSuccess(response, deeds); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -46,10 +46,11 @@ export default class DeedsController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } - let deedEntity: Deeds; + let deedEntity: Deeds | null; //get query if (req.query["q"]) { const query = JSON.parse(req.query["q"] as string); @@ -59,13 +60,18 @@ export default class DeedsController extends ApiController { deedEntity = await this.deedsService.getByUid(uid); } + if (!deedEntity) { + this.httpNotFoundRequest(response, "deed not found"); + return; + } + //Hydrate ressource with prisma entity const deed = Deed.hydrate(deedEntity, { strategy: "excludeAll" }); //success this.httpSuccess(response, deed); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -78,7 +84,8 @@ export default class DeedsController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } //init OfficeFolder resource with request body values const deedEntity = Deed.hydrate(req.body); @@ -87,17 +94,17 @@ export default class DeedsController extends ApiController { await validateOrReject(deedEntity, { groups: ["updateDeed"], forbidUnknownValues: false }); //call service to get prisma entity - const prismaEntityUpdated = await this.deedsService.update(uid, deedEntity); + const deedEntityUpdated = await this.deedsService.update(uid, deedEntity); //Hydrate ressource with prisma entity - const deedEntityUpdated = Deed.hydrate(prismaEntityUpdated, { + const deed = Deed.hydrate(deedEntityUpdated, { strategy: "excludeAll", }); //success - this.httpSuccess(response, deedEntityUpdated); + this.httpSuccess(response, deed); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } diff --git a/src/app/api/super-admin/DocumentTypesController.ts b/src/app/api/super-admin/DocumentTypesController.ts index 3ef79a93..802ffcf6 100644 --- a/src/app/api/super-admin/DocumentTypesController.ts +++ b/src/app/api/super-admin/DocumentTypesController.ts @@ -25,17 +25,17 @@ export default class DocumentTypesController extends ApiController { const query = JSON.parse(req.query["q"] as string); //call service to get prisma entity - const prismaEntity: DocumentTypes[] = await this.documentTypesService.get(query); + const documentTypeEntities: DocumentTypes[] = await this.documentTypesService.get(query); //Hydrate ressource with prisma entity - const documentTypes = DocumentType.map(DocumentType, prismaEntity, { + const documentTypes = DocumentType.hydrateArray(DocumentType, documentTypeEntities, { strategy: "excludeAll", }); //success this.httpSuccess(response, documentTypes); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -51,15 +51,15 @@ export default class DocumentTypesController extends ApiController { //validate user await validateOrReject(documentTypeEntity, { groups: ["createDocumentType"], forbidUnknownValues: false }); //call service to get prisma entity - const prismaEntityCreated = await this.documentTypesService.create(documentTypeEntity); + const documentTypeEntityCreated = await this.documentTypesService.create(documentTypeEntity); //Hydrate ressource with prisma entity - const userEntityCreated = DocumentType.hydrate(prismaEntityCreated, { + const userEntityCreated = DocumentType.hydrate(documentTypeEntityCreated, { strategy: "excludeAll", }); //success this.httpSuccess(response, userEntityCreated); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -72,7 +72,8 @@ export default class DocumentTypesController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } //init DocumentType resource with request body values const documentTypeEntity = DocumentType.hydrate(req.body); @@ -81,17 +82,17 @@ export default class DocumentTypesController extends ApiController { await validateOrReject(documentTypeEntity, { groups: ["update"] }); //call service to get prisma entity - const prismaEntityUpdated = await this.documentTypesService.update(uid, documentTypeEntity); + const documentTypeEntityUpdated = await this.documentTypesService.update(uid, documentTypeEntity); //Hydrate ressource with prisma entity - const documentTypeEntityUpdated = DocumentType.hydrate(prismaEntityUpdated, { + const documentType = DocumentType.hydrate(documentTypeEntityUpdated, { strategy: "excludeAll", }); //success - this.httpSuccess(response, documentTypeEntityUpdated); + this.httpSuccess(response, documentType); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -104,10 +105,11 @@ export default class DocumentTypesController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } - let documentTypeEntity: DocumentTypes; + let documentTypeEntity: DocumentTypes | null; //get query if (req.query["q"]) { const query = JSON.parse(req.query["q"] as string); @@ -117,13 +119,18 @@ export default class DocumentTypesController extends ApiController { documentTypeEntity = await this.documentTypesService.getByUid(uid); } + if (!documentTypeEntity) { + this.httpNotFoundRequest(response, "document not found"); + return; + } + //Hydrate ressource with prisma entity const user = ObjectHydrate.hydrate(new DocumentType(), documentTypeEntity, { strategy: "excludeAll" }); //success this.httpSuccess(response, user); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } diff --git a/src/app/api/super-admin/DocumentsController.ts b/src/app/api/super-admin/DocumentsController.ts index ae60a9ab..0a83078b 100644 --- a/src/app/api/super-admin/DocumentsController.ts +++ b/src/app/api/super-admin/DocumentsController.ts @@ -25,15 +25,15 @@ export default class DocumentsController extends ApiController { const query = JSON.parse(req.query["q"] as string); //call service to get prisma entity - const prismaEntity: Documents[] = await this.documentsService.get(query); + const documentEntities: Documents[] = await this.documentsService.get(query); //Hydrate ressource with prisma entity - const documents = Document.map(Document, prismaEntity, { strategy: "excludeAll" }); + const documents = Document.hydrateArray(Document, documentEntities, { strategy: "excludeAll" }); //success this.httpSuccess(response, documents); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -52,17 +52,17 @@ export default class DocumentsController extends ApiController { await validateOrReject(documentEntity, { groups: ["createDocument"], forbidUnknownValues: false }); //call service to get prisma entity - const prismaEntityCreated = await this.documentsService.create(documentEntity); + const documentEntityCreated = await this.documentsService.create(documentEntity); //Hydrate ressource with prisma entity - const documentEntityCreated = Document.hydrate(prismaEntityCreated, { + const document = Document.hydrate(documentEntityCreated, { strategy: "excludeAll", }); //success - this.httpSuccess(response, documentEntityCreated); + this.httpSuccess(response, document); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -75,7 +75,8 @@ export default class DocumentsController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } //init Document resource with request body values @@ -85,15 +86,15 @@ export default class DocumentsController extends ApiController { await validateOrReject(documentEntity, { groups: ["updateDocument"] }); //call service to get prisma entity - const prismaEntityUpdated: Documents = await this.documentsService.update(uid, documentEntity, req.body.refused_reason); + const documentEntityUpdated: Documents = await this.documentsService.update(uid, documentEntity, req.body.refused_reason); //Hydrate ressource with prisma entity - const document = Document.hydrate(prismaEntityUpdated, { strategy: "excludeAll" }); + const document = Document.hydrate(documentEntityUpdated, { strategy: "excludeAll" }); //success this.httpSuccess(response, document); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -106,7 +107,8 @@ export default class DocumentsController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } //call service to get prisma entity @@ -118,7 +120,7 @@ export default class DocumentsController extends ApiController { //success this.httpSuccess(response, document); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -131,10 +133,11 @@ export default class DocumentsController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } - let documentEntity: Documents; + let documentEntity: Documents | null; //get query if (req.query["q"]) { const query = JSON.parse(req.query["q"] as string); @@ -144,13 +147,18 @@ export default class DocumentsController extends ApiController { documentEntity = await this.documentsService.getByUid(uid); } + if (!documentEntity) { + this.httpNotFoundRequest(response, "document not found"); + return; + } + //Hydrate ressource with prisma entity const document = Document.hydrate(documentEntity, { strategy: "excludeAll" }); //success this.httpSuccess(response, document); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } diff --git a/src/app/api/super-admin/FilesController.ts b/src/app/api/super-admin/FilesController.ts index b3be77f3..eb50b90b 100644 --- a/src/app/api/super-admin/FilesController.ts +++ b/src/app/api/super-admin/FilesController.ts @@ -4,7 +4,7 @@ import ApiController from "@Common/system/controller-pattern/ApiController"; import { Service } from "typedi"; import FilesService from "@Services/private-services/FilesService/FilesService"; import { Files } from "@prisma/client"; -import { File, Document } from "le-coffre-resources/dist/SuperAdmin"; +import { File } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; @@ -26,10 +26,10 @@ export default class FilesController extends ApiController { const query = JSON.parse(req.query["q"] as string); //call service to get prisma entity - const prismaEntity = await this.filesService.get(query); + const fileEntities = await this.filesService.get(query); //Hydrate ressource with prisma entity - const files = File.map(File, prismaEntity, { strategy: "excludeAll" }); + const files = File.hydrateArray(File, fileEntities, { strategy: "excludeAll" }); //success this.httpSuccess(response, files); @@ -85,19 +85,25 @@ export default class FilesController extends ApiController { await validateOrReject(fileEntity, { groups: ["createFile"] }); //call service to get prisma entity - const prismaEntityCreated = await this.filesService.create(fileEntity, req.file); + const fileEntityCreated = await this.filesService.create(fileEntity, req.file); - const document: Document = await this.documentService.getByUid(fileEntity.document!.uid!); + const document = await this.documentService.getByUid(fileEntity.document!.uid!); + + if(!document){ + this.httpNotFoundRequest(response, "document not found"); + return; + } + document.document_status = "DEPOSITED"; await this.documentService.update(document.uid!, document); //Hydrate ressource with prisma entity - const fileEntityCreated = File.hydrate(prismaEntityCreated, { + const fileEntityHydrated = File.hydrate(fileEntityCreated, { strategy: "excludeAll", }); //success - this.httpSuccess(response, fileEntityCreated); + this.httpSuccess(response, fileEntityHydrated); } catch (error) { this.httpBadRequest(response, error); return; @@ -122,10 +128,10 @@ export default class FilesController extends ApiController { await validateOrReject(fileEntity, { groups: ["updateFile"] }); //call service to get prisma entity - const prismaEntityUpdated: Files = await this.filesService.update(uid, fileEntity); + const fileEntityUpdated: Files = await this.filesService.update(uid, fileEntity); //Hydrate ressource with prisma entity - const file = File.hydrate(prismaEntityUpdated, { strategy: "excludeAll" }); + const file = File.hydrate(fileEntityUpdated, { strategy: "excludeAll" }); //success this.httpSuccess(response, file); @@ -154,6 +160,7 @@ export default class FilesController extends ApiController { this.httpNotFoundRequest(response, "file not found"); return; } + //Hydrate ressource with prisma entity const file = File.hydrate(fileEntity, { strategy: "excludeAll" }); diff --git a/src/app/api/super-admin/OfficeFoldersController.ts b/src/app/api/super-admin/OfficeFoldersController.ts index 989ea9b5..7bd245b3 100644 --- a/src/app/api/super-admin/OfficeFoldersController.ts +++ b/src/app/api/super-admin/OfficeFoldersController.ts @@ -23,15 +23,15 @@ export default class OfficeFoldersController extends ApiController { //get query const query = JSON.parse(req.query["q"] as string); //call service to get prisma entity - const prismaEntity: OfficeFolders[] = await this.officeFoldersService.get(query); + const officeFolderEntities: OfficeFolders[] = await this.officeFoldersService.get(query); //Hydrate ressource with prisma entity - const officeFolders = OfficeFolder.map(OfficeFolder, prismaEntity, { + const officeFolders = OfficeFolder.hydrateArray(OfficeFolder, officeFolderEntities, { strategy: "excludeAll", }); //success this.httpSuccess(response, officeFolders); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -48,15 +48,15 @@ export default class OfficeFoldersController extends ApiController { //validate folder await validateOrReject(officeFolderEntity, { groups: ["createFolder"] , forbidUnknownValues: false }); //call service to get prisma entity - const prismaEntityCreated = await this.officeFoldersService.create(officeFolderEntity); + const officeFolderEntityCreated = await this.officeFoldersService.create(officeFolderEntity); //Hydrate ressource with prisma entity - const officeFolderEntityCreated = OfficeFolder.hydrate(prismaEntityCreated, { + const officeFolders = OfficeFolder.hydrate(officeFolderEntityCreated, { strategy: "excludeAll", }); //success - this.httpSuccess(response, officeFolderEntityCreated); + this.httpSuccess(response, officeFolders); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -69,7 +69,8 @@ export default class OfficeFoldersController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } //init OfficeFolder resource with request body values const officeFolderEntity = OfficeFolder.hydrate(req.body); @@ -78,17 +79,17 @@ export default class OfficeFoldersController extends ApiController { await validateOrReject(officeFolderEntity, { groups: ["updateFolder"], forbidUnknownValues: false }); //call service to get prisma entity - const prismaEntityUpdated = await this.officeFoldersService.update(uid, officeFolderEntity); + const officeFolderEntityUpdated = await this.officeFoldersService.update(uid, officeFolderEntity); //Hydrate ressource with prisma entity - const officeFolderEntityUpdated = OfficeFolder.hydrate(prismaEntityUpdated, { + const officeFolders = OfficeFolder.hydrate(officeFolderEntityUpdated, { strategy: "excludeAll", }); //success - this.httpSuccess(response, officeFolderEntityUpdated); + this.httpSuccess(response, officeFolders); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -102,10 +103,11 @@ export default class OfficeFoldersController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } - let officeFolderEntity: OfficeFolders; + let officeFolderEntity: OfficeFolders | null; //get query if (req.query["q"]) { const query = JSON.parse(req.query["q"] as string); @@ -115,13 +117,18 @@ export default class OfficeFoldersController extends ApiController { officeFolderEntity = await this.officeFoldersService.getByUid(uid); } + if (!officeFolderEntity) { + this.httpNotFoundRequest(response, "folder not found"); + return; + } + //Hydrate ressource with prisma entity const officeFolder = OfficeFolder.hydrate(officeFolderEntity, { strategy: "excludeAll" }); //success this.httpSuccess(response, officeFolder); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } this.httpSuccess(response, await this.officeFoldersService.getByUid("uid")); @@ -135,7 +142,8 @@ export default class OfficeFoldersController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } //call service to get prisma entity @@ -147,7 +155,7 @@ export default class OfficeFoldersController extends ApiController { //success this.httpSuccess(response, officeFolder); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } diff --git a/src/app/api/super-admin/OfficesController.ts b/src/app/api/super-admin/OfficesController.ts index 8520fe49..397cdba5 100644 --- a/src/app/api/super-admin/OfficesController.ts +++ b/src/app/api/super-admin/OfficesController.ts @@ -22,13 +22,13 @@ export default class OfficesController extends ApiController { //get query const query = JSON.parse(req.query["q"] as string); //call service to get prisma entity - const officesEntity: Offices[] = await this.officesService.get(query); + const officesEntities: Offices[] = await this.officesService.get(query); //Hydrate ressource with prisma entity - const offices = OfficeResource.map(OfficeResource, officesEntity, { strategy: "excludeAll" }); + const offices = OfficeResource.hydrateArray(OfficeResource, officesEntities, { strategy: "excludeAll" }); //success this.httpSuccess(response, offices); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -43,15 +43,15 @@ export default class OfficesController extends ApiController { //validate user await validateOrReject(officeEntity, { groups: ["createOffice"], forbidUnknownValues: false }); //call service to get prisma entity - const prismaEntityCreated = await this.officesService.create(officeEntity); + const officeEntityCreated = await this.officesService.create(officeEntity); //Hydrate ressource with prisma entity - const officeEntityCreated = OfficeResource.hydrate(prismaEntityCreated, { + const office = OfficeResource.hydrate(officeEntityCreated, { strategy: "excludeAll", }); //success - this.httpSuccess(response, officeEntityCreated); + this.httpSuccess(response, office); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -63,22 +63,23 @@ export default class OfficesController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } //init IUser resource with request body values const officeEntity = OfficeResource.hydrate(req.body); //validate user await validateOrReject(officeEntity, { groups: ["update"] }); //call service to get prisma entity - const prismaEntityUpdated = await this.officesService.update(uid, officeEntity); + const officeEntityUpdated = await this.officesService.update(uid, officeEntity); //Hydrate ressource with prisma entity - const officeEntityUpdated = OfficeResource.hydrate(prismaEntityUpdated, { + const office = OfficeResource.hydrate(officeEntityUpdated, { strategy: "excludeAll", }); //success - this.httpSuccess(response, officeEntityUpdated); + this.httpSuccess(response, office); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -90,9 +91,10 @@ export default class OfficesController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } - let officeEntity: Offices; + let officeEntity: Offices | null; //get query if (req.query["q"]) { const query = JSON.parse(req.query["q"] as string); @@ -101,12 +103,18 @@ export default class OfficesController extends ApiController { //call service to get prisma entity officeEntity = await this.officesService.getByUid(uid); } + + if (!officeEntity) { + this.httpNotFoundRequest(response, "office not found"); + return; + } + //Hydrate ressource with prisma entity const office = OfficeResource.hydrate(officeEntity, { strategy: "excludeAll" }); //success this.httpSuccess(response, office); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index aee392e8..c0ff65ff 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -24,15 +24,15 @@ export default class UsersController extends ApiController { const query = JSON.parse(req.query["q"] as string); //call service to get prisma entity - const usersEntity = await this.usersService.get(query); + const usersEntities = await this.usersService.get(query); //Hydrate ressource with prisma entity - const users = User.map(User, usersEntity, { strategy: "excludeAll" }); + const users = User.hydrateArray(User, usersEntities, { strategy: "excludeAll" }); //success this.httpSuccess(response, users); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -50,17 +50,17 @@ export default class UsersController extends ApiController { await validateOrReject(userEntity, { groups: ["createUser"] }); //call service to get prisma entity - const prismaEntityCreated = await this.usersService.create(userEntity); + const userEntityCreated = await this.usersService.create(userEntity); //Hydrate ressource with prisma entity - const userEntityCreated = User.hydrate(prismaEntityCreated, { + const user = User.hydrate(userEntityCreated, { strategy: "excludeAll", }); //success - this.httpSuccess(response, userEntityCreated); + this.httpSuccess(response, user); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -73,7 +73,8 @@ export default class UsersController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } //init IUser resource with request body values const userEntity = User.hydrate(req.body); @@ -82,17 +83,17 @@ export default class UsersController extends ApiController { await validateOrReject(userEntity, { groups: ["update"] }); //call service to get prisma entity - const prismaEntityUpdated = await this.usersService.update(uid, userEntity); + const userEntityUpdated = await this.usersService.update(uid, userEntity); //Hydrate ressource with prisma entity - const userEntityUpdated = User.hydrate(prismaEntityUpdated, { + const user = User.hydrate(userEntityUpdated, { strategy: "excludeAll", }); //success - this.httpSuccess(response, userEntityUpdated); + this.httpSuccess(response, user); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -105,9 +106,10 @@ export default class UsersController extends ApiController { try { const uid = req.params["uid"]; if (!uid) { - throw new Error("No uid provided"); + this.httpBadRequest(response, "No uid provided"); + return; } - let userEntity: Users; + let userEntity: Users | null; //get query if (req.query["q"]) { const query = JSON.parse(req.query["q"] as string); @@ -117,13 +119,18 @@ export default class UsersController extends ApiController { userEntity = await this.usersService.getByUid(uid); } + if (!userEntity) { + this.httpNotFoundRequest(response, "user not found"); + return; + } + //Hydrate ressource with prisma entity const user = User.hydrate(userEntity, { strategy: "excludeAll" }); //success this.httpSuccess(response, user); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } diff --git a/src/common/repositories/AddressesRepository.ts b/src/common/repositories/AddressesRepository.ts index 7bd53e84..268d9059 100644 --- a/src/common/repositories/AddressesRepository.ts +++ b/src/common/repositories/AddressesRepository.ts @@ -26,17 +26,13 @@ export default class AddressesRepository extends BaseRepository { /** * @description : Find one address */ - public async findOneByUid(uid: string): Promise { + public async findOneByUid(uid: string): Promise { const addressEntity = await this.model.findUnique({ where: { uid: uid, }, }); - if (!addressEntity) { - throw new Error("Address not found"); - } - return addressEntity; } } diff --git a/src/common/repositories/ContactsRepository.ts b/src/common/repositories/ContactsRepository.ts index b302d1f6..26836b4a 100644 --- a/src/common/repositories/ContactsRepository.ts +++ b/src/common/repositories/ContactsRepository.ts @@ -26,17 +26,13 @@ export default class ContactsRepository extends BaseRepository { /** * @description : Find unique contact */ - public async findOneByUid(uid: string): Promise { + public async findOneByUid(uid: string): Promise { const contactEntity = await this.model.findUnique({ where: { uid: uid, }, }); - if (!contactEntity) { - throw new Error("contact not found"); - } - return contactEntity; } } diff --git a/src/common/repositories/CustomersRepository.ts b/src/common/repositories/CustomersRepository.ts index 4f846795..c1b48c22 100644 --- a/src/common/repositories/CustomersRepository.ts +++ b/src/common/repositories/CustomersRepository.ts @@ -98,7 +98,7 @@ export default class CustomersRepository extends BaseRepository { /** * @description : Find unique customer */ - public async findOneByUid(uid: string, query?: any): Promise { + public async findOneByUid(uid: string, query?: any): Promise { const findOneArgs: Prisma.CustomersFindUniqueArgs = { where: { uid: uid, @@ -108,9 +108,6 @@ export default class CustomersRepository extends BaseRepository { findOneArgs.include = query; } const customerEntity = await this.model.findUnique(findOneArgs); - if (!customerEntity) { - throw new Error("Customer not found"); - } return customerEntity; } diff --git a/src/common/repositories/DeedTypesHasDocumentTypesRepository.ts b/src/common/repositories/DeedTypesHasDocumentTypesRepository.ts index 53cb40a7..e724d9d8 100644 --- a/src/common/repositories/DeedTypesHasDocumentTypesRepository.ts +++ b/src/common/repositories/DeedTypesHasDocumentTypesRepository.ts @@ -26,17 +26,13 @@ export default class DeedTypeHasDocumentTypesRepository extends BaseRepository { /** * @description : Find unique relation between deed type and a document type */ - public async findOneByUid(uid: string): Promise { + public async findOneByUid(uid: string): Promise { const deedTypeHasDoculmentTypesEntity = await this.model.findUnique({ where: { uid: uid, }, }); - if (!deedTypeHasDoculmentTypesEntity) { - throw new Error("deed type not found"); - } - return deedTypeHasDoculmentTypesEntity; } } diff --git a/src/common/repositories/DeedTypesRepository.ts b/src/common/repositories/DeedTypesRepository.ts index 6f38421d..7a695488 100644 --- a/src/common/repositories/DeedTypesRepository.ts +++ b/src/common/repositories/DeedTypesRepository.ts @@ -91,7 +91,7 @@ export default class DeedTypesRepository extends BaseRepository { /** * @description : Find unique deed type */ - public async findOneByUid(uid: string, query?: any): Promise { + public async findOneByUid(uid: string, query?: any): Promise { const findOneArgs: Prisma.DeedTypesFindUniqueArgs = { where: { uid: uid, @@ -102,10 +102,6 @@ export default class DeedTypesRepository extends BaseRepository { } const deedTypeEntity = await this.model.findUnique(findOneArgs); - if (!deedTypeEntity) { - throw new Error("deed type not found"); - } - return deedTypeEntity; } } diff --git a/src/common/repositories/DeedsHasDocumentTypesRepository.ts b/src/common/repositories/DeedsHasDocumentTypesRepository.ts index 65bac2c0..f95bca45 100644 --- a/src/common/repositories/DeedsHasDocumentTypesRepository.ts +++ b/src/common/repositories/DeedsHasDocumentTypesRepository.ts @@ -26,17 +26,13 @@ export default class DeedHasDocumentTypesRepository extends BaseRepository { /** * @description : Find unique relation between deed and a document type */ - public async findOneByUid(uid: string): Promise { + public async findOneByUid(uid: string): Promise { const deedHasDocumentTypesEntity = await this.model.findUnique({ where: { uid: uid, }, }); - if (!deedHasDocumentTypesEntity) { - throw new Error("relation between deed and document type not found"); - } - return deedHasDocumentTypesEntity; } } diff --git a/src/common/repositories/DeedsRepository.ts b/src/common/repositories/DeedsRepository.ts index 945a181d..ce6bef38 100644 --- a/src/common/repositories/DeedsRepository.ts +++ b/src/common/repositories/DeedsRepository.ts @@ -90,7 +90,7 @@ export default class DeedsRepository extends BaseRepository { /** * @description : Find unique deed */ - public async findOneByUid(uid: string, query?: any): Promise { + public async findOneByUid(uid: string, query?: any): Promise { const findOneArgs: Prisma.DeedsFindUniqueArgs = { where: { uid: uid, @@ -101,10 +101,6 @@ export default class DeedsRepository extends BaseRepository { } const deedTypeEntity = await this.model.findUnique(findOneArgs); - if (!deedTypeEntity) { - throw new Error("deed not found"); - } - return deedTypeEntity; } } diff --git a/src/common/repositories/DocumentTypesRepository.ts b/src/common/repositories/DocumentTypesRepository.ts index e9cb3fef..04d785ba 100644 --- a/src/common/repositories/DocumentTypesRepository.ts +++ b/src/common/repositories/DocumentTypesRepository.ts @@ -67,7 +67,7 @@ export default class DocumentTypesRepository extends BaseRepository { /** * @description : find unique document type */ - public async findOneByUid(uid: string, query?: any): Promise { + public async findOneByUid(uid: string, query?: any): Promise { const findOneArgs: Prisma.DocumentTypesFindUniqueArgs = { where: { uid: uid, @@ -78,10 +78,6 @@ export default class DocumentTypesRepository extends BaseRepository { } const documentTypeEntity = await this.model.findUnique(findOneArgs); - if (!documentTypeEntity) { - throw new Error("Document Type not found"); - } - return documentTypeEntity; } } diff --git a/src/common/repositories/DocumentsRepository.ts b/src/common/repositories/DocumentsRepository.ts index 1e1aa340..0c2e3b60 100644 --- a/src/common/repositories/DocumentsRepository.ts +++ b/src/common/repositories/DocumentsRepository.ts @@ -109,7 +109,7 @@ export default class DocumentsRepository extends BaseRepository { /** * @description : Find unique document */ - public async findOneByUid(uid: string, query?: any): Promise { + public async findOneByUid(uid: string, query?: any): Promise { const findOneArgs: Prisma.DocumentsFindUniqueArgs = { where: { uid: uid, @@ -119,10 +119,7 @@ export default class DocumentsRepository extends BaseRepository { findOneArgs.include = query; } const documentEntity = await this.model.findUnique(findOneArgs); - if (!documentEntity) { - throw new Error("Document not found"); - } - + return documentEntity; } } diff --git a/src/common/repositories/FilesRepository.ts b/src/common/repositories/FilesRepository.ts index f3003b40..cc75dbf1 100644 --- a/src/common/repositories/FilesRepository.ts +++ b/src/common/repositories/FilesRepository.ts @@ -81,6 +81,7 @@ export default class FilesRepository extends BaseRepository { uid: uid, }, }); + return fileEntity; } } diff --git a/src/common/repositories/OfficeFoldersHasCustomerRepository.ts b/src/common/repositories/OfficeFoldersHasCustomerRepository.ts index 2d4b403d..932e51fd 100644 --- a/src/common/repositories/OfficeFoldersHasCustomerRepository.ts +++ b/src/common/repositories/OfficeFoldersHasCustomerRepository.ts @@ -26,17 +26,13 @@ export default class OfficeFoldersHasCustomerRepository extends BaseRepository { /** * @description : Find a unique relation between an office folder and customers */ - public async findOneByUid(uid: string): Promise { + public async findOneByUid(uid: string): Promise { const officeFolderHasCustomersEntity = await this.model.findUnique({ where: { uid: uid, }, }); - if (!officeFolderHasCustomersEntity) { - throw new Error("relation between office folder and customer not found"); - } - return officeFolderHasCustomersEntity; } } diff --git a/src/common/repositories/OfficeFoldersHasStakeholderRepository.ts b/src/common/repositories/OfficeFoldersHasStakeholderRepository.ts index 02b2bb11..864856cd 100644 --- a/src/common/repositories/OfficeFoldersHasStakeholderRepository.ts +++ b/src/common/repositories/OfficeFoldersHasStakeholderRepository.ts @@ -26,17 +26,13 @@ export default class OfficeFoldersHasStakeholderRepository extends BaseRepositor /** * @description : Find a unique relation between an office folder and stakeholders */ - public async findOneByUid(uid: string): Promise { + public async findOneByUid(uid: string): Promise { const officeFolderHasStakeholdersEntity = await this.model.findUnique({ where: { uid: uid, }, }); - if (!officeFolderHasStakeholdersEntity) { - throw new Error("relation between office folder and stakeholder not found"); - } - return officeFolderHasStakeholdersEntity; } } diff --git a/src/common/repositories/OfficeFoldersRepository.ts b/src/common/repositories/OfficeFoldersRepository.ts index 18f6e894..d148cc46 100644 --- a/src/common/repositories/OfficeFoldersRepository.ts +++ b/src/common/repositories/OfficeFoldersRepository.ts @@ -122,7 +122,7 @@ export default class OfficeFoldersRepository extends BaseRepository { /** * @description : Find one office folder */ - public async findOneByUid(uid: string, query?: any): Promise { + public async findOneByUid(uid: string, query?: any): Promise { const findOneArgs: Prisma.OfficeFoldersFindUniqueArgs = { where: { uid: uid, @@ -133,10 +133,6 @@ export default class OfficeFoldersRepository extends BaseRepository { } const officeFolderEntity = await this.model.findUnique(findOneArgs); - if (!officeFolderEntity) { - throw new Error("office folder not found"); - } - return officeFolderEntity; } diff --git a/src/common/repositories/OfficesRepository.ts b/src/common/repositories/OfficesRepository.ts index 7595a1f5..e74a1d52 100644 --- a/src/common/repositories/OfficesRepository.ts +++ b/src/common/repositories/OfficesRepository.ts @@ -71,7 +71,7 @@ export default class OfficesRepository extends BaseRepository { /** * @description : Find one office */ - public async findOneByUid(uid: string, query?: any): Promise { + public async findOneByUid(uid: string, query?: any): Promise { const findOneArgs: Prisma.OfficesFindUniqueArgs = { where: { uid: uid, @@ -82,10 +82,6 @@ export default class OfficesRepository extends BaseRepository { } const officeEntity = await this.model.findUnique(findOneArgs); - if (!officeEntity) { - throw new Error("office not found"); - } - return officeEntity; } } diff --git a/src/common/repositories/UsersRepository.ts b/src/common/repositories/UsersRepository.ts index b7643e18..b051af69 100644 --- a/src/common/repositories/UsersRepository.ts +++ b/src/common/repositories/UsersRepository.ts @@ -138,7 +138,7 @@ export default class UsersRepository extends BaseRepository { /** * @description : Find one user */ - public async findOneByUid(uid: string, query?: any): Promise { + public async findOneByUid(uid: string, query?: any): Promise { const findOneArgs: Prisma.UsersFindUniqueArgs = { where: { uid: uid, @@ -149,10 +149,6 @@ export default class UsersRepository extends BaseRepository { } const userEntity = await this.model.findUnique(findOneArgs); - if (!userEntity) { - throw new Error("User not found"); - } - return userEntity; } } diff --git a/src/services/customer/DocumentsService/DocumentsService.ts b/src/services/customer/DocumentsService/DocumentsService.ts index b5d470e0..e8aeec5e 100644 --- a/src/services/customer/DocumentsService/DocumentsService.ts +++ b/src/services/customer/DocumentsService/DocumentsService.ts @@ -14,7 +14,7 @@ export default class DocumentsService extends BaseService { * @description : Get all documents * @throws {Error} If documents cannot be get */ - public async get(query: any) { + public async get(query: any): Promise { return this.documentsRepository.findMany(query); } @@ -54,7 +54,7 @@ export default class DocumentsService extends BaseService { * @description : Get a document by uid * @throws {Error} If document cannot be get by uid */ - public async getByUid(uid: string, query?: any) { + public async getByUid(uid: string, query?: any): Promise { return this.documentsRepository.findOneByUid(uid, query); } } diff --git a/src/services/private-services/AddressesService/AddressesService.ts b/src/services/private-services/AddressesService/AddressesService.ts index 41e53765..4054aaba 100644 --- a/src/services/private-services/AddressesService/AddressesService.ts +++ b/src/services/private-services/AddressesService/AddressesService.ts @@ -1,5 +1,6 @@ import AddressesRepository from "@Repositories/AddressesRepository"; import BaseService from "@Services/BaseService"; +import { Addresses } from "@prisma/client"; import { Service } from "typedi"; @Service() @@ -12,7 +13,7 @@ export default class AddressesService extends BaseService { * @description : Get all addresses * @throws {Error} If addresses cannot be get */ - public async get(query: any) { + public async get(query: any): Promise { return this.addressRepository.findMany(query); } @@ -20,7 +21,7 @@ export default class AddressesService extends BaseService { * @description : Get a address by uid * @throws {Error} If address cannot be get */ - public async getByUid(uid: string) { + public async getByUid(uid: string): Promise { return this.addressRepository.findOneByUid(uid); } } diff --git a/src/services/private-services/ContactsService/ContactsService.ts b/src/services/private-services/ContactsService/ContactsService.ts index 4d381a84..116c9cbe 100644 --- a/src/services/private-services/ContactsService/ContactsService.ts +++ b/src/services/private-services/ContactsService/ContactsService.ts @@ -1,5 +1,6 @@ import ContactsRepository from "@Repositories/ContactsRepository"; import BaseService from "@Services/BaseService"; +import { Contacts } from "@prisma/client"; import { Service } from "typedi"; @Service() @@ -12,7 +13,7 @@ export default class ContactsService extends BaseService { * @description : Get all contacts * @throws {Error} If contacts cannot be get */ - public async get(query: any) { + public async get(query: any): Promise { return this.contactRepository.findMany(query); } @@ -20,7 +21,7 @@ export default class ContactsService extends BaseService { * @description : Get a contact by uid * @throws {Error} If contact cannot be get */ - public async getByUid(uid: string) { + public async getByUid(uid: string): Promise { return this.contactRepository.findOneByUid(uid); } } diff --git a/src/services/private-services/FilesService/FilesService.ts b/src/services/private-services/FilesService/FilesService.ts index 6aacc1d0..6e88a91f 100644 --- a/src/services/private-services/FilesService/FilesService.ts +++ b/src/services/private-services/FilesService/FilesService.ts @@ -7,6 +7,7 @@ import IpfsService from "../IpfsService/IpfsService"; import { BackendVariables } from "@Common/config/variables/Variables"; import { Readable } from "stream"; import { v4 } from "uuid"; +import { Files } from "@prisma/client"; @Service() export default class FilesService extends BaseService { @@ -23,7 +24,7 @@ export default class FilesService extends BaseService { * @description : Get all files * @throws {Error} If files cannot be ge */ - public async get(query: any) { + public async get(query: any): Promise { return this.filesRepository.findMany(query); } @@ -31,7 +32,7 @@ export default class FilesService extends BaseService { * @description : Get a file by uid * @throws {Error} If project cannot be created */ - public async getByUid(uid: string) { + public async getByUid(uid: string): Promise { return this.filesRepository.findOneByUid(uid); } @@ -41,6 +42,7 @@ export default class FilesService extends BaseService { */ public async download(uid: string) { const file = await this.filesRepository.findOneByUid(uid); + console.log(file, uid); if (!file?.key) return null; const fileResult = await fetch(file.file_path); const fileContent = await fileResult.arrayBuffer(); @@ -51,7 +53,7 @@ export default class FilesService extends BaseService { * @description : Create a new file * @throws {Error} If file cannot be created */ - public async create(file: File, fileData: Express.Multer.File) { + public async create(file: File, fileData: Express.Multer.File): Promise { const key = v4(); fileData.mimetype; fileData.size; @@ -67,7 +69,7 @@ export default class FilesService extends BaseService { * @description : Modify a new file * @throws {Error} If file cannot be modified */ - public async update(uid: string, file: File) { + public async update(uid: string, file: File): Promise { return this.filesRepository.update(uid, file); } @@ -75,10 +77,10 @@ export default class FilesService extends BaseService { * @description : Delete a file key and archive * @throws {Error} If file key cannot be deleted or archived */ - public async deleteKeyAndArchive(uid: string) { + public async deleteKeyAndArchive(uid: string): Promise { try { const fileToUnpin = await this.filesRepository.findOneByUid(uid); - if(!fileToUnpin) return null; + if(!fileToUnpin) throw new Error("file not found"); const fileHash = fileToUnpin.file_path.substring(this.variables.PINATA_GATEWAY.length); await this.ipfsService.unpinFile(fileHash); } catch(error) { diff --git a/src/services/super-admin/CustomersService/CustomersService.ts b/src/services/super-admin/CustomersService/CustomersService.ts index 80765051..95c702ef 100644 --- a/src/services/super-admin/CustomersService/CustomersService.ts +++ b/src/services/super-admin/CustomersService/CustomersService.ts @@ -38,7 +38,7 @@ export default class CustomersService extends BaseService { * @description : Get a customer by uid * @throws {Error} If customer cannot be get by uid */ - public async getByUid(uid: string, query?: any): Promise { + public async getByUid(uid: string, query?: any): Promise { return this.customerRepository.findOneByUid(uid, query); } } diff --git a/src/services/super-admin/DeedTypesService/DeedTypesService.ts b/src/services/super-admin/DeedTypesService/DeedTypesService.ts index da71909e..7bb48f09 100644 --- a/src/services/super-admin/DeedTypesService/DeedTypesService.ts +++ b/src/services/super-admin/DeedTypesService/DeedTypesService.ts @@ -40,7 +40,7 @@ export default class DeedTypesService extends BaseService { * @description : Get a deedtype by uid * @throws {Error} If deed-type cannot be get by uid */ - public async getByUid(uid: string, query?: any) { + public async getByUid(uid: string, query?: any): Promise { return this.deedTypeRepository.findOneByUid(uid, query); } } diff --git a/src/services/super-admin/DeedsService/DeedsService.ts b/src/services/super-admin/DeedsService/DeedsService.ts index 93a6c6bd..055d24cf 100644 --- a/src/services/super-admin/DeedsService/DeedsService.ts +++ b/src/services/super-admin/DeedsService/DeedsService.ts @@ -38,7 +38,7 @@ export default class DeedsService extends BaseService { * @description : Get a deed by uid * @throws {Error} If deed-type cannot be get by uid */ - public async getByUid(uid: string, query?: any) { + public async getByUid(uid: string, query?: any): Promise { return this.deedRepository.findOneByUid(uid, query); } } diff --git a/src/services/super-admin/DocumentTypesService/DocumentTypesService.ts b/src/services/super-admin/DocumentTypesService/DocumentTypesService.ts index dacfe17f..0f93d721 100644 --- a/src/services/super-admin/DocumentTypesService/DocumentTypesService.ts +++ b/src/services/super-admin/DocumentTypesService/DocumentTypesService.ts @@ -14,7 +14,7 @@ export default class DocumentTypesService extends BaseService { * @description : Get all document-types * @throws {Error} If document-types cannot be get */ - public async get(query: any) { + public async get(query: any): Promise { return this.documentTypeRepository.findMany(query); } @@ -38,7 +38,7 @@ export default class DocumentTypesService extends BaseService { * @description : Get a document-type by uid * @throws {Error} If document-type is not found */ - public async getByUid(uid: string, query?: any) { + public async getByUid(uid: string, query?: any): Promise { return this.documentTypeRepository.findOneByUid(uid, query); } } diff --git a/src/services/super-admin/DocumentsService/DocumentsService.ts b/src/services/super-admin/DocumentsService/DocumentsService.ts index 81a0d8bc..f12e253f 100644 --- a/src/services/super-admin/DocumentsService/DocumentsService.ts +++ b/src/services/super-admin/DocumentsService/DocumentsService.ts @@ -48,7 +48,7 @@ export default class DocumentsService extends BaseService { */ 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" }); if (document.files && document.files.length !== 0) { @@ -61,7 +61,7 @@ export default class DocumentsService extends BaseService { * @description : Get a document by uid * @throws {Error} If document cannot be get by uid */ - public async getByUid(uid: string, query?: any) { + public async getByUid(uid: string, query?: any): Promise { return this.documentsRepository.findOneByUid(uid, query); } } diff --git a/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts b/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts index 128070e4..e0740d28 100644 --- a/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts +++ b/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts @@ -21,7 +21,7 @@ export default class OfficeFoldersService extends BaseService { * @description : Get all folders * @throws {Error} If folders cannot be get */ - public async get(query: any) { + public async get(query: any): Promise { return this.officeFoldersRepository.findMany(query); } @@ -31,6 +31,7 @@ export default class OfficeFoldersService extends BaseService { */ public async create(officeFolderEntity: OfficeFolder): Promise { const deedType = await this.deedTypeService.getByUid(officeFolderEntity.deed!.deed_type!.uid!); + if(!deedType) throw new Error('deed type not found'); if(deedType.archived_at) throw new Error('deed type is archived'); const deed = await this.deedRepository.create(officeFolderEntity.deed!); officeFolderEntity.deed!.uid = deed.uid; @@ -49,7 +50,7 @@ export default class OfficeFoldersService extends BaseService { * @description : Get a folder by uid * @throws {Error} If folder cannot be get by uid */ - public async getByUid(uid: string, query?: any) { + public async getByUid(uid: string, query?: any): Promise { return this.officeFoldersRepository.findOneByUid(uid, query); } @@ -57,8 +58,9 @@ export default class OfficeFoldersService extends BaseService { * @description : Delete a folder * @throws {Error} If document cannot be deleted */ - public async delete(uid: string): Promise { + public async delete(uid: string): Promise { const officeFolderEntity = await this.officeFoldersRepository.findOneByUid(uid, { office_folder_has_customers: true }); + if(!officeFolderEntity) throw new Error('office folder not found'); const officeFolder = OfficeFolder.hydrate(officeFolderEntity, { strategy: "excludeAll" }); if (officeFolder.office_folder_has_customers && officeFolder.office_folder_has_customers.length !== 0) { diff --git a/src/services/super-admin/OfficesService/OfficesService.ts b/src/services/super-admin/OfficesService/OfficesService.ts index 4de766be..441da71b 100644 --- a/src/services/super-admin/OfficesService/OfficesService.ts +++ b/src/services/super-admin/OfficesService/OfficesService.ts @@ -38,7 +38,7 @@ export default class OfficesService extends BaseService { * @description : Get a office by uid * @throws {Error} If office cannot be get */ - public async getByUid(uid: string, query?: any): Promise { + public async getByUid(uid: string, query?: any): Promise { return this.officeRepository.findOneByUid(uid, query); } } diff --git a/src/services/super-admin/UsersService/UsersService.ts b/src/services/super-admin/UsersService/UsersService.ts index fcdbf428..7846b23d 100644 --- a/src/services/super-admin/UsersService/UsersService.ts +++ b/src/services/super-admin/UsersService/UsersService.ts @@ -39,7 +39,7 @@ export default class UsersService extends BaseService { * @description : Get a user by uid * @throws {Error} If user cannot be get by uid */ - public getByUid(uid: string, query?: any): Promise { + public getByUid(uid: string, query?: any): Promise { return this.userRepository.findOneByUid(uid, query); } } From 71b39d6e55d22b627bd325d8a3dab496ec035bb9 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Mon, 15 May 2023 12:07:08 +0200 Subject: [PATCH 007/134] add created http code and notFoundErrors on put and delete --- src/app/api/customer/DocumentsController.ts | 28 ++++++++++++++----- .../api/super-admin/CustomersController.ts | 10 ++++++- .../api/super-admin/DeedTypesController.ts | 10 ++++++- src/app/api/super-admin/DeedsController.ts | 8 ++++++ .../super-admin/DocumentTypesController.ts | 9 +++++- .../api/super-admin/DocumentsController.ts | 18 ++++++++++-- src/app/api/super-admin/FilesController.ts | 18 ++++++++++-- .../super-admin/OfficeFoldersController.ts | 17 ++++++++++- src/app/api/super-admin/OfficesController.ts | 9 +++++- src/app/api/super-admin/UsersController.ts | 10 ++++++- .../controller-pattern/BaseController.ts | 2 +- 11 files changed, 121 insertions(+), 18 deletions(-) diff --git a/src/app/api/customer/DocumentsController.ts b/src/app/api/customer/DocumentsController.ts index 419062dc..85b64290 100644 --- a/src/app/api/customer/DocumentsController.ts +++ b/src/app/api/customer/DocumentsController.ts @@ -33,7 +33,7 @@ export default class DocumentsController extends ApiController { //success this.httpSuccess(response, documents); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -62,7 +62,7 @@ export default class DocumentsController extends ApiController { //success this.httpSuccess(response, document); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -79,6 +79,13 @@ export default class DocumentsController extends ApiController { return; } + const documentFound = await this.documentsService.getByUid(uid); + + if (!documentFound) { + this.httpNotFoundRequest(response, "document not found"); + return; + } + //init Document resource with request body values const documentEntity = new Document(); Document.hydrate(documentEntity, req.body); @@ -95,7 +102,7 @@ export default class DocumentsController extends ApiController { //success this.httpSuccess(response, document); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -112,16 +119,23 @@ export default class DocumentsController extends ApiController { return; } + const documentEntity = await this.documentsService.getByUid(uid); + + if (!documentEntity) { + this.httpNotFoundRequest(response, "document not found"); + return; + } + //call service to get prisma entity - const documentEntity: Documents = await this.documentsService.delete(uid); + const documentEntityDeleted: Documents = await this.documentsService.delete(uid); //Hydrate ressource with prisma entity - const document = Document.hydrate(documentEntity, { strategy: "excludeAll" }); + const document = Document.hydrate(documentEntityDeleted, { strategy: "excludeAll" }); //success this.httpSuccess(response, document); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } @@ -159,7 +173,7 @@ export default class DocumentsController extends ApiController { //success this.httpSuccess(response, document); } catch (error) { - this.httpBadRequest(response, error); + this.httpInternalError(response); return; } } diff --git a/src/app/api/super-admin/CustomersController.ts b/src/app/api/super-admin/CustomersController.ts index 641fa2ef..96e1b7b6 100644 --- a/src/app/api/super-admin/CustomersController.ts +++ b/src/app/api/super-admin/CustomersController.ts @@ -56,7 +56,7 @@ export default class CustomersController extends ApiController { }); //success - this.httpSuccess(response, customer); + this.httpCreated(response, customer); } catch (error) { this.httpInternalError(response); return; @@ -74,6 +74,14 @@ export default class CustomersController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } + + const userFound = await this.customersService.getByUid(uid); + + if (!userFound) { + this.httpNotFoundRequest(response, "user not found"); + return; + } + //init IUser resource with request body values const customerEntity = Customer.hydrate(req.body); diff --git a/src/app/api/super-admin/DeedTypesController.ts b/src/app/api/super-admin/DeedTypesController.ts index ba9c6e03..974a0d88 100644 --- a/src/app/api/super-admin/DeedTypesController.ts +++ b/src/app/api/super-admin/DeedTypesController.ts @@ -59,7 +59,7 @@ export default class DeedTypesController extends ApiController { }); //success - this.httpSuccess(response, deedType); + this.httpCreated(response, deedType); } catch (error) { this.httpInternalError(response); return; @@ -78,6 +78,14 @@ export default class DeedTypesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } + + const deedTypeFound = await this.deedTypesService.getByUid(uid); + + if (!deedTypeFound) { + this.httpNotFoundRequest(response, "deed type not found"); + return; + } + //init DeedType resource with request body values const deedTypeEntity = DeedType.hydrate(req.body); diff --git a/src/app/api/super-admin/DeedsController.ts b/src/app/api/super-admin/DeedsController.ts index 676c5f79..d03d3ee8 100644 --- a/src/app/api/super-admin/DeedsController.ts +++ b/src/app/api/super-admin/DeedsController.ts @@ -87,6 +87,14 @@ export default class DeedsController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } + + const deedFound = await this.deedsService.getByUid(uid); + + if (!deedFound) { + this.httpNotFoundRequest(response, "deed not found"); + return; + } + //init OfficeFolder resource with request body values const deedEntity = Deed.hydrate(req.body); diff --git a/src/app/api/super-admin/DocumentTypesController.ts b/src/app/api/super-admin/DocumentTypesController.ts index 802ffcf6..d03c37ae 100644 --- a/src/app/api/super-admin/DocumentTypesController.ts +++ b/src/app/api/super-admin/DocumentTypesController.ts @@ -57,7 +57,7 @@ export default class DocumentTypesController extends ApiController { strategy: "excludeAll", }); //success - this.httpSuccess(response, userEntityCreated); + this.httpCreated(response, userEntityCreated); } catch (error) { this.httpInternalError(response); return; @@ -75,6 +75,13 @@ export default class DocumentTypesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } + + const documentTypeFound = await this.documentTypesService.getByUid(uid); + + if (!documentTypeFound) { + this.httpNotFoundRequest(response, "document type not found"); + return; + } //init DocumentType resource with request body values const documentTypeEntity = DocumentType.hydrate(req.body); diff --git a/src/app/api/super-admin/DocumentsController.ts b/src/app/api/super-admin/DocumentsController.ts index 0a83078b..59ee08e5 100644 --- a/src/app/api/super-admin/DocumentsController.ts +++ b/src/app/api/super-admin/DocumentsController.ts @@ -60,7 +60,7 @@ export default class DocumentsController extends ApiController { }); //success - this.httpSuccess(response, document); + this.httpCreated(response, document); } catch (error) { this.httpInternalError(response); return; @@ -77,7 +77,14 @@ export default class DocumentsController extends ApiController { if (!uid) { this.httpBadRequest(response, "No uid provided"); return; - } + } + + const documentFound = await this.documentsService.getByUid(uid); + + if (!documentFound) { + this.httpNotFoundRequest(response, "document not found"); + return; + } //init Document resource with request body values const documentEntity = Document.hydrate(req.body); @@ -111,6 +118,13 @@ export default class DocumentsController extends ApiController { return; } + const documentFound = await this.documentsService.getByUid(uid); + + if (!documentFound) { + this.httpNotFoundRequest(response, "document not found"); + return; + } + //call service to get prisma entity const documentEntity: Documents = await this.documentsService.delete(uid); diff --git a/src/app/api/super-admin/FilesController.ts b/src/app/api/super-admin/FilesController.ts index eb50b90b..745bac2a 100644 --- a/src/app/api/super-admin/FilesController.ts +++ b/src/app/api/super-admin/FilesController.ts @@ -53,7 +53,7 @@ export default class FilesController extends ApiController { const fileInfo = await this.filesService.download(uid); if (!fileInfo) { - this.httpNotFoundRequest(response); + this.httpNotFoundRequest(response, "file not found"); return; } @@ -103,7 +103,7 @@ export default class FilesController extends ApiController { }); //success - this.httpSuccess(response, fileEntityHydrated); + this.httpCreated(response, fileEntityHydrated); } catch (error) { this.httpBadRequest(response, error); return; @@ -121,6 +121,13 @@ export default class FilesController extends ApiController { throw new Error("No uid provided"); } + const fileFound = await this.filesService.getByUid(uid); + + if (!fileFound) { + this.httpNotFoundRequest(response, "file not found"); + return; + } + //init File resource with request body values const fileEntity = File.hydrate(req.body); @@ -153,6 +160,13 @@ export default class FilesController extends ApiController { return; } + const fileFound = await this.filesService.getByUid(uid); + + if (!fileFound) { + this.httpNotFoundRequest(response, "file not found"); + return; + } + //call service to get prisma entity const fileEntity = await this.filesService.deleteKeyAndArchive(uid); diff --git a/src/app/api/super-admin/OfficeFoldersController.ts b/src/app/api/super-admin/OfficeFoldersController.ts index 7bd245b3..4c642835 100644 --- a/src/app/api/super-admin/OfficeFoldersController.ts +++ b/src/app/api/super-admin/OfficeFoldersController.ts @@ -54,7 +54,7 @@ export default class OfficeFoldersController extends ApiController { strategy: "excludeAll", }); //success - this.httpSuccess(response, officeFolders); + this.httpCreated(response, officeFolders); } catch (error) { this.httpInternalError(response); return; @@ -72,6 +72,14 @@ export default class OfficeFoldersController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } + + const officeFolderFound = await this.officeFoldersService.getByUid(uid); + + if (!officeFolderFound) { + this.httpNotFoundRequest(response, "office folder not found"); + return; + } + //init OfficeFolder resource with request body values const officeFolderEntity = OfficeFolder.hydrate(req.body); @@ -146,6 +154,13 @@ export default class OfficeFoldersController extends ApiController { return; } + const officeFolderFound = await this.officeFoldersService.getByUid(uid); + + if (!officeFolderFound) { + this.httpNotFoundRequest(response, "office folder not found"); + return; + } + //call service to get prisma entity const officeFoldertEntity: OfficeFolders = await this.officeFoldersService.delete(uid); diff --git a/src/app/api/super-admin/OfficesController.ts b/src/app/api/super-admin/OfficesController.ts index 397cdba5..820ccade 100644 --- a/src/app/api/super-admin/OfficesController.ts +++ b/src/app/api/super-admin/OfficesController.ts @@ -49,7 +49,7 @@ export default class OfficesController extends ApiController { strategy: "excludeAll", }); //success - this.httpSuccess(response, office); + this.httpCreated(response, office); } catch (error) { this.httpInternalError(response); return; @@ -66,6 +66,13 @@ export default class OfficesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } + + const officeFound = await this.officesService.getByUid(uid); + + if (!officeFound) { + this.httpNotFoundRequest(response, "office not found"); + return; + } //init IUser resource with request body values const officeEntity = OfficeResource.hydrate(req.body); //validate user diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index c0ff65ff..7ba6f437 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -58,7 +58,7 @@ export default class UsersController extends ApiController { }); //success - this.httpSuccess(response, user); + this.httpCreated(response, user); } catch (error) { this.httpInternalError(response); return; @@ -76,6 +76,14 @@ export default class UsersController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } + + const userFound = await this.usersService.getByUid(uid); + + if (!userFound) { + this.httpNotFoundRequest(response, "user not found"); + return; + } + //init IUser resource with request body values const userEntity = User.hydrate(req.body); diff --git a/src/common/system/controller-pattern/BaseController.ts b/src/common/system/controller-pattern/BaseController.ts index 24906610..27eb5aa9 100644 --- a/src/common/system/controller-pattern/BaseController.ts +++ b/src/common/system/controller-pattern/BaseController.ts @@ -28,7 +28,7 @@ export default abstract class BaseController { return this.httpResponse(response, HttpCodes.INTERNAL_ERROR, responseData); } - protected httpNotImplemented(response: Response, responseData: IResponseData = "http Internal Server Error") { + protected httpNotImplemented(response: Response, responseData: IResponseData = "Not implemented") { return this.httpResponse(response, HttpCodes.NOT_IMPLEMENTED, responseData); } From b6f1e11f53f5e71a966bb7540e95e980ad9ce177 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Mon, 15 May 2023 11:26:21 +0200 Subject: [PATCH 008/134] add mimetype and size of files --- package.json | 2 +- src/app/api/super-admin/FilesController.ts | 3 +-- src/common/databases/schema.prisma | 2 ++ src/common/repositories/FilesRepository.ts | 2 ++ .../FilesService/FilesService.ts | 22 ++++++++++++++----- 5 files changed, 23 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 45a5412f..a6afd3e1 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "cors": "^2.8.5", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.49", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.50", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", diff --git a/src/app/api/super-admin/FilesController.ts b/src/app/api/super-admin/FilesController.ts index 745bac2a..ff81a1a4 100644 --- a/src/app/api/super-admin/FilesController.ts +++ b/src/app/api/super-admin/FilesController.ts @@ -57,8 +57,7 @@ export default class FilesController extends ApiController { return; } - const type = fileInfo.file.file_name.split(".").pop(); - if (type?.toLowerCase() === "pdf") response.setHeader("Content-Type", "application/pdf"); + response.setHeader("Content-Type", fileInfo.file.mimetype); response.setHeader("Content-Disposition", `inline; filename=${encodeURIComponent(fileInfo.file.file_name)}`); this.httpSuccess(response, fileInfo.buffer); diff --git a/src/common/databases/schema.prisma b/src/common/databases/schema.prisma index 742b331b..f9035aa2 100644 --- a/src/common/databases/schema.prisma +++ b/src/common/databases/schema.prisma @@ -204,6 +204,8 @@ model Files { document_uid String @db.VarChar(255) file_path String @unique @db.VarChar(255) file_name String @db.VarChar(255) + mimetype String @db.VarChar(255) + size Int archived_at DateTime? key String? @db.VarChar(255) created_at DateTime? @default(now()) diff --git a/src/common/repositories/FilesRepository.ts b/src/common/repositories/FilesRepository.ts index cc75dbf1..9a0816c9 100644 --- a/src/common/repositories/FilesRepository.ts +++ b/src/common/repositories/FilesRepository.ts @@ -37,6 +37,8 @@ export default class FilesRepository extends BaseRepository { }, file_name: file.file_name, file_path: file.file_path, + mimetype: file.mimetype, + size: file.size, key: key }, include: { document: true } diff --git a/src/services/private-services/FilesService/FilesService.ts b/src/services/private-services/FilesService/FilesService.ts index 6e88a91f..fe1ae559 100644 --- a/src/services/private-services/FilesService/FilesService.ts +++ b/src/services/private-services/FilesService/FilesService.ts @@ -6,8 +6,12 @@ import CryptoService from "../CryptoService/CryptoService"; import IpfsService from "../IpfsService/IpfsService"; import { BackendVariables } from "@Common/config/variables/Variables"; import { Readable } from "stream"; +<<<<<<< HEAD import { v4 } from "uuid"; import { Files } from "@prisma/client"; +======= +import uuid from "uuid"; +>>>>>>> 14db92d (add mimetype and size of files) @Service() export default class FilesService extends BaseService { @@ -45,24 +49,32 @@ export default class FilesService extends BaseService { console.log(file, uid); if (!file?.key) return null; const fileResult = await fetch(file.file_path); - const fileContent = await fileResult.arrayBuffer(); - return {file: file, buffer: await this.cryptoService.decrypt(Buffer.from(fileContent), file.key)}; + const fileArrayBuffer = await fileResult.arrayBuffer(); + return {file: file, buffer: await this.cryptoService.decrypt(Buffer.from(fileArrayBuffer), file.key)}; } /** * @description : Create a new file * @throws {Error} If file cannot be created */ +<<<<<<< HEAD public async create(file: File, fileData: Express.Multer.File): Promise { const key = v4(); fileData.mimetype; fileData.size; +======= + public async create(file: File, fileData: Express.Multer.File) { + const key = uuid.v4(); +>>>>>>> 14db92d (add mimetype and size of files) const encryptedFile = await this.cryptoService.encrypt(fileData.buffer, key); const upload = await this.ipfsService.pinFile(Readable.from(encryptedFile), fileData.originalname); - file.file_name = fileData.originalname; //encryptedFileName.toString('utf-8') - file.file_path = this.variables.PINATA_GATEWAY.concat(upload.IpfsHash); + const fileToCreate: File = file; + fileToCreate.file_name = fileData.originalname; + fileToCreate.file_path = this.variables.PINATA_GATEWAY.concat(upload.IpfsHash); + fileToCreate.mimetype = fileData.mimetype; + fileToCreate.size = fileData.size; - return this.filesRepository.create(file, key); + return this.filesRepository.create(fileToCreate, key); } /** From 2e4ca63d9d129038b631b02588ee7aa402181665 Mon Sep 17 00:00:00 2001 From: Vincent Alamelle Date: Mon, 15 May 2023 15:45:50 +0200 Subject: [PATCH 009/134] Added error log to controller --- package-lock.json | 170 ++++++++++-------- .../api/super-admin/CustomersController.ts | 8 +- .../api/super-admin/DeedTypesController.ts | 8 +- src/app/api/super-admin/DeedsController.ts | 6 +- .../super-admin/DocumentTypesController.ts | 8 +- .../api/super-admin/DocumentsController.ts | 10 +- src/app/api/super-admin/FilesController.ts | 6 +- .../super-admin/OfficeFoldersController.ts | 12 +- src/app/api/super-admin/OfficesController.ts | 8 +- src/app/api/super-admin/UsersController.ts | 8 +- src/common/databases/seeders/seeder.ts | 31 ---- .../FilesService/FilesService.ts | 13 +- .../OfficeFoldersService.ts | 2 +- 13 files changed, 131 insertions(+), 159 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2b3ba769..6df3d498 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "cors": "^2.8.5", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.47", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.50", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", @@ -1043,14 +1043,14 @@ "dev": true }, "node_modules/@next/env": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.1.tgz", - "integrity": "sha512-eD6WCBMFjLFooLM19SIhSkWBHtaFrZFfg2Cxnyl3vS3DAdFRfnx5TY2RxlkuKXdIRCC0ySbtK9JXXt8qLCqzZg==" + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.2.tgz", + "integrity": "sha512-Wqvo7lDeS0KGwtwg9TT9wKQ8raelmUxt+TQKWvG/xKfcmDXNOtCuaszcfCF8JzlBG1q0VhpI6CKaRMbVPMDWgw==" }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.1.tgz", - "integrity": "sha512-eF8ARHtYfnoYtDa6xFHriUKA/Mfj/cCbmKb3NofeKhMccs65G6/loZ15a6wYCCx4rPAd6x4t1WmVYtri7EdeBg==", + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.2.tgz", + "integrity": "sha512-6BBlqGu3ewgJflv9iLCwO1v1hqlecaIH2AotpKfVUEzUxuuDNJQZ2a4KLb4MBl8T9/vca1YuWhSqtbF6ZuUJJw==", "cpu": [ "arm64" ], @@ -1063,9 +1063,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.1.tgz", - "integrity": "sha512-7cmDgF9tGWTgn5Gw+vP17miJbH4wcraMHDCOHTYWkO/VeKT73dUWG23TNRLfgtCNSPgH4V5B4uLHoZTanx9bAw==", + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.2.tgz", + "integrity": "sha512-iZuYr7ZvGLPjPmfhhMl0ISm+z8EiyLBC1bLyFwGBxkWmPXqdJ60mzuTaDSr5WezDwv0fz32HB7JHmRC6JVHSZg==", "cpu": [ "x64" ], @@ -1078,9 +1078,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.1.tgz", - "integrity": "sha512-qwJqmCri2ie8aTtE5gjTSr8S6O8B67KCYgVZhv9gKH44yvc/zXbAY8u23QGULsYOyh1islWE5sWfQNLOj9iryg==", + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.2.tgz", + "integrity": "sha512-2xVabFtIge6BJTcJrW8YuUnYTuQjh4jEuRuS2mscyNVOj6zUZkom3CQg+egKOoS+zh2rrro66ffSKIS+ztFJTg==", "cpu": [ "arm64" ], @@ -1093,9 +1093,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.1.tgz", - "integrity": "sha512-qcC54tWNGDv/VVIFkazxhqH1Bnagjfs4enzELVRlUOoJPD2BGJTPI7z08pQPbbgxLtRiu8gl2mXvpB8WlOkMeA==", + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.2.tgz", + "integrity": "sha512-wKRCQ27xCUJx5d6IivfjYGq8oVngqIhlhSAJntgXLt7Uo9sRT/3EppMHqUZRfyuNBTbykEre1s5166z+pvRB5A==", "cpu": [ "arm64" ], @@ -1108,9 +1108,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.1.tgz", - "integrity": "sha512-9TeWFlpLsBosZ+tsm/rWBaMwt5It9tPH8m3nawZqFUUrZyGRfGcI67js774vtx0k3rL9qbyY6+3pw9BCVpaYUA==", + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.2.tgz", + "integrity": "sha512-NpCa+UVhhuNeaFVUP1Bftm0uqtvLWq2JTm7+Ta48+2Uqj2mNXrDIvyn1DY/ZEfmW/1yvGBRaUAv9zkMkMRixQA==", "cpu": [ "x64" ], @@ -1123,9 +1123,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.1.tgz", - "integrity": "sha512-sNDGaWmSqTS4QRUzw61wl4mVPeSqNIr1OOjLlQTRuyInxMxtqImRqdvzDvFTlDfdeUMU/DZhWGYoHrXLlZXe6A==", + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.2.tgz", + "integrity": "sha512-ZWVC72x0lW4aj44e3khvBrj2oSYj1bD0jESmyah3zG/3DplEy/FOtYkMzbMjHTdDSheso7zH8GIlW6CDQnKhmQ==", "cpu": [ "x64" ], @@ -1138,9 +1138,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.1.tgz", - "integrity": "sha512-+CXZC7u1iXdLRudecoUYbhbsXpglYv8KFYsFxKBPn7kg+bk7eJo738wAA4jXIl8grTF2mPdmO93JOQym+BlYGA==", + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.2.tgz", + "integrity": "sha512-pLT+OWYpzJig5K4VKhLttlIfBcVZfr2+Xbjra0Tjs83NQSkFS+y7xx+YhCwvpEmXYLIvaggj2ONPyjbiigOvHQ==", "cpu": [ "arm64" ], @@ -1153,9 +1153,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.1.tgz", - "integrity": "sha512-vIoXVVc7UYO68VwVMDKwJC2+HqAZQtCYiVlApyKEeIPIQpz2gpufzGxk1z3/gwrJt/kJ5CDZjlhYDCzd3hdz+g==", + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.2.tgz", + "integrity": "sha512-dhpiksQCyGca4WY0fJyzK3FxMDFoqMb0Cn+uDB+9GYjpU2K5//UGPQlCwiK4JHxuhg8oLMag5Nf3/IPSJNG8jw==", "cpu": [ "ia32" ], @@ -1168,9 +1168,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.1.tgz", - "integrity": "sha512-n8V5ImLQZibKTu10UUdI3nIeTLkliEXe628qxqW9v8My3BAH2a7H0SaCqkV2OgqFnn8sG1wxKYw9/SNJ632kSA==", + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.2.tgz", + "integrity": "sha512-O7bort1Vld00cu8g0jHZq3cbSTUNMohOEvYqsqE10+yfohhdPHzvzO+ziJRz4Dyyr/fYKREwS7gR4JC0soSOMw==", "cpu": [ "x64" ], @@ -1232,21 +1232,21 @@ "dev": true }, "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.1.0.tgz", + "integrity": "sha512-w1qd368vtrwttm1PRJWPW1QHlbmHrVDGs1eBH/jZvRPUFS4MNXV9Q33EQdjOdeAxZ7O8+3wM7zxztm2nfUSyKw==", "dev": true, "dependencies": { - "@sinonjs/commons": "^2.0.0" + "@sinonjs/commons": "^3.0.0" } }, "node_modules/@swc/helpers": { @@ -1273,9 +1273,9 @@ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" }, "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" }, "node_modules/@types/babel__core": { "version": "7.20.0", @@ -1359,9 +1359,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.34", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.34.tgz", - "integrity": "sha512-fvr49XlCGoUj2Pp730AItckfjat4WNb0lb3kfrLWffd+RLeoGAMsq7UOy04PAPtoL01uKwcp6u8nhzpgpDYr3w==", + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", "dev": true, "dependencies": { "@types/node": "*", @@ -1438,9 +1438,9 @@ } }, "node_modules/@types/node": { - "version": "18.16.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.7.tgz", - "integrity": "sha512-MFg7ua/bRtnA1hYE3pVyWxGd/r7aMqjNOdHvlSsXV3n8iaeGKkOaPzpJh6/ovf4bEXWcojkeMJpTsq3mzXW4IQ==" + "version": "18.16.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.9.tgz", + "integrity": "sha512-IeB32oIV4oGArLrd7znD2rkHQ6EDCM+2Sr76dJnrHwv9OHBTTM6nuDLK9bmikXzPa0ZlWMWtRGo/Uw4mrzQedA==" }, "node_modules/@types/node-schedule": { "version": "2.1.0", @@ -1965,9 +1965,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001486", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001486.tgz", - "integrity": "sha512-uv7/gXuHi10Whlj0pp5q/tsK/32J2QSqVRKQhs2j8VsDCjgyruAh/eEXHF822VqO9yT6iZKw3nRwZRSPBE9OQg==", + "version": "1.0.30001487", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001487.tgz", + "integrity": "sha512-83564Z3yWGqXsh2vaH/mhXfEM0wX+NlBCm1jYHOb97TrTWJEmPTccZgeLTPBUUb0PNVo+oomb7wkimZBIERClA==", "funding": [ { "type": "opencollective", @@ -2372,9 +2372,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.391", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.391.tgz", - "integrity": "sha512-GqydVV1+kUWY5qlEzaw34/hyWTApuQrHiGrcGA2Kk/56nEK44i+YUW45VH43JuZT0Oo7uY8aVtpPhBBZXEWtSA==", + "version": "1.4.394", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.394.tgz", + "integrity": "sha512-0IbC2cfr8w5LxTz+nmn2cJTGafsK9iauV2r5A5scfzyovqLrxuLoxOHE5OBobP3oVIggJT+0JfKnw9sm87c8Hw==", "dev": true }, "node_modules/emittery": { @@ -2694,12 +2694,13 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { @@ -2794,6 +2795,17 @@ "node": ">=8" } }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -3620,9 +3632,9 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -3815,9 +3827,9 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/jsonwebtoken/node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3862,7 +3874,7 @@ } }, "node_modules/le-coffre-resources": { - "resolved": "git+ssh://git@github.com/smart-chain-fr/leCoffre-resources.git#467b34a484adbd6dfa3fd6082bb7677f6178da51", + "resolved": "git+ssh://git@github.com/smart-chain-fr/leCoffre-resources.git#f90ab464e3b0f9dd70601b9c8f8bbf5090b685a7", "license": "MIT", "dependencies": { "class-transformer": "^0.5.1", @@ -4276,11 +4288,11 @@ } }, "node_modules/next": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.1.tgz", - "integrity": "sha512-JBw2kAIyhKDpjhEWvNVoFeIzNp9xNxg8wrthDOtMctfn3EpqGCmW0FSviNyGgOSOSn6zDaX48pmvbdf6X2W9xA==", + "version": "13.4.2", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.2.tgz", + "integrity": "sha512-aNFqLs3a3nTGvLWlO9SUhCuMUHVPSFQC0+tDNGAsDXqx+WJDFSbvc233gOJ5H19SBc7nw36A9LwQepOJ2u/8Kg==", "dependencies": { - "@next/env": "13.4.1", + "@next/env": "13.4.2", "@swc/helpers": "0.5.1", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", @@ -4295,15 +4307,15 @@ "node": ">=16.8.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.1", - "@next/swc-darwin-x64": "13.4.1", - "@next/swc-linux-arm64-gnu": "13.4.1", - "@next/swc-linux-arm64-musl": "13.4.1", - "@next/swc-linux-x64-gnu": "13.4.1", - "@next/swc-linux-x64-musl": "13.4.1", - "@next/swc-win32-arm64-msvc": "13.4.1", - "@next/swc-win32-ia32-msvc": "13.4.1", - "@next/swc-win32-x64-msvc": "13.4.1" + "@next/swc-darwin-arm64": "13.4.2", + "@next/swc-darwin-x64": "13.4.2", + "@next/swc-linux-arm64-gnu": "13.4.2", + "@next/swc-linux-arm64-musl": "13.4.2", + "@next/swc-linux-x64-gnu": "13.4.2", + "@next/swc-linux-x64-musl": "13.4.2", + "@next/swc-win32-arm64-msvc": "13.4.2", + "@next/swc-win32-ia32-msvc": "13.4.2", + "@next/swc-win32-x64-msvc": "13.4.2" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -5467,9 +5479,9 @@ } }, "node_modules/ts-jest/node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" diff --git a/src/app/api/super-admin/CustomersController.ts b/src/app/api/super-admin/CustomersController.ts index 96e1b7b6..0db0059e 100644 --- a/src/app/api/super-admin/CustomersController.ts +++ b/src/app/api/super-admin/CustomersController.ts @@ -32,7 +32,7 @@ export default class CustomersController extends ApiController { //success this.httpSuccess(response, customers); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -58,7 +58,7 @@ export default class CustomersController extends ApiController { //success this.httpCreated(response, customer); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -99,7 +99,7 @@ export default class CustomersController extends ApiController { //success this.httpSuccess(response, customer); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -137,7 +137,7 @@ export default class CustomersController extends ApiController { //success this.httpSuccess(response, customer); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } diff --git a/src/app/api/super-admin/DeedTypesController.ts b/src/app/api/super-admin/DeedTypesController.ts index 974a0d88..df324a68 100644 --- a/src/app/api/super-admin/DeedTypesController.ts +++ b/src/app/api/super-admin/DeedTypesController.ts @@ -32,7 +32,7 @@ export default class DeedTypesController extends ApiController { //success this.httpSuccess(response, DeedTypes); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -61,7 +61,7 @@ export default class DeedTypesController extends ApiController { //success this.httpCreated(response, deedType); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -103,7 +103,7 @@ export default class DeedTypesController extends ApiController { //success this.httpSuccess(response, deedType); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -142,7 +142,7 @@ export default class DeedTypesController extends ApiController { //success this.httpSuccess(response, deedType); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } diff --git a/src/app/api/super-admin/DeedsController.ts b/src/app/api/super-admin/DeedsController.ts index d03d3ee8..87d6df7e 100644 --- a/src/app/api/super-admin/DeedsController.ts +++ b/src/app/api/super-admin/DeedsController.ts @@ -32,7 +32,7 @@ export default class DeedsController extends ApiController { //success this.httpSuccess(response, deeds); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -71,7 +71,7 @@ export default class DeedsController extends ApiController { //success this.httpSuccess(response, deed); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -112,7 +112,7 @@ export default class DeedsController extends ApiController { //success this.httpSuccess(response, deed); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } diff --git a/src/app/api/super-admin/DocumentTypesController.ts b/src/app/api/super-admin/DocumentTypesController.ts index d03c37ae..effa524a 100644 --- a/src/app/api/super-admin/DocumentTypesController.ts +++ b/src/app/api/super-admin/DocumentTypesController.ts @@ -35,7 +35,7 @@ export default class DocumentTypesController extends ApiController { //success this.httpSuccess(response, documentTypes); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -59,7 +59,7 @@ export default class DocumentTypesController extends ApiController { //success this.httpCreated(response, userEntityCreated); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -99,7 +99,7 @@ export default class DocumentTypesController extends ApiController { //success this.httpSuccess(response, documentType); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -137,7 +137,7 @@ export default class DocumentTypesController extends ApiController { //success this.httpSuccess(response, user); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } diff --git a/src/app/api/super-admin/DocumentsController.ts b/src/app/api/super-admin/DocumentsController.ts index 59ee08e5..ad3327f6 100644 --- a/src/app/api/super-admin/DocumentsController.ts +++ b/src/app/api/super-admin/DocumentsController.ts @@ -33,7 +33,7 @@ export default class DocumentsController extends ApiController { //success this.httpSuccess(response, documents); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -62,7 +62,7 @@ export default class DocumentsController extends ApiController { //success this.httpCreated(response, document); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -101,7 +101,7 @@ export default class DocumentsController extends ApiController { //success this.httpSuccess(response, document); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -134,7 +134,7 @@ export default class DocumentsController extends ApiController { //success this.httpSuccess(response, document); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -172,7 +172,7 @@ export default class DocumentsController extends ApiController { //success this.httpSuccess(response, document); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } diff --git a/src/app/api/super-admin/FilesController.ts b/src/app/api/super-admin/FilesController.ts index ff81a1a4..0d0fdf44 100644 --- a/src/app/api/super-admin/FilesController.ts +++ b/src/app/api/super-admin/FilesController.ts @@ -62,7 +62,7 @@ export default class FilesController extends ApiController { this.httpSuccess(response, fileInfo.buffer); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -180,7 +180,7 @@ export default class FilesController extends ApiController { //success this.httpSuccess(response, file); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -210,7 +210,7 @@ export default class FilesController extends ApiController { //success this.httpSuccess(response, file); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } diff --git a/src/app/api/super-admin/OfficeFoldersController.ts b/src/app/api/super-admin/OfficeFoldersController.ts index 4c642835..e7c9467f 100644 --- a/src/app/api/super-admin/OfficeFoldersController.ts +++ b/src/app/api/super-admin/OfficeFoldersController.ts @@ -22,8 +22,10 @@ export default class OfficeFoldersController extends ApiController { try { //get query const query = JSON.parse(req.query["q"] as string); + //call service to get prisma entity const officeFolderEntities: OfficeFolders[] = await this.officeFoldersService.get(query); + //Hydrate ressource with prisma entity const officeFolders = OfficeFolder.hydrateArray(OfficeFolder, officeFolderEntities, { strategy: "excludeAll", @@ -31,7 +33,7 @@ export default class OfficeFoldersController extends ApiController { //success this.httpSuccess(response, officeFolders); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -56,7 +58,7 @@ export default class OfficeFoldersController extends ApiController { //success this.httpCreated(response, officeFolders); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -97,7 +99,7 @@ export default class OfficeFoldersController extends ApiController { //success this.httpSuccess(response, officeFolders); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -136,7 +138,7 @@ export default class OfficeFoldersController extends ApiController { //success this.httpSuccess(response, officeFolder); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } this.httpSuccess(response, await this.officeFoldersService.getByUid("uid")); @@ -170,7 +172,7 @@ export default class OfficeFoldersController extends ApiController { //success this.httpSuccess(response, officeFolder); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } diff --git a/src/app/api/super-admin/OfficesController.ts b/src/app/api/super-admin/OfficesController.ts index 820ccade..dfbe4b1b 100644 --- a/src/app/api/super-admin/OfficesController.ts +++ b/src/app/api/super-admin/OfficesController.ts @@ -28,7 +28,7 @@ export default class OfficesController extends ApiController { //success this.httpSuccess(response, offices); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -51,7 +51,7 @@ export default class OfficesController extends ApiController { //success this.httpCreated(response, office); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -86,7 +86,7 @@ export default class OfficesController extends ApiController { //success this.httpSuccess(response, office); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -121,7 +121,7 @@ export default class OfficesController extends ApiController { //success this.httpSuccess(response, office); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index 7ba6f437..362b3444 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -32,7 +32,7 @@ export default class UsersController extends ApiController { //success this.httpSuccess(response, users); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -60,7 +60,7 @@ export default class UsersController extends ApiController { //success this.httpCreated(response, user); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -101,7 +101,7 @@ export default class UsersController extends ApiController { //success this.httpSuccess(response, user); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } @@ -138,7 +138,7 @@ export default class UsersController extends ApiController { //success this.httpSuccess(response, user); } catch (error) { - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } diff --git a/src/common/databases/seeders/seeder.ts b/src/common/databases/seeders/seeder.ts index 39f8f7cd..881e081f 100644 --- a/src/common/databases/seeders/seeder.ts +++ b/src/common/databases/seeders/seeder.ts @@ -12,7 +12,6 @@ import { EDocumentStatus, EFolderStatus, EOfficeStatus, - Files, OfficeFolderHasCustomers, OfficeFolders, Offices, @@ -78,9 +77,6 @@ import { const uidOfficeFolderHasCustomer1: string = randomString(); const uidOfficeFolderHasCustomer2: string = randomString(); - const uidFiles1: string = randomString(); - const uidFiles2: string = randomString(); - const uidDeedHasDocumentType1: string = randomString(); const uidDeedHasDocumentType2: string = randomString(); @@ -466,29 +462,6 @@ import { }, ]; - const files: Files[] = [ - { - uid: uidFiles1, - document_uid: uidDocument1, - file_name: "fileName1", - file_path: "https://www.google1.com", - key: '', - archived_at: null, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidFiles2, - document_uid: uidDocument1, - file_name: "fileName2", - file_path: "https://www.google2.com", - key: '', - archived_at: null, - created_at: new Date(), - updated_at: new Date(), - }, - ]; - const deedHasDocumentTypes: DeedHasDocumentTypes[] = [ { uid: uidDeedHasDocumentType1, @@ -581,10 +554,6 @@ import { await prisma.documents.create({ data: document }); } - for (const file of files) { - await prisma.files.create({ data: file }); - } - for (const documentHistory of documentHistories) { await prisma.documentHistory.create({ data: documentHistory }); } diff --git a/src/services/private-services/FilesService/FilesService.ts b/src/services/private-services/FilesService/FilesService.ts index fe1ae559..fba0f42c 100644 --- a/src/services/private-services/FilesService/FilesService.ts +++ b/src/services/private-services/FilesService/FilesService.ts @@ -6,12 +6,8 @@ import CryptoService from "../CryptoService/CryptoService"; import IpfsService from "../IpfsService/IpfsService"; import { BackendVariables } from "@Common/config/variables/Variables"; import { Readable } from "stream"; -<<<<<<< HEAD -import { v4 } from "uuid"; -import { Files } from "@prisma/client"; -======= import uuid from "uuid"; ->>>>>>> 14db92d (add mimetype and size of files) +import { Files } from "@prisma/client"; @Service() export default class FilesService extends BaseService { @@ -57,15 +53,8 @@ export default class FilesService extends BaseService { * @description : Create a new file * @throws {Error} If file cannot be created */ -<<<<<<< HEAD - public async create(file: File, fileData: Express.Multer.File): Promise { - const key = v4(); - fileData.mimetype; - fileData.size; -======= public async create(file: File, fileData: Express.Multer.File) { const key = uuid.v4(); ->>>>>>> 14db92d (add mimetype and size of files) const encryptedFile = await this.cryptoService.encrypt(fileData.buffer, key); const upload = await this.ipfsService.pinFile(Readable.from(encryptedFile), fileData.originalname); const fileToCreate: File = file; diff --git a/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts b/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts index e0740d28..91fd7113 100644 --- a/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts +++ b/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts @@ -21,7 +21,7 @@ export default class OfficeFoldersService extends BaseService { * @description : Get all folders * @throws {Error} If folders cannot be get */ - public async get(query: any): Promise { + public async get(query: any): Promise { return this.officeFoldersRepository.findMany(query); } From 3403b563d88497163209deb59335292a8712c64f Mon Sep 17 00:00:00 2001 From: Vincent Alamelle Date: Mon, 15 May 2023 16:08:10 +0200 Subject: [PATCH 010/134] hotfix fetch --- package-lock.json | 64 +++++++++++++++++++ package.json | 2 + .../20230515134800_v6/migration.sql | 10 +++ .../FilesService/FilesService.ts | 7 +- 4 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 src/common/databases/migrations/20230515134800_v6/migration.sql diff --git a/package-lock.json b/package-lock.json index 6df3d498..c2171d10 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,7 @@ "multer": "^1.4.5-lts.1", "next": "^13.1.5", "node-cache": "^5.1.2", + "node-fetch": "^2.6.11", "node-schedule": "^2.1.1", "prisma-query": "^2.0.0", "reflect-metadata": "^0.1.13", @@ -39,6 +40,7 @@ "@types/jsonwebtoken": "^9.0.1", "@types/multer": "^1.4.7", "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.3", "@types/node-schedule": "^2.1.0", "@types/uuid": "^9.0.0", "dotenv": "^16.0.3", @@ -1442,6 +1444,30 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.9.tgz", "integrity": "sha512-IeB32oIV4oGArLrd7znD2rkHQ6EDCM+2Sr76dJnrHwv9OHBTTM6nuDLK9bmikXzPa0ZlWMWtRGo/Uw4mrzQedA==" }, + "node_modules/@types/node-fetch": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.3.tgz", + "integrity": "sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w==", + "dev": true, + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "node_modules/@types/node-fetch/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/@types/node-schedule": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/node-schedule/-/node-schedule-2.1.0.tgz", @@ -4351,6 +4377,25 @@ "node": ">= 8.0.0" } }, + "node_modules/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -5423,6 +5468,11 @@ "nodetouch": "bin/nodetouch.js" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "node_modules/ts-jest": { "version": "29.1.0", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", @@ -5756,6 +5806,20 @@ "makeerror": "1.0.12" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index a6afd3e1..e658b730 100644 --- a/package.json +++ b/package.json @@ -53,6 +53,7 @@ "multer": "^1.4.5-lts.1", "next": "^13.1.5", "node-cache": "^5.1.2", + "node-fetch": "^2.6.11", "node-schedule": "^2.1.1", "prisma-query": "^2.0.0", "reflect-metadata": "^0.1.13", @@ -70,6 +71,7 @@ "@types/jsonwebtoken": "^9.0.1", "@types/multer": "^1.4.7", "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.3", "@types/node-schedule": "^2.1.0", "@types/uuid": "^9.0.0", "dotenv": "^16.0.3", diff --git a/src/common/databases/migrations/20230515134800_v6/migration.sql b/src/common/databases/migrations/20230515134800_v6/migration.sql new file mode 100644 index 00000000..efaf46c5 --- /dev/null +++ b/src/common/databases/migrations/20230515134800_v6/migration.sql @@ -0,0 +1,10 @@ +/* + Warnings: + + - Added the required column `mimetype` to the `files` table without a default value. This is not possible if the table is not empty. + - Added the required column `size` to the `files` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "files" ADD COLUMN "mimetype" VARCHAR(255) NOT NULL, +ADD COLUMN "size" INTEGER NOT NULL; diff --git a/src/services/private-services/FilesService/FilesService.ts b/src/services/private-services/FilesService/FilesService.ts index fba0f42c..78cf9588 100644 --- a/src/services/private-services/FilesService/FilesService.ts +++ b/src/services/private-services/FilesService/FilesService.ts @@ -6,8 +6,10 @@ import CryptoService from "../CryptoService/CryptoService"; import IpfsService from "../IpfsService/IpfsService"; import { BackendVariables } from "@Common/config/variables/Variables"; import { Readable } from "stream"; -import uuid from "uuid"; +import {v4} from "uuid"; import { Files } from "@prisma/client"; +import fetch from "node-fetch"; + @Service() export default class FilesService extends BaseService { @@ -42,7 +44,6 @@ export default class FilesService extends BaseService { */ public async download(uid: string) { const file = await this.filesRepository.findOneByUid(uid); - console.log(file, uid); if (!file?.key) return null; const fileResult = await fetch(file.file_path); const fileArrayBuffer = await fileResult.arrayBuffer(); @@ -54,7 +55,7 @@ export default class FilesService extends BaseService { * @throws {Error} If file cannot be created */ public async create(file: File, fileData: Express.Multer.File) { - const key = uuid.v4(); + const key = v4(); const encryptedFile = await this.cryptoService.encrypt(fileData.buffer, key); const upload = await this.ipfsService.pinFile(Readable.from(encryptedFile), fileData.originalname); const fileToCreate: File = file; From 090daafe5df41a780aceff3b9086438603f15ed2 Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Mon, 15 May 2023 16:08:32 +0200 Subject: [PATCH 011/134] :bug: Fixing hydrate --- src/app/api/customer/DocumentsController.ts | 2 +- src/app/api/super-admin/CustomersController.ts | 2 +- src/app/api/super-admin/DeedTypesController.ts | 2 +- src/app/api/super-admin/DeedsController.ts | 2 +- src/app/api/super-admin/DocumentTypesController.ts | 2 +- src/app/api/super-admin/DocumentsController.ts | 2 +- src/app/api/super-admin/FilesController.ts | 2 +- src/app/api/super-admin/OfficeFoldersController.ts | 11 +++++------ src/app/api/super-admin/OfficesController.ts | 2 +- src/app/api/super-admin/UsersController.ts | 2 +- .../migrations/20230515140007_v6/migration.sql | 10 ++++++++++ src/common/repositories/DocumentsRepository.ts | 2 +- .../super-admin/DocumentsService/DocumentsService.ts | 2 +- 13 files changed, 26 insertions(+), 17 deletions(-) create mode 100644 src/common/databases/migrations/20230515140007_v6/migration.sql diff --git a/src/app/api/customer/DocumentsController.ts b/src/app/api/customer/DocumentsController.ts index 85b64290..8be29e46 100644 --- a/src/app/api/customer/DocumentsController.ts +++ b/src/app/api/customer/DocumentsController.ts @@ -28,7 +28,7 @@ export default class DocumentsController extends ApiController { const documentEntities: Documents[] = await this.documentsService.get(query); //Hydrate ressource with prisma entity - const documents = Document.hydrateArray(Document, documentEntities, { strategy: "excludeAll" }); + const documents = Document.hydrateArray(documentEntities, { strategy: "excludeAll" }); //success this.httpSuccess(response, documents); diff --git a/src/app/api/super-admin/CustomersController.ts b/src/app/api/super-admin/CustomersController.ts index 0db0059e..6bd28b1e 100644 --- a/src/app/api/super-admin/CustomersController.ts +++ b/src/app/api/super-admin/CustomersController.ts @@ -27,7 +27,7 @@ export default class CustomersController extends ApiController { const customersEntities = await this.customersService.get(query); //Hydrate ressource with prisma entity - const customers = Customer.hydrateArray(Customer, customersEntities, { strategy: "excludeAll" }); + const customers = Customer.hydrateArray(customersEntities, { strategy: "excludeAll" }); //success this.httpSuccess(response, customers); diff --git a/src/app/api/super-admin/DeedTypesController.ts b/src/app/api/super-admin/DeedTypesController.ts index df324a68..5f038ba9 100644 --- a/src/app/api/super-admin/DeedTypesController.ts +++ b/src/app/api/super-admin/DeedTypesController.ts @@ -27,7 +27,7 @@ export default class DeedTypesController extends ApiController { const deedTypeEntities: DeedTypes[] = await this.deedTypesService.get(query); //Hydrate ressource with prisma entity - const DeedTypes = DeedType.hydrateArray(DeedType, deedTypeEntities, { strategy: "excludeAll" }); + const DeedTypes = DeedType.hydrateArray(deedTypeEntities, { strategy: "excludeAll" }); //success this.httpSuccess(response, DeedTypes); diff --git a/src/app/api/super-admin/DeedsController.ts b/src/app/api/super-admin/DeedsController.ts index 87d6df7e..3f4d3c62 100644 --- a/src/app/api/super-admin/DeedsController.ts +++ b/src/app/api/super-admin/DeedsController.ts @@ -27,7 +27,7 @@ export default class DeedsController extends ApiController { const deedEntities: Deeds[] = await this.deedsService.get(query); //Hydrate ressource with prisma entity - const deeds = Deed.hydrateArray(Deed, deedEntities, { strategy: "excludeAll" }); + const deeds = Deed.hydrateArray(deedEntities, { strategy: "excludeAll" }); //success this.httpSuccess(response, deeds); diff --git a/src/app/api/super-admin/DocumentTypesController.ts b/src/app/api/super-admin/DocumentTypesController.ts index effa524a..ecd89e14 100644 --- a/src/app/api/super-admin/DocumentTypesController.ts +++ b/src/app/api/super-admin/DocumentTypesController.ts @@ -28,7 +28,7 @@ export default class DocumentTypesController extends ApiController { const documentTypeEntities: DocumentTypes[] = await this.documentTypesService.get(query); //Hydrate ressource with prisma entity - const documentTypes = DocumentType.hydrateArray(DocumentType, documentTypeEntities, { + const documentTypes = DocumentType.hydrateArray(documentTypeEntities, { strategy: "excludeAll", }); diff --git a/src/app/api/super-admin/DocumentsController.ts b/src/app/api/super-admin/DocumentsController.ts index ad3327f6..009d33ca 100644 --- a/src/app/api/super-admin/DocumentsController.ts +++ b/src/app/api/super-admin/DocumentsController.ts @@ -28,7 +28,7 @@ export default class DocumentsController extends ApiController { const documentEntities: Documents[] = await this.documentsService.get(query); //Hydrate ressource with prisma entity - const documents = Document.hydrateArray(Document, documentEntities, { strategy: "excludeAll" }); + const documents = Document.hydrateArray(documentEntities, { strategy: "excludeAll" }); //success this.httpSuccess(response, documents); diff --git a/src/app/api/super-admin/FilesController.ts b/src/app/api/super-admin/FilesController.ts index 0d0fdf44..3bfd52da 100644 --- a/src/app/api/super-admin/FilesController.ts +++ b/src/app/api/super-admin/FilesController.ts @@ -29,7 +29,7 @@ export default class FilesController extends ApiController { const fileEntities = await this.filesService.get(query); //Hydrate ressource with prisma entity - const files = File.hydrateArray(File, fileEntities, { strategy: "excludeAll" }); + const files = File.hydrateArray(fileEntities, { strategy: "excludeAll" }); //success this.httpSuccess(response, files); diff --git a/src/app/api/super-admin/OfficeFoldersController.ts b/src/app/api/super-admin/OfficeFoldersController.ts index e7c9467f..a5427559 100644 --- a/src/app/api/super-admin/OfficeFoldersController.ts +++ b/src/app/api/super-admin/OfficeFoldersController.ts @@ -27,7 +27,7 @@ export default class OfficeFoldersController extends ApiController { const officeFolderEntities: OfficeFolders[] = await this.officeFoldersService.get(query); //Hydrate ressource with prisma entity - const officeFolders = OfficeFolder.hydrateArray(OfficeFolder, officeFolderEntities, { + const officeFolders = OfficeFolder.hydrateArray(officeFolderEntities, { strategy: "excludeAll", }); //success @@ -45,14 +45,13 @@ export default class OfficeFoldersController extends ApiController { protected async post(req: Request, response: Response) { try { //init OfficeFolder resource with request body values - const officeFolderEntity = OfficeFolder.hydrate(req.body); - + const officeFolderRessource = OfficeFolder.hydrate(req.body); + await officeFolderRessource.validateOrReject?.({ groups: ["createFolder"] , forbidUnknownValues: false }); //validate folder - await validateOrReject(officeFolderEntity, { groups: ["createFolder"] , forbidUnknownValues: false }); //call service to get prisma entity - const officeFolderEntityCreated = await this.officeFoldersService.create(officeFolderEntity); + const officeFolderEntity = await this.officeFoldersService.create(officeFolderRessource); //Hydrate ressource with prisma entity - const officeFolders = OfficeFolder.hydrate(officeFolderEntityCreated, { + const officeFolders = OfficeFolder.hydrate(officeFolderEntity, { strategy: "excludeAll", }); //success diff --git a/src/app/api/super-admin/OfficesController.ts b/src/app/api/super-admin/OfficesController.ts index dfbe4b1b..86de50f5 100644 --- a/src/app/api/super-admin/OfficesController.ts +++ b/src/app/api/super-admin/OfficesController.ts @@ -24,7 +24,7 @@ export default class OfficesController extends ApiController { //call service to get prisma entity const officesEntities: Offices[] = await this.officesService.get(query); //Hydrate ressource with prisma entity - const offices = OfficeResource.hydrateArray(OfficeResource, officesEntities, { strategy: "excludeAll" }); + const offices = OfficeResource.hydrateArray(officesEntities, { strategy: "excludeAll" }); //success this.httpSuccess(response, offices); } catch (error) { diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index 362b3444..5231ccc1 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -27,7 +27,7 @@ export default class UsersController extends ApiController { const usersEntities = await this.usersService.get(query); //Hydrate ressource with prisma entity - const users = User.hydrateArray(User, usersEntities, { strategy: "excludeAll" }); + const users = User.hydrateArray(usersEntities, { strategy: "excludeAll" }); //success this.httpSuccess(response, users); diff --git a/src/common/databases/migrations/20230515140007_v6/migration.sql b/src/common/databases/migrations/20230515140007_v6/migration.sql new file mode 100644 index 00000000..efaf46c5 --- /dev/null +++ b/src/common/databases/migrations/20230515140007_v6/migration.sql @@ -0,0 +1,10 @@ +/* + Warnings: + + - Added the required column `mimetype` to the `files` table without a default value. This is not possible if the table is not empty. + - Added the required column `size` to the `files` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "files" ADD COLUMN "mimetype" VARCHAR(255) NOT NULL, +ADD COLUMN "size" INTEGER NOT NULL; diff --git a/src/common/repositories/DocumentsRepository.ts b/src/common/repositories/DocumentsRepository.ts index 0c2e3b60..d6e784c9 100644 --- a/src/common/repositories/DocumentsRepository.ts +++ b/src/common/repositories/DocumentsRepository.ts @@ -78,7 +78,7 @@ export default class DocumentsRepository extends BaseRepository { /** * @description : Update data of a document */ - public async update(uid: string, document: Document, refusedReason?: string): Promise { + public async update(uid: string, document: Partial, refusedReason?: string): Promise { return this.model.update({ where: { uid: uid, diff --git a/src/services/super-admin/DocumentsService/DocumentsService.ts b/src/services/super-admin/DocumentsService/DocumentsService.ts index f12e253f..bf7a421b 100644 --- a/src/services/super-admin/DocumentsService/DocumentsService.ts +++ b/src/services/super-admin/DocumentsService/DocumentsService.ts @@ -38,7 +38,7 @@ export default class DocumentsService extends BaseService { * @description : Modify a document * @throws {Error} If document cannot be modified */ - public async update(uid: string, document: Document, refused_reason?: string): Promise { + public async update(uid: string, document: Partial, refused_reason?: string): Promise { return this.documentsRepository.update(uid, document, refused_reason); } From fbf9d302659218c3d8042cfbbbc9da7786656d59 Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Mon, 15 May 2023 16:10:07 +0200 Subject: [PATCH 012/134] :sparkles: Updating resources --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e658b730..948859f1 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "cors": "^2.8.5", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.50", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.51", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", From 68cba7f40100560b6bf478c44a6294f53f294a95 Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Tue, 16 May 2023 09:30:20 +0200 Subject: [PATCH 013/134] :sparkles: Updating resources --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 948859f1..1a32400c 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "cors": "^2.8.5", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.51", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.52", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", From 8441c06e9b2694fd1990f85d512e9dc6ff1f0447 Mon Sep 17 00:00:00 2001 From: Vincent Alamelle Date: Tue, 16 May 2023 15:03:31 +0200 Subject: [PATCH 014/134] Validation error folder number already taken --- src/app/api/super-admin/OfficeFoldersController.ts | 9 ++++++++- src/common/system/controller-pattern/BaseController.ts | 4 ++++ src/common/system/controller-pattern/HttpCodes.ts | 1 + 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/app/api/super-admin/OfficeFoldersController.ts b/src/app/api/super-admin/OfficeFoldersController.ts index a5427559..36062499 100644 --- a/src/app/api/super-admin/OfficeFoldersController.ts +++ b/src/app/api/super-admin/OfficeFoldersController.ts @@ -47,7 +47,14 @@ export default class OfficeFoldersController extends ApiController { //init OfficeFolder resource with request body values const officeFolderRessource = OfficeFolder.hydrate(req.body); await officeFolderRessource.validateOrReject?.({ groups: ["createFolder"] , forbidUnknownValues: false }); - //validate folder + + const officeFolderNumberExist = await this.officeFoldersService.get({where: {folder_number: officeFolderRessource.folder_number}}); + + if (officeFolderNumberExist) { + this.httpValidationError(response, "Folder number already taken"); + return; + } + //call service to get prisma entity const officeFolderEntity = await this.officeFoldersService.create(officeFolderRessource); //Hydrate ressource with prisma entity diff --git a/src/common/system/controller-pattern/BaseController.ts b/src/common/system/controller-pattern/BaseController.ts index 27eb5aa9..edd1af03 100644 --- a/src/common/system/controller-pattern/BaseController.ts +++ b/src/common/system/controller-pattern/BaseController.ts @@ -20,6 +20,10 @@ export default abstract class BaseController { return this.httpResponse(response, HttpCodes.BAD_REQUEST, responseData); } + protected httpValidationError(response: Response, responseData: IResponseData = "Http Validation Error") { + return this.httpResponse(response, HttpCodes.VALIDATION_ERROR, responseData); + } + protected httpNotFoundRequest(response: Response, responseData: IResponseData = "Not Found") { return this.httpResponse(response, HttpCodes.NOT_FOUND, responseData); } diff --git a/src/common/system/controller-pattern/HttpCodes.ts b/src/common/system/controller-pattern/HttpCodes.ts index 8ca2500b..f6ce001a 100644 --- a/src/common/system/controller-pattern/HttpCodes.ts +++ b/src/common/system/controller-pattern/HttpCodes.ts @@ -2,6 +2,7 @@ enum HttpCodes { SUCCESS = 200, CREATED = 201, BAD_REQUEST = 400, + VALIDATION_ERROR = 422, INTERNAL_ERROR = 500, UNKNOWN_ERROR = 520, NOT_IMPLEMENTED = 501, From 941163822cbce447fb46d7ffda591351f26fed6a Mon Sep 17 00:00:00 2001 From: Vincent Alamelle Date: Tue, 16 May 2023 15:32:14 +0200 Subject: [PATCH 015/134] fix --- src/app/api/super-admin/OfficeFoldersController.ts | 7 ++++++- src/common/system/controller-pattern/HttpCodes.ts | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/app/api/super-admin/OfficeFoldersController.ts b/src/app/api/super-admin/OfficeFoldersController.ts index 36062499..85c52667 100644 --- a/src/app/api/super-admin/OfficeFoldersController.ts +++ b/src/app/api/super-admin/OfficeFoldersController.ts @@ -51,7 +51,12 @@ export default class OfficeFoldersController extends ApiController { const officeFolderNumberExist = await this.officeFoldersService.get({where: {folder_number: officeFolderRessource.folder_number}}); if (officeFolderNumberExist) { - this.httpValidationError(response, "Folder number already taken"); + this.httpValidationError(response, [{ + property: "folder_number", + constraints: { + unique: "folder_number must be unique", + }, + }]); return; } diff --git a/src/common/system/controller-pattern/HttpCodes.ts b/src/common/system/controller-pattern/HttpCodes.ts index f6ce001a..2d6d92c5 100644 --- a/src/common/system/controller-pattern/HttpCodes.ts +++ b/src/common/system/controller-pattern/HttpCodes.ts @@ -2,7 +2,7 @@ enum HttpCodes { SUCCESS = 200, CREATED = 201, BAD_REQUEST = 400, - VALIDATION_ERROR = 422, + VALIDATION_ERROR = 409, INTERNAL_ERROR = 500, UNKNOWN_ERROR = 520, NOT_IMPLEMENTED = 501, From 831733d090b88204e6286e9402a65daf1030f1f9 Mon Sep 17 00:00:00 2001 From: Vincent Alamelle Date: Wed, 17 May 2023 14:21:23 +0200 Subject: [PATCH 016/134] Fixed unique folder number --- src/app/api/super-admin/OfficeFoldersController.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/app/api/super-admin/OfficeFoldersController.ts b/src/app/api/super-admin/OfficeFoldersController.ts index 85c52667..ed2dbce1 100644 --- a/src/app/api/super-admin/OfficeFoldersController.ts +++ b/src/app/api/super-admin/OfficeFoldersController.ts @@ -47,10 +47,11 @@ export default class OfficeFoldersController extends ApiController { //init OfficeFolder resource with request body values const officeFolderRessource = OfficeFolder.hydrate(req.body); await officeFolderRessource.validateOrReject?.({ groups: ["createFolder"] , forbidUnknownValues: false }); - + const officeFolderNumberExist = await this.officeFoldersService.get({where: {folder_number: officeFolderRessource.folder_number}}); + - if (officeFolderNumberExist) { + if (officeFolderNumberExist.length > 0) { this.httpValidationError(response, [{ property: "folder_number", constraints: { From aa30e8baddfb3d8c75ca5d1c81e9f37646e4f2f4 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Mon, 19 Jun 2023 17:58:12 +0200 Subject: [PATCH 017/134] add roles and rules repositories --- src/common/databases/schema.prisma | 53 ++++++++- .../OfficeRoleHasRulesRepository.ts | 42 +++++++ .../repositories/RolesHasRulesRepository.ts | 42 +++++++ src/common/repositories/RolesRepository.ts | 111 ++++++++++++++++++ src/common/repositories/RulesRepository.ts | 83 +++++++++++++ src/common/repositories/UsersRepository.ts | 5 + 6 files changed, 335 insertions(+), 1 deletion(-) create mode 100644 src/common/repositories/OfficeRoleHasRulesRepository.ts create mode 100644 src/common/repositories/RolesHasRulesRepository.ts create mode 100644 src/common/repositories/RolesRepository.ts create mode 100644 src/common/repositories/RulesRepository.ts diff --git a/src/common/databases/schema.prisma b/src/common/databases/schema.prisma index f9035aa2..63f8da27 100644 --- a/src/common/databases/schema.prisma +++ b/src/common/databases/schema.prisma @@ -54,6 +54,8 @@ model Users { idNot String @unique @db.VarChar(255) contact Contacts @relation(fields: [contact_uid], references: [uid], onDelete: Cascade) contact_uid String @unique @db.VarChar(255) + role Roles @relation(fields: [roles_uid], references: [uid]) + roles_uid String created_at DateTime? @default(now()) updated_at DateTime? @updatedAt office_membership Offices @relation(fields: [office_uid], references: [uid], onDelete: Cascade) @@ -205,7 +207,7 @@ model Files { file_path String @unique @db.VarChar(255) file_name String @db.VarChar(255) mimetype String @db.VarChar(255) - size Int + size Int archived_at DateTime? key String? @db.VarChar(255) created_at DateTime? @default(now()) @@ -296,6 +298,55 @@ model DeedTypeHasDocumentTypes { @@map("deed_type_has_document_types") } +model Roles { + uid String @id @unique @default(uuid()) + name String @db.VarChar(255) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + role_has_rules RolesHasRules[] + office_role_has_rules OfficesRolesHasRules[] + users Users[] + + @@map("roles") +} + +model Rules { + uid String @id @unique @default(uuid()) + name String @db.VarChar(255) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + role_has_rules RolesHasRules? @relation(fields: [role_has_rules_uid], references: [uid]) + role_has_rules_uid String? + office_role_has_rules OfficesRolesHasRules? @relation(fields: [office_role_has_rules_uid], references: [uid]) + office_role_has_rules_uid String? + + @@map("rules") +} + +model RolesHasRules { + uid String @id @unique @default(uuid()) + role Roles @relation(fields: [role_uid], references: [uid], onDelete: Cascade) + role_uid String @db.VarChar(255) + rule_uid String @db.VarChar(255) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + rules Rules[] + + @@map("role_has_rules") +} + +model OfficesRolesHasRules { + uid String @id @unique @default(uuid()) + role Roles @relation(fields: [role_uid], references: [uid], onDelete: Cascade) + role_uid String @db.VarChar(255) + rule_uid String @db.VarChar(255) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + rules Rules[] + + @@map("office_role_has_rules") +} + enum ECivility { MALE FEMALE diff --git a/src/common/repositories/OfficeRoleHasRulesRepository.ts b/src/common/repositories/OfficeRoleHasRulesRepository.ts new file mode 100644 index 00000000..f36ccfd2 --- /dev/null +++ b/src/common/repositories/OfficeRoleHasRulesRepository.ts @@ -0,0 +1,42 @@ +import Database from "@Common/databases/database"; +import BaseRepository from "@Repositories/BaseRepository"; +import { Service } from "typedi"; +import { OfficesRolesHasRules, Prisma } from "@prisma/client"; + +@Service() +export default class OfficeRoleHasRulesRepository extends BaseRepository { + constructor(private database: Database) { + super(); + } + protected get model() { + return this.database.getClient().officesRolesHasRules; + } + protected get instanceDb() { + return this.database.getClient(); + } + + /** + * @description : Find many relations between office roles and rules + */ + public async findMany(query: any): Promise { + query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); + return this.model.findMany(query); + } + + /** + * @description : Find one relation between an office role and rules + */ + public async findOneByUid(uid: string, query?: any): Promise { + const findOneArgs: Prisma.OfficesRolesHasRulesFindUniqueArgs = { + where: { + uid: uid, + }, + }; + if (query) { + findOneArgs.include = query; + } + const roleEntity = await this.model.findUnique(findOneArgs); + + return roleEntity; + } +} diff --git a/src/common/repositories/RolesHasRulesRepository.ts b/src/common/repositories/RolesHasRulesRepository.ts new file mode 100644 index 00000000..7a255dc5 --- /dev/null +++ b/src/common/repositories/RolesHasRulesRepository.ts @@ -0,0 +1,42 @@ +import Database from "@Common/databases/database"; +import BaseRepository from "@Repositories/BaseRepository"; +import { Service } from "typedi"; +import { RolesHasRules, Prisma } from "@prisma/client"; + +@Service() +export default class RolesHasRulesRepository extends BaseRepository { + constructor(private database: Database) { + super(); + } + protected get model() { + return this.database.getClient().rolesHasRules; + } + protected get instanceDb() { + return this.database.getClient(); + } + + /** + * @description : Find many relations between basic roles and rules + */ + public async findMany(query: any): Promise { + query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); + return this.model.findMany(query); + } + + /** + * @description : Find one relation between an basic role and rules + */ + public async findOneByUid(uid: string, query?: any): Promise { + const findOneArgs: Prisma.RolesHasRulesFindUniqueArgs = { + where: { + uid: uid, + }, + }; + if (query) { + findOneArgs.include = query; + } + const roleEntity = await this.model.findUnique(findOneArgs); + + return roleEntity; + } +} diff --git a/src/common/repositories/RolesRepository.ts b/src/common/repositories/RolesRepository.ts new file mode 100644 index 00000000..159674a5 --- /dev/null +++ b/src/common/repositories/RolesRepository.ts @@ -0,0 +1,111 @@ +import Database from "@Common/databases/database"; +import BaseRepository from "@Repositories/BaseRepository"; +import { Service } from "typedi"; +import { Roles, Prisma } from "@prisma/client"; +import { Role } from "le-coffre-resources/dist/SuperAdmin"; + +@Service() +export default class RolesRepository extends BaseRepository { + constructor(private database: Database) { + super(); + } + protected get model() { + return this.database.getClient().roles; + } + protected get instanceDb() { + return this.database.getClient(); + } + + /** + * @description : Find many roles + */ + public async findMany(query: any): Promise { + query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); + return this.model.findMany(query); + } + + /** + * @description : Create new role with rules + */ + public async create(role: Role): Promise { + const createArgs: Prisma.RolesCreateArgs = { + data: { + name: role.name, + role_has_rules: { + createMany: { + data: role.role_has_rules!.rules.map((relation) => ({ + rule_uid: relation.uid!, + })), + skipDuplicates: true, + }, + }, + }, + }; + + return this.model.create(createArgs); + } + + /** + * @description : Update data of a role with rules + */ + public async update(role: Role): Promise { + const updateArgs: Prisma.RolesUpdateArgs = { + where: { + uid: role.uid, + }, + data: { + name: role.name, + role_has_rules: { + deleteMany: { role_uid: role.uid }, + createMany: { + data: role.role_has_rules!.rules.map((relation) => ({ + rule_uid: relation.uid!, + })), + skipDuplicates: true, + }, + }, + }, + }; + if(role.office_role_has_rules) { + updateArgs.data.office_role_has_rules = { + deleteMany: { role_uid: role.uid }, + createMany: { + data: role.office_role_has_rules.rules.map((relation) => ({ + rule_uid: relation.uid!, + })), + skipDuplicates: true, + }, + }; + } + + return this.model.update(updateArgs); + } + + /** + * @description : Find one role + */ + public async findOneByUid(uid: string, query?: any): Promise { + const findOneArgs: Prisma.RolesFindUniqueArgs = { + where: { + uid: uid, + }, + }; + if (query) { + findOneArgs.include = query; + } + const roleEntity = await this.model.findUnique(findOneArgs); + + return roleEntity; + } + + /** + * @description : Delete a role + */ + public async delete(uid: string): Promise { + return this.model.delete({ + where: { + uid: uid, + }, + }); + } +} diff --git a/src/common/repositories/RulesRepository.ts b/src/common/repositories/RulesRepository.ts new file mode 100644 index 00000000..7d015429 --- /dev/null +++ b/src/common/repositories/RulesRepository.ts @@ -0,0 +1,83 @@ +import Database from "@Common/databases/database"; +import BaseRepository from "@Repositories/BaseRepository"; +import { Service } from "typedi"; +import { Rules, Prisma } from "@prisma/client"; +import { Rule } from "le-coffre-resources/dist/SuperAdmin"; + +@Service() +export default class RulesRepository extends BaseRepository { + constructor(private database: Database) { + super(); + } + protected get model() { + return this.database.getClient().rules; + } + protected get instanceDb() { + return this.database.getClient(); + } + + /** + * @description : Find many rules + */ + public async findMany(query: any): Promise { + query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); + return this.model.findMany(query); + } + + /** + * @description : Create new rule + */ + public async create(rule: Rule): Promise { + const createArgs: Prisma.RulesCreateArgs = { + data: { + name: rule.name + }, + }; + + return this.model.create(createArgs); + } + + /** + * @description : Update data of a rule + */ + public async update(rule: Rule): Promise { + const updateArgs: Prisma.RulesUpdateArgs = { + where: { + uid: rule.uid, + }, + data: { + name: rule.name + }, + }; + + return this.model.update(updateArgs); + } + + /** + * @description : Find one rule + */ + public async findOneByUid(uid: string, query?: any): Promise { + const findOneArgs: Prisma.RulesFindUniqueArgs = { + where: { + uid: uid, + }, + }; + if (query) { + findOneArgs.include = query; + } + const ruleEntity = await this.model.findUnique(findOneArgs); + + return ruleEntity; + } + + /** + * @description : Delete a rule + */ + public async delete(uid: string): Promise { + return this.model.delete({ + where: { + uid: uid, + }, + }); + } +} diff --git a/src/common/repositories/UsersRepository.ts b/src/common/repositories/UsersRepository.ts index b051af69..a0f14234 100644 --- a/src/common/repositories/UsersRepository.ts +++ b/src/common/repositories/UsersRepository.ts @@ -61,6 +61,11 @@ export default class UsersRepository extends BaseRepository { address: {}, }, }, + role: { + connect: { + uid: user.role!.uid, + }, + } }, }; if (user.contact!.address) { From 5207fd3159df345458a616cccb6b2c1118e0a2b7 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Mon, 19 Jun 2023 18:12:35 +0200 Subject: [PATCH 018/134] update seeder with roles --- src/common/databases/seeders/seeder.ts | 5 + src/common/databases/seeders/seeder2.ts | 8 ++ src/test/config/Init.ts | 157 +++++++++++++++--------- 3 files changed, 110 insertions(+), 60 deletions(-) diff --git a/src/common/databases/seeders/seeder.ts b/src/common/databases/seeders/seeder.ts index 881e081f..3210ca98 100644 --- a/src/common/databases/seeders/seeder.ts +++ b/src/common/databases/seeders/seeder.ts @@ -49,6 +49,9 @@ import { const uidUser1: string = randomString(); const uidUser2: string = randomString(); + const uidRole1: string = randomString(); + const uidRole2: string = randomString(); + const uidOfficeFolder1: string = randomString(); const uidOfficeFolder2: string = randomString(); const uidOfficeFolder3: string = randomString(); @@ -231,6 +234,7 @@ import { idNot: randomString(), contact_uid: uidContact1, office_uid: uidOffice1, + roles_uid: uidRole1, }, { uid: uidUser2, @@ -239,6 +243,7 @@ import { idNot: randomString(), contact_uid: uidContact2, office_uid: uidOffice2, + roles_uid: uidRole2, }, ]; diff --git a/src/common/databases/seeders/seeder2.ts b/src/common/databases/seeders/seeder2.ts index 7a3c82fe..248f04f7 100644 --- a/src/common/databases/seeders/seeder2.ts +++ b/src/common/databases/seeders/seeder2.ts @@ -100,6 +100,9 @@ import { const uidUser4: string = randomString(); const uidUser5: string = randomString(); + const uidRole1: string = randomString(); + const uidRole2: string = randomString(); + const uidOfficeFolder1: string = randomString(); const uidOfficeFolder2: string = randomString(); const uidOfficeFolder3: string = randomString(); @@ -793,6 +796,7 @@ import { idNot: randomString(), contact_uid: uidContact16, office_uid: uidOffice1, + roles_uid: uidRole1, }, { uid: uidUser2, @@ -801,6 +805,7 @@ import { idNot: randomString(), contact_uid: uidContact17, office_uid: uidOffice1, + roles_uid: uidRole2, }, { uid: uidUser3, @@ -809,6 +814,7 @@ import { idNot: randomString(), contact_uid: uidContact18, office_uid: uidOffice1, + roles_uid: uidRole1, }, { uid: uidUser4, @@ -817,6 +823,7 @@ import { idNot: randomString(), contact_uid: uidContact19, office_uid: uidOffice1, + roles_uid: uidRole2, }, { uid: uidUser5, @@ -825,6 +832,7 @@ import { idNot: randomString(), contact_uid: uidContact20, office_uid: uidOffice1, + roles_uid: uidRole1, }, ]; diff --git a/src/test/config/Init.ts b/src/test/config/Init.ts index 033fc8f1..a488d9a0 100644 --- a/src/test/config/Init.ts +++ b/src/test/config/Init.ts @@ -1,5 +1,16 @@ -import { Customers, DeedTypes, DocumentTypes, ECivility, ECustomerStatus, Offices, PrismaClient, Users } from "@prisma/client"; -import User, { Customer, DeedType, DocumentType, Office } from "le-coffre-resources/dist/SuperAdmin"; +import { + Customers, + DeedTypes, + DocumentTypes, + ECivility, + ECustomerStatus, + Offices, + PrismaClient, + Roles, + Rules, + Users, +} from "@prisma/client"; +import User, { Customer, DeedType, DocumentType, Office, Role, Rule } from "le-coffre-resources/dist/SuperAdmin"; const prisma = new PrismaClient(); @@ -54,68 +65,94 @@ export const initDeedType = (deedType: DeedType, office: Office, documentTypes?: export const initCustomers = (customer: Customer): Promise => { return prisma.customers.create({ data: { - status: ECustomerStatus.PENDING, - contact: { - create: { - first_name: customer.contact!.first_name, - last_name: customer.contact!.last_name, - email: customer.contact!.email, - phone_number: customer.contact!.phone_number, - cell_phone_number: customer.contact!?.cell_phone_number, - civility: ECivility[customer.contact!.civility as keyof typeof ECivility], - address: { - create: { - address: customer.contact!.address!.address, - zip_code: customer.contact!.address!.zip_code, - city: customer.contact!.address!.city, - }, - }, - }, - }, - }, + status: ECustomerStatus.PENDING, + contact: { + create: { + first_name: customer.contact!.first_name, + last_name: customer.contact!.last_name, + email: customer.contact!.email, + phone_number: customer.contact!.phone_number, + cell_phone_number: customer.contact!?.cell_phone_number, + civility: ECivility[customer.contact!.civility as keyof typeof ECivility], + address: { + create: { + address: customer.contact!.address!.address, + zip_code: customer.contact!.address!.zip_code, + city: customer.contact!.address!.city, + }, + }, + }, + }, + }, + }); +}; + +export const initRules = (rule: Rule): Promise => { + return prisma.rules.create({ + data: { + name: rule.name, + }, + }); +}; + +export const initRoles = (role: Role): Promise => { + return prisma.roles.create({ + data: { + name: role.name, + }, }); }; export const initUsers = (user: User): Promise => { return prisma.users.create({ data: { - idNot: user.idNot, - office_membership: { - connectOrCreate: { - where: { - idNot: user.office_membership!.idNot, - }, - create: { - idNot: user.office_membership!.idNot, - name: user.office_membership!.name, - crpcen: user.office_membership!.crpcen, - address: { - create: { - address: user.office_membership!.address!.address, - zip_code: user.office_membership!.address!.zip_code, - city: user.office_membership!.address!.city, - }, - }, - }, - }, - }, - contact: { - create: { - first_name: user.contact!.first_name, - last_name: user.contact!.last_name, - email: user.contact!.email, - phone_number: user.contact!.phone_number, - cell_phone_number: user.contact!.cell_phone_number, - civility: ECivility[user.contact!.civility as keyof typeof ECivility], - address: { - create: { - address: user.contact!.address!.address, - zip_code: user.contact!.address!.zip_code, - city: user.contact!.address!.city, - }, - }, - }, - }, - }, - }); + idNot: user.idNot, + office_membership: { + connectOrCreate: { + where: { + idNot: user.office_membership!.idNot, + }, + create: { + idNot: user.office_membership!.idNot, + name: user.office_membership!.name, + crpcen: user.office_membership!.crpcen, + address: { + create: { + address: user.office_membership!.address!.address, + zip_code: user.office_membership!.address!.zip_code, + city: user.office_membership!.address!.city, + }, + }, + }, + }, + }, + contact: { + create: { + first_name: user.contact!.first_name, + last_name: user.contact!.last_name, + email: user.contact!.email, + phone_number: user.contact!.phone_number, + cell_phone_number: user.contact!.cell_phone_number, + civility: ECivility[user.contact!.civility as keyof typeof ECivility], + address: { + create: { + address: user.contact!.address!.address, + zip_code: user.contact!.address!.zip_code, + city: user.contact!.address!.city, + }, + }, + }, + }, + role: { + connectOrCreate: { + where: { + uid: user.role!.uid, + }, + create: { + name: user.role!.name, + }, + }, + }, + }, + }); }; From 219ebe5a83f233a1664703e4d612b06c0fdd404d Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Mon, 19 Jun 2023 18:33:28 +0200 Subject: [PATCH 019/134] add services & controllers --- src/app/api/super-admin/RolesController.ts | 145 ++++++++++++++++++ src/app/api/super-admin/RulesController.ts | 145 ++++++++++++++++++ .../super-admin/RolesService/RolesService.ts | 45 ++++++ .../super-admin/RulesService/RulesService.ts | 45 ++++++ 4 files changed, 380 insertions(+) create mode 100644 src/app/api/super-admin/RolesController.ts create mode 100644 src/app/api/super-admin/RulesController.ts create mode 100644 src/services/super-admin/RolesService/RolesService.ts create mode 100644 src/services/super-admin/RulesService/RulesService.ts diff --git a/src/app/api/super-admin/RolesController.ts b/src/app/api/super-admin/RolesController.ts new file mode 100644 index 00000000..487511a2 --- /dev/null +++ b/src/app/api/super-admin/RolesController.ts @@ -0,0 +1,145 @@ +import { Response, Request } from "express"; +import { Controller, Get, Post, Put } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import RulesService from "@Services/super-admin/RulesService/RulesService"; +import { Service } from "typedi"; +import { validateOrReject } from "class-validator"; +import { Rule } from "le-coffre-resources/dist/Notary"; +import { Rules } from "@prisma/client"; + +@Controller() +@Service() +export default class RulesController extends ApiController { + constructor(private rolesService: RulesService) { + super(); + } + + /** + * @description Get all roles + */ + @Get("/api/v1/super-admin/roles") + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + + //call service to get prisma entity + const rolesEntities = await this.rolesService.get(query); + + //Hydrate ressource with prisma entity + const roles = Rule.hydrateArray(rolesEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, roles); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Create a new role + */ + @Post("/api/v1/super-admin/roles") + protected async getAddresses(req: Request, response: Response) { + try { + //init IRule resource with request body values + const roleEntity = Rule.hydrate(req.body); + + //validate role + await validateOrReject(roleEntity, { groups: ["createRule"] }); + + //call service to get prisma entity + const roleEntityCreated = await this.rolesService.create(roleEntity); + + //Hydrate ressource with prisma entity + const role = Rule.hydrate(roleEntityCreated, { + strategy: "excludeAll", + }); + + //success + this.httpCreated(response, role); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Modify a specific role by uid + */ + @Put("/api/v1/super-admin/roles/:uid") + protected async put(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const roleFound = await this.rolesService.getByUid(uid); + + if (!roleFound) { + this.httpNotFoundRequest(response, "role not found"); + return; + } + + //init IRule resource with request body values + const roleEntity = Rule.hydrate(req.body); + + //validate role + await validateOrReject(roleEntity, { groups: ["update"] }); + + //call service to get prisma entity + const roleEntityUpdated = await this.rolesService.update(roleEntity); + + //Hydrate ressource with prisma entity + const role = Rule.hydrate(roleEntityUpdated, { + strategy: "excludeAll", + }); + + //success + this.httpSuccess(response, role); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific role by uid + */ + @Get("/api/v1/super-admin/roles/:uid") + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + let roleEntity: Rules | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + roleEntity = await this.rolesService.getByUid(uid, query); + } else { + //call service to get prisma entity + roleEntity = await this.rolesService.getByUid(uid); + } + + if (!roleEntity) { + this.httpNotFoundRequest(response, "role not found"); + return; + } + + //Hydrate ressource with prisma entity + const role = Rule.hydrate(roleEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, role); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/super-admin/RulesController.ts b/src/app/api/super-admin/RulesController.ts new file mode 100644 index 00000000..b1858c0e --- /dev/null +++ b/src/app/api/super-admin/RulesController.ts @@ -0,0 +1,145 @@ +import { Response, Request } from "express"; +import { Controller, Get, Post, Put } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import RulesService from "@Services/super-admin/RulesService/RulesService"; +import { Service } from "typedi"; +import { validateOrReject } from "class-validator"; +import { Rule } from "le-coffre-resources/dist/Notary"; +import { Rules } from "@prisma/client"; + +@Controller() +@Service() +export default class RulesController extends ApiController { + constructor(private rulesService: RulesService) { + super(); + } + + /** + * @description Get all rules + */ + @Get("/api/v1/super-admin/rules") + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + + //call service to get prisma entity + const rulesEntities = await this.rulesService.get(query); + + //Hydrate ressource with prisma entity + const rules = Rule.hydrateArray(rulesEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, rules); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Create a new rule + */ + @Post("/api/v1/super-admin/rules") + protected async getAddresses(req: Request, response: Response) { + try { + //init IRule resource with request body values + const ruleEntity = Rule.hydrate(req.body); + + //validate rule + await validateOrReject(ruleEntity, { groups: ["createRule"] }); + + //call service to get prisma entity + const ruleEntityCreated = await this.rulesService.create(ruleEntity); + + //Hydrate ressource with prisma entity + const rule = Rule.hydrate(ruleEntityCreated, { + strategy: "excludeAll", + }); + + //success + this.httpCreated(response, rule); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Modify a specific rule by uid + */ + @Put("/api/v1/super-admin/rules/:uid") + protected async put(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const ruleFound = await this.rulesService.getByUid(uid); + + if (!ruleFound) { + this.httpNotFoundRequest(response, "rule not found"); + return; + } + + //init IRule resource with request body values + const ruleEntity = Rule.hydrate(req.body); + + //validate rule + await validateOrReject(ruleEntity, { groups: ["update"] }); + + //call service to get prisma entity + const ruleEntityUpdated = await this.rulesService.update(ruleEntity); + + //Hydrate ressource with prisma entity + const rule = Rule.hydrate(ruleEntityUpdated, { + strategy: "excludeAll", + }); + + //success + this.httpSuccess(response, rule); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific rule by uid + */ + @Get("/api/v1/super-admin/rules/:uid") + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + let ruleEntity: Rules | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + ruleEntity = await this.rulesService.getByUid(uid, query); + } else { + //call service to get prisma entity + ruleEntity = await this.rulesService.getByUid(uid); + } + + if (!ruleEntity) { + this.httpNotFoundRequest(response, "rule not found"); + return; + } + + //Hydrate ressource with prisma entity + const rule = Rule.hydrate(ruleEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, rule); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/services/super-admin/RolesService/RolesService.ts b/src/services/super-admin/RolesService/RolesService.ts new file mode 100644 index 00000000..bbe52248 --- /dev/null +++ b/src/services/super-admin/RolesService/RolesService.ts @@ -0,0 +1,45 @@ +import BaseService from "@Services/BaseService"; +import "reflect-metadata"; +import { Service } from "typedi"; +import RolesRepository from "@Repositories/RolesRepository"; +import { Role } from "le-coffre-resources/dist/SuperAdmin"; +import {Prisma, Roles } from "@prisma/client"; + +@Service() +export default class RolesService extends BaseService { + constructor(private roleRepository: RolesRepository) { + super(); + } + + /** + * @description : Get all roles + * @throws {Error} If roles cannot be get + */ + public get(query: Prisma.RolesFindManyArgs): Promise { + return this.roleRepository.findMany(query); + } + + /** + * @description : Create a role + * @throws {Error} If role couldn't be created + */ + public create(roleEntity: Role): Promise { + return this.roleRepository.create(roleEntity); + } + + /** + * @description : Modify a role + * @throws {Error} If role modification failed + */ + public update(roleEntity: Role): Promise { + return this.roleRepository.update(roleEntity); + } + + /** + * @description : Get a role by uid + * @throws {Error} If role cannot be get by uid + */ + public getByUid(uid: string, query?: any): Promise { + return this.roleRepository.findOneByUid(uid, query); + } +} diff --git a/src/services/super-admin/RulesService/RulesService.ts b/src/services/super-admin/RulesService/RulesService.ts new file mode 100644 index 00000000..edc4ce64 --- /dev/null +++ b/src/services/super-admin/RulesService/RulesService.ts @@ -0,0 +1,45 @@ +import BaseService from "@Services/BaseService"; +import "reflect-metadata"; +import { Service } from "typedi"; +import RulesRepository from "@Repositories/RulesRepository"; +import { Rule } from "le-coffre-resources/dist/SuperAdmin"; +import {Prisma, Rules } from "@prisma/client"; + +@Service() +export default class RulesService extends BaseService { + constructor(private ruleRepository: RulesRepository) { + super(); + } + + /** + * @description : Get all rules + * @throws {Error} If rules cannot be get + */ + public get(query: Prisma.RulesFindManyArgs): Promise { + return this.ruleRepository.findMany(query); + } + + /** + * @description : Create a rule + * @throws {Error} If rule couldn't be created + */ + public create(ruleEntity: Rule): Promise { + return this.ruleRepository.create(ruleEntity); + } + + /** + * @description : Modify a rule + * @throws {Error} If rule modification failed + */ + public update(ruleEntity: Rule): Promise { + return this.ruleRepository.update(ruleEntity); + } + + /** + * @description : Get a rule by uid + * @throws {Error} If rule cannot be get by uid + */ + public getByUid(uid: string, query?: any): Promise { + return this.ruleRepository.findOneByUid(uid, query); + } +} From acbbba023c7c426b6cf0977a5388bc8b9423a75d Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Wed, 21 Jun 2023 15:08:00 +0200 Subject: [PATCH 020/134] add controllers for auth --- src/app/api/idnot-user/UserInfoController.ts | 108 ++++++++++++++---- src/app/api/super-admin/RolesController.ts | 32 +++--- src/app/api/super-admin/RulesController.ts | 2 +- src/app/index.ts | 4 + src/common/config/variables/Variables.ts | 22 +++- .../20230505075245_v1/migration.sql | 8 -- .../20230505131655_v2/migration.sql | 8 -- .../20230510204321_v4/migration.sql | 9 -- .../20230511085908_v5/migration.sql | 2 - .../20230515134800_v6/migration.sql | 10 -- .../20230515140007_v6/migration.sql | 10 -- .../migration.sql | 83 +++++++++++++- .../20230621100427_v1/migration.sql | 14 +++ src/common/databases/schema.prisma | 4 +- src/common/databases/seeders/seeder.ts | 20 ++++ src/common/databases/seeders/seeder2.ts | 20 ++++ .../controller-pattern/BaseController.ts | 4 + .../system/controller-pattern/HttpCodes.ts | 1 + .../AuthService/AuthService.ts | 24 +++- 19 files changed, 285 insertions(+), 100 deletions(-) delete mode 100644 src/common/databases/migrations/20230505075245_v1/migration.sql delete mode 100644 src/common/databases/migrations/20230505131655_v2/migration.sql delete mode 100644 src/common/databases/migrations/20230510204321_v4/migration.sql delete mode 100644 src/common/databases/migrations/20230511085908_v5/migration.sql delete mode 100644 src/common/databases/migrations/20230515134800_v6/migration.sql delete mode 100644 src/common/databases/migrations/20230515140007_v6/migration.sql rename src/common/databases/migrations/{20230426144239_init => 20230621092719_init}/migration.sql (85%) create mode 100644 src/common/databases/migrations/20230621100427_v1/migration.sql diff --git a/src/app/api/idnot-user/UserInfoController.ts b/src/app/api/idnot-user/UserInfoController.ts index afd5bf22..80b6dc4a 100644 --- a/src/app/api/idnot-user/UserInfoController.ts +++ b/src/app/api/idnot-user/UserInfoController.ts @@ -1,32 +1,94 @@ import { Response, Request } from "express"; - import { Controller,Post } from "@ControllerPattern/index"; - import ApiController from "@Common/system/controller-pattern/ApiController"; - import { Service } from "typedi"; +import { Controller, Post } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import { Service } from "typedi"; import AuthService from "@Services/private-services/AuthService/AuthService"; +import UsersService from "@Services/super-admin/UsersService/UsersService"; +import User from "le-coffre-resources/dist/SuperAdmin"; +import { JwtPayload } from "jsonwebtoken"; +import { validateOrReject } from "class-validator"; //import User from "le-coffre-resources/dist/Notary"; - - @Controller() - @Service() - export default class UserInfoController extends ApiController { - constructor(private authService: AuthService) { - super(); - } - - /** - * @description Get user created from IdNot authentification - * @returns User - */ - @Post("/api/v1/idnot-user/:code") - protected async getUserInfosFromIdnot(req: Request, response: Response) { - try { - const code = req.params["code"]; - const user = await this.authService.getUserFromIdNotTokens(code!); - //success + +@Controller() +@Service() +export default class UserInfoController extends ApiController { + constructor(private authService: AuthService, private userService: UsersService) { + super(); + } + + /** + * @description Get user created from IdNot authentification + * @returns User + */ + @Post("/api/v1/idnot-user/:code") + protected async getUserInfosFromIdnot(req: Request, response: Response) { + try { + const code = req.params["code"]; + const user = await this.authService.getUserFromIdNotTokens(code!); + //success this.httpSuccess(response, user); } catch (error) { this.httpInternalError(response); return; } - } + } -} \ No newline at end of file + @Post("/api/v1/login/:idnot") + protected async login(req: Request, response: Response) { + try { + const id = req.params["idnot"]; + if (!id) throw new Error("idnot is required"); + + const users = await this.userService.get({ where: { idNot: id } , include: {contact: true, role: true, office_membership: true}}); + const user = User.hydrate(users[0]!, { strategy: "excludeAll" }); + await validateOrReject(user, { groups: ["auth"] }) + console.log(user) + const accessToken = this.authService.generateAccessToken(user); + const refreshToken = this.authService.generateRefreshToken(user); + + //success + this.httpSuccess(response, { accessToken, refreshToken }); + } catch (error) { + console.log(error); + this.httpInternalError(response); + return; + } + } + + @Post("/api/v1/refresh-token") + protected async refreshToken(req: Request, response: Response) { + try { + const authHeader = req.headers["authorization"]; + const token = authHeader && authHeader.split(" ")[1]; + + if (!token) { + this.httpBadRequest(response); + return; + } + + let accessToken; + this.authService.verifyRefreshToken(token, (err, userPayload) => { + if (err) { + this.httpUnauthorized(response); + return; + } + + const user = userPayload as JwtPayload; + console.log(userPayload) + // const user = User.hydrate(userPayload!, { strategy: "excludeAll" }); + // const user = await this.userService.getByUid(userPayload!.uid); + // const users = await this.userService.getByUid(userPayload!.uid); + delete user.iat; + delete user!.exp; + accessToken = this.authService.generateAccessToken(user); + }); + + //success + this.httpSuccess(response, accessToken); + } catch (error) { + console.log(error) + this.httpInternalError(response); + return; + } + } +} diff --git a/src/app/api/super-admin/RolesController.ts b/src/app/api/super-admin/RolesController.ts index 487511a2..d7d8bc8e 100644 --- a/src/app/api/super-admin/RolesController.ts +++ b/src/app/api/super-admin/RolesController.ts @@ -1,16 +1,16 @@ import { Response, Request } from "express"; import { Controller, Get, Post, Put } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; -import RulesService from "@Services/super-admin/RulesService/RulesService"; +import RolesService from "@Services/super-admin/RolesService/RolesService"; import { Service } from "typedi"; import { validateOrReject } from "class-validator"; -import { Rule } from "le-coffre-resources/dist/Notary"; -import { Rules } from "@prisma/client"; +import { Role } from "le-coffre-resources/dist/Notary"; +import { Roles } from "@prisma/client"; @Controller() @Service() -export default class RulesController extends ApiController { - constructor(private rolesService: RulesService) { +export default class RolesController extends ApiController { + constructor(private rolesService: RolesService) { super(); } @@ -27,7 +27,7 @@ export default class RulesController extends ApiController { const rolesEntities = await this.rolesService.get(query); //Hydrate ressource with prisma entity - const roles = Rule.hydrateArray(rolesEntities, { strategy: "excludeAll" }); + const roles = Role.hydrateArray(rolesEntities, { strategy: "excludeAll" }); //success this.httpSuccess(response, roles); @@ -43,17 +43,17 @@ export default class RulesController extends ApiController { @Post("/api/v1/super-admin/roles") protected async getAddresses(req: Request, response: Response) { try { - //init IRule resource with request body values - const roleEntity = Rule.hydrate(req.body); + //init IRole resource with request body values + const roleEntity = Role.hydrate(req.body); //validate role - await validateOrReject(roleEntity, { groups: ["createRule"] }); + await validateOrReject(roleEntity, { groups: ["createRole"] }); //call service to get prisma entity const roleEntityCreated = await this.rolesService.create(roleEntity); //Hydrate ressource with prisma entity - const role = Rule.hydrate(roleEntityCreated, { + const role = Role.hydrate(roleEntityCreated, { strategy: "excludeAll", }); @@ -84,17 +84,17 @@ export default class RulesController extends ApiController { return; } - //init IRule resource with request body values - const roleEntity = Rule.hydrate(req.body); + //init IRole resource with request body values + const roleEntity = Role.hydrate(req.body); //validate role - await validateOrReject(roleEntity, { groups: ["update"] }); + await validateOrReject(roleEntity, { groups: ["updateRole"] }); //call service to get prisma entity const roleEntityUpdated = await this.rolesService.update(roleEntity); //Hydrate ressource with prisma entity - const role = Rule.hydrate(roleEntityUpdated, { + const role = Role.hydrate(roleEntityUpdated, { strategy: "excludeAll", }); @@ -117,7 +117,7 @@ export default class RulesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - let roleEntity: Rules | null; + let roleEntity: Roles | null; //get query if (req.query["q"]) { const query = JSON.parse(req.query["q"] as string); @@ -133,7 +133,7 @@ export default class RulesController extends ApiController { } //Hydrate ressource with prisma entity - const role = Rule.hydrate(roleEntity, { strategy: "excludeAll" }); + const role = Role.hydrate(roleEntity, { strategy: "excludeAll" }); //success this.httpSuccess(response, role); diff --git a/src/app/api/super-admin/RulesController.ts b/src/app/api/super-admin/RulesController.ts index b1858c0e..53b8d9a6 100644 --- a/src/app/api/super-admin/RulesController.ts +++ b/src/app/api/super-admin/RulesController.ts @@ -88,7 +88,7 @@ export default class RulesController extends ApiController { const ruleEntity = Rule.hydrate(req.body); //validate rule - await validateOrReject(ruleEntity, { groups: ["update"] }); + await validateOrReject(ruleEntity, { groups: ["updateRule"] }); //call service to get prisma entity const ruleEntityUpdated = await this.rulesService.update(ruleEntity); diff --git a/src/app/index.ts b/src/app/index.ts index e2b0a51f..62bb1c58 100644 --- a/src/app/index.ts +++ b/src/app/index.ts @@ -11,6 +11,8 @@ import DocumentTypesController from "./api/super-admin/DocumentTypesController"; import IdNotUserInfoController from "./api/idnot-user/UserInfoController"; import DocumentsControllerCustomer from "./api/customer/DocumentsController"; import FilesController from "./api/super-admin/FilesController"; +import RulesController from "./api/super-admin/RolesController"; +import RolesController from "./api/super-admin/RolesController"; /** @@ -30,5 +32,7 @@ export default { Container.get(IdNotUserInfoController); Container.get(FilesController); Container.get(DocumentsControllerCustomer); + Container.get(RulesController); + Container.get(RolesController); }, }; diff --git a/src/common/config/variables/Variables.ts b/src/common/config/variables/Variables.ts index bc20851c..95a8a427 100644 --- a/src/common/config/variables/Variables.ts +++ b/src/common/config/variables/Variables.ts @@ -54,6 +54,12 @@ export class BackendVariables { @IsNotEmpty() public readonly PINATA_GATEWAY!: string; + @IsNotEmpty() + public readonly ACCESS_TOKEN_SECRET!: string; + + @IsNotEmpty() + public readonly REFRESH_TOKEN_SECRET!: string; + public constructor() { dotenv.config(); this.DATABASE_PORT = process.env["DATABASE_PORT"]!; @@ -72,9 +78,21 @@ export class BackendVariables { this.PINATA_API_KEY = process.env["PINATA_API_KEY"]!; this.PINATA_API_SECRET = process.env["PINATA_API_SECRET"]!; this.PINATA_GATEWAY = process.env["PINATA_GATEWAY"]!; + this.ACCESS_TOKEN_SECRET = process.env["ACCESS_TOKEN_SECRET"]!; + this.REFRESH_TOKEN_SECRET = process.env["REFRESH_TOKEN_SECRET"]!; } - public async validate() { - await validateOrReject(this); + public async validate(groups?: string[]) { + const validationOptions = groups ? { groups } : undefined; + + try { + await validateOrReject(this, validationOptions); + } + catch(error) { + if(process.env["NODE_ENV"] === "development") { + throw error; + } + throw new Error("Some env variables are required!"); + } return this; } } diff --git a/src/common/databases/migrations/20230505075245_v1/migration.sql b/src/common/databases/migrations/20230505075245_v1/migration.sql deleted file mode 100644 index c212eab0..00000000 --- a/src/common/databases/migrations/20230505075245_v1/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ -/* - Warnings: - - - Added the required column `iv` to the `files` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "files" ADD COLUMN "iv" VARCHAR(255) NOT NULL; diff --git a/src/common/databases/migrations/20230505131655_v2/migration.sql b/src/common/databases/migrations/20230505131655_v2/migration.sql deleted file mode 100644 index a7f5aaa6..00000000 --- a/src/common/databases/migrations/20230505131655_v2/migration.sql +++ /dev/null @@ -1,8 +0,0 @@ -/* - Warnings: - - - Added the required column `file_name` to the `files` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "files" ADD COLUMN "file_name" VARCHAR(255) NOT NULL; diff --git a/src/common/databases/migrations/20230510204321_v4/migration.sql b/src/common/databases/migrations/20230510204321_v4/migration.sql deleted file mode 100644 index 463c9e19..00000000 --- a/src/common/databases/migrations/20230510204321_v4/migration.sql +++ /dev/null @@ -1,9 +0,0 @@ -/* - Warnings: - - - You are about to drop the column `iv` on the `files` table. All the data in the column will be lost. - -*/ --- AlterTable -ALTER TABLE "files" DROP COLUMN "iv", -ADD COLUMN "key" VARCHAR(255); diff --git a/src/common/databases/migrations/20230511085908_v5/migration.sql b/src/common/databases/migrations/20230511085908_v5/migration.sql deleted file mode 100644 index a5b3abcb..00000000 --- a/src/common/databases/migrations/20230511085908_v5/migration.sql +++ /dev/null @@ -1,2 +0,0 @@ --- AlterTable -ALTER TABLE "files" ADD COLUMN "archived_at" TIMESTAMP(3); diff --git a/src/common/databases/migrations/20230515134800_v6/migration.sql b/src/common/databases/migrations/20230515134800_v6/migration.sql deleted file mode 100644 index efaf46c5..00000000 --- a/src/common/databases/migrations/20230515134800_v6/migration.sql +++ /dev/null @@ -1,10 +0,0 @@ -/* - Warnings: - - - Added the required column `mimetype` to the `files` table without a default value. This is not possible if the table is not empty. - - Added the required column `size` to the `files` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "files" ADD COLUMN "mimetype" VARCHAR(255) NOT NULL, -ADD COLUMN "size" INTEGER NOT NULL; diff --git a/src/common/databases/migrations/20230515140007_v6/migration.sql b/src/common/databases/migrations/20230515140007_v6/migration.sql deleted file mode 100644 index efaf46c5..00000000 --- a/src/common/databases/migrations/20230515140007_v6/migration.sql +++ /dev/null @@ -1,10 +0,0 @@ -/* - Warnings: - - - Added the required column `mimetype` to the `files` table without a default value. This is not possible if the table is not empty. - - Added the required column `size` to the `files` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "files" ADD COLUMN "mimetype" VARCHAR(255) NOT NULL, -ADD COLUMN "size" INTEGER NOT NULL; diff --git a/src/common/databases/migrations/20230426144239_init/migration.sql b/src/common/databases/migrations/20230621092719_init/migration.sql similarity index 85% rename from src/common/databases/migrations/20230426144239_init/migration.sql rename to src/common/databases/migrations/20230621092719_init/migration.sql index d017a9c4..f8237a5c 100644 --- a/src/common/databases/migrations/20230426144239_init/migration.sql +++ b/src/common/databases/migrations/20230621092719_init/migration.sql @@ -35,9 +35,9 @@ CREATE TABLE "contacts" ( "last_name" VARCHAR(255) NOT NULL, "email" VARCHAR(255) NOT NULL, "phone_number" VARCHAR(50), - "cell_phone_number" VARCHAR(50), + "cell_phone_number" VARCHAR(50) NOT NULL, "civility" "ECivility" NOT NULL DEFAULT 'MALE', - "address_uid" VARCHAR(255) NOT NULL, + "address_uid" VARCHAR(255), "birthdate" TIMESTAMP(3), "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3), @@ -50,6 +50,7 @@ CREATE TABLE "users" ( "uid" TEXT NOT NULL, "idNot" VARCHAR(255) NOT NULL, "contact_uid" VARCHAR(255) NOT NULL, + "roles_uid" TEXT NOT NULL, "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3), "office_uid" VARCHAR(255) NOT NULL, @@ -174,6 +175,11 @@ CREATE TABLE "files" ( "uid" TEXT NOT NULL, "document_uid" VARCHAR(255) NOT NULL, "file_path" VARCHAR(255) NOT NULL, + "file_name" VARCHAR(255) NOT NULL, + "mimetype" VARCHAR(255) NOT NULL, + "size" INTEGER NOT NULL, + "archived_at" TIMESTAMP(3), + "key" VARCHAR(255), "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3), @@ -249,6 +255,50 @@ CREATE TABLE "deed_type_has_document_types" ( CONSTRAINT "deed_type_has_document_types_pkey" PRIMARY KEY ("uid") ); +-- CreateTable +CREATE TABLE "roles" ( + "uid" TEXT NOT NULL, + "name" VARCHAR(255) NOT NULL, + "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3), + + CONSTRAINT "roles_pkey" PRIMARY KEY ("uid") +); + +-- CreateTable +CREATE TABLE "rules" ( + "uid" TEXT NOT NULL, + "name" VARCHAR(255) NOT NULL, + "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3), + "role_has_rules_uid" TEXT, + "office_role_has_rules_uid" TEXT, + + CONSTRAINT "rules_pkey" PRIMARY KEY ("uid") +); + +-- CreateTable +CREATE TABLE "role_has_rules" ( + "uid" TEXT NOT NULL, + "role_uid" VARCHAR(255) NOT NULL, + "rule_uid" VARCHAR(255) NOT NULL, + "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3), + + CONSTRAINT "role_has_rules_pkey" PRIMARY KEY ("uid") +); + +-- CreateTable +CREATE TABLE "office_role_has_rules" ( + "uid" TEXT NOT NULL, + "role_uid" VARCHAR(255) NOT NULL, + "rule_uid" VARCHAR(255) NOT NULL, + "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3), + + CONSTRAINT "office_role_has_rules_pkey" PRIMARY KEY ("uid") +); + -- CreateIndex CREATE UNIQUE INDEX "addresses_uid_key" ON "addresses"("uid"); @@ -366,12 +416,27 @@ CREATE UNIQUE INDEX "deed_type_has_document_types_uid_key" ON "deed_type_has_doc -- CreateIndex CREATE UNIQUE INDEX "deed_type_has_document_types_deed_type_uid_document_type_ui_key" ON "deed_type_has_document_types"("deed_type_uid", "document_type_uid"); +-- CreateIndex +CREATE UNIQUE INDEX "roles_uid_key" ON "roles"("uid"); + +-- CreateIndex +CREATE UNIQUE INDEX "rules_uid_key" ON "rules"("uid"); + +-- CreateIndex +CREATE UNIQUE INDEX "role_has_rules_uid_key" ON "role_has_rules"("uid"); + +-- CreateIndex +CREATE UNIQUE INDEX "office_role_has_rules_uid_key" ON "office_role_has_rules"("uid"); + -- AddForeignKey ALTER TABLE "contacts" ADD CONSTRAINT "contacts_address_uid_fkey" FOREIGN KEY ("address_uid") REFERENCES "addresses"("uid") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "users" ADD CONSTRAINT "users_contact_uid_fkey" FOREIGN KEY ("contact_uid") REFERENCES "contacts"("uid") ON DELETE CASCADE ON UPDATE CASCADE; +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_roles_uid_fkey" FOREIGN KEY ("roles_uid") REFERENCES "roles"("uid") ON DELETE RESTRICT ON UPDATE CASCADE; + -- AddForeignKey ALTER TABLE "users" ADD CONSTRAINT "users_office_uid_fkey" FOREIGN KEY ("office_uid") REFERENCES "offices"("uid") ON DELETE CASCADE ON UPDATE CASCADE; @@ -444,6 +509,14 @@ ALTER TABLE "deed_type_has_document_types" ADD CONSTRAINT "deed_type_has_documen -- AddForeignKey ALTER TABLE "deed_type_has_document_types" ADD CONSTRAINT "deed_type_has_document_types_deed_type_uid_fkey" FOREIGN KEY ("deed_type_uid") REFERENCES "deed_types"("uid") ON DELETE CASCADE ON UPDATE CASCADE; --- AlterTable -ALTER TABLE "contacts" ALTER COLUMN "cell_phone_number" SET NOT NULL, -ALTER COLUMN "address_uid" DROP NOT NULL; \ No newline at end of file +-- AddForeignKey +ALTER TABLE "rules" ADD CONSTRAINT "rules_role_has_rules_uid_fkey" FOREIGN KEY ("role_has_rules_uid") REFERENCES "role_has_rules"("uid") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "rules" ADD CONSTRAINT "rules_office_role_has_rules_uid_fkey" FOREIGN KEY ("office_role_has_rules_uid") REFERENCES "office_role_has_rules"("uid") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "role_has_rules" ADD CONSTRAINT "role_has_rules_role_uid_fkey" FOREIGN KEY ("role_uid") REFERENCES "roles"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "office_role_has_rules" ADD CONSTRAINT "office_role_has_rules_role_uid_fkey" FOREIGN KEY ("role_uid") REFERENCES "roles"("uid") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/src/common/databases/migrations/20230621100427_v1/migration.sql b/src/common/databases/migrations/20230621100427_v1/migration.sql new file mode 100644 index 00000000..be549452 --- /dev/null +++ b/src/common/databases/migrations/20230621100427_v1/migration.sql @@ -0,0 +1,14 @@ +/* + Warnings: + + - You are about to alter the column `roles_uid` on the `users` table. The data in that column could be lost. The data in that column will be cast from `Text` to `VarChar(255)`. + +*/ +-- DropForeignKey +ALTER TABLE "users" DROP CONSTRAINT "users_roles_uid_fkey"; + +-- AlterTable +ALTER TABLE "users" ALTER COLUMN "roles_uid" SET DATA TYPE VARCHAR(255); + +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_roles_uid_fkey" FOREIGN KEY ("roles_uid") REFERENCES "roles"("uid") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/src/common/databases/schema.prisma b/src/common/databases/schema.prisma index 63f8da27..1208df65 100644 --- a/src/common/databases/schema.prisma +++ b/src/common/databases/schema.prisma @@ -54,8 +54,8 @@ model Users { idNot String @unique @db.VarChar(255) contact Contacts @relation(fields: [contact_uid], references: [uid], onDelete: Cascade) contact_uid String @unique @db.VarChar(255) - role Roles @relation(fields: [roles_uid], references: [uid]) - roles_uid String + role Roles @relation(fields: [roles_uid], references: [uid], onDelete: Cascade) + roles_uid String @db.VarChar(255) created_at DateTime? @default(now()) updated_at DateTime? @updatedAt office_membership Offices @relation(fields: [office_uid], references: [uid], onDelete: Cascade) diff --git a/src/common/databases/seeders/seeder.ts b/src/common/databases/seeders/seeder.ts index 3210ca98..c8eb63f8 100644 --- a/src/common/databases/seeders/seeder.ts +++ b/src/common/databases/seeders/seeder.ts @@ -19,6 +19,7 @@ import { ECivility, ECustomerStatus, PrismaClient, + Roles, } from "@prisma/client"; (async () => { @@ -226,6 +227,21 @@ import { }, ]; + const roles: Roles[] = [ + { + uid: uidRole1, + name: 'super-admin', + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidRole2, + name: 'admin', + created_at: new Date(), + updated_at: new Date(), + } + ]; + const users: Users[] = [ { uid: uidUser1, @@ -532,6 +548,10 @@ import { await prisma.offices.create({ data: office }); } + for (const role of roles) { + await prisma.roles.create({ data: role }); + } + for (const user of users) { await prisma.users.create({ data: user }); } diff --git a/src/common/databases/seeders/seeder2.ts b/src/common/databases/seeders/seeder2.ts index 248f04f7..f76f8cde 100644 --- a/src/common/databases/seeders/seeder2.ts +++ b/src/common/databases/seeders/seeder2.ts @@ -17,6 +17,7 @@ import { ECivility, ECustomerStatus, PrismaClient, + Roles, } from "@prisma/client"; (async () => { @@ -788,6 +789,21 @@ import { } ]; + const roles: Roles[] = [ + { + uid: uidRole1, + name: 'super-admin', + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidRole2, + name: 'admin', + created_at: new Date(), + updated_at: new Date(), + } + ]; + const users: Users[] = [ { uid: uidUser1, @@ -1848,6 +1864,10 @@ import { await prisma.offices.create({ data: office }); } + for (const role of roles) { + await prisma.roles.create({ data: role }); + } + for (const user of users) { await prisma.users.create({ data: user }); } diff --git a/src/common/system/controller-pattern/BaseController.ts b/src/common/system/controller-pattern/BaseController.ts index edd1af03..39bd4be7 100644 --- a/src/common/system/controller-pattern/BaseController.ts +++ b/src/common/system/controller-pattern/BaseController.ts @@ -32,6 +32,10 @@ export default abstract class BaseController { return this.httpResponse(response, HttpCodes.INTERNAL_ERROR, responseData); } + protected httpUnauthorized(response: Response, responseData: IResponseData = "http Unauthorized Request") { + return this.httpResponse(response, HttpCodes.UNAUTHORIZED, responseData); + } + protected httpNotImplemented(response: Response, responseData: IResponseData = "Not implemented") { return this.httpResponse(response, HttpCodes.NOT_IMPLEMENTED, responseData); } diff --git a/src/common/system/controller-pattern/HttpCodes.ts b/src/common/system/controller-pattern/HttpCodes.ts index 2d6d92c5..648c30b1 100644 --- a/src/common/system/controller-pattern/HttpCodes.ts +++ b/src/common/system/controller-pattern/HttpCodes.ts @@ -7,5 +7,6 @@ enum HttpCodes { UNKNOWN_ERROR = 520, NOT_IMPLEMENTED = 501, NOT_FOUND = 404, + UNAUTHORIZED = 401, } export default HttpCodes; diff --git a/src/services/private-services/AuthService/AuthService.ts b/src/services/private-services/AuthService/AuthService.ts index ab528ec4..e156a052 100644 --- a/src/services/private-services/AuthService/AuthService.ts +++ b/src/services/private-services/AuthService/AuthService.ts @@ -1,8 +1,9 @@ -import jwt from "jsonwebtoken"; +import jwt, { VerifyCallback } from "jsonwebtoken"; import BaseService from "@Services/BaseService"; import "reflect-metadata"; import { BackendVariables } from "@Common/config/variables/Variables"; -import Container, { Service } from "typedi"; +import { Service } from "typedi"; +//import User from "le-coffre-resources/dist/Notary"; type IdNotTokens = { access_token: string; @@ -11,8 +12,7 @@ type IdNotTokens = { @Service() export default class AuthService extends BaseService { - protected readonly variables = Container.get(BackendVariables); - private constructor() { + private constructor(protected variables: BackendVariables) { super(); } @@ -50,4 +50,20 @@ export default class AuthService extends BaseService { throw new Error(); } } + + public generateAccessToken(user: any) { + return jwt.sign({...user}, this.variables.ACCESS_TOKEN_SECRET, { expiresIn: "15m" }); + } + + public generateRefreshToken(user: any) { + return jwt.sign({...user}, this.variables.REFRESH_TOKEN_SECRET, { expiresIn: "1h" }); + } + + public verifyAccessToken(token: string, callback?: VerifyCallback) { + return jwt.verify(token, this.variables.ACCESS_TOKEN_SECRET, callback); + } + + public verifyRefreshToken(token: string, callback?: VerifyCallback) { + return jwt.verify(token, this.variables.REFRESH_TOKEN_SECRET, callback); + } } From 8ff4cc2afd1cdf3971ff3a73e2586b689d696a23 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Wed, 21 Jun 2023 15:51:09 +0200 Subject: [PATCH 021/134] add auth Handler --- src/app/api/super-admin/UsersController.ts | 5 +++-- src/app/middlewares/AuthHandler.ts | 20 +++++++++++++++++++ .../AuthService/AuthService.ts | 4 ++-- 3 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 src/app/middlewares/AuthHandler.ts diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index 5231ccc1..e25bd351 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -6,6 +6,7 @@ import { Service } from "typedi"; import { validateOrReject } from "class-validator"; import User from "le-coffre-resources/dist/Notary"; import { Users } from "@prisma/client"; +import authHandler from "@App/middlewares/AuthHandler"; @Controller() @Service() @@ -17,7 +18,7 @@ export default class UsersController extends ApiController { /** * @description Get all users */ - @Get("/api/v1/super-admin/users") + @Get("/api/v1/super-admin/users", [authHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -40,7 +41,7 @@ export default class UsersController extends ApiController { /** * @description Create a new user */ - @Post("/api/v1/super-admin/users") + @Post("/api/v1/super-admin/users", [authHandler]) protected async getAddresses(req: Request, response: Response) { try { //init IUser resource with request body values diff --git a/src/app/middlewares/AuthHandler.ts b/src/app/middlewares/AuthHandler.ts new file mode 100644 index 00000000..f2bf8cb7 --- /dev/null +++ b/src/app/middlewares/AuthHandler.ts @@ -0,0 +1,20 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import AuthService from "@Services/private-services/AuthService/AuthService"; +import { NextFunction, Request, Response } from "express"; +import Container from "typedi"; + +export default function authHandler(req: Request, response: Response, next: NextFunction) { + const authHeader = req.headers['authorization']; + const token = authHeader && authHeader.split(' ')[1]; + + if (!token) return response.sendStatus(HttpCodes.UNAUTHORIZED) + + const authService = Container.get(AuthService); + authService.verifyAccessToken(token, (err, userPayload) => { + if (err) return response.sendStatus(HttpCodes.UNAUTHORIZED); + req.body.user = userPayload; + return; + }) + return next(); +} + diff --git a/src/services/private-services/AuthService/AuthService.ts b/src/services/private-services/AuthService/AuthService.ts index e156a052..d8a0cf54 100644 --- a/src/services/private-services/AuthService/AuthService.ts +++ b/src/services/private-services/AuthService/AuthService.ts @@ -3,7 +3,6 @@ import BaseService from "@Services/BaseService"; import "reflect-metadata"; import { BackendVariables } from "@Common/config/variables/Variables"; import { Service } from "typedi"; -//import User from "le-coffre-resources/dist/Notary"; type IdNotTokens = { access_token: string; @@ -12,7 +11,8 @@ type IdNotTokens = { @Service() export default class AuthService extends BaseService { - private constructor(protected variables: BackendVariables) { + + constructor(protected variables: BackendVariables) { super(); } From 6b643224243d23198f03768e3440c62879c3b5e2 Mon Sep 17 00:00:00 2001 From: Vins Date: Mon, 26 Jun 2023 09:48:33 +0200 Subject: [PATCH 022/134] Remove useless migration --- package.json | 3 ++- .../migrations/20230515140007_v6/migration.sql | 10 ---------- 2 files changed, 2 insertions(+), 11 deletions(-) delete mode 100644 src/common/databases/migrations/20230515140007_v6/migration.sql diff --git a/package.json b/package.json index 1a32400c..c3e19dfb 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,8 @@ "migrate": "npx prisma migrate deploy", "docker:up:test": "docker-compose -f docker-compose-test.yml up -d", "docker:down:test": "docker-compose down", - "test": "tsc && npm run docker:up:test && npm run migrate:test && dotenv -e .env.test -- jest -i --verbose ./dist/test/* && npm run docker:down:test" + "test": "tsc && npm run docker:up:test && npm run migrate:test && dotenv -e .env.test -- jest -i --verbose ./dist/test/* && npm run docker:down:test", + "seed": "ts-node src/common/databases/seeders/seeder2.ts" }, "repository": { "type": "git", diff --git a/src/common/databases/migrations/20230515140007_v6/migration.sql b/src/common/databases/migrations/20230515140007_v6/migration.sql deleted file mode 100644 index efaf46c5..00000000 --- a/src/common/databases/migrations/20230515140007_v6/migration.sql +++ /dev/null @@ -1,10 +0,0 @@ -/* - Warnings: - - - Added the required column `mimetype` to the `files` table without a default value. This is not possible if the table is not empty. - - Added the required column `size` to the `files` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterTable -ALTER TABLE "files" ADD COLUMN "mimetype" VARCHAR(255) NOT NULL, -ADD COLUMN "size" INTEGER NOT NULL; From e1b2bec91252d9b8a73f9aab9a3310862fca2edc Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Mon, 26 Jun 2023 10:45:29 +0200 Subject: [PATCH 023/134] add rules middleware --- src/app/api/idnot-user/UserInfoController.ts | 94 ------------------- src/app/api/idnot/UserController.ts | 85 +++++++++++++++++ .../api/super-admin/CustomersController.ts | 10 +- .../api/super-admin/DeedTypesController.ts | 10 +- src/app/api/super-admin/DeedsController.ts | 8 +- .../super-admin/DocumentTypesController.ts | 10 +- .../api/super-admin/DocumentsController.ts | 12 ++- src/app/api/super-admin/FilesController.ts | 16 ++-- .../super-admin/OfficeFoldersController.ts | 12 ++- src/app/api/super-admin/OfficesController.ts | 10 +- src/app/api/super-admin/RolesController.ts | 10 +- src/app/api/super-admin/RulesController.ts | 10 +- src/app/api/super-admin/UsersController.ts | 9 +- src/app/index.ts | 4 +- src/app/middlewares/AuthHandler.ts | 20 ++-- src/app/middlewares/RulesHandler.ts | 22 +++++ .../20230622172124_v2/migration.sql | 37 ++++++++ .../20230622172838_v3/migration.sql | 24 +++++ .../20230623070044_v4/migration.sql | 12 +++ .../20230623072820_v5/migration.sql | 30 ++++++ src/common/databases/schema.prisma | 59 ++++++------ src/common/databases/seeders/seeder2.ts | 75 +++++++++++++++ src/common/repositories/RolesRepository.ts | 14 ++- src/common/system/OpenIdInterface.ts | 16 ++++ src/entries/App.ts | 1 + .../AddressesService/AddressesService.ts | 0 .../common/AuthService/AuthService.ts | 65 +++++++++++++ .../ContactsService/ContactsService.ts | 0 .../CryptoService/CryptoService.ts | 0 .../FilesService/FilesService.ts | 0 .../IpfsService/IpfsService.ts | 0 .../NotificationsService.ts | 0 .../AuthService/AuthService.ts | 69 -------------- 33 files changed, 494 insertions(+), 250 deletions(-) delete mode 100644 src/app/api/idnot-user/UserInfoController.ts create mode 100644 src/app/api/idnot/UserController.ts create mode 100644 src/app/middlewares/RulesHandler.ts create mode 100644 src/common/databases/migrations/20230622172124_v2/migration.sql create mode 100644 src/common/databases/migrations/20230622172838_v3/migration.sql create mode 100644 src/common/databases/migrations/20230623070044_v4/migration.sql create mode 100644 src/common/databases/migrations/20230623072820_v5/migration.sql create mode 100644 src/common/system/OpenIdInterface.ts rename src/services/{private-services => common}/AddressesService/AddressesService.ts (100%) create mode 100644 src/services/common/AuthService/AuthService.ts rename src/services/{private-services => common}/ContactsService/ContactsService.ts (100%) rename src/services/{private-services => common}/CryptoService/CryptoService.ts (100%) rename src/services/{private-services => common}/FilesService/FilesService.ts (100%) rename src/services/{private-services => common}/IpfsService/IpfsService.ts (100%) rename src/services/{private-services => common}/NotificationsService/NotificationsService.ts (100%) delete mode 100644 src/services/private-services/AuthService/AuthService.ts diff --git a/src/app/api/idnot-user/UserInfoController.ts b/src/app/api/idnot-user/UserInfoController.ts deleted file mode 100644 index 80b6dc4a..00000000 --- a/src/app/api/idnot-user/UserInfoController.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { Response, Request } from "express"; -import { Controller, Post } from "@ControllerPattern/index"; -import ApiController from "@Common/system/controller-pattern/ApiController"; -import { Service } from "typedi"; -import AuthService from "@Services/private-services/AuthService/AuthService"; -import UsersService from "@Services/super-admin/UsersService/UsersService"; -import User from "le-coffre-resources/dist/SuperAdmin"; -import { JwtPayload } from "jsonwebtoken"; -import { validateOrReject } from "class-validator"; -//import User from "le-coffre-resources/dist/Notary"; - -@Controller() -@Service() -export default class UserInfoController extends ApiController { - constructor(private authService: AuthService, private userService: UsersService) { - super(); - } - - /** - * @description Get user created from IdNot authentification - * @returns User - */ - @Post("/api/v1/idnot-user/:code") - protected async getUserInfosFromIdnot(req: Request, response: Response) { - try { - const code = req.params["code"]; - const user = await this.authService.getUserFromIdNotTokens(code!); - //success - this.httpSuccess(response, user); - } catch (error) { - this.httpInternalError(response); - return; - } - } - - @Post("/api/v1/login/:idnot") - protected async login(req: Request, response: Response) { - try { - const id = req.params["idnot"]; - if (!id) throw new Error("idnot is required"); - - const users = await this.userService.get({ where: { idNot: id } , include: {contact: true, role: true, office_membership: true}}); - const user = User.hydrate(users[0]!, { strategy: "excludeAll" }); - await validateOrReject(user, { groups: ["auth"] }) - console.log(user) - const accessToken = this.authService.generateAccessToken(user); - const refreshToken = this.authService.generateRefreshToken(user); - - //success - this.httpSuccess(response, { accessToken, refreshToken }); - } catch (error) { - console.log(error); - this.httpInternalError(response); - return; - } - } - - @Post("/api/v1/refresh-token") - protected async refreshToken(req: Request, response: Response) { - try { - const authHeader = req.headers["authorization"]; - const token = authHeader && authHeader.split(" ")[1]; - - if (!token) { - this.httpBadRequest(response); - return; - } - - let accessToken; - this.authService.verifyRefreshToken(token, (err, userPayload) => { - if (err) { - this.httpUnauthorized(response); - return; - } - - const user = userPayload as JwtPayload; - console.log(userPayload) - // const user = User.hydrate(userPayload!, { strategy: "excludeAll" }); - // const user = await this.userService.getByUid(userPayload!.uid); - // const users = await this.userService.getByUid(userPayload!.uid); - delete user.iat; - delete user!.exp; - accessToken = this.authService.generateAccessToken(user); - }); - - //success - this.httpSuccess(response, accessToken); - } catch (error) { - console.log(error) - this.httpInternalError(response); - return; - } - } -} diff --git a/src/app/api/idnot/UserController.ts b/src/app/api/idnot/UserController.ts new file mode 100644 index 00000000..ad72402d --- /dev/null +++ b/src/app/api/idnot/UserController.ts @@ -0,0 +1,85 @@ +import { Response, Request } from "express"; +import { Controller, Post } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import { Service } from "typedi"; +import AuthService from "@Services/common/AuthService/AuthService"; +import { JwtPayload } from "jsonwebtoken"; + +@Controller() +@Service() +export default class UserController extends ApiController { + constructor(private authService: AuthService) { + super(); + } + + /** + * @description Get user created from IdNot authentification + * @todo Used for test, should be removed + * @returns User + */ + // @Post("/api/v1/idnot/user/:code") + // protected async getUserInfosFromIdnot(req: Request, response: Response) { + // console.warn("/api/v1/idnot/user/:code used for test, should be removed"); + + // try { + // const code = req.params["code"]; + // const user = await this.authService.getUserFromIdNotTokens(code!); + // //success + // this.httpSuccess(response, user); + // } catch (error) { + // this.httpInternalError(response); + // return; + // } + // } + + @Post("/api/v1/idnot/user/login/:idnot") + protected async login(req: Request, response: Response) { + try { + const id = req.params["idnot"]; + if (!id) throw new Error("idnot is required"); + + const payload = await this.authService.getUserPayload(id!); + const accessToken = this.authService.generateAccessToken(payload); + const refreshToken = this.authService.generateRefreshToken(payload); + + //success + this.httpSuccess(response, { accessToken, refreshToken }); + } catch (error) { + console.log(error) + this.httpInternalError(response); + return; + } + } + + @Post("/api/v1/idnot/user/refresh-token") + protected async refreshToken(req: Request, response: Response) { + try { + const authHeader = req.headers["authorization"]; + const token = authHeader && authHeader.split(" ")[1]; + + if (!token) { + this.httpBadRequest(response); + return; + } + + let accessToken; + this.authService.verifyRefreshToken(token, (err, userPayload) => { + if (err) { + this.httpUnauthorized(response); + return; + } + + const user = userPayload as JwtPayload; + delete user.iat; + delete user!.exp; + accessToken = this.authService.generateAccessToken(user); + }); + + //success + this.httpSuccess(response, accessToken); + } catch (error) { + this.httpInternalError(response); + return; + } + } +} diff --git a/src/app/api/super-admin/CustomersController.ts b/src/app/api/super-admin/CustomersController.ts index 6bd28b1e..440de50b 100644 --- a/src/app/api/super-admin/CustomersController.ts +++ b/src/app/api/super-admin/CustomersController.ts @@ -6,6 +6,8 @@ import { Service } from "typedi"; import { Customer } from "le-coffre-resources/dist/SuperAdmin"; import { Customers } from "@prisma/client"; import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; @Controller() @Service() @@ -17,7 +19,7 @@ export default class CustomersController extends ApiController { /** * @description Get all customers */ - @Get("/api/v1/super-admin/customers") + @Get("/api/v1/super-admin/customers", [authHandler,ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -40,7 +42,7 @@ export default class CustomersController extends ApiController { /** * @description Create a new customer */ - @Post("/api/v1/super-admin/customers") + @Post("/api/v1/super-admin/customers", [authHandler,ruleHandler]) protected async post(req: Request, response: Response) { try { //init IUser resource with request body values @@ -66,7 +68,7 @@ export default class CustomersController extends ApiController { /** * @description Modify a specific customer by uid */ - @Put("/api/v1/super-admin/customers/:uid") + @Put("/api/v1/super-admin/customers/:uid", [authHandler,ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -107,7 +109,7 @@ export default class CustomersController extends ApiController { /** * @description Get a specific customer by uid */ - @Get("/api/v1/super-admin/customers/:uid") + @Get("/api/v1/super-admin/customers/:uid", [authHandler,ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/DeedTypesController.ts b/src/app/api/super-admin/DeedTypesController.ts index 5f038ba9..d890bc2c 100644 --- a/src/app/api/super-admin/DeedTypesController.ts +++ b/src/app/api/super-admin/DeedTypesController.ts @@ -6,6 +6,8 @@ import DeedTypesService from "@Services/super-admin/DeedTypesService/DeedTypesSe import { DeedTypes } from "@prisma/client"; import { DeedType } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; @Controller() @Service() @@ -18,7 +20,7 @@ export default class DeedTypesController extends ApiController { * @description Get all deedtypes * @returns Deedtype[] list of deedtypes */ - @Get("/api/v1/super-admin/deed-types") + @Get("/api/v1/super-admin/deed-types", [authHandler,ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -41,7 +43,7 @@ export default class DeedTypesController extends ApiController { * @description Create a new deedtype * @returns Deedtype created */ - @Post("/api/v1/super-admin/deed-types") + @Post("/api/v1/super-admin/deed-types", [authHandler,ruleHandler]) protected async post(req: Request, response: Response) { try { //init DeedType resource with request body values @@ -70,7 +72,7 @@ export default class DeedTypesController extends ApiController { * @description Modify a specific deedtype by uid * @returns Deedtype modified */ - @Put("/api/v1/super-admin/deed-types/:uid") + @Put("/api/v1/super-admin/deed-types/:uid", [authHandler,ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -112,7 +114,7 @@ export default class DeedTypesController extends ApiController { * @description Get a specific deedtype by uid * @returns IDeedtype */ - @Get("/api/v1/super-admin/deed-types/:uid") + @Get("/api/v1/super-admin/deed-types/:uid", [authHandler,ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/DeedsController.ts b/src/app/api/super-admin/DeedsController.ts index 3f4d3c62..2dd94592 100644 --- a/src/app/api/super-admin/DeedsController.ts +++ b/src/app/api/super-admin/DeedsController.ts @@ -6,6 +6,8 @@ import { Service } from "typedi"; import { Deeds } from "@prisma/client"; import { Deed } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; @Controller() @Service() @@ -18,7 +20,7 @@ export default class DeedsController extends ApiController { * @description Get all deeds * @returns Deed[] list of deeds */ - @Get("/api/v1/super-admin/deeds") + @Get("/api/v1/super-admin/deeds", [authHandler,ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -41,7 +43,7 @@ export default class DeedsController extends ApiController { * @description Get a specific deed by uid * @returns Deed */ - @Get("/api/v1/super-admin/deeds/:uid") + @Get("/api/v1/super-admin/deeds/:uid", [authHandler,ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -79,7 +81,7 @@ export default class DeedsController extends ApiController { /** * @description Modify a specific deed by uid */ - @Put("/api/v1/super-admin/deeds/:uid") + @Put("/api/v1/super-admin/deeds/:uid", [authHandler,ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/DocumentTypesController.ts b/src/app/api/super-admin/DocumentTypesController.ts index ecd89e14..99cef9ac 100644 --- a/src/app/api/super-admin/DocumentTypesController.ts +++ b/src/app/api/super-admin/DocumentTypesController.ts @@ -7,6 +7,8 @@ import { DocumentTypes } from "@prisma/client"; import ObjectHydrate from "@Common/helpers/ObjectHydrate"; import { DocumentType } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; @Controller() @Service() @@ -18,7 +20,7 @@ export default class DocumentTypesController extends ApiController { /** * @description Get all document-types */ - @Get("/api/v1/super-admin/document-types") + @Get("/api/v1/super-admin/document-types", [authHandler,ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -43,7 +45,7 @@ export default class DocumentTypesController extends ApiController { /** * @description Create a new documentType */ - @Post("/api/v1/super-admin/document-types") + @Post("/api/v1/super-admin/document-types", [authHandler,ruleHandler]) protected async post(req: Request, response: Response) { try { //init DocumentType resource with request body values @@ -67,7 +69,7 @@ export default class DocumentTypesController extends ApiController { /** * @description Modify a specific documentType by uid */ - @Put("/api/v1/super-admin/document-types/:uid") + @Put("/api/v1/super-admin/document-types/:uid", [authHandler,ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -107,7 +109,7 @@ export default class DocumentTypesController extends ApiController { /** * @description Get a specific documentType by uid */ - @Get("/api/v1/super-admin/document-types/:uid") + @Get("/api/v1/super-admin/document-types/:uid", [authHandler,ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/DocumentsController.ts b/src/app/api/super-admin/DocumentsController.ts index 009d33ca..cfc5bb2f 100644 --- a/src/app/api/super-admin/DocumentsController.ts +++ b/src/app/api/super-admin/DocumentsController.ts @@ -6,6 +6,8 @@ import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsSe import { Documents } from "@prisma/client"; import { Document } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; @Controller() @Service() @@ -18,7 +20,7 @@ export default class DocumentsController extends ApiController { * @description Get all documents * @returns IDocument[] list of documents */ - @Get("/api/v1/super-admin/documents") + @Get("/api/v1/super-admin/documents", [authHandler,ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -42,7 +44,7 @@ export default class DocumentsController extends ApiController { * @description Create a new document * @returns IDocument created */ - @Post("/api/v1/super-admin/documents") + @Post("/api/v1/super-admin/documents", [authHandler,ruleHandler]) protected async post(req: Request, response: Response) { try { //init Document resource with request body values @@ -70,7 +72,7 @@ export default class DocumentsController extends ApiController { /** * @description Update a specific document */ - @Put("/api/v1/super-admin/documents/:uid") + @Put("/api/v1/super-admin/documents/:uid", [authHandler,ruleHandler]) protected async update(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -109,7 +111,7 @@ export default class DocumentsController extends ApiController { /** * @description Delete a specific document */ - @Delete("/api/v1/super-admin/documents/:uid") + @Delete("/api/v1/super-admin/documents/:uid", [authHandler,ruleHandler]) protected async delete(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -142,7 +144,7 @@ export default class DocumentsController extends ApiController { /** * @description Get a specific document by uid */ - @Get("/api/v1/super-admin/documents/:uid") + @Get("/api/v1/super-admin/documents/:uid", [authHandler,ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/FilesController.ts b/src/app/api/super-admin/FilesController.ts index 3bfd52da..465e684f 100644 --- a/src/app/api/super-admin/FilesController.ts +++ b/src/app/api/super-admin/FilesController.ts @@ -2,11 +2,13 @@ import { Response, Request } from "express"; import { Controller, Delete, Get, Post, Put } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import { Service } from "typedi"; -import FilesService from "@Services/private-services/FilesService/FilesService"; +import FilesService from "@Services/common/FilesService/FilesService"; import { Files } from "@prisma/client"; import { File } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; @Controller() @Service() @@ -19,7 +21,7 @@ export default class FilesController extends ApiController { * @description Get all Files * @returns File[] list of Files */ - @Get("/api/v1/super-admin/files") + @Get("/api/v1/super-admin/files", [authHandler,ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -42,7 +44,7 @@ export default class FilesController extends ApiController { /** * @description Get a specific File by uid */ - @Get("/api/v1/super-admin/files/download/:uid") + @Get("/api/v1/super-admin/files/download/:uid", [authHandler,ruleHandler]) protected async download(req: Request, response: Response) { const uid = req.params["uid"]; if (!uid) { @@ -71,7 +73,7 @@ export default class FilesController extends ApiController { * @description Create a new File * @returns File created */ - @Post("/api/v1/super-admin/files") + @Post("/api/v1/super-admin/files", [authHandler,ruleHandler]) protected async post(req: Request, response: Response) { try { //get file @@ -112,7 +114,7 @@ export default class FilesController extends ApiController { /** * @description Update a specific file */ - @Put("/api/v1/super-admin/files/:uid") + @Put("/api/v1/super-admin/files/:uid", [authHandler,ruleHandler]) protected async update(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -150,7 +152,7 @@ export default class FilesController extends ApiController { /** * @description Delete a specific File */ - @Delete("/api/v1/super-admin/files/:uid") + @Delete("/api/v1/super-admin/files/:uid", [authHandler,ruleHandler]) protected async delete(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -188,7 +190,7 @@ export default class FilesController extends ApiController { /** * @description Get a specific File by uid */ - @Get("/api/v1/super-admin/files/:uid") + @Get("/api/v1/super-admin/files/:uid", [authHandler,ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/OfficeFoldersController.ts b/src/app/api/super-admin/OfficeFoldersController.ts index ed2dbce1..6999e03b 100644 --- a/src/app/api/super-admin/OfficeFoldersController.ts +++ b/src/app/api/super-admin/OfficeFoldersController.ts @@ -6,6 +6,8 @@ import { Service } from "typedi"; import { OfficeFolders } from "@prisma/client"; import { OfficeFolder } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; @Controller() @Service() @@ -17,7 +19,7 @@ export default class OfficeFoldersController extends ApiController { /** * @description Get all folders */ - @Get("/api/v1/super-admin/folders") + @Get("/api/v1/super-admin/folders", [authHandler,ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -41,7 +43,7 @@ export default class OfficeFoldersController extends ApiController { /** * @description Create a new folder */ - @Post("/api/v1/super-admin/folders") + @Post("/api/v1/super-admin/folders", [authHandler,ruleHandler]) protected async post(req: Request, response: Response) { try { //init OfficeFolder resource with request body values @@ -78,7 +80,7 @@ export default class OfficeFoldersController extends ApiController { /** * @description Modify a specific folder by uid */ - @Put("/api/v1/super-admin/folders/:uid") + @Put("/api/v1/super-admin/folders/:uid", [authHandler,ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -120,7 +122,7 @@ export default class OfficeFoldersController extends ApiController { * @description Get a specific folder by uid * @returns IFolder */ - @Get("/api/v1/super-admin/folders/:uid") + @Get("/api/v1/super-admin/folders/:uid", [authHandler,ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -159,7 +161,7 @@ export default class OfficeFoldersController extends ApiController { /** * @description Delete a specific folder */ - @Delete("/api/v1/super-admin/folders/:uid") + @Delete("/api/v1/super-admin/folders/:uid", [authHandler,ruleHandler]) protected async delete(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/OfficesController.ts b/src/app/api/super-admin/OfficesController.ts index 86de50f5..2ec24cc1 100644 --- a/src/app/api/super-admin/OfficesController.ts +++ b/src/app/api/super-admin/OfficesController.ts @@ -6,6 +6,8 @@ import { Service } from "typedi"; import { Offices } from "@prisma/client"; import { Office as OfficeResource } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; +import ruleHandler from "@App/middlewares/RulesHandler"; +import authHandler from "@App/middlewares/AuthHandler"; @Controller() @Service() @@ -16,7 +18,7 @@ export default class OfficesController extends ApiController { /** * @description Get all offices */ - @Get("/api/v1/super-admin/offices") + @Get("/api/v1/super-admin/offices", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -35,7 +37,7 @@ export default class OfficesController extends ApiController { /** * @description Create a new office */ - @Post("/api/v1/super-admin/offices") + @Post("/api/v1/super-admin/offices", [authHandler,ruleHandler]) protected async post(req: Request, response: Response) { try { //init IUser resource with request body values @@ -58,7 +60,7 @@ export default class OfficesController extends ApiController { /** * @description Modify a specific office by uid */ - @Put("/api/v1/super-admin/offices/:uid") + @Put("/api/v1/super-admin/offices/:uid", [authHandler,ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -93,7 +95,7 @@ export default class OfficesController extends ApiController { /** * @description Get a specific office by uid */ - @Get("/api/v1/super-admin/offices/:uid") + @Get("/api/v1/super-admin/offices/:uid", [authHandler,ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/RolesController.ts b/src/app/api/super-admin/RolesController.ts index d7d8bc8e..c4ac55af 100644 --- a/src/app/api/super-admin/RolesController.ts +++ b/src/app/api/super-admin/RolesController.ts @@ -6,6 +6,8 @@ import { Service } from "typedi"; import { validateOrReject } from "class-validator"; import { Role } from "le-coffre-resources/dist/Notary"; import { Roles } from "@prisma/client"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; @Controller() @Service() @@ -17,7 +19,7 @@ export default class RolesController extends ApiController { /** * @description Get all roles */ - @Get("/api/v1/super-admin/roles") + @Get("/api/v1/super-admin/roles", [authHandler,ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -40,7 +42,7 @@ export default class RolesController extends ApiController { /** * @description Create a new role */ - @Post("/api/v1/super-admin/roles") + @Post("/api/v1/super-admin/roles", [authHandler,ruleHandler]) protected async getAddresses(req: Request, response: Response) { try { //init IRole resource with request body values @@ -68,7 +70,7 @@ export default class RolesController extends ApiController { /** * @description Modify a specific role by uid */ - @Put("/api/v1/super-admin/roles/:uid") + @Put("/api/v1/super-admin/roles/:uid", [authHandler,ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -109,7 +111,7 @@ export default class RolesController extends ApiController { /** * @description Get a specific role by uid */ - @Get("/api/v1/super-admin/roles/:uid") + @Get("/api/v1/super-admin/roles/:uid", [authHandler,ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/RulesController.ts b/src/app/api/super-admin/RulesController.ts index 53b8d9a6..fe7e4ee3 100644 --- a/src/app/api/super-admin/RulesController.ts +++ b/src/app/api/super-admin/RulesController.ts @@ -6,6 +6,8 @@ import { Service } from "typedi"; import { validateOrReject } from "class-validator"; import { Rule } from "le-coffre-resources/dist/Notary"; import { Rules } from "@prisma/client"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; @Controller() @Service() @@ -17,7 +19,7 @@ export default class RulesController extends ApiController { /** * @description Get all rules */ - @Get("/api/v1/super-admin/rules") + @Get("/api/v1/super-admin/rules", [authHandler,ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -40,7 +42,7 @@ export default class RulesController extends ApiController { /** * @description Create a new rule */ - @Post("/api/v1/super-admin/rules") + @Post("/api/v1/super-admin/rules", [authHandler,ruleHandler]) protected async getAddresses(req: Request, response: Response) { try { //init IRule resource with request body values @@ -68,7 +70,7 @@ export default class RulesController extends ApiController { /** * @description Modify a specific rule by uid */ - @Put("/api/v1/super-admin/rules/:uid") + @Put("/api/v1/super-admin/rules/:uid", [authHandler,ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -109,7 +111,7 @@ export default class RulesController extends ApiController { /** * @description Get a specific rule by uid */ - @Get("/api/v1/super-admin/rules/:uid") + @Get("/api/v1/super-admin/rules/:uid", [authHandler,ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index e25bd351..aa2de89c 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -7,6 +7,7 @@ import { validateOrReject } from "class-validator"; import User from "le-coffre-resources/dist/Notary"; import { Users } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; @Controller() @Service() @@ -18,7 +19,7 @@ export default class UsersController extends ApiController { /** * @description Get all users */ - @Get("/api/v1/super-admin/users", [authHandler]) + @Get("/api/v1/super-admin/users", [authHandler,ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -41,7 +42,7 @@ export default class UsersController extends ApiController { /** * @description Create a new user */ - @Post("/api/v1/super-admin/users", [authHandler]) + @Post("/api/v1/super-admin/users", [authHandler, ruleHandler]) protected async getAddresses(req: Request, response: Response) { try { //init IUser resource with request body values @@ -69,7 +70,7 @@ export default class UsersController extends ApiController { /** * @description Modify a specific user by uid */ - @Put("/api/v1/super-admin/users/:uid") + @Put("/api/v1/super-admin/users/:uid", [authHandler,ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -110,7 +111,7 @@ export default class UsersController extends ApiController { /** * @description Get a specific user by uid */ - @Get("/api/v1/super-admin/users/:uid") + @Get("/api/v1/super-admin/users/:uid",[authHandler,ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/index.ts b/src/app/index.ts index 62bb1c58..f23a9a7d 100644 --- a/src/app/index.ts +++ b/src/app/index.ts @@ -8,7 +8,7 @@ import DeedsController from "./api/super-admin/DeedsController"; import DeedTypesController from "./api/super-admin/DeedTypesController"; import DocumentsController from "./api/super-admin/DocumentsController"; import DocumentTypesController from "./api/super-admin/DocumentTypesController"; -import IdNotUserInfoController from "./api/idnot-user/UserInfoController"; +import IdNotUserController from "./api/idnot/UserController"; import DocumentsControllerCustomer from "./api/customer/DocumentsController"; import FilesController from "./api/super-admin/FilesController"; import RulesController from "./api/super-admin/RolesController"; @@ -29,7 +29,7 @@ export default { Container.get(DeedTypesController); Container.get(DocumentsController); Container.get(DocumentTypesController); - Container.get(IdNotUserInfoController); + Container.get(IdNotUserController); Container.get(FilesController); Container.get(DocumentsControllerCustomer); Container.get(RulesController); diff --git a/src/app/middlewares/AuthHandler.ts b/src/app/middlewares/AuthHandler.ts index f2bf8cb7..549cfe1f 100644 --- a/src/app/middlewares/AuthHandler.ts +++ b/src/app/middlewares/AuthHandler.ts @@ -1,5 +1,5 @@ import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; -import AuthService from "@Services/private-services/AuthService/AuthService"; +import AuthService from "@Services/common/AuthService/AuthService"; import { NextFunction, Request, Response } from "express"; import Container from "typedi"; @@ -7,14 +7,20 @@ export default function authHandler(req: Request, response: Response, next: Next const authHeader = req.headers['authorization']; const token = authHeader && authHeader.split(' ')[1]; - if (!token) return response.sendStatus(HttpCodes.UNAUTHORIZED) + if (!token) { + response.sendStatus(HttpCodes.UNAUTHORIZED) + return; + } const authService = Container.get(AuthService); authService.verifyAccessToken(token, (err, userPayload) => { - if (err) return response.sendStatus(HttpCodes.UNAUTHORIZED); - req.body.user = userPayload; - return; - }) - return next(); + if (err) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + console.log(userPayload); + req.body.user = userPayload + next(); + }); } diff --git a/src/app/middlewares/RulesHandler.ts b/src/app/middlewares/RulesHandler.ts new file mode 100644 index 00000000..c1a4d6e6 --- /dev/null +++ b/src/app/middlewares/RulesHandler.ts @@ -0,0 +1,22 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import { NextFunction, Request, Response } from "express"; + +export default async function ruleHandler(req: Request, response: Response, next: NextFunction) { + const rules = req.body.user.rules; + const service = req.path && req.path.split('/')[4]; + const namespace = req.path && req.path.split('/')[3]; + const role = req.body.user.role; + + if(namespace != 'notary' && role != namespace) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + + if(!rules.includes(req.method + ' ' + service)) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + + next(); +} + diff --git a/src/common/databases/migrations/20230622172124_v2/migration.sql b/src/common/databases/migrations/20230622172124_v2/migration.sql new file mode 100644 index 00000000..34d5f531 --- /dev/null +++ b/src/common/databases/migrations/20230622172124_v2/migration.sql @@ -0,0 +1,37 @@ +/* + Warnings: + + - You are about to drop the column `office_role_has_rules_uid` on the `rules` table. All the data in the column will be lost. + - You are about to drop the column `role_has_rules_uid` on the `rules` table. All the data in the column will be lost. + - Added the required column `office_uid` to the `office_role_has_rules` table without a default value. This is not possible if the table is not empty. + +*/ +-- DropForeignKey +ALTER TABLE "rules" DROP CONSTRAINT "rules_office_role_has_rules_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "rules" DROP CONSTRAINT "rules_role_has_rules_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "users" DROP CONSTRAINT "users_roles_uid_fkey"; + +-- AlterTable +ALTER TABLE "office_role_has_rules" ADD COLUMN "office_uid" VARCHAR(255) NOT NULL; + +-- AlterTable +ALTER TABLE "rules" DROP COLUMN "office_role_has_rules_uid", +DROP COLUMN "role_has_rules_uid", +ADD COLUMN "officesRolesHasRulesUid" TEXT, +ADD COLUMN "rolesHasRulesUid" TEXT; + +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_roles_uid_fkey" FOREIGN KEY ("roles_uid") REFERENCES "roles"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "rules" ADD CONSTRAINT "rules_rolesHasRulesUid_fkey" FOREIGN KEY ("rolesHasRulesUid") REFERENCES "role_has_rules"("uid") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "rules" ADD CONSTRAINT "rules_officesRolesHasRulesUid_fkey" FOREIGN KEY ("officesRolesHasRulesUid") REFERENCES "office_role_has_rules"("uid") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "office_role_has_rules" ADD CONSTRAINT "office_role_has_rules_office_uid_fkey" FOREIGN KEY ("office_uid") REFERENCES "offices"("uid") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/src/common/databases/migrations/20230622172838_v3/migration.sql b/src/common/databases/migrations/20230622172838_v3/migration.sql new file mode 100644 index 00000000..b218d50d --- /dev/null +++ b/src/common/databases/migrations/20230622172838_v3/migration.sql @@ -0,0 +1,24 @@ +/* + Warnings: + + - You are about to drop the column `officesRolesHasRulesUid` on the `rules` table. All the data in the column will be lost. + - You are about to drop the column `rolesHasRulesUid` on the `rules` table. All the data in the column will be lost. + +*/ +-- DropForeignKey +ALTER TABLE "rules" DROP CONSTRAINT "rules_officesRolesHasRulesUid_fkey"; + +-- DropForeignKey +ALTER TABLE "rules" DROP CONSTRAINT "rules_rolesHasRulesUid_fkey"; + +-- AlterTable +ALTER TABLE "rules" DROP COLUMN "officesRolesHasRulesUid", +DROP COLUMN "rolesHasRulesUid", +ADD COLUMN "office_role_has_rules_uid" TEXT, +ADD COLUMN "role_has_rules_uid" TEXT; + +-- AddForeignKey +ALTER TABLE "rules" ADD CONSTRAINT "rules_role_has_rules_uid_fkey" FOREIGN KEY ("role_has_rules_uid") REFERENCES "role_has_rules"("uid") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "rules" ADD CONSTRAINT "rules_office_role_has_rules_uid_fkey" FOREIGN KEY ("office_role_has_rules_uid") REFERENCES "office_role_has_rules"("uid") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/src/common/databases/migrations/20230623070044_v4/migration.sql b/src/common/databases/migrations/20230623070044_v4/migration.sql new file mode 100644 index 00000000..865da2cf --- /dev/null +++ b/src/common/databases/migrations/20230623070044_v4/migration.sql @@ -0,0 +1,12 @@ +/* + Warnings: + + - You are about to drop the column `rule_uid` on the `office_role_has_rules` table. All the data in the column will be lost. + - You are about to drop the column `rule_uid` on the `role_has_rules` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE "office_role_has_rules" DROP COLUMN "rule_uid"; + +-- AlterTable +ALTER TABLE "role_has_rules" DROP COLUMN "rule_uid"; diff --git a/src/common/databases/migrations/20230623072820_v5/migration.sql b/src/common/databases/migrations/20230623072820_v5/migration.sql new file mode 100644 index 00000000..417d4724 --- /dev/null +++ b/src/common/databases/migrations/20230623072820_v5/migration.sql @@ -0,0 +1,30 @@ +/* + Warnings: + + - You are about to drop the column `office_role_has_rules_uid` on the `rules` table. All the data in the column will be lost. + - You are about to drop the column `role_has_rules_uid` on the `rules` table. All the data in the column will be lost. + - Added the required column `rule_uid` to the `office_role_has_rules` table without a default value. This is not possible if the table is not empty. + - Added the required column `rule_uid` to the `role_has_rules` table without a default value. This is not possible if the table is not empty. + +*/ +-- DropForeignKey +ALTER TABLE "rules" DROP CONSTRAINT "rules_office_role_has_rules_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "rules" DROP CONSTRAINT "rules_role_has_rules_uid_fkey"; + +-- AlterTable +ALTER TABLE "office_role_has_rules" ADD COLUMN "rule_uid" VARCHAR(255) NOT NULL; + +-- AlterTable +ALTER TABLE "role_has_rules" ADD COLUMN "rule_uid" VARCHAR(255) NOT NULL; + +-- AlterTable +ALTER TABLE "rules" DROP COLUMN "office_role_has_rules_uid", +DROP COLUMN "role_has_rules_uid"; + +-- AddForeignKey +ALTER TABLE "role_has_rules" ADD CONSTRAINT "role_has_rules_rule_uid_fkey" FOREIGN KEY ("rule_uid") REFERENCES "rules"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "office_role_has_rules" ADD CONSTRAINT "office_role_has_rules_rule_uid_fkey" FOREIGN KEY ("rule_uid") REFERENCES "rules"("uid") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/src/common/databases/schema.prisma b/src/common/databases/schema.prisma index 1208df65..fa2ad5eb 100644 --- a/src/common/databases/schema.prisma +++ b/src/common/databases/schema.prisma @@ -67,19 +67,20 @@ model Users { } model Offices { - uid String @id @unique @default(uuid()) - idNot String @unique @db.VarChar(255) - name String @db.VarChar(255) - crpcen String @unique @db.VarChar(255) - address Addresses @relation(fields: [address_uid], references: [uid], onDelete: Cascade) - address_uid String @unique @db.VarChar(255) - office_status EOfficeStatus @default(DESACTIVATED) - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - deed_types DeedTypes[] - users Users[] - office_folders OfficeFolders[] - document_types DocumentTypes[] + uid String @id @unique @default(uuid()) + idNot String @unique @db.VarChar(255) + name String @db.VarChar(255) + crpcen String @unique @db.VarChar(255) + address Addresses @relation(fields: [address_uid], references: [uid], onDelete: Cascade) + address_uid String @unique @db.VarChar(255) + office_status EOfficeStatus @default(DESACTIVATED) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + deed_types DeedTypes[] + users Users[] + office_folders OfficeFolders[] + document_types DocumentTypes[] + office_role_has_rules OfficesRolesHasRules[] @@map("offices") } @@ -299,26 +300,24 @@ model DeedTypeHasDocumentTypes { } model Roles { - uid String @id @unique @default(uuid()) - name String @db.VarChar(255) - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - role_has_rules RolesHasRules[] + uid String @id @unique @default(uuid()) + name String @db.VarChar(255) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + role_has_rules RolesHasRules[] office_role_has_rules OfficesRolesHasRules[] - users Users[] + users Users[] @@map("roles") } model Rules { - uid String @id @unique @default(uuid()) - name String @db.VarChar(255) - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - role_has_rules RolesHasRules? @relation(fields: [role_has_rules_uid], references: [uid]) - role_has_rules_uid String? - office_role_has_rules OfficesRolesHasRules? @relation(fields: [office_role_has_rules_uid], references: [uid]) - office_role_has_rules_uid String? + uid String @id @unique @default(uuid()) + name String @db.VarChar(255) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + role_has_rules RolesHasRules[] + office_roles_has_rules OfficesRolesHasRules[] @@map("rules") } @@ -327,22 +326,24 @@ model RolesHasRules { uid String @id @unique @default(uuid()) role Roles @relation(fields: [role_uid], references: [uid], onDelete: Cascade) role_uid String @db.VarChar(255) + rule Rules @relation(fields: [rule_uid], references: [uid], onDelete: Cascade) rule_uid String @db.VarChar(255) created_at DateTime? @default(now()) updated_at DateTime? @updatedAt - rules Rules[] @@map("role_has_rules") } model OfficesRolesHasRules { uid String @id @unique @default(uuid()) + office Offices @relation(fields: [office_uid], references: [uid], onDelete: Cascade) role Roles @relation(fields: [role_uid], references: [uid], onDelete: Cascade) + rule Rules @relation(fields: [rule_uid], references: [uid], onDelete: Cascade) + office_uid String @db.VarChar(255) role_uid String @db.VarChar(255) rule_uid String @db.VarChar(255) created_at DateTime? @default(now()) updated_at DateTime? @updatedAt - rules Rules[] @@map("office_role_has_rules") } diff --git a/src/common/databases/seeders/seeder2.ts b/src/common/databases/seeders/seeder2.ts index f76f8cde..ce81192e 100644 --- a/src/common/databases/seeders/seeder2.ts +++ b/src/common/databases/seeders/seeder2.ts @@ -18,6 +18,9 @@ import { ECustomerStatus, PrismaClient, Roles, + OfficesRolesHasRules, + RolesHasRules, + Rules, } from "@prisma/client"; (async () => { @@ -104,6 +107,9 @@ import { const uidRole1: string = randomString(); const uidRole2: string = randomString(); + const uidRule1: string = randomString(); + const uidRule2: string = randomString(); + const uidOfficeFolder1: string = randomString(); const uidOfficeFolder2: string = randomString(); const uidOfficeFolder3: string = randomString(); @@ -167,6 +173,12 @@ import { const uidOfficeFolderHasCustomer3: string = randomString(); const uidOfficeFolderHasCustomer4: string = randomString(); + const uidOfficeRoleHasRule1: string = randomString(); + const uidOfficeRoleHasRule2: string = randomString(); + + const uidRoleHasRule1: string = randomString(); + const uidRoleHasRule2: string = randomString(); + const uidDeedHasDocumentType1: string = randomString(); const uidDeedHasDocumentType2: string = randomString(); const uidDeedHasDocumentType3: string = randomString(); @@ -1688,6 +1700,57 @@ import { }, ]; + const officeRoleHasRules: OfficesRolesHasRules[] = [ + { + uid: uidOfficeRoleHasRule1, + office_uid: uidOffice1, + role_uid: uidRole1, + rule_uid: uidRule1, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidOfficeRoleHasRule2, + office_uid: uidOffice1, + role_uid: uidRole2, + rule_uid: uidRule2, + created_at: new Date(), + updated_at: new Date(), + }, + ]; + + const roleHasRules: RolesHasRules[] = [ + { + uid: uidRoleHasRule1, + role_uid: uidRole1, + rule_uid: uidRule2, + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidRoleHasRule2, + role_uid: uidRole2, + rule_uid: uidRule1, + created_at: new Date(), + updated_at: new Date(), + }, + ]; + + const rules: Rules[] = [ + { + uid: uidRule1, + name: 'GET users', + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidRule2, + name: 'GET offices', + created_at: new Date(), + updated_at: new Date(), + } + ]; + const deedTypeHasDocumentTypes: DeedTypeHasDocumentTypes[] = [ { uid: uidDeedTypeHasDocumentType1, @@ -1868,6 +1931,10 @@ import { await prisma.roles.create({ data: role }); } + for (const rule of rules) { + await prisma.rules.create({ data: rule }); + } + for (const user of users) { await prisma.users.create({ data: user }); } @@ -1899,6 +1966,14 @@ import { await prisma.officeFolderHasCustomers.create({ data: officeFolderHasCustomer }); } + for (const officeRoleHasRule of officeRoleHasRules) { + await prisma.officesRolesHasRules.create({ data: officeRoleHasRule }); + } + + for (const roleHasRule of roleHasRules) { + await prisma.rolesHasRules.create({ data: roleHasRule }); + } + for (const deedHasDocumentType of deedHasDocumentTypes) { await prisma.deedHasDocumentTypes.create({ data: deedHasDocumentType }); } diff --git a/src/common/repositories/RolesRepository.ts b/src/common/repositories/RolesRepository.ts index 159674a5..3b69797a 100644 --- a/src/common/repositories/RolesRepository.ts +++ b/src/common/repositories/RolesRepository.ts @@ -41,6 +41,17 @@ export default class RolesRepository extends BaseRepository { }, }, }; + if (role.office_role_has_rules) { + createArgs.data.office_role_has_rules = { + createMany: { + data: role.office_role_has_rules.rules.map((relation) => ({ + office_uid: role.office_role_has_rules!.office.uid!, + rule_uid: relation.uid!, + })), + skipDuplicates: true, + }, + }; + } return this.model.create(createArgs); } @@ -66,11 +77,12 @@ export default class RolesRepository extends BaseRepository { }, }, }; - if(role.office_role_has_rules) { + if (role.office_role_has_rules) { updateArgs.data.office_role_has_rules = { deleteMany: { role_uid: role.uid }, createMany: { data: role.office_role_has_rules.rules.map((relation) => ({ + office_uid: role.office_role_has_rules!.office.uid!, rule_uid: relation.uid!, })), skipDuplicates: true, diff --git a/src/common/system/OpenIdInterface.ts b/src/common/system/OpenIdInterface.ts new file mode 100644 index 00000000..d2d25049 --- /dev/null +++ b/src/common/system/OpenIdInterface.ts @@ -0,0 +1,16 @@ +export type Payload = { + sub: string; + email: string; +}; + +export type Tokens = { + access_token: string; + expires_in: number; + id_token: string; + token_type: string; +}; + +export default interface OpenIdInterface { + verifyIdToken(signingKey: string): Promise; + getSigningKeys(jwksUri: string): Promise; +} diff --git a/src/entries/App.ts b/src/entries/App.ts index d9874748..0b426b5d 100644 --- a/src/entries/App.ts +++ b/src/entries/App.ts @@ -11,6 +11,7 @@ import { BackendVariables } from "@Common/config/variables/Variables"; //import fileHandler from "@App/middlewares/FileHandler"; import multer from "multer"; + const storage = multer.memoryStorage(); (async () => { diff --git a/src/services/private-services/AddressesService/AddressesService.ts b/src/services/common/AddressesService/AddressesService.ts similarity index 100% rename from src/services/private-services/AddressesService/AddressesService.ts rename to src/services/common/AddressesService/AddressesService.ts diff --git a/src/services/common/AuthService/AuthService.ts b/src/services/common/AuthService/AuthService.ts new file mode 100644 index 00000000..8d497fa9 --- /dev/null +++ b/src/services/common/AuthService/AuthService.ts @@ -0,0 +1,65 @@ +import jwt, { VerifyCallback } from "jsonwebtoken"; +import BaseService from "@Services/BaseService"; +import "reflect-metadata"; +import { BackendVariables } from "@Common/config/variables/Variables"; +import { Service } from "typedi"; +import UsersService from "@Services/super-admin/UsersService/UsersService"; + +export type UserPayload = { + uid: string; + idNot: string; + office_idNot: string; + role: string; + rules: string[]; +}; + +@Service() +export default class AuthService extends BaseService { + constructor(protected variables: BackendVariables, private userService: UsersService) { + super(); + } + + public async getUserPayload(id: string): Promise { + const user: any = ( + await this.userService.get({ + where: { idNot: id }, + include: { + role: { include: { role_has_rules: { include: { rule: true } }, office_role_has_rules: { include: { rule: true } } } }, + office_membership: true, + }, + }) + )[0]; + + if (!user) throw new Error("User not found"); + + let rules: string[] = []; + if (user.role.office_role_has_rules.length) { + user.role.office_role_has_rules.forEach((relation: any) => { + if (relation.office_uid === user.office_membership.uid) rules.push(relation.rule.name); + }); + return { uid: user.uid, idNot: user.idNot, office_idNot: user.office_membership.idNot, role: user.role.name, rules: rules }; + } + if (!rules.length) { + user.role.role_has_rules.forEach((relation: any) => { + rules.push(relation.rule.name); + }); + } + return { uid: user.uid, idNot: user.idNot, office_idNot: user.office_membership.idNot, role: user.role.name, rules: rules }; + } + + public generateAccessToken(user: any): string { + return jwt.sign({ ...user }, this.variables.ACCESS_TOKEN_SECRET, { expiresIn: "15m" }); + } + + public generateRefreshToken(user: any): string { + return jwt.sign({ ...user }, this.variables.REFRESH_TOKEN_SECRET, { expiresIn: "1h" }); + } + + public verifyAccessToken(token: string, callback?: VerifyCallback) { + return jwt.verify(token, this.variables.ACCESS_TOKEN_SECRET, callback); + } + + public verifyRefreshToken(token: string, callback?: VerifyCallback) { + return jwt.verify(token, this.variables.REFRESH_TOKEN_SECRET, callback); + } +} diff --git a/src/services/private-services/ContactsService/ContactsService.ts b/src/services/common/ContactsService/ContactsService.ts similarity index 100% rename from src/services/private-services/ContactsService/ContactsService.ts rename to src/services/common/ContactsService/ContactsService.ts diff --git a/src/services/private-services/CryptoService/CryptoService.ts b/src/services/common/CryptoService/CryptoService.ts similarity index 100% rename from src/services/private-services/CryptoService/CryptoService.ts rename to src/services/common/CryptoService/CryptoService.ts diff --git a/src/services/private-services/FilesService/FilesService.ts b/src/services/common/FilesService/FilesService.ts similarity index 100% rename from src/services/private-services/FilesService/FilesService.ts rename to src/services/common/FilesService/FilesService.ts diff --git a/src/services/private-services/IpfsService/IpfsService.ts b/src/services/common/IpfsService/IpfsService.ts similarity index 100% rename from src/services/private-services/IpfsService/IpfsService.ts rename to src/services/common/IpfsService/IpfsService.ts diff --git a/src/services/private-services/NotificationsService/NotificationsService.ts b/src/services/common/NotificationsService/NotificationsService.ts similarity index 100% rename from src/services/private-services/NotificationsService/NotificationsService.ts rename to src/services/common/NotificationsService/NotificationsService.ts diff --git a/src/services/private-services/AuthService/AuthService.ts b/src/services/private-services/AuthService/AuthService.ts deleted file mode 100644 index d8a0cf54..00000000 --- a/src/services/private-services/AuthService/AuthService.ts +++ /dev/null @@ -1,69 +0,0 @@ -import jwt, { VerifyCallback } from "jsonwebtoken"; -import BaseService from "@Services/BaseService"; -import "reflect-metadata"; -import { BackendVariables } from "@Common/config/variables/Variables"; -import { Service } from "typedi"; - -type IdNotTokens = { - access_token: string; - id_token: string; -}; - -@Service() -export default class AuthService extends BaseService { - - constructor(protected variables: BackendVariables) { - super(); - } - - /** - * @description : Get IdNot id_token and access_token - * @throws {Error} If jwt pair cannot be get - */ - public async getUserFromIdNotTokens(code: string) { - const tokens = await this.getIdNotTokens(code); - return jwt.decode(tokens.id_token); - } - - private async getIdNotTokens(code: string): Promise { - const url = new URL( - this.variables.IDNOT_CONNEXION_URL.concat("?") + - new URLSearchParams({ - client_id: this.variables.IDNOT_CLIENT_ID, - client_secret: this.variables.IDNOT_CLIENT_SECRET, - redirect_uri: this.variables.IDNOT_REDIRECT_URL, - code: code, - grant_type: "authorization_code", - }), - ); - try { - const headers = new Headers({ - "Content-Type": "application/x-www-form-urlencoded", - }); - const res = await fetch(url, { - method: "POST", - headers: headers, - }); - const data = await res.json(); - return data as IdNotTokens; - } catch (error) { - throw new Error(); - } - } - - public generateAccessToken(user: any) { - return jwt.sign({...user}, this.variables.ACCESS_TOKEN_SECRET, { expiresIn: "15m" }); - } - - public generateRefreshToken(user: any) { - return jwt.sign({...user}, this.variables.REFRESH_TOKEN_SECRET, { expiresIn: "1h" }); - } - - public verifyAccessToken(token: string, callback?: VerifyCallback) { - return jwt.verify(token, this.variables.ACCESS_TOKEN_SECRET, callback); - } - - public verifyRefreshToken(token: string, callback?: VerifyCallback) { - return jwt.verify(token, this.variables.REFRESH_TOKEN_SECRET, callback); - } -} From 037976a1e67dc498d3b260d6f52f29311f973e76 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Tue, 27 Jun 2023 18:06:54 +0200 Subject: [PATCH 024/134] refacto roles and rules --- .gitignore | 1 + package-lock.json | 547 ++++---- package.json | 2 +- src/app/api/idnot/UserController.ts | 32 +- .../api/super-admin/OfficeRolesController.ts | 147 +++ .../20230627155351_v6/migration.sql | 86 ++ src/common/databases/schema.prisma | 110 +- src/common/databases/seeders/seeder.ts | 1122 ++++++++--------- src/common/databases/seeders/seeder2.ts | 115 +- .../DeedTypesHasDocumentTypesRepository.ts | 38 - .../DeedsHasDocumentTypesRepository.ts | 38 - .../OfficeFoldersHasCustomerRepository.ts | 38 - .../OfficeFoldersHasStakeholderRepository.ts | 38 - .../OfficeRoleHasRulesRepository.ts | 42 - .../repositories/OfficeRolesRepository.ts | 98 ++ .../repositories/RolesHasRulesRepository.ts | 42 - src/common/repositories/RolesRepository.ts | 46 +- src/common/repositories/UsersRepository.ts | 32 +- src/common/system/OpenIdInterface.ts | 14 + .../common/AuthService/AuthService.ts | 48 +- .../common/OpenIdService/OpenIdService.ts | 55 + .../OfficeRolesService/OfficeRolesService.ts | 44 + .../super-admin/UsersService/UsersService.ts | 10 +- 23 files changed, 1490 insertions(+), 1255 deletions(-) create mode 100644 src/app/api/super-admin/OfficeRolesController.ts create mode 100644 src/common/databases/migrations/20230627155351_v6/migration.sql delete mode 100644 src/common/repositories/DeedTypesHasDocumentTypesRepository.ts delete mode 100644 src/common/repositories/DeedsHasDocumentTypesRepository.ts delete mode 100644 src/common/repositories/OfficeFoldersHasCustomerRepository.ts delete mode 100644 src/common/repositories/OfficeFoldersHasStakeholderRepository.ts delete mode 100644 src/common/repositories/OfficeRoleHasRulesRepository.ts create mode 100644 src/common/repositories/OfficeRolesRepository.ts delete mode 100644 src/common/repositories/RolesHasRulesRepository.ts create mode 100644 src/services/common/OpenIdService/OpenIdService.ts create mode 100644 src/services/super-admin/OfficeRolesService/OfficeRolesService.ts diff --git a/.gitignore b/.gitignore index e505544c..5d7e9ac1 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ dist # dependencies /node_modules +package-lock.json # envs .env diff --git a/package-lock.json b/package-lock.json index c2171d10..611ea677 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "cors": "^2.8.5", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.50", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.54", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", @@ -65,42 +65,42 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.21.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", - "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", + "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", - "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helpers": "^7.21.5", - "@babel/parser": "^7.21.8", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -145,12 +145,12 @@ "dev": true }, "node_modules/@babel/generator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", - "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", + "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -160,13 +160,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", - "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", + "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", + "@babel/compat-data": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" @@ -179,151 +179,151 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", - "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, "dependencies": { - "@babel/types": "^7.21.4" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", - "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", - "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", + "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", - "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", + "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -403,9 +403,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", - "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", + "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -475,12 +475,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -577,12 +577,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -592,33 +592,33 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", - "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", + "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.5", - "@babel/types": "^7.21.5", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -650,13 +650,13 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", - "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1045,14 +1045,14 @@ "dev": true }, "node_modules/@next/env": { - "version": "13.4.2", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.2.tgz", - "integrity": "sha512-Wqvo7lDeS0KGwtwg9TT9wKQ8raelmUxt+TQKWvG/xKfcmDXNOtCuaszcfCF8JzlBG1q0VhpI6CKaRMbVPMDWgw==" + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", + "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.2.tgz", - "integrity": "sha512-6BBlqGu3ewgJflv9iLCwO1v1hqlecaIH2AotpKfVUEzUxuuDNJQZ2a4KLb4MBl8T9/vca1YuWhSqtbF6ZuUJJw==", + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", + "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", "cpu": [ "arm64" ], @@ -1065,9 +1065,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.2", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.2.tgz", - "integrity": "sha512-iZuYr7ZvGLPjPmfhhMl0ISm+z8EiyLBC1bLyFwGBxkWmPXqdJ60mzuTaDSr5WezDwv0fz32HB7JHmRC6JVHSZg==", + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", + "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", "cpu": [ "x64" ], @@ -1080,9 +1080,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.2.tgz", - "integrity": "sha512-2xVabFtIge6BJTcJrW8YuUnYTuQjh4jEuRuS2mscyNVOj6zUZkom3CQg+egKOoS+zh2rrro66ffSKIS+ztFJTg==", + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", + "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", "cpu": [ "arm64" ], @@ -1095,9 +1095,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.2.tgz", - "integrity": "sha512-wKRCQ27xCUJx5d6IivfjYGq8oVngqIhlhSAJntgXLt7Uo9sRT/3EppMHqUZRfyuNBTbykEre1s5166z+pvRB5A==", + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", + "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", "cpu": [ "arm64" ], @@ -1110,9 +1110,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.2.tgz", - "integrity": "sha512-NpCa+UVhhuNeaFVUP1Bftm0uqtvLWq2JTm7+Ta48+2Uqj2mNXrDIvyn1DY/ZEfmW/1yvGBRaUAv9zkMkMRixQA==", + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", + "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", "cpu": [ "x64" ], @@ -1125,9 +1125,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.2", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.2.tgz", - "integrity": "sha512-ZWVC72x0lW4aj44e3khvBrj2oSYj1bD0jESmyah3zG/3DplEy/FOtYkMzbMjHTdDSheso7zH8GIlW6CDQnKhmQ==", + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", + "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", "cpu": [ "x64" ], @@ -1140,9 +1140,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.2.tgz", - "integrity": "sha512-pLT+OWYpzJig5K4VKhLttlIfBcVZfr2+Xbjra0Tjs83NQSkFS+y7xx+YhCwvpEmXYLIvaggj2ONPyjbiigOvHQ==", + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", + "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", "cpu": [ "arm64" ], @@ -1155,9 +1155,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.2.tgz", - "integrity": "sha512-dhpiksQCyGca4WY0fJyzK3FxMDFoqMb0Cn+uDB+9GYjpU2K5//UGPQlCwiK4JHxuhg8oLMag5Nf3/IPSJNG8jw==", + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", + "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", "cpu": [ "ia32" ], @@ -1170,9 +1170,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.2", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.2.tgz", - "integrity": "sha512-O7bort1Vld00cu8g0jHZq3cbSTUNMohOEvYqsqE10+yfohhdPHzvzO+ziJRz4Dyyr/fYKREwS7gR4JC0soSOMw==", + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", + "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", "cpu": [ "x64" ], @@ -1196,12 +1196,12 @@ } }, "node_modules/@prisma/client": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.14.0.tgz", - "integrity": "sha512-MK/XaA2sFdfaOa7I9MjNKz6dxeIEdeZlnpNRoF2w3JuRLlFJLkpp6cD3yaqw2nUUhbrn3Iqe3ZpVV+VuGGil7Q==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.11.0.tgz", + "integrity": "sha512-0INHYkQIqgAjrt7NzhYpeDQi8x3Nvylc2uDngKyFDDj1tTRQ4uV1HnVmd1sQEraeVAN63SOK0dgCKQHlvjL0KA==", "hasInstallScript": true, "dependencies": { - "@prisma/engines-version": "4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c" + "@prisma/engines-version": "4.11.0-57.8fde8fef4033376662cad983758335009d522acb" }, "engines": { "node": ">=14.17" @@ -1216,16 +1216,16 @@ } }, "node_modules/@prisma/engines": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.14.0.tgz", - "integrity": "sha512-PDNlhP/1vyTgmNyiucGqGCdXIp7HIkkvKO50si3y3PcceeHvqtiKPaH1iJdz63jCWMVMbj2MElSxXPOeBvEVIQ==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.11.0.tgz", + "integrity": "sha512-0AEBi2HXGV02cf6ASsBPhfsVIbVSDC9nbQed4iiY5eHttW9ZtMxHThuKZE1pnESbr8HRdgmFSa/Kn4OSNYuibg==", "devOptional": true, "hasInstallScript": true }, "node_modules/@prisma/engines-version": { - "version": "4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.14.0-67.d9a4c5988f480fa576d43970d5a23641aa77bc9c.tgz", - "integrity": "sha512-3jum8/YSudeSN0zGW5qkpz+wAN2V/NYCQ+BPjvHYDfWatLWlQkqy99toX0GysDeaUoBIJg1vaz2yKqiA3CFcQw==" + "version": "4.11.0-57.8fde8fef4033376662cad983758335009d522acb", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.11.0-57.8fde8fef4033376662cad983758335009d522acb.tgz", + "integrity": "sha512-3Vd8Qq06d5xD8Ch5WauWcUUrsVPdMC6Ge8ILji8RFfyhUpqon6qSyGM0apvr1O8n8qH8cKkEFqRPsYjuz5r83g==" }, "node_modules/@sinclair/typebox": { "version": "0.25.24", @@ -1243,9 +1243,9 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.1.0.tgz", - "integrity": "sha512-w1qd368vtrwttm1PRJWPW1QHlbmHrVDGs1eBH/jZvRPUFS4MNXV9Q33EQdjOdeAxZ7O8+3wM7zxztm2nfUSyKw==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0" @@ -1280,9 +1280,9 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" }, "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -1312,12 +1312,12 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.5.tgz", - "integrity": "sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==", + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", "dev": true, "dependencies": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "node_modules/@types/body-parser": { @@ -1381,6 +1381,12 @@ "@types/node": "*" } }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==", + "dev": true + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -1406,9 +1412,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.1.tgz", - "integrity": "sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ==", + "version": "29.5.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.2.tgz", + "integrity": "sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -1440,14 +1446,14 @@ } }, "node_modules/@types/node": { - "version": "18.16.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.9.tgz", - "integrity": "sha512-IeB32oIV4oGArLrd7znD2rkHQ6EDCM+2Sr76dJnrHwv9OHBTTM6nuDLK9bmikXzPa0ZlWMWtRGo/Uw4mrzQedA==" + "version": "18.16.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.18.tgz", + "integrity": "sha512-/aNaQZD0+iSBAGnvvN2Cx92HqE5sZCPZtx2TsK+4nvV23fFe09jVDvpArXr2j9DnYlzuU9WuoykDDc6wqvpNcw==" }, "node_modules/@types/node-fetch": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.3.tgz", - "integrity": "sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", + "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", "dev": true, "dependencies": { "@types/node": "*", @@ -1478,9 +1484,9 @@ } }, "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, "node_modules/@types/qs": { @@ -1506,11 +1512,12 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", "dev": true, "dependencies": { + "@types/http-errors": "*", "@types/mime": "*", "@types/node": "*" } @@ -1522,9 +1529,9 @@ "dev": true }, "node_modules/@types/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-rFT3ak0/2trgvp4yYZo5iKFEPsET7vKydKF+VRCxlQ9bpheehyAJH89dAkaLEq/j/RZXJIqcgsmPJKUP1Z28HA==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.2.tgz", + "integrity": "sha512-kNnC1GFBLuhImSnV7w4njQkUiJi0ZXUycu1rUaouPqiKlXkh77JKgdRnTAp1x5eBwcIwbtI+3otwzuIDEuDoxQ==", "dev": true }, "node_modules/@types/validator": { @@ -1566,9 +1573,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", "bin": { "acorn": "bin/acorn" }, @@ -1852,9 +1859,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "dev": true, "funding": [ { @@ -1864,13 +1871,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -1991,9 +2002,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001487", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001487.tgz", - "integrity": "sha512-83564Z3yWGqXsh2vaH/mhXfEM0wX+NlBCm1jYHOb97TrTWJEmPTccZgeLTPBUUb0PNVo+oomb7wkimZBIERClA==", + "version": "1.0.30001508", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001508.tgz", + "integrity": "sha512-sdQZOJdmt3GJs1UMNpCCCyeuS2IEGLXnHyAo9yIO5JJDjbjoVRij4M1qep6P6gFpptD1PqIYgzM+gwJbOi92mw==", "funding": [ { "type": "opencollective", @@ -2094,9 +2105,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, "node_modules/class-is": { @@ -2376,12 +2387,15 @@ } }, "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", "dev": true, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, "node_modules/ecdsa-sig-formatter": { @@ -2398,9 +2412,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.394", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.394.tgz", - "integrity": "sha512-0IbC2cfr8w5LxTz+nmn2cJTGafsK9iauV2r5A5scfzyovqLrxuLoxOHE5OBobP3oVIggJT+0JfKnw9sm87c8Hw==", + "version": "1.4.440", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.440.tgz", + "integrity": "sha512-r6dCgNpRhPwiWlxbHzZQ/d9swfPaEJGi8ekqRBwQYaR3WmA5VkqQfBWSDDjuJU1ntO+W9tHx8OHV/96Q8e0dVw==", "dev": true }, "node_modules/emittery": { @@ -2786,6 +2800,11 @@ "node": ">= 6" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -2798,8 +2817,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/has": { "version": "1.0.3", @@ -2987,9 +3005,9 @@ } }, "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -3658,9 +3676,9 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -3853,9 +3871,9 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/jsonwebtoken/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3900,7 +3918,7 @@ } }, "node_modules/le-coffre-resources": { - "resolved": "git+ssh://git@github.com/smart-chain-fr/leCoffre-resources.git#f90ab464e3b0f9dd70601b9c8f8bbf5090b685a7", + "resolved": "git+ssh://git@github.com/smart-chain-fr/leCoffre-resources.git#16c30e06af8241bf6fef6ec8083da9bf434048df", "license": "MIT", "dependencies": { "class-transformer": "^0.5.1", @@ -3918,9 +3936,9 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.10.30", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.30.tgz", - "integrity": "sha512-PLGc+xfrQrkya/YK2/5X+bPpxRmyJBHM+xxz9krUdSgk4Vs2ZwxX5/Ow0lv3r9PDlDtNWb4u+it8MY5rZ0IyGw==" + "version": "1.10.36", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.36.tgz", + "integrity": "sha512-NCPWES1poiS4NSzIS49mxHM5hCkSWov8wFICRKfL9narzimqAXlnAgNloHCt0BukZHbWt8TIStCdzLy7LXBYpQ==" }, "node_modules/lines-and-columns": { "version": "1.2.4", @@ -4133,9 +4151,9 @@ } }, "node_modules/module-alias": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", - "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.3.tgz", + "integrity": "sha512-23g5BFj4zdQL/b6tor7Ji+QY4pEfNH784BMslY9Qb0UnJWRAt+lQGLYmRaM0KDBwIG23ffEBELhZDP2rhi9f/Q==" }, "node_modules/ms": { "version": "2.0.0", @@ -4314,16 +4332,17 @@ } }, "node_modules/next": { - "version": "13.4.2", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.2.tgz", - "integrity": "sha512-aNFqLs3a3nTGvLWlO9SUhCuMUHVPSFQC0+tDNGAsDXqx+WJDFSbvc233gOJ5H19SBc7nw36A9LwQepOJ2u/8Kg==", + "version": "13.4.7", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", + "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", "dependencies": { - "@next/env": "13.4.2", + "@next/env": "13.4.7", "@swc/helpers": "0.5.1", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", "postcss": "8.4.14", "styled-jsx": "5.1.1", + "watchpack": "2.4.0", "zod": "3.21.4" }, "bin": { @@ -4333,20 +4352,19 @@ "node": ">=16.8.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.2", - "@next/swc-darwin-x64": "13.4.2", - "@next/swc-linux-arm64-gnu": "13.4.2", - "@next/swc-linux-arm64-musl": "13.4.2", - "@next/swc-linux-x64-gnu": "13.4.2", - "@next/swc-linux-x64-musl": "13.4.2", - "@next/swc-win32-arm64-msvc": "13.4.2", - "@next/swc-win32-ia32-msvc": "13.4.2", - "@next/swc-win32-x64-msvc": "13.4.2" + "@next/swc-darwin-arm64": "13.4.7", + "@next/swc-darwin-x64": "13.4.7", + "@next/swc-linux-arm64-gnu": "13.4.7", + "@next/swc-linux-arm64-musl": "13.4.7", + "@next/swc-linux-x64-gnu": "13.4.7", + "@next/swc-linux-x64-musl": "13.4.7", + "@next/swc-win32-arm64-msvc": "13.4.7", + "@next/swc-win32-ia32-msvc": "13.4.7", + "@next/swc-win32-x64-msvc": "13.4.7" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "fibers": ">= 3.1.0", - "node-sass": "^6.0.0 || ^7.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -4358,9 +4376,6 @@ "fibers": { "optional": true }, - "node-sass": { - "optional": true - }, "sass": { "optional": true } @@ -4403,9 +4418,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", "dev": true }, "node_modules/node-schedule": { @@ -4723,9 +4738,9 @@ } }, "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, "engines": { "node": ">= 6" @@ -4808,13 +4823,13 @@ } }, "node_modules/prisma": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.14.0.tgz", - "integrity": "sha512-+5dMl1uxMQb4RepndY6AwR9xi1cDcaGFICu+ws6/Nmgt93mFPNj8tYxSfTdmfg+rkNrUId9rk/Ac2vTgLe/oXA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.11.0.tgz", + "integrity": "sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==", "devOptional": true, "hasInstallScript": true, "dependencies": { - "@prisma/engines": "4.14.0" + "@prisma/engines": "4.11.0" }, "bin": { "prisma": "build/index.js", @@ -5529,9 +5544,9 @@ } }, "node_modules/ts-jest/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5592,9 +5607,9 @@ } }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" }, "node_modules/type-detect": { "version": "4.0.8", @@ -5806,6 +5821,18 @@ "makeerror": "1.0.12" } }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/package.json b/package.json index c3e19dfb..d2d12d63 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "cors": "^2.8.5", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.52", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.54", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", diff --git a/src/app/api/idnot/UserController.ts b/src/app/api/idnot/UserController.ts index ad72402d..7c574a83 100644 --- a/src/app/api/idnot/UserController.ts +++ b/src/app/api/idnot/UserController.ts @@ -17,20 +17,24 @@ export default class UserController extends ApiController { * @todo Used for test, should be removed * @returns User */ - // @Post("/api/v1/idnot/user/:code") - // protected async getUserInfosFromIdnot(req: Request, response: Response) { - // console.warn("/api/v1/idnot/user/:code used for test, should be removed"); + @Post("/api/v1/idnot/user/:code") + protected async getUserInfosFromIdnot(req: Request, response: Response) { + console.warn("/api/v1/idnot/user/:code used for test, should be removed"); - // try { - // const code = req.params["code"]; - // const user = await this.authService.getUserFromIdNotTokens(code!); - // //success - // this.httpSuccess(response, user); - // } catch (error) { - // this.httpInternalError(response); - // return; - // } - // } + try { + const code = req.params["code"]; + if (!code) throw new Error("code is required"); + const token = await fetch('https://qual-connexion.idnot.fr/IdPOAuth2/token/idnot_idp_v1', {method: 'POST'}); + console.log(token); + //const user = await this.authService.getUserFromIdNotTokens(code!); + //success + this.httpSuccess(response); + } catch (error) { + console.log(error) + this.httpInternalError(response); + return; + } + } @Post("/api/v1/idnot/user/login/:idnot") protected async login(req: Request, response: Response) { @@ -38,7 +42,7 @@ export default class UserController extends ApiController { const id = req.params["idnot"]; if (!id) throw new Error("idnot is required"); - const payload = await this.authService.getUserPayload(id!); + const payload = await this.authService.getUserJwtPayload(id!); const accessToken = this.authService.generateAccessToken(payload); const refreshToken = this.authService.generateRefreshToken(payload); diff --git a/src/app/api/super-admin/OfficeRolesController.ts b/src/app/api/super-admin/OfficeRolesController.ts new file mode 100644 index 00000000..dd7de7a0 --- /dev/null +++ b/src/app/api/super-admin/OfficeRolesController.ts @@ -0,0 +1,147 @@ +import { Response, Request } from "express"; +import { Controller, Get, Post, Put } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import OfficeRolesService from "@Services/super-admin/OfficeRolesService/OfficeRolesService"; +import { Service } from "typedi"; +import { validateOrReject } from "class-validator"; +import { OfficeRole } from "le-coffre-resources/dist/Notary"; +import { OfficeRoles } from "@prisma/client"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; + +@Controller() +@Service() +export default class OfficeRolesController extends ApiController { + constructor(private officeRolesService: OfficeRolesService) { + super(); + } + + /** + * @description Get all officeRoles + */ + @Get("/api/v1/super-admin/officeRoles", [authHandler,ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + + //call service to get prisma entity + const officeRolesEntities = await this.officeRolesService.get(query); + + //Hydrate ressource with prisma entity + const officeRoles = OfficeRole.hydrateArray(officeRolesEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, officeRoles); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Create a new officeRole + */ + @Post("/api/v1/super-admin/office-roles", [authHandler,ruleHandler]) + protected async getAddresses(req: Request, response: Response) { + try { + //init IOfficeRole resource with request body values + const officeRoleEntity = OfficeRole.hydrate(req.body); + + //validate officeRole + await validateOrReject(officeRoleEntity, { groups: ["createOfficeRole"] }); + + //call service to get prisma entity + const officeRoleEntityCreated = await this.officeRolesService.create(officeRoleEntity); + + //Hydrate ressource with prisma entity + const officeRole = OfficeRole.hydrate(officeRoleEntityCreated, { + strategy: "excludeAll", + }); + + //success + this.httpCreated(response, officeRole); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Modify a specific officeRole by uid + */ + @Put("/api/v1/super-admin/office-roles/:uid", [authHandler,ruleHandler]) + protected async put(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const officeRoleFound = await this.officeRolesService.getByUid(uid); + + if (!officeRoleFound) { + this.httpNotFoundRequest(response, "officeRole not found"); + return; + } + + //init IOfficeRole resource with request body values + const officeRoleEntity = OfficeRole.hydrate(req.body); + + //validate officeRole + await validateOrReject(officeRoleEntity, { groups: ["updateOfficeRole"] }); + + //call service to get prisma entity + const officeRoleEntityUpdated = await this.officeRolesService.update(officeRoleEntity); + + //Hydrate ressource with prisma entity + const officeRole = OfficeRole.hydrate(officeRoleEntityUpdated, { + strategy: "excludeAll", + }); + + //success + this.httpSuccess(response, officeRole); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific officeRole by uid + */ + @Get("/api/v1/super-admin/office-roles/:uid", [authHandler,ruleHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + let officeRoleEntity: OfficeRoles | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + officeRoleEntity = await this.officeRolesService.getByUid(uid, query); + } else { + //call service to get prisma entity + officeRoleEntity = await this.officeRolesService.getByUid(uid); + } + + if (!officeRoleEntity) { + this.httpNotFoundRequest(response, "officeRole not found"); + return; + } + + //Hydrate ressource with prisma entity + const officeRole = OfficeRole.hydrate(officeRoleEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, officeRole); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/common/databases/migrations/20230627155351_v6/migration.sql b/src/common/databases/migrations/20230627155351_v6/migration.sql new file mode 100644 index 00000000..42e2a343 --- /dev/null +++ b/src/common/databases/migrations/20230627155351_v6/migration.sql @@ -0,0 +1,86 @@ +/* + Warnings: + + - You are about to drop the `office_role_has_rules` table. If the table is not empty, all the data it contains will be lost. + - You are about to drop the `role_has_rules` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- DropForeignKey +ALTER TABLE "office_role_has_rules" DROP CONSTRAINT "office_role_has_rules_office_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "office_role_has_rules" DROP CONSTRAINT "office_role_has_rules_role_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "office_role_has_rules" DROP CONSTRAINT "office_role_has_rules_rule_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "role_has_rules" DROP CONSTRAINT "role_has_rules_role_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "role_has_rules" DROP CONSTRAINT "role_has_rules_rule_uid_fkey"; + +-- AlterTable +ALTER TABLE "users" ADD COLUMN "office_role_uid" VARCHAR(255); + +-- DropTable +DROP TABLE "office_role_has_rules"; + +-- DropTable +DROP TABLE "role_has_rules"; + +-- CreateTable +CREATE TABLE "office_roles" ( + "uid" TEXT NOT NULL, + "name" VARCHAR(255) NOT NULL, + "office_uid" VARCHAR(255) NOT NULL, + "created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3), + + CONSTRAINT "office_roles_pkey" PRIMARY KEY ("uid") +); + +-- CreateTable +CREATE TABLE "_RolesHasRules" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL +); + +-- CreateTable +CREATE TABLE "_OfficeRolesHasRules" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "office_roles_uid_key" ON "office_roles"("uid"); + +-- CreateIndex +CREATE UNIQUE INDEX "_RolesHasRules_AB_unique" ON "_RolesHasRules"("A", "B"); + +-- CreateIndex +CREATE INDEX "_RolesHasRules_B_index" ON "_RolesHasRules"("B"); + +-- CreateIndex +CREATE UNIQUE INDEX "_OfficeRolesHasRules_AB_unique" ON "_OfficeRolesHasRules"("A", "B"); + +-- CreateIndex +CREATE INDEX "_OfficeRolesHasRules_B_index" ON "_OfficeRolesHasRules"("B"); + +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_office_role_uid_fkey" FOREIGN KEY ("office_role_uid") REFERENCES "office_roles"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "office_roles" ADD CONSTRAINT "office_roles_office_uid_fkey" FOREIGN KEY ("office_uid") REFERENCES "offices"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_RolesHasRules" ADD CONSTRAINT "_RolesHasRules_A_fkey" FOREIGN KEY ("A") REFERENCES "roles"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_RolesHasRules" ADD CONSTRAINT "_RolesHasRules_B_fkey" FOREIGN KEY ("B") REFERENCES "rules"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_OfficeRolesHasRules" ADD CONSTRAINT "_OfficeRolesHasRules_A_fkey" FOREIGN KEY ("A") REFERENCES "office_roles"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_OfficeRolesHasRules" ADD CONSTRAINT "_OfficeRolesHasRules_B_fkey" FOREIGN KEY ("B") REFERENCES "rules"("uid") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/src/common/databases/schema.prisma b/src/common/databases/schema.prisma index fa2ad5eb..6fb4da16 100644 --- a/src/common/databases/schema.prisma +++ b/src/common/databases/schema.prisma @@ -56,6 +56,8 @@ model Users { contact_uid String @unique @db.VarChar(255) role Roles @relation(fields: [roles_uid], references: [uid], onDelete: Cascade) roles_uid String @db.VarChar(255) + office_role OfficeRoles? @relation(fields: [office_role_uid], references: [uid], onDelete: Cascade) + office_role_uid String? @db.VarChar(255) created_at DateTime? @default(now()) updated_at DateTime? @updatedAt office_membership Offices @relation(fields: [office_uid], references: [uid], onDelete: Cascade) @@ -67,20 +69,20 @@ model Users { } model Offices { - uid String @id @unique @default(uuid()) - idNot String @unique @db.VarChar(255) - name String @db.VarChar(255) - crpcen String @unique @db.VarChar(255) - address Addresses @relation(fields: [address_uid], references: [uid], onDelete: Cascade) - address_uid String @unique @db.VarChar(255) - office_status EOfficeStatus @default(DESACTIVATED) - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - deed_types DeedTypes[] - users Users[] - office_folders OfficeFolders[] - document_types DocumentTypes[] - office_role_has_rules OfficesRolesHasRules[] + uid String @id @unique @default(uuid()) + idNot String @unique @db.VarChar(255) + name String @db.VarChar(255) + crpcen String @unique @db.VarChar(255) + address Addresses @relation(fields: [address_uid], references: [uid], onDelete: Cascade) + address_uid String @unique @db.VarChar(255) + office_status EOfficeStatus @default(DESACTIVATED) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + deed_types DeedTypes[] + users Users[] + office_folders OfficeFolders[] + document_types DocumentTypes[] + OfficeRoles OfficeRoles[] @@map("offices") } @@ -300,53 +302,63 @@ model DeedTypeHasDocumentTypes { } model Roles { - uid String @id @unique @default(uuid()) - name String @db.VarChar(255) - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - role_has_rules RolesHasRules[] - office_role_has_rules OfficesRolesHasRules[] - users Users[] + uid String @id @unique @default(uuid()) + name String @db.VarChar(255) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + rules Rules[] @relation("RolesHasRules") + users Users[] @@map("roles") } +model OfficeRoles { + uid String @id @unique @default(uuid()) + name String @db.VarChar(255) + office Offices @relation(fields: [office_uid], references: [uid], onDelete: Cascade) + office_uid String @db.VarChar(255) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + rules Rules[] @relation("OfficeRolesHasRules") + users Users[] + + @@map("office_roles") +} + model Rules { - uid String @id @unique @default(uuid()) - name String @db.VarChar(255) - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - role_has_rules RolesHasRules[] - office_roles_has_rules OfficesRolesHasRules[] + uid String @id @unique @default(uuid()) + name String @db.VarChar(255) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + role Roles[] @relation("RolesHasRules") + office_roles OfficeRoles[] @relation("OfficeRolesHasRules") @@map("rules") } -model RolesHasRules { - uid String @id @unique @default(uuid()) - role Roles @relation(fields: [role_uid], references: [uid], onDelete: Cascade) - role_uid String @db.VarChar(255) - rule Rules @relation(fields: [rule_uid], references: [uid], onDelete: Cascade) - rule_uid String @db.VarChar(255) - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt +// model RolesHasRules { +// uid String @id @unique @default(uuid()) +// role Roles @relation(fields: [role_uid], references: [uid], onDelete: Cascade) +// role_uid String @db.VarChar(255) +// rule Rules @relation(fields: [rule_uid], references: [uid], onDelete: Cascade) +// rule_uid String @db.VarChar(255) +// created_at DateTime? @default(now()) +// updated_at DateTime? @updatedAt - @@map("role_has_rules") -} +// @@map("role_has_rules") +// } -model OfficesRolesHasRules { - uid String @id @unique @default(uuid()) - office Offices @relation(fields: [office_uid], references: [uid], onDelete: Cascade) - role Roles @relation(fields: [role_uid], references: [uid], onDelete: Cascade) - rule Rules @relation(fields: [rule_uid], references: [uid], onDelete: Cascade) - office_uid String @db.VarChar(255) - role_uid String @db.VarChar(255) - rule_uid String @db.VarChar(255) - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt +// model OfficesRolesHasRules { +// uid String @id @unique @default(uuid()) +// office_role OfficeRoles @relation(fields: [office_role_uid], references: [uid], onDelete: Cascade) +// rule Rules @relation(fields: [rule_uid], references: [uid], onDelete: Cascade) +// office_role_uid String @db.VarChar(255) +// rule_uid String @db.VarChar(255) +// created_at DateTime? @default(now()) +// updated_at DateTime? @updatedAt - @@map("office_role_has_rules") -} +// @@map("office_role_has_rules") +// } enum ECivility { MALE diff --git a/src/common/databases/seeders/seeder.ts b/src/common/databases/seeders/seeder.ts index c8eb63f8..e7e2816a 100644 --- a/src/common/databases/seeders/seeder.ts +++ b/src/common/databases/seeders/seeder.ts @@ -1,599 +1,599 @@ import { - Addresses, - Contacts, - Customers, - DeedHasDocumentTypes, - DeedTypeHasDocumentTypes, - DeedTypes, - Deeds, - DocumentHistory, - DocumentTypes, - Documents, - EDocumentStatus, - EFolderStatus, - EOfficeStatus, - OfficeFolderHasCustomers, - OfficeFolders, - Offices, - Users, - ECivility, - ECustomerStatus, + // Addresses, + // Contacts, + // Customers, + // DeedHasDocumentTypes, + // DeedTypeHasDocumentTypes, + // DeedTypes, + // Deeds, + // DocumentHistory, + // DocumentTypes, + // Documents, + // EDocumentStatus, + // EFolderStatus, + // EOfficeStatus, + // OfficeFolderHasCustomers, + // OfficeFolders, + // Offices, + // Users, + // ECivility, + // ECustomerStatus, PrismaClient, - Roles, +// Roles, } from "@prisma/client"; (async () => { const prisma = new PrismaClient(); + console.log(prisma); + // const randomString = () => { + // const chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + // let result = ""; + // for (let i = 10; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)]; + // return result; + // }; + // const uidCustomer1: string = randomString(); + // const uidCustomer2: string = randomString(); - const randomString = () => { - const chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - let result = ""; - for (let i = 10; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)]; - return result; - }; - const uidCustomer1: string = randomString(); - const uidCustomer2: string = randomString(); + // const uidContact1: string = randomString(); + // const uidContact2: string = randomString(); + // const uidContact3: string = randomString(); + // const uidContact4: string = randomString(); - const uidContact1: string = randomString(); - const uidContact2: string = randomString(); - const uidContact3: string = randomString(); - const uidContact4: string = randomString(); + // const uidAddress1: string = randomString(); + // const uidAddress2: string = randomString(); + // const uidAddress3: string = randomString(); + // const uidAddress4: string = randomString(); - const uidAddress1: string = randomString(); - const uidAddress2: string = randomString(); - const uidAddress3: string = randomString(); - const uidAddress4: string = randomString(); + // const uidOffice1: string = randomString(); + // const uidOffice2: string = randomString(); - const uidOffice1: string = randomString(); - const uidOffice2: string = randomString(); + // const uidUser1: string = randomString(); + // const uidUser2: string = randomString(); - const uidUser1: string = randomString(); - const uidUser2: string = randomString(); + // const uidRole1: string = randomString(); + // const uidRole2: string = randomString(); - const uidRole1: string = randomString(); - const uidRole2: string = randomString(); + // const uidOfficeFolder1: string = randomString(); + // const uidOfficeFolder2: string = randomString(); + // const uidOfficeFolder3: string = randomString(); + // const uidOfficeFolder4: string = randomString(); + // const uidOfficeFolder5: string = randomString(); - const uidOfficeFolder1: string = randomString(); - const uidOfficeFolder2: string = randomString(); - const uidOfficeFolder3: string = randomString(); - const uidOfficeFolder4: string = randomString(); - const uidOfficeFolder5: string = randomString(); + // const uidDeed1: string = randomString(); + // const uidDeed2: string = randomString(); + // const uidDeed3: string = randomString(); + // const uidDeed4: string = randomString(); + // const uidDeed5: string = randomString(); - const uidDeed1: string = randomString(); - const uidDeed2: string = randomString(); - const uidDeed3: string = randomString(); - const uidDeed4: string = randomString(); - const uidDeed5: string = randomString(); + // const uidDeedType1: string = randomString(); + // const uidDeedType2: string = randomString(); - const uidDeedType1: string = randomString(); - const uidDeedType2: string = randomString(); + // const uidDocument1: string = randomString(); + // const uidDocument2: string = randomString(); + // const uidDocument3: string = randomString(); + // const uidDocument4: string = randomString(); + // const uidDocument5: string = randomString(); - const uidDocument1: string = randomString(); - const uidDocument2: string = randomString(); - const uidDocument3: string = randomString(); - const uidDocument4: string = randomString(); - const uidDocument5: string = randomString(); + // const uidDocumentType1: string = randomString(); + // const uidDocumentType2: string = randomString(); + // const uidDocumentType3: string = randomString(); - const uidDocumentType1: string = randomString(); - const uidDocumentType2: string = randomString(); - const uidDocumentType3: string = randomString(); + // const uidOfficeFolderHasCustomer1: string = randomString(); + // const uidOfficeFolderHasCustomer2: string = randomString(); - const uidOfficeFolderHasCustomer1: string = randomString(); - const uidOfficeFolderHasCustomer2: string = randomString(); + // const uidDeedHasDocumentType1: string = randomString(); + // const uidDeedHasDocumentType2: string = randomString(); - const uidDeedHasDocumentType1: string = randomString(); - const uidDeedHasDocumentType2: string = randomString(); + // const uidDeedTypeHasDocumentType1: string = randomString(); + // const uidDeedTypeHasDocumentType2: string = randomString(); - const uidDeedTypeHasDocumentType1: string = randomString(); - const uidDeedTypeHasDocumentType2: string = randomString(); + // const uidDocumentHistory1: string = randomString(); + // const uidDocumentHistory2: string = randomString(); - const uidDocumentHistory1: string = randomString(); - const uidDocumentHistory2: string = randomString(); + // // const existingData = await prisma.contacts.findFirst({ where: { uid: uidContact4 } }); + // // if (existingData) { + // // console.log("Seed data already exists. Skipping seeding process."); + // // return; + // // } - // const existingData = await prisma.contacts.findFirst({ where: { uid: uidContact4 } }); - // if (existingData) { - // console.log("Seed data already exists. Skipping seeding process."); - // return; + + // const customers: Customers[] = [ + // { + // uid: uidCustomer1, + // contact_uid: uidContact1, + // created_at: new Date(), + // updated_at: new Date(), + // status: ECustomerStatus.PENDING, + // }, + // { + // uid: uidCustomer2, + // contact_uid: uidContact2, + // created_at: new Date(), + // updated_at: new Date(), + // status: ECustomerStatus.PENDING, + // }, + // ]; + + // const addresses: Addresses[] = [ + // { + // uid: uidAddress1, + // address: "123 Main St", + // city: "Los Angeles", + // zip_code: 90001, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // { + // uid: uidAddress2, + // address: "Rue Pierre Emillion", + // city: "Paris", + // zip_code: 75003, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // { + // uid: uidAddress3, + // address: "Rue Pierre Charles", + // city: "Paris", + // zip_code: 75003, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // { + // uid: uidAddress4, + // address: "Rue Pierre Pologne", + // city: "Paris", + // zip_code: 75003, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // ]; + + // const contacts: Contacts[] = [ + // { + // uid: uidContact1, + // address_uid: uidAddress1, + // first_name: "John", + // last_name: "Doe", + // email: "john.doe@example.com", + // phone_number: randomString(), + // cell_phone_number: randomString(), + // birthdate: null, + // created_at: new Date(), + // updated_at: new Date(), + // civility: ECivility.MALE, + // }, + // { + // uid: uidContact2, + // address_uid: uidAddress2, + // first_name: "Jane", + // last_name: "Doe", + // email: "jane.doe@example.com", + // phone_number: randomString(), + // cell_phone_number: randomString(), + // birthdate: null, + // created_at: new Date(), + // updated_at: new Date(), + // civility: ECivility.FEMALE, + // }, + // { + // uid: uidContact3, + // address_uid: uidAddress3, + // first_name: "Maitre Marcelino", + // last_name: "Jack", + // email: "Marcelino.Jack@example.com", + // phone_number: randomString(), + // cell_phone_number: randomString(), + // birthdate: null, + // created_at: new Date(), + // updated_at: new Date(), + // civility: ECivility.MALE, + // }, + // { + // uid: uidContact4, + // address_uid: uidAddress4, + // first_name: "Maitre Massi", + // last_name: "Jack", + // email: "Massi.Jack@example.com", + // phone_number: randomString(), + // cell_phone_number: randomString(), + // birthdate: null, + // created_at: new Date(), + // updated_at: new Date(), + // civility: ECivility.FEMALE, + // }, + // ]; + + // const offices: Offices[] = [ + // { + // uid: uidOffice1, + // idNot: randomString(), + // name: "LA Office", + // crpcen: randomString(), + // address_uid: uidAddress1, + // created_at: new Date(), + // updated_at: new Date(), + // office_status: EOfficeStatus.ACTIVATED, + // }, + // { + // uid: uidOffice2, + // idNot: randomString(), + // name: "NYC Office", + // crpcen: randomString(), + // address_uid: uidAddress2, + // created_at: new Date(), + // updated_at: new Date(), + // office_status: EOfficeStatus.DESACTIVATED, + // }, + // ]; + + // const roles: Roles[] = [ + // { + // uid: uidRole1, + // name: 'super-admin', + // created_at: new Date(), + // updated_at: new Date(), + // }, + // { + // uid: uidRole2, + // name: 'admin', + // created_at: new Date(), + // updated_at: new Date(), + // } + // ]; + + // const users: Users[] = [ + // { + // uid: uidUser1, + // created_at: new Date(), + // updated_at: new Date(), + // idNot: randomString(), + // contact_uid: uidContact1, + // office_uid: uidOffice1, + // roles_uid: uidRole1, + // }, + // { + // uid: uidUser2, + // created_at: new Date(), + // updated_at: new Date(), + // idNot: randomString(), + // contact_uid: uidContact2, + // office_uid: uidOffice2, + // roles_uid: uidRole2, + // }, + // ]; + + // const officeFolders: OfficeFolders[] = [ + // { + // uid: uidOfficeFolder1, + // folder_number: "0001", + // name: "Dossier", + // deed_uid: uidDeed1, + // status: EFolderStatus.LIVE, + // created_at: new Date(), + // updated_at: new Date(), + // office_uid: uidOffice1, + // description: null, + // archived_description: null, + // }, + // { + // uid: uidOfficeFolder2, + // folder_number: "0002", + // name: "Dossier", + // deed_uid: uidDeed2, + // status: EFolderStatus.LIVE, + // created_at: new Date(), + // updated_at: new Date(), + // office_uid: uidOffice2, + // description: null, + // archived_description: null, + // }, + // { + // uid: uidOfficeFolder3, + // folder_number: "0003", + // name: "Dossier", + // deed_uid: uidDeed3, + // status: EFolderStatus.LIVE, + // created_at: new Date(), + // updated_at: new Date(), + // office_uid: uidOffice2, + // description: null, + // archived_description: null, + // }, + // { + // uid: uidOfficeFolder4, + // folder_number: "0004", + // name: "Dossier", + // deed_uid: uidDeed4, + // status: EFolderStatus.ARCHIVED, + // created_at: new Date(), + // updated_at: new Date(), + // office_uid: uidOffice2, + // description: null, + // archived_description: null, + // }, + // { + // uid: uidOfficeFolder5, + // folder_number: "0005", + // name: "Dossier", + // deed_uid: uidDeed5, + // status: EFolderStatus.ARCHIVED, + // created_at: new Date(), + // updated_at: new Date(), + // office_uid: uidOffice2, + // description: null, + // archived_description: null, + // }, + // ]; + + // const deeds: Deeds[] = [ + // { + // uid: uidDeed1, + // deed_type_uid: uidDeedType1, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // { + // uid: uidDeed2, + // deed_type_uid: uidDeedType2, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // { + // uid: uidDeed3, + // deed_type_uid: uidDeedType2, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // { + // uid: uidDeed4, + // deed_type_uid: uidDeedType2, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // { + // uid: uidDeed5, + // deed_type_uid: uidDeedType2, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // ]; + + // const deedTypes: DeedTypes[] = [ + // { + // uid: uidDeedType1, + // name: "Acte de mariage", + // archived_at: null, + // description: "Acte regroupant deux personnes en mariage", + // office_uid: uidOffice1, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // { + // uid: uidDeedType2, + // name: "Vente d'un bien immobilier", + // archived_at: null, + // description: "Permet de vendre un bien immobilier à une entité ou une personne physique", + // office_uid: uidOffice2, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // ]; + + // const documents: Documents[] = [ + // { + // uid: uidDocument1, + // blockchain_anchor_uid: null, + // depositor_uid: uidCustomer1, + // document_status: EDocumentStatus.DEPOSITED, + // folder_uid: uidOfficeFolder1, + // document_type_uid: uidDocumentType1, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // { + // uid: uidDocument2, + // blockchain_anchor_uid: null, + // depositor_uid: uidCustomer2, + // document_status: EDocumentStatus.ASKED, + // folder_uid: uidOfficeFolder2, + // document_type_uid: uidDocumentType2, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // { + // uid: uidDocument3, + // blockchain_anchor_uid: null, + // depositor_uid: uidCustomer1, + // document_status: EDocumentStatus.ASKED, + // folder_uid: uidOfficeFolder1, + // document_type_uid: uidDocumentType3, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // { + // uid: uidDocument4, + // blockchain_anchor_uid: null, + // depositor_uid: uidCustomer1, + // document_status: EDocumentStatus.ASKED, + // folder_uid: uidOfficeFolder1, + // document_type_uid: uidDocumentType2, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // { + // uid: uidDocument5, + // blockchain_anchor_uid: null, + // depositor_uid: uidCustomer1, + // document_status: EDocumentStatus.ASKED, + // folder_uid: uidOfficeFolder1, + // document_type_uid: uidDocumentType1, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // ]; + + // const documentTypes: DocumentTypes[] = [ + // { + // uid: uidDocumentType1, + // archived_at: null, + // name: "Acte de naissance", + // office_uid: uidOffice1, + // private_description: "Ce document est confidentiel, et ne doit pas être divulgué", + // public_description: "Acte de naissance est un document officiel qui atteste de la naissance d'une personne", + // created_at: new Date(), + // updated_at: new Date(), + // }, + // { + // uid: uidDocumentType2, + // archived_at: null, + // name: "Carte d'identité", + // office_uid: uidOffice1, + // private_description: "Ce document est confidentiel, demander un recto-verso au client", + // public_description: "Carte d'identité est un document officiel qui atteste de l'identité d'une personne", + // created_at: new Date(), + // updated_at: new Date(), + // }, + // { + // uid: uidDocumentType3, + // archived_at: null, + // name: "Autres documents", + // office_uid: uidOffice1, + // private_description: "Ce document est confidentiel, demander un recto-verso au client", + // public_description: "Carte d'identité est un document officiel qui atteste de l'identité d'une personne", + // created_at: new Date(), + // updated_at: new Date(), + // }, + // ]; + + // const officeFolderHasCustomers: OfficeFolderHasCustomers[] = [ + // { + // uid: uidOfficeFolderHasCustomer1, + // customer_uid: uidCustomer1, + // office_folder_uid: uidOfficeFolder1, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // { + // uid: uidOfficeFolderHasCustomer2, + // customer_uid: uidCustomer2, + // office_folder_uid: uidOfficeFolder2, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // ]; + + // const deedHasDocumentTypes: DeedHasDocumentTypes[] = [ + // { + // uid: uidDeedHasDocumentType1, + // deed_uid: uidDeed1, + // document_type_uid: uidDocumentType1, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // { + // uid: uidDeedHasDocumentType2, + // deed_uid: uidDeed2, + // document_type_uid: uidDocumentType2, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // ]; + + // const deedTypeHasDocumentTypes: DeedTypeHasDocumentTypes[] = [ + // { + // uid: uidDeedTypeHasDocumentType1, + // deed_type_uid: uidDeedType1, + // document_type_uid: uidDocumentType1, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // { + // uid: uidDeedTypeHasDocumentType2, + // deed_type_uid: uidDeedType2, + // document_type_uid: uidDocumentType2, + // created_at: new Date(), + // updated_at: new Date(), + // }, + // ]; + + // const documentHistories: DocumentHistory[] = [ + // { + // uid: uidDocumentHistory1, + // document_status: EDocumentStatus.ASKED, + // document_uid: uidDocument1, + // refused_reason: "", + // created_at: new Date(), + // updated_at: new Date(), + // }, + // { + // uid: uidDocumentHistory2, + // document_status: EDocumentStatus.DEPOSITED, + // document_uid: uidDocument1, + // refused_reason: "Le document n'est pas conforme", + // created_at: new Date(), + // updated_at: new Date(), + // }, + // ]; + + // for (const address of addresses) { + // await prisma.addresses.create({ data: address }); // } + // for (const contact of contacts) { + // await prisma.contacts.create({ data: contact }); + // } - const customers: Customers[] = [ - { - uid: uidCustomer1, - contact_uid: uidContact1, - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - uid: uidCustomer2, - contact_uid: uidContact2, - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - ]; + // for (const office of offices) { + // await prisma.offices.create({ data: office }); + // } - const addresses: Addresses[] = [ - { - uid: uidAddress1, - address: "123 Main St", - city: "Los Angeles", - zip_code: 90001, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress2, - address: "Rue Pierre Emillion", - city: "Paris", - zip_code: 75003, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress3, - address: "Rue Pierre Charles", - city: "Paris", - zip_code: 75003, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress4, - address: "Rue Pierre Pologne", - city: "Paris", - zip_code: 75003, - created_at: new Date(), - updated_at: new Date(), - }, - ]; + // for (const role of roles) { + // await prisma.roles.create({ data: role }); + // } - const contacts: Contacts[] = [ - { - uid: uidContact1, - address_uid: uidAddress1, - first_name: "John", - last_name: "Doe", - email: "john.doe@example.com", - phone_number: randomString(), - cell_phone_number: randomString(), - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - uid: uidContact2, - address_uid: uidAddress2, - first_name: "Jane", - last_name: "Doe", - email: "jane.doe@example.com", - phone_number: randomString(), - cell_phone_number: randomString(), - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.FEMALE, - }, - { - uid: uidContact3, - address_uid: uidAddress3, - first_name: "Maitre Marcelino", - last_name: "Jack", - email: "Marcelino.Jack@example.com", - phone_number: randomString(), - cell_phone_number: randomString(), - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - uid: uidContact4, - address_uid: uidAddress4, - first_name: "Maitre Massi", - last_name: "Jack", - email: "Massi.Jack@example.com", - phone_number: randomString(), - cell_phone_number: randomString(), - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.FEMALE, - }, - ]; + // for (const user of users) { + // await prisma.users.create({ data: user }); + // } - const offices: Offices[] = [ - { - uid: uidOffice1, - idNot: randomString(), - name: "LA Office", - crpcen: randomString(), - address_uid: uidAddress1, - created_at: new Date(), - updated_at: new Date(), - office_status: EOfficeStatus.ACTIVATED, - }, - { - uid: uidOffice2, - idNot: randomString(), - name: "NYC Office", - crpcen: randomString(), - address_uid: uidAddress2, - created_at: new Date(), - updated_at: new Date(), - office_status: EOfficeStatus.DESACTIVATED, - }, - ]; + // for (const customer of customers) { + // await prisma.customers.create({ data: customer }); + // } - const roles: Roles[] = [ - { - uid: uidRole1, - name: 'super-admin', - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidRole2, - name: 'admin', - created_at: new Date(), - updated_at: new Date(), - } - ]; + // for (const deedType of deedTypes) { + // await prisma.deedTypes.create({ data: deedType }); + // } - const users: Users[] = [ - { - uid: uidUser1, - created_at: new Date(), - updated_at: new Date(), - idNot: randomString(), - contact_uid: uidContact1, - office_uid: uidOffice1, - roles_uid: uidRole1, - }, - { - uid: uidUser2, - created_at: new Date(), - updated_at: new Date(), - idNot: randomString(), - contact_uid: uidContact2, - office_uid: uidOffice2, - roles_uid: uidRole2, - }, - ]; + // for (const deed of deeds) { + // await prisma.deeds.create({ data: deed }); + // } + // for (const officeFolder of officeFolders) { + // await prisma.officeFolders.create({ data: officeFolder }); + // } - const officeFolders: OfficeFolders[] = [ - { - uid: uidOfficeFolder1, - folder_number: "0001", - name: "Dossier", - deed_uid: uidDeed1, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder2, - folder_number: "0002", - name: "Dossier", - deed_uid: uidDeed2, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice2, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder3, - folder_number: "0003", - name: "Dossier", - deed_uid: uidDeed3, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice2, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder4, - folder_number: "0004", - name: "Dossier", - deed_uid: uidDeed4, - status: EFolderStatus.ARCHIVED, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice2, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder5, - folder_number: "0005", - name: "Dossier", - deed_uid: uidDeed5, - status: EFolderStatus.ARCHIVED, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice2, - description: null, - archived_description: null, - }, - ]; + // for (const documentType of documentTypes) { + // await prisma.documentTypes.create({ data: documentType }); + // } - const deeds: Deeds[] = [ - { - uid: uidDeed1, - deed_type_uid: uidDeedType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed2, - deed_type_uid: uidDeedType2, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed3, - deed_type_uid: uidDeedType2, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed4, - deed_type_uid: uidDeedType2, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed5, - deed_type_uid: uidDeedType2, - created_at: new Date(), - updated_at: new Date(), - }, - ]; + // for (const document of documents) { + // await prisma.documents.create({ data: document }); + // } - const deedTypes: DeedTypes[] = [ - { - uid: uidDeedType1, - name: "Acte de mariage", - archived_at: null, - description: "Acte regroupant deux personnes en mariage", - office_uid: uidOffice1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedType2, - name: "Vente d'un bien immobilier", - archived_at: null, - description: "Permet de vendre un bien immobilier à une entité ou une personne physique", - office_uid: uidOffice2, - created_at: new Date(), - updated_at: new Date(), - }, - ]; + // for (const documentHistory of documentHistories) { + // await prisma.documentHistory.create({ data: documentHistory }); + // } - const documents: Documents[] = [ - { - uid: uidDocument1, - blockchain_anchor_uid: null, - depositor_uid: uidCustomer1, - document_status: EDocumentStatus.DEPOSITED, - folder_uid: uidOfficeFolder1, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocument2, - blockchain_anchor_uid: null, - depositor_uid: uidCustomer2, - document_status: EDocumentStatus.ASKED, - folder_uid: uidOfficeFolder2, - document_type_uid: uidDocumentType2, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocument3, - blockchain_anchor_uid: null, - depositor_uid: uidCustomer1, - document_status: EDocumentStatus.ASKED, - folder_uid: uidOfficeFolder1, - document_type_uid: uidDocumentType3, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocument4, - blockchain_anchor_uid: null, - depositor_uid: uidCustomer1, - document_status: EDocumentStatus.ASKED, - folder_uid: uidOfficeFolder1, - document_type_uid: uidDocumentType2, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocument5, - blockchain_anchor_uid: null, - depositor_uid: uidCustomer1, - document_status: EDocumentStatus.ASKED, - folder_uid: uidOfficeFolder1, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - ]; + // for (const officeFolderHasCustomer of officeFolderHasCustomers) { + // await prisma.officeFolderHasCustomers.create({ data: officeFolderHasCustomer }); + // } - const documentTypes: DocumentTypes[] = [ - { - uid: uidDocumentType1, - archived_at: null, - name: "Acte de naissance", - office_uid: uidOffice1, - private_description: "Ce document est confidentiel, et ne doit pas être divulgué", - public_description: "Acte de naissance est un document officiel qui atteste de la naissance d'une personne", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentType2, - archived_at: null, - name: "Carte d'identité", - office_uid: uidOffice1, - private_description: "Ce document est confidentiel, demander un recto-verso au client", - public_description: "Carte d'identité est un document officiel qui atteste de l'identité d'une personne", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentType3, - archived_at: null, - name: "Autres documents", - office_uid: uidOffice1, - private_description: "Ce document est confidentiel, demander un recto-verso au client", - public_description: "Carte d'identité est un document officiel qui atteste de l'identité d'une personne", - created_at: new Date(), - updated_at: new Date(), - }, - ]; + // for (const deedHasDocumentType of deedHasDocumentTypes) { + // await prisma.deedHasDocumentTypes.create({ data: deedHasDocumentType }); + // } - const officeFolderHasCustomers: OfficeFolderHasCustomers[] = [ - { - uid: uidOfficeFolderHasCustomer1, - customer_uid: uidCustomer1, - office_folder_uid: uidOfficeFolder1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidOfficeFolderHasCustomer2, - customer_uid: uidCustomer2, - office_folder_uid: uidOfficeFolder2, - created_at: new Date(), - updated_at: new Date(), - }, - ]; + // for (const deedTypeHasDocumentType of deedTypeHasDocumentTypes) { + // await prisma.deedTypeHasDocumentTypes.create({ data: deedTypeHasDocumentType }); + // } - const deedHasDocumentTypes: DeedHasDocumentTypes[] = [ - { - uid: uidDeedHasDocumentType1, - deed_uid: uidDeed1, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType2, - deed_uid: uidDeed2, - document_type_uid: uidDocumentType2, - created_at: new Date(), - updated_at: new Date(), - }, - ]; - - const deedTypeHasDocumentTypes: DeedTypeHasDocumentTypes[] = [ - { - uid: uidDeedTypeHasDocumentType1, - deed_type_uid: uidDeedType1, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedTypeHasDocumentType2, - deed_type_uid: uidDeedType2, - document_type_uid: uidDocumentType2, - created_at: new Date(), - updated_at: new Date(), - }, - ]; - - const documentHistories: DocumentHistory[] = [ - { - uid: uidDocumentHistory1, - document_status: EDocumentStatus.ASKED, - document_uid: uidDocument1, - refused_reason: "", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentHistory2, - document_status: EDocumentStatus.DEPOSITED, - document_uid: uidDocument1, - refused_reason: "Le document n'est pas conforme", - created_at: new Date(), - updated_at: new Date(), - }, - ]; - - for (const address of addresses) { - await prisma.addresses.create({ data: address }); - } - - for (const contact of contacts) { - await prisma.contacts.create({ data: contact }); - } - - for (const office of offices) { - await prisma.offices.create({ data: office }); - } - - for (const role of roles) { - await prisma.roles.create({ data: role }); - } - - for (const user of users) { - await prisma.users.create({ data: user }); - } - - for (const customer of customers) { - await prisma.customers.create({ data: customer }); - } - - for (const deedType of deedTypes) { - await prisma.deedTypes.create({ data: deedType }); - } - - for (const deed of deeds) { - await prisma.deeds.create({ data: deed }); - } - for (const officeFolder of officeFolders) { - await prisma.officeFolders.create({ data: officeFolder }); - } - - for (const documentType of documentTypes) { - await prisma.documentTypes.create({ data: documentType }); - } - - for (const document of documents) { - await prisma.documents.create({ data: document }); - } - - for (const documentHistory of documentHistories) { - await prisma.documentHistory.create({ data: documentHistory }); - } - - for (const officeFolderHasCustomer of officeFolderHasCustomers) { - await prisma.officeFolderHasCustomers.create({ data: officeFolderHasCustomer }); - } - - for (const deedHasDocumentType of deedHasDocumentTypes) { - await prisma.deedHasDocumentTypes.create({ data: deedHasDocumentType }); - } - - for (const deedTypeHasDocumentType of deedTypeHasDocumentTypes) { - await prisma.deedTypeHasDocumentTypes.create({ data: deedTypeHasDocumentType }); - } - - console.log(">MOCK DATA - Seeding completed!"); + // console.log(">MOCK DATA - Seeding completed!"); })(); diff --git a/src/common/databases/seeders/seeder2.ts b/src/common/databases/seeders/seeder2.ts index ce81192e..c16b9a91 100644 --- a/src/common/databases/seeders/seeder2.ts +++ b/src/common/databases/seeders/seeder2.ts @@ -18,9 +18,8 @@ import { ECustomerStatus, PrismaClient, Roles, - OfficesRolesHasRules, - RolesHasRules, Rules, + OfficeRoles, } from "@prisma/client"; (async () => { @@ -106,6 +105,8 @@ import { const uidRole1: string = randomString(); const uidRole2: string = randomString(); + const uidOfficeRole1: string = randomString(); + const uidOfficeRole2: string = randomString(); const uidRule1: string = randomString(); const uidRule2: string = randomString(); @@ -173,12 +174,6 @@ import { const uidOfficeFolderHasCustomer3: string = randomString(); const uidOfficeFolderHasCustomer4: string = randomString(); - const uidOfficeRoleHasRule1: string = randomString(); - const uidOfficeRoleHasRule2: string = randomString(); - - const uidRoleHasRule1: string = randomString(); - const uidRoleHasRule2: string = randomString(); - const uidDeedHasDocumentType1: string = randomString(); const uidDeedHasDocumentType2: string = randomString(); const uidDeedHasDocumentType3: string = randomString(); @@ -801,6 +796,21 @@ import { } ]; + const rules: Rules[] = [ + { + uid: uidRule1, + name: 'GET users', + created_at: new Date(), + updated_at: new Date(), + }, + { + uid: uidRule2, + name: 'GET offices', + created_at: new Date(), + updated_at: new Date(), + } + ]; + const roles: Roles[] = [ { uid: uidRole1, @@ -816,6 +826,23 @@ import { } ]; + const officeRoles: OfficeRoles[] = [ + { + uid: uidOfficeRole1, + name: 'super-admin', + created_at: new Date(), + updated_at: new Date(), + office_uid: uidOffice1, + }, + { + uid: uidOfficeRole2, + name: 'admin', + created_at: new Date(), + updated_at: new Date(), + office_uid: uidOffice1, + } + ]; + const users: Users[] = [ { uid: uidUser1, @@ -825,6 +852,7 @@ import { contact_uid: uidContact16, office_uid: uidOffice1, roles_uid: uidRole1, + office_role_uid: uidOfficeRole1, }, { uid: uidUser2, @@ -834,6 +862,7 @@ import { contact_uid: uidContact17, office_uid: uidOffice1, roles_uid: uidRole2, + office_role_uid: uidOfficeRole2, }, { uid: uidUser3, @@ -843,6 +872,7 @@ import { contact_uid: uidContact18, office_uid: uidOffice1, roles_uid: uidRole1, + office_role_uid: null, }, { uid: uidUser4, @@ -852,6 +882,7 @@ import { contact_uid: uidContact19, office_uid: uidOffice1, roles_uid: uidRole2, + office_role_uid: null, }, { uid: uidUser5, @@ -861,6 +892,7 @@ import { contact_uid: uidContact20, office_uid: uidOffice1, roles_uid: uidRole1, + office_role_uid: null, }, ]; @@ -1700,57 +1732,6 @@ import { }, ]; - const officeRoleHasRules: OfficesRolesHasRules[] = [ - { - uid: uidOfficeRoleHasRule1, - office_uid: uidOffice1, - role_uid: uidRole1, - rule_uid: uidRule1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidOfficeRoleHasRule2, - office_uid: uidOffice1, - role_uid: uidRole2, - rule_uid: uidRule2, - created_at: new Date(), - updated_at: new Date(), - }, - ]; - - const roleHasRules: RolesHasRules[] = [ - { - uid: uidRoleHasRule1, - role_uid: uidRole1, - rule_uid: uidRule2, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidRoleHasRule2, - role_uid: uidRole2, - rule_uid: uidRule1, - created_at: new Date(), - updated_at: new Date(), - }, - ]; - - const rules: Rules[] = [ - { - uid: uidRule1, - name: 'GET users', - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidRule2, - name: 'GET offices', - created_at: new Date(), - updated_at: new Date(), - } - ]; - const deedTypeHasDocumentTypes: DeedTypeHasDocumentTypes[] = [ { uid: uidDeedTypeHasDocumentType1, @@ -1927,12 +1908,16 @@ import { await prisma.offices.create({ data: office }); } + for (const rule of rules) { + await prisma.rules.create({ data: rule }); + } + for (const role of roles) { await prisma.roles.create({ data: role }); } - for (const rule of rules) { - await prisma.rules.create({ data: rule }); + for (const officeRole of officeRoles) { + await prisma.officeRoles.create({ data: officeRole }); } for (const user of users) { @@ -1966,14 +1951,6 @@ import { await prisma.officeFolderHasCustomers.create({ data: officeFolderHasCustomer }); } - for (const officeRoleHasRule of officeRoleHasRules) { - await prisma.officesRolesHasRules.create({ data: officeRoleHasRule }); - } - - for (const roleHasRule of roleHasRules) { - await prisma.rolesHasRules.create({ data: roleHasRule }); - } - for (const deedHasDocumentType of deedHasDocumentTypes) { await prisma.deedHasDocumentTypes.create({ data: deedHasDocumentType }); } diff --git a/src/common/repositories/DeedTypesHasDocumentTypesRepository.ts b/src/common/repositories/DeedTypesHasDocumentTypesRepository.ts deleted file mode 100644 index e724d9d8..00000000 --- a/src/common/repositories/DeedTypesHasDocumentTypesRepository.ts +++ /dev/null @@ -1,38 +0,0 @@ -import Database from "@Common/databases/database"; -import { DeedTypeHasDocumentTypes } from "@prisma/client"; -import BaseRepository from "@Repositories/BaseRepository"; -import { Service } from "typedi"; - -@Service() -export default class DeedTypeHasDocumentTypesRepository extends BaseRepository { - constructor(private database: Database) { - super(); - } - protected get model() { - return this.database.getClient().deedTypeHasDocumentTypes; - } - protected get instanceDb() { - return this.database.getClient(); - } - - /** - * @description : Find many relations between deed type and a document type - */ - public async findMany(query: any): Promise { - query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); - return this.model.findMany(query); - } - - /** - * @description : Find unique relation between deed type and a document type - */ - public async findOneByUid(uid: string): Promise { - const deedTypeHasDoculmentTypesEntity = await this.model.findUnique({ - where: { - uid: uid, - }, - }); - - return deedTypeHasDoculmentTypesEntity; - } -} diff --git a/src/common/repositories/DeedsHasDocumentTypesRepository.ts b/src/common/repositories/DeedsHasDocumentTypesRepository.ts deleted file mode 100644 index f95bca45..00000000 --- a/src/common/repositories/DeedsHasDocumentTypesRepository.ts +++ /dev/null @@ -1,38 +0,0 @@ -import Database from "@Common/databases/database"; -import { DeedHasDocumentTypes } from "@prisma/client"; -import BaseRepository from "@Repositories/BaseRepository"; -import { Service } from "typedi"; - -@Service() -export default class DeedHasDocumentTypesRepository extends BaseRepository { - constructor(private database: Database) { - super(); - } - protected get model() { - return this.database.getClient().deedHasDocumentTypes; - } - protected get instanceDb() { - return this.database.getClient(); - } - - /** - * @description : Find many deeds - */ - public async findMany(query: any): Promise { - query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); - return this.model.findMany(query); - } - - /** - * @description : Find unique relation between deed and a document type - */ - public async findOneByUid(uid: string): Promise { - const deedHasDocumentTypesEntity = await this.model.findUnique({ - where: { - uid: uid, - }, - }); - - return deedHasDocumentTypesEntity; - } -} diff --git a/src/common/repositories/OfficeFoldersHasCustomerRepository.ts b/src/common/repositories/OfficeFoldersHasCustomerRepository.ts deleted file mode 100644 index 932e51fd..00000000 --- a/src/common/repositories/OfficeFoldersHasCustomerRepository.ts +++ /dev/null @@ -1,38 +0,0 @@ -import Database from "@Common/databases/database"; -import { OfficeFolderHasCustomers } from "@prisma/client"; -import BaseRepository from "@Repositories/BaseRepository"; -import { Service } from "typedi"; - -@Service() -export default class OfficeFoldersHasCustomerRepository extends BaseRepository { - constructor(private database: Database) { - super(); - } - protected get model() { - return this.database.getClient().officeFolderHasCustomers; - } - protected get instanceDb() { - return this.database.getClient(); - } - - /** - * @description : Find many relations - */ - public async findMany(query: any): Promise { - query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); - return this.model.findMany(query); - } - - /** - * @description : Find a unique relation between an office folder and customers - */ - public async findOneByUid(uid: string): Promise { - const officeFolderHasCustomersEntity = await this.model.findUnique({ - where: { - uid: uid, - }, - }); - - return officeFolderHasCustomersEntity; - } -} diff --git a/src/common/repositories/OfficeFoldersHasStakeholderRepository.ts b/src/common/repositories/OfficeFoldersHasStakeholderRepository.ts deleted file mode 100644 index 864856cd..00000000 --- a/src/common/repositories/OfficeFoldersHasStakeholderRepository.ts +++ /dev/null @@ -1,38 +0,0 @@ -import Database from "@Common/databases/database"; -import { OfficeFolderHasStakeholders } from "@prisma/client"; -import BaseRepository from "@Repositories/BaseRepository"; -import { Service } from "typedi"; - -@Service() -export default class OfficeFoldersHasStakeholderRepository extends BaseRepository { - constructor(private database: Database) { - super(); - } - protected get model() { - return this.database.getClient().officeFolderHasStakeholders; - } - protected get instanceDb() { - return this.database.getClient(); - } - - /** - * @description : Find many relations - */ - public async findMany(query: any): Promise { - query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); - return this.model.findMany(query); - } - - /** - * @description : Find a unique relation between an office folder and stakeholders - */ - public async findOneByUid(uid: string): Promise { - const officeFolderHasStakeholdersEntity = await this.model.findUnique({ - where: { - uid: uid, - }, - }); - - return officeFolderHasStakeholdersEntity; - } -} diff --git a/src/common/repositories/OfficeRoleHasRulesRepository.ts b/src/common/repositories/OfficeRoleHasRulesRepository.ts deleted file mode 100644 index f36ccfd2..00000000 --- a/src/common/repositories/OfficeRoleHasRulesRepository.ts +++ /dev/null @@ -1,42 +0,0 @@ -import Database from "@Common/databases/database"; -import BaseRepository from "@Repositories/BaseRepository"; -import { Service } from "typedi"; -import { OfficesRolesHasRules, Prisma } from "@prisma/client"; - -@Service() -export default class OfficeRoleHasRulesRepository extends BaseRepository { - constructor(private database: Database) { - super(); - } - protected get model() { - return this.database.getClient().officesRolesHasRules; - } - protected get instanceDb() { - return this.database.getClient(); - } - - /** - * @description : Find many relations between office roles and rules - */ - public async findMany(query: any): Promise { - query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); - return this.model.findMany(query); - } - - /** - * @description : Find one relation between an office role and rules - */ - public async findOneByUid(uid: string, query?: any): Promise { - const findOneArgs: Prisma.OfficesRolesHasRulesFindUniqueArgs = { - where: { - uid: uid, - }, - }; - if (query) { - findOneArgs.include = query; - } - const roleEntity = await this.model.findUnique(findOneArgs); - - return roleEntity; - } -} diff --git a/src/common/repositories/OfficeRolesRepository.ts b/src/common/repositories/OfficeRolesRepository.ts new file mode 100644 index 00000000..a197e725 --- /dev/null +++ b/src/common/repositories/OfficeRolesRepository.ts @@ -0,0 +1,98 @@ +import Database from "@Common/databases/database"; +import BaseRepository from "@Repositories/BaseRepository"; +import { Service } from "typedi"; +import { OfficeRoles, Prisma } from "@prisma/client"; +import { OfficeRole } from "le-coffre-resources/dist/SuperAdmin"; + +@Service() +export default class OfficeRolesRepository extends BaseRepository { + constructor(private database: Database) { + super(); + } + protected get model() { + return this.database.getClient().officeRoles; + } + protected get instanceDb() { + return this.database.getClient(); + } + + /** + * @description : Find many officeRoles + */ + public async findMany(query: any): Promise { + query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); + return this.model.findMany(query); + } + + /** + * @description : Create new officeRole with rules + */ + public async create(officeRole: OfficeRole): Promise { + const createArgs: Prisma.OfficeRolesCreateArgs = { + data: { + name: officeRole.name, + office: { + connect: { + uid: officeRole.office.uid, + }, + }, + rules: { + connect: officeRole.rules?.map((rule) => ({ + uid: rule.uid!, + })), + }, + }, + }; + + return this.model.create(createArgs); + } + + /** + * @description : Update data of a officeRole with rules + */ + public async update(officeRole: OfficeRole): Promise { + const updateArgs: Prisma.OfficeRolesUpdateArgs = { + where: { + uid: officeRole.uid, + }, + data: { + name: officeRole.name, + rules: { + set: officeRole.rules?.map((rule) => ({ + uid: rule.uid!, + })), + }, + }, + }; + + return this.model.update(updateArgs); + } + + /** + * @description : Find one officeRole + */ + public async findOneByUid(uid: string, query?: any): Promise { + const findOneArgs: Prisma.OfficeRolesFindUniqueArgs = { + where: { + uid: uid, + }, + }; + if (query) { + findOneArgs.include = query; + } + const officeRoleEntity = await this.model.findUnique(findOneArgs); + + return officeRoleEntity; + } + + /** + * @description : Delete a officeRole + */ + public async delete(uid: string): Promise { + return this.model.delete({ + where: { + uid: uid, + }, + }); + } +} diff --git a/src/common/repositories/RolesHasRulesRepository.ts b/src/common/repositories/RolesHasRulesRepository.ts deleted file mode 100644 index 7a255dc5..00000000 --- a/src/common/repositories/RolesHasRulesRepository.ts +++ /dev/null @@ -1,42 +0,0 @@ -import Database from "@Common/databases/database"; -import BaseRepository from "@Repositories/BaseRepository"; -import { Service } from "typedi"; -import { RolesHasRules, Prisma } from "@prisma/client"; - -@Service() -export default class RolesHasRulesRepository extends BaseRepository { - constructor(private database: Database) { - super(); - } - protected get model() { - return this.database.getClient().rolesHasRules; - } - protected get instanceDb() { - return this.database.getClient(); - } - - /** - * @description : Find many relations between basic roles and rules - */ - public async findMany(query: any): Promise { - query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); - return this.model.findMany(query); - } - - /** - * @description : Find one relation between an basic role and rules - */ - public async findOneByUid(uid: string, query?: any): Promise { - const findOneArgs: Prisma.RolesHasRulesFindUniqueArgs = { - where: { - uid: uid, - }, - }; - if (query) { - findOneArgs.include = query; - } - const roleEntity = await this.model.findUnique(findOneArgs); - - return roleEntity; - } -} diff --git a/src/common/repositories/RolesRepository.ts b/src/common/repositories/RolesRepository.ts index 3b69797a..56e5f919 100644 --- a/src/common/repositories/RolesRepository.ts +++ b/src/common/repositories/RolesRepository.ts @@ -31,27 +31,13 @@ export default class RolesRepository extends BaseRepository { const createArgs: Prisma.RolesCreateArgs = { data: { name: role.name, - role_has_rules: { - createMany: { - data: role.role_has_rules!.rules.map((relation) => ({ - rule_uid: relation.uid!, - })), - skipDuplicates: true, - }, + rules: { + connect: role.rules?.map((rule) => ({ + uid: rule.uid!, + })), }, }, }; - if (role.office_role_has_rules) { - createArgs.data.office_role_has_rules = { - createMany: { - data: role.office_role_has_rules.rules.map((relation) => ({ - office_uid: role.office_role_has_rules!.office.uid!, - rule_uid: relation.uid!, - })), - skipDuplicates: true, - }, - }; - } return this.model.create(createArgs); } @@ -66,29 +52,13 @@ export default class RolesRepository extends BaseRepository { }, data: { name: role.name, - role_has_rules: { - deleteMany: { role_uid: role.uid }, - createMany: { - data: role.role_has_rules!.rules.map((relation) => ({ - rule_uid: relation.uid!, - })), - skipDuplicates: true, - }, + rules: { + set: role.rules?.map((rule) => ({ + uid: rule.uid!, + })), }, }, }; - if (role.office_role_has_rules) { - updateArgs.data.office_role_has_rules = { - deleteMany: { role_uid: role.uid }, - createMany: { - data: role.office_role_has_rules.rules.map((relation) => ({ - office_uid: role.office_role_has_rules!.office.uid!, - rule_uid: relation.uid!, - })), - skipDuplicates: true, - }, - }; - } return this.model.update(updateArgs); } diff --git a/src/common/repositories/UsersRepository.ts b/src/common/repositories/UsersRepository.ts index a0f14234..8767fb5a 100644 --- a/src/common/repositories/UsersRepository.ts +++ b/src/common/repositories/UsersRepository.ts @@ -19,7 +19,7 @@ export default class UsersRepository extends BaseRepository { /** * @description : Find many users */ - public async findMany(query: Prisma.UsersFindManyArgs): Promise { + public async findMany(query: Prisma.UsersFindManyArgs) { query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); return this.model.findMany(query); } @@ -65,7 +65,7 @@ export default class UsersRepository extends BaseRepository { connect: { uid: user.role!.uid, }, - } + }, }, }; if (user.contact!.address) { @@ -75,6 +75,13 @@ export default class UsersRepository extends BaseRepository { city: user.contact!.address.city, }; } + if (user.office_role) { + createArgs.data.office_role = { + connect: { + uid: user.office_role.uid, + }, + }; + } return this.model.create({ ...createArgs, include: { contact: true, office_membership: { include: { address: true } } } }); } @@ -137,6 +144,13 @@ export default class UsersRepository extends BaseRepository { city: user.contact!.address!.city, }; } + if (user.office_role) { + updateArgs.data.office_role = { + connect: { + uid: user.office_role.uid, + }, + }; + } return this.model.update({ ...updateArgs, include: { contact: true, office_membership: { include: { address: true } } } }); } @@ -156,4 +170,18 @@ export default class UsersRepository extends BaseRepository { return userEntity; } + + /** + * @description : Find one user + */ + public async findOneByProvider(providerName: string, id: string) { + return this.model.findUnique({ + where: { [providerName]: id }, + include: { + role: { include: { rules: true } } , + office_role: { include: { rules: true } } , + office_membership: true, + }, + }); + } } diff --git a/src/common/system/OpenIdInterface.ts b/src/common/system/OpenIdInterface.ts index d2d25049..62700e63 100644 --- a/src/common/system/OpenIdInterface.ts +++ b/src/common/system/OpenIdInterface.ts @@ -10,7 +10,21 @@ export type Tokens = { token_type: string; }; +export type OpenIdConfig = { + authorization_endpoint: string; + token_endpoint: string; + userinfo_endpoint: string; + claims_supported: string[]; + end_session_endpoint: string; + grant_types_supported: string[]; + response_types_supported: string[]; + scopes_supported: string[]; + issuer: string; + jwks_uri: string; +} + export default interface OpenIdInterface { + getOpenIdConfig(): Promise verifyIdToken(signingKey: string): Promise; getSigningKeys(jwksUri: string): Promise; } diff --git a/src/services/common/AuthService/AuthService.ts b/src/services/common/AuthService/AuthService.ts index 8d497fa9..39348d51 100644 --- a/src/services/common/AuthService/AuthService.ts +++ b/src/services/common/AuthService/AuthService.ts @@ -1,17 +1,24 @@ +import "reflect-metadata"; import jwt, { VerifyCallback } from "jsonwebtoken"; import BaseService from "@Services/BaseService"; -import "reflect-metadata"; import { BackendVariables } from "@Common/config/variables/Variables"; import { Service } from "typedi"; import UsersService from "@Services/super-admin/UsersService/UsersService"; -export type UserPayload = { - uid: string; - idNot: string; - office_idNot: string; +enum PROVIDER_OPENID { + idNot = "idNot", +} + +interface IJwtPayload { + userId: string; + openId: { + providerName: PROVIDER_OPENID; + userId: string | number; + }; + office_IdNot_Id: string; role: string; rules: string[]; -}; +} @Service() export default class AuthService extends BaseService { @@ -19,32 +26,25 @@ export default class AuthService extends BaseService { super(); } - public async getUserPayload(id: string): Promise { - const user: any = ( - await this.userService.get({ - where: { idNot: id }, - include: { - role: { include: { role_has_rules: { include: { rule: true } }, office_role_has_rules: { include: { rule: true } } } }, - office_membership: true, - }, - }) - )[0]; + public async getUserJwtPayload(id: string, providerName: PROVIDER_OPENID = PROVIDER_OPENID.idNot): Promise { + const user = await this.userService.getByProvider(providerName, id); - if (!user) throw new Error("User not found"); + if (!user) return null; - let rules: string[] = []; - if (user.role.office_role_has_rules.length) { - user.role.office_role_has_rules.forEach((relation: any) => { - if (relation.office_uid === user.office_membership.uid) rules.push(relation.rule.name); + const rules: string[] = []; + if (user.office_role?.rules.length) { + user.office_role.rules.forEach((relation: any) => { + rules.push(relation.rule.name); }); - return { uid: user.uid, idNot: user.idNot, office_idNot: user.office_membership.idNot, role: user.role.name, rules: rules }; + return { userId: user.uid, openId: {providerName: providerName, userId: user.idNot}, office_IdNot_Id: user.office_membership.idNot, role: user.role.name, rules: rules }; } + if (!rules.length) { - user.role.role_has_rules.forEach((relation: any) => { + user.role.rules.forEach((relation: any) => { rules.push(relation.rule.name); }); } - return { uid: user.uid, idNot: user.idNot, office_idNot: user.office_membership.idNot, role: user.role.name, rules: rules }; + return { userId: user.uid, openId: {providerName: providerName, userId: user.idNot}, office_IdNot_Id: user.office_membership.idNot, role: user.role.name, rules: rules }; } public generateAccessToken(user: any): string { diff --git a/src/services/common/OpenIdService/OpenIdService.ts b/src/services/common/OpenIdService/OpenIdService.ts new file mode 100644 index 00000000..c6785c83 --- /dev/null +++ b/src/services/common/OpenIdService/OpenIdService.ts @@ -0,0 +1,55 @@ +import jwt from "jsonwebtoken"; +import BaseService from "@Services/BaseService"; +import { Service } from "typedi"; + +export type Tokens = { + access_token: string; + expires_in: number; + id_token: string; + token_type: string; +}; + +export type OpenIdConfig = { + authorization_endpoint: string; + token_endpoint: string; + userinfo_endpoint: string; + claims_supported: string[]; + end_session_endpoint: string; + grant_types_supported: string[]; + response_types_supported: string[]; + scopes_supported: string[]; + issuer: string; + jwks_uri: string; +} + +@Service() +export default class OpenIdService extends BaseService { + protected authorizationServerUrl: string; + constructor(authorizationServerUrl: string) { + super(); + this.authorizationServerUrl = authorizationServerUrl; + } + + public async getOpenIdConfig(): Promise { + const response = await fetch(this.authorizationServerUrl + "/.well-known/openid-configuration"); + return await response.json(); + } + + public async getSigningKey(kid: string): Promise { + const jwksUri = (await this.getOpenIdConfig()).jwks_uri; + const response = await fetch(jwksUri); + const jwks = await response.json(); + const signingKey = jwks.keys.find((key: any) => key.kid === kid); + if (!signingKey) return null; + return signingKey; + } + + /** + * @throws Error + */ + public async verifyIdToken(idToken: string, kid: string) { + const signingKey = await this.getSigningKey(kid); + if (!signingKey) throw new Error("Signing key not found"); + return jwt.verify(idToken, signingKey); + } +} diff --git a/src/services/super-admin/OfficeRolesService/OfficeRolesService.ts b/src/services/super-admin/OfficeRolesService/OfficeRolesService.ts new file mode 100644 index 00000000..e50ac7e4 --- /dev/null +++ b/src/services/super-admin/OfficeRolesService/OfficeRolesService.ts @@ -0,0 +1,44 @@ +import BaseService from "@Services/BaseService"; +import { Service } from "typedi"; +import OfficeRolesRepository from "@Repositories/OfficeRolesRepository"; +import { OfficeRole } from "le-coffre-resources/dist/SuperAdmin"; +import {Prisma, OfficeRoles } from "@prisma/client"; + +@Service() +export default class OfficeRolesService extends BaseService { + constructor(private officeRoleRepository: OfficeRolesRepository) { + super(); + } + + /** + * @description : Get all officeRoles + * @throws {Error} If officeRoles cannot be get + */ + public get(query: Prisma.OfficeRolesFindManyArgs): Promise { + return this.officeRoleRepository.findMany(query); + } + + /** + * @description : Create a officeRole + * @throws {Error} If officeRole couldn't be created + */ + public create(officeRoleEntity: OfficeRole): Promise { + return this.officeRoleRepository.create(officeRoleEntity); + } + + /** + * @description : Modify a officeRole + * @throws {Error} If officeRole modification failed + */ + public update(officeRoleEntity: OfficeRole): Promise { + return this.officeRoleRepository.update(officeRoleEntity); + } + + /** + * @description : Get a officeRole by uid + * @throws {Error} If officeRole cannot be get by uid + */ + public getByUid(uid: string, query?: any): Promise { + return this.officeRoleRepository.findOneByUid(uid, query); + } +} diff --git a/src/services/super-admin/UsersService/UsersService.ts b/src/services/super-admin/UsersService/UsersService.ts index 7846b23d..4c2a27b3 100644 --- a/src/services/super-admin/UsersService/UsersService.ts +++ b/src/services/super-admin/UsersService/UsersService.ts @@ -15,7 +15,7 @@ export default class UsersService extends BaseService { * @description : Get all users * @throws {Error} If users cannot be get */ - public get(query: Prisma.UsersFindManyArgs): Promise { + public get(query: Prisma.UsersFindManyArgs) { return this.userRepository.findMany(query); } @@ -42,4 +42,12 @@ export default class UsersService extends BaseService { public getByUid(uid: string, query?: any): Promise { return this.userRepository.findOneByUid(uid, query); } + + /** + * @description : Get a user by uid + * @throws {Error} If user cannot be get by uid + */ + public getByProvider(providerName: string, id: string) { + return this.userRepository.findOneByProvider(providerName, id); + } } From 9a686be8ba44ea999a9005761869bc0d08b43a6b Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Thu, 29 Jun 2023 15:23:50 +0200 Subject: [PATCH 025/134] delete explicit relations for models --- src/app/api/idnot/UserController.ts | 1 - src/app/api/super-admin/RulesController.ts | 4 +- src/app/index.ts | 2 +- src/app/middlewares/AuthHandler.ts | 1 - .../20230628100711_v7/migration.sql | 144 ++ src/common/databases/schema.prisma | 236 +- src/common/databases/seeders/seeder.ts | 2159 ++++++++++++----- src/common/databases/seeders/seeder2.ts | 1963 --------------- .../repositories/AddressesRepository.ts | 38 - src/common/repositories/ContactsRepository.ts | 38 - .../repositories/CustomersRepository.ts | 31 +- .../repositories/DeedTypesRepository.ts | 56 +- src/common/repositories/DeedsRepository.ts | 63 +- .../repositories/DocumentTypesRepository.ts | 28 +- .../repositories/DocumentsRepository.ts | 45 +- src/common/repositories/FilesRepository.ts | 41 +- .../repositories/OfficeFoldersRepository.ts | 112 +- .../repositories/OfficeRolesRepository.ts | 25 +- src/common/repositories/OfficesRepository.ts | 39 +- src/common/repositories/RolesRepository.ts | 15 +- src/common/repositories/RulesRepository.ts | 15 +- src/common/repositories/UsersRepository.ts | 13 +- .../AddressesService/AddressesService.ts | 27 - .../common/AuthService/AuthService.ts | 30 +- .../common/ContactsService/ContactsService.ts | 27 - .../common/FilesService/FilesService.ts | 3 +- .../DocumentsService/DocumentsService.ts | 4 +- .../DocumentsService/DocumentsService.ts | 4 +- .../OfficeFoldersService.ts | 4 +- src/test/config/Init.ts | 26 +- src/test/config/MockedData.ts | 39 +- .../services/super-admin/DeedService.test.ts | 52 +- .../super-admin/DeedTypesService.test.ts | 44 +- .../super-admin/OfficeFolderService.test.ts | 137 +- tsconfig.json | 5 +- 35 files changed, 2107 insertions(+), 3364 deletions(-) create mode 100644 src/common/databases/migrations/20230628100711_v7/migration.sql delete mode 100644 src/common/databases/seeders/seeder2.ts delete mode 100644 src/common/repositories/AddressesRepository.ts delete mode 100644 src/common/repositories/ContactsRepository.ts delete mode 100644 src/services/common/AddressesService/AddressesService.ts delete mode 100644 src/services/common/ContactsService/ContactsService.ts diff --git a/src/app/api/idnot/UserController.ts b/src/app/api/idnot/UserController.ts index 7c574a83..24863fff 100644 --- a/src/app/api/idnot/UserController.ts +++ b/src/app/api/idnot/UserController.ts @@ -49,7 +49,6 @@ export default class UserController extends ApiController { //success this.httpSuccess(response, { accessToken, refreshToken }); } catch (error) { - console.log(error) this.httpInternalError(response); return; } diff --git a/src/app/api/super-admin/RulesController.ts b/src/app/api/super-admin/RulesController.ts index fe7e4ee3..84038796 100644 --- a/src/app/api/super-admin/RulesController.ts +++ b/src/app/api/super-admin/RulesController.ts @@ -49,8 +49,8 @@ export default class RulesController extends ApiController { const ruleEntity = Rule.hydrate(req.body); //validate rule - await validateOrReject(ruleEntity, { groups: ["createRule"] }); - + await validateOrReject(ruleEntity, {groups: ["createRule"]}); + //call service to get prisma entity const ruleEntityCreated = await this.rulesService.create(ruleEntity); diff --git a/src/app/index.ts b/src/app/index.ts index f23a9a7d..9848d5c1 100644 --- a/src/app/index.ts +++ b/src/app/index.ts @@ -11,7 +11,7 @@ import DocumentTypesController from "./api/super-admin/DocumentTypesController"; import IdNotUserController from "./api/idnot/UserController"; import DocumentsControllerCustomer from "./api/customer/DocumentsController"; import FilesController from "./api/super-admin/FilesController"; -import RulesController from "./api/super-admin/RolesController"; +import RulesController from "./api/super-admin/RulesController"; import RolesController from "./api/super-admin/RolesController"; diff --git a/src/app/middlewares/AuthHandler.ts b/src/app/middlewares/AuthHandler.ts index 549cfe1f..3ab26600 100644 --- a/src/app/middlewares/AuthHandler.ts +++ b/src/app/middlewares/AuthHandler.ts @@ -18,7 +18,6 @@ export default function authHandler(req: Request, response: Response, next: Next response.sendStatus(HttpCodes.UNAUTHORIZED); return; } - console.log(userPayload); req.body.user = userPayload next(); }); diff --git a/src/common/databases/migrations/20230628100711_v7/migration.sql b/src/common/databases/migrations/20230628100711_v7/migration.sql new file mode 100644 index 00000000..4d8f4bf3 --- /dev/null +++ b/src/common/databases/migrations/20230628100711_v7/migration.sql @@ -0,0 +1,144 @@ +/* + Warnings: + + - You are about to drop the `deed_has_document_types` table. If the table is not empty, all the data it contains will be lost. + - You are about to drop the `deed_type_has_document_types` table. If the table is not empty, all the data it contains will be lost. + - You are about to drop the `office_folder_has_customers` table. If the table is not empty, all the data it contains will be lost. + - You are about to drop the `office_folder_has_stakeholder` table. If the table is not empty, all the data it contains will be lost. + - You are about to drop the `user_has_notifications` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- DropForeignKey +ALTER TABLE "deed_has_document_types" DROP CONSTRAINT "deed_has_document_types_deed_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "deed_has_document_types" DROP CONSTRAINT "deed_has_document_types_document_type_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "deed_type_has_document_types" DROP CONSTRAINT "deed_type_has_document_types_deed_type_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "deed_type_has_document_types" DROP CONSTRAINT "deed_type_has_document_types_document_type_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "office_folder_has_customers" DROP CONSTRAINT "office_folder_has_customers_customer_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "office_folder_has_customers" DROP CONSTRAINT "office_folder_has_customers_office_folder_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "office_folder_has_stakeholder" DROP CONSTRAINT "office_folder_has_stakeholder_office_folder_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "office_folder_has_stakeholder" DROP CONSTRAINT "office_folder_has_stakeholder_user_stakeholder_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "user_has_notifications" DROP CONSTRAINT "user_has_notifications_notification_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "user_has_notifications" DROP CONSTRAINT "user_has_notifications_user_uid_fkey"; + +-- DropTable +DROP TABLE "deed_has_document_types"; + +-- DropTable +DROP TABLE "deed_type_has_document_types"; + +-- DropTable +DROP TABLE "office_folder_has_customers"; + +-- DropTable +DROP TABLE "office_folder_has_stakeholder"; + +-- DropTable +DROP TABLE "user_has_notifications"; + +-- CreateTable +CREATE TABLE "_OfficeFolderHasCustomers" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL +); + +-- CreateTable +CREATE TABLE "_UserHasNotifications" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL +); + +-- CreateTable +CREATE TABLE "_OfficeFolderHasStakeholders" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL +); + +-- CreateTable +CREATE TABLE "_DeedHasDocumentTypes" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL +); + +-- CreateTable +CREATE TABLE "_DeedTypeHasDocumentTypes" ( + "A" TEXT NOT NULL, + "B" TEXT NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "_OfficeFolderHasCustomers_AB_unique" ON "_OfficeFolderHasCustomers"("A", "B"); + +-- CreateIndex +CREATE INDEX "_OfficeFolderHasCustomers_B_index" ON "_OfficeFolderHasCustomers"("B"); + +-- CreateIndex +CREATE UNIQUE INDEX "_UserHasNotifications_AB_unique" ON "_UserHasNotifications"("A", "B"); + +-- CreateIndex +CREATE INDEX "_UserHasNotifications_B_index" ON "_UserHasNotifications"("B"); + +-- CreateIndex +CREATE UNIQUE INDEX "_OfficeFolderHasStakeholders_AB_unique" ON "_OfficeFolderHasStakeholders"("A", "B"); + +-- CreateIndex +CREATE INDEX "_OfficeFolderHasStakeholders_B_index" ON "_OfficeFolderHasStakeholders"("B"); + +-- CreateIndex +CREATE UNIQUE INDEX "_DeedHasDocumentTypes_AB_unique" ON "_DeedHasDocumentTypes"("A", "B"); + +-- CreateIndex +CREATE INDEX "_DeedHasDocumentTypes_B_index" ON "_DeedHasDocumentTypes"("B"); + +-- CreateIndex +CREATE UNIQUE INDEX "_DeedTypeHasDocumentTypes_AB_unique" ON "_DeedTypeHasDocumentTypes"("A", "B"); + +-- CreateIndex +CREATE INDEX "_DeedTypeHasDocumentTypes_B_index" ON "_DeedTypeHasDocumentTypes"("B"); + +-- AddForeignKey +ALTER TABLE "_OfficeFolderHasCustomers" ADD CONSTRAINT "_OfficeFolderHasCustomers_A_fkey" FOREIGN KEY ("A") REFERENCES "customers"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_OfficeFolderHasCustomers" ADD CONSTRAINT "_OfficeFolderHasCustomers_B_fkey" FOREIGN KEY ("B") REFERENCES "office_folders"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_UserHasNotifications" ADD CONSTRAINT "_UserHasNotifications_A_fkey" FOREIGN KEY ("A") REFERENCES "notifications"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_UserHasNotifications" ADD CONSTRAINT "_UserHasNotifications_B_fkey" FOREIGN KEY ("B") REFERENCES "users"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_OfficeFolderHasStakeholders" ADD CONSTRAINT "_OfficeFolderHasStakeholders_A_fkey" FOREIGN KEY ("A") REFERENCES "office_folders"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_OfficeFolderHasStakeholders" ADD CONSTRAINT "_OfficeFolderHasStakeholders_B_fkey" FOREIGN KEY ("B") REFERENCES "users"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_DeedHasDocumentTypes" ADD CONSTRAINT "_DeedHasDocumentTypes_A_fkey" FOREIGN KEY ("A") REFERENCES "deed"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_DeedHasDocumentTypes" ADD CONSTRAINT "_DeedHasDocumentTypes_B_fkey" FOREIGN KEY ("B") REFERENCES "document_types"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_DeedTypeHasDocumentTypes" ADD CONSTRAINT "_DeedTypeHasDocumentTypes_A_fkey" FOREIGN KEY ("A") REFERENCES "deed_types"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "_DeedTypeHasDocumentTypes" ADD CONSTRAINT "_DeedTypeHasDocumentTypes_B_fkey" FOREIGN KEY ("B") REFERENCES "document_types"("uid") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/src/common/databases/schema.prisma b/src/common/databases/schema.prisma index 6fb4da16..35e7d73c 100644 --- a/src/common/databases/schema.prisma +++ b/src/common/databases/schema.prisma @@ -50,20 +50,20 @@ model Contacts { } model Users { - uid String @id @unique @default(uuid()) @map("uid") - idNot String @unique @db.VarChar(255) - contact Contacts @relation(fields: [contact_uid], references: [uid], onDelete: Cascade) - contact_uid String @unique @db.VarChar(255) - role Roles @relation(fields: [roles_uid], references: [uid], onDelete: Cascade) - roles_uid String @db.VarChar(255) - office_role OfficeRoles? @relation(fields: [office_role_uid], references: [uid], onDelete: Cascade) - office_role_uid String? @db.VarChar(255) - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - office_membership Offices @relation(fields: [office_uid], references: [uid], onDelete: Cascade) - office_uid String @db.VarChar(255) - user_has_notifications UserHasNotifications[] - office_folder_has_stakeholder OfficeFolderHasStakeholders[] + uid String @id @unique @default(uuid()) @map("uid") + idNot String @unique @db.VarChar(255) + contact Contacts @relation(fields: [contact_uid], references: [uid], onDelete: Cascade) + contact_uid String @unique @db.VarChar(255) + role Roles @relation(fields: [roles_uid], references: [uid], onDelete: Cascade) + roles_uid String @db.VarChar(255) + office_role OfficeRoles? @relation(fields: [office_role_uid], references: [uid], onDelete: Cascade) + office_role_uid String? @db.VarChar(255) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + office_membership Offices @relation(fields: [office_uid], references: [uid], onDelete: Cascade) + office_uid String @db.VarChar(255) + notifications Notifications[] @relation("UserHasNotifications") + office_folders OfficeFolders[] @relation("OfficeFolderHasStakeholders") @@map("users") } @@ -82,96 +82,56 @@ model Offices { users Users[] office_folders OfficeFolders[] document_types DocumentTypes[] - OfficeRoles OfficeRoles[] + office_roles OfficeRoles[] @@map("offices") } model Customers { - uid String @id @unique @default(uuid()) - status ECustomerStatus @default(PENDING) - contact Contacts @relation(fields: [contact_uid], references: [uid], onDelete: Cascade) - contact_uid String @unique @db.VarChar(255) - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - office_folder_has_customers OfficeFolderHasCustomers[] - documents Documents[] + uid String @id @unique @default(uuid()) + status ECustomerStatus @default(PENDING) + contact Contacts @relation(fields: [contact_uid], references: [uid], onDelete: Cascade) + contact_uid String @unique @db.VarChar(255) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + office_folders OfficeFolders[] @relation("OfficeFolderHasCustomers") + documents Documents[] @@map("customers") } -model UserHasNotifications { - uid String @id @unique @default(uuid()) - user Users @relation(fields: [user_uid], references: [uid]) - user_uid String @db.VarChar(255) - notification Notifications @relation(fields: [notification_uid], references: [uid], onDelete: Cascade) - notification_uid String @db.VarChar(255) - notification_status ENotificationStatus @default(UNREAD) - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - - @@unique([notification_uid, user_uid]) - @@map("user_has_notifications") -} - model Notifications { - uid String @id @unique @default(uuid()) - message String @db.VarChar(255) - redirection_url String @db.VarChar(255) - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - user_has_notifications UserHasNotifications[] + uid String @id @unique @default(uuid()) + message String @db.VarChar(255) + redirection_url String @db.VarChar(255) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + users Users[] @relation("UserHasNotifications") @@map("notifications") } model OfficeFolders { - uid String @id @unique @default(uuid()) - folder_number String @db.VarChar(255) - name String @db.VarChar(255) - description String? @db.VarChar(255) - archived_description String? @db.VarChar(255) - status EFolderStatus @default(LIVE) - deed Deeds @relation(fields: [deed_uid], references: [uid], onDelete: Cascade) - deed_uid String @unique @db.VarChar(255) - office Offices @relation(fields: [office_uid], references: [uid], onDelete: Cascade) - office_uid String @db.VarChar(255) - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - office_folder_has_customers OfficeFolderHasCustomers[] - office_folder_has_stakeholder OfficeFolderHasStakeholders[] - documents Documents[] + uid String @id @unique @default(uuid()) + folder_number String @db.VarChar(255) + name String @db.VarChar(255) + description String? @db.VarChar(255) + archived_description String? @db.VarChar(255) + status EFolderStatus @default(LIVE) + deed Deeds @relation(fields: [deed_uid], references: [uid], onDelete: Cascade) + deed_uid String @unique @db.VarChar(255) + office Offices @relation(fields: [office_uid], references: [uid], onDelete: Cascade) + office_uid String @db.VarChar(255) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + stakeholders Users[] @relation("OfficeFolderHasStakeholders") + customers Customers[] @relation("OfficeFolderHasCustomers") + documents Documents[] @@unique([folder_number, office_uid]) @@map("office_folders") } -model OfficeFolderHasCustomers { - uid String @id @unique @default(uuid()) - customer Customers @relation(fields: [customer_uid], references: [uid], onDelete: Cascade) - customer_uid String @db.VarChar(255) - office_folder OfficeFolders @relation(fields: [office_folder_uid], references: [uid], onDelete: Cascade) - office_folder_uid String @db.VarChar(255) - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - - @@unique([office_folder_uid, customer_uid]) - @@map("office_folder_has_customers") -} - -model OfficeFolderHasStakeholders { - uid String @id @unique @default(uuid()) - office_folder OfficeFolders @relation(fields: [office_folder_uid], references: [uid], onDelete: Cascade) - office_folder_uid String @db.VarChar(255) - user_stakeholder Users @relation(fields: [user_stakeholder_uid], references: [uid], onDelete: Cascade) - user_stakeholder_uid String @db.VarChar(255) - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - - @@unique([office_folder_uid, user_stakeholder_uid]) - @@map("office_folder_has_stakeholder") -} - model Documents { uid String @id @unique @default(uuid()) document_status EDocumentStatus @default(ASKED) @@ -230,77 +190,51 @@ model BlockchainAnchors { } model DocumentTypes { - uid String @id @unique @default(uuid()) - name String @db.VarChar(255) - public_description String @db.VarChar(255) - private_description String? @db.VarChar(255) - office Offices @relation(fields: [office_uid], references: [uid], onDelete: Cascade) - office_uid String @db.VarChar(255) - archived_at DateTime? - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - documents Documents[] - deed_has_document_types DeedHasDocumentTypes[] - deed_type_has_document_types DeedTypeHasDocumentTypes[] + uid String @id @unique @default(uuid()) + name String @db.VarChar(255) + public_description String @db.VarChar(255) + private_description String? @db.VarChar(255) + office Offices @relation(fields: [office_uid], references: [uid], onDelete: Cascade) + office_uid String @db.VarChar(255) + archived_at DateTime? + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + documents Documents[] + deeds Deeds[] @relation("DeedHasDocumentTypes") + deed_type DeedTypes[] @relation("DeedTypeHasDocumentTypes") @@unique([name, office_uid]) @@map("document_types") } -model DeedHasDocumentTypes { - uid String @id @unique @default(uuid()) - document_type DocumentTypes @relation(fields: [document_type_uid], references: [uid], onDelete: Cascade) - document_type_uid String @db.VarChar(255) - deed Deeds @relation(fields: [deed_uid], references: [uid], onDelete: Cascade) - deed_uid String @db.VarChar(255) - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - - @@unique([deed_uid, document_type_uid]) - @@map("deed_has_document_types") -} - model Deeds { - uid String @id @unique @default(uuid()) - deed_type DeedTypes @relation(fields: [deed_type_uid], references: [uid], onDelete: Cascade) - deed_type_uid String @db.VarChar(255) - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - deed_has_document_types DeedHasDocumentTypes[] - office_folder OfficeFolders? + uid String @id @unique @default(uuid()) + deed_type DeedTypes @relation(fields: [deed_type_uid], references: [uid], onDelete: Cascade) + deed_type_uid String @db.VarChar(255) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + document_types DocumentTypes[] @relation("DeedHasDocumentTypes") + office_folder OfficeFolders? @@map("deed") } model DeedTypes { - uid String @id @unique @default(uuid()) - name String @db.VarChar(255) - description String @db.VarChar(255) - archived_at DateTime? - office Offices @relation(fields: [office_uid], references: [uid], onDelete: Cascade) - office_uid String @db.VarChar(255) - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - deed Deeds[] - deed_type_has_document_types DeedTypeHasDocumentTypes[] + uid String @id @unique @default(uuid()) + name String @db.VarChar(255) + description String @db.VarChar(255) + archived_at DateTime? + office Offices @relation(fields: [office_uid], references: [uid], onDelete: Cascade) + office_uid String @db.VarChar(255) + created_at DateTime? @default(now()) + updated_at DateTime? @updatedAt + deed Deeds[] + document_types DocumentTypes[] @relation("DeedTypeHasDocumentTypes") @@unique([name, office_uid]) @@map("deed_types") } -model DeedTypeHasDocumentTypes { - uid String @id @unique @default(uuid()) - document_type DocumentTypes @relation(fields: [document_type_uid], references: [uid], onDelete: Cascade) - document_type_uid String @db.VarChar(255) - deed_type DeedTypes @relation(fields: [deed_type_uid], references: [uid], onDelete: Cascade) - deed_type_uid String @db.VarChar(255) - created_at DateTime? @default(now()) - updated_at DateTime? @updatedAt - - @@unique([deed_type_uid, document_type_uid]) - @@map("deed_type_has_document_types") -} - model Roles { uid String @id @unique @default(uuid()) name String @db.VarChar(255) @@ -336,30 +270,6 @@ model Rules { @@map("rules") } -// model RolesHasRules { -// uid String @id @unique @default(uuid()) -// role Roles @relation(fields: [role_uid], references: [uid], onDelete: Cascade) -// role_uid String @db.VarChar(255) -// rule Rules @relation(fields: [rule_uid], references: [uid], onDelete: Cascade) -// rule_uid String @db.VarChar(255) -// created_at DateTime? @default(now()) -// updated_at DateTime? @updatedAt - -// @@map("role_has_rules") -// } - -// model OfficesRolesHasRules { -// uid String @id @unique @default(uuid()) -// office_role OfficeRoles @relation(fields: [office_role_uid], references: [uid], onDelete: Cascade) -// rule Rules @relation(fields: [rule_uid], references: [uid], onDelete: Cascade) -// office_role_uid String @db.VarChar(255) -// rule_uid String @db.VarChar(255) -// created_at DateTime? @default(now()) -// updated_at DateTime? @updatedAt - -// @@map("office_role_has_rules") -// } - enum ECivility { MALE FEMALE diff --git a/src/common/databases/seeders/seeder.ts b/src/common/databases/seeders/seeder.ts index e7e2816a..a64ab0b5 100644 --- a/src/common/databases/seeders/seeder.ts +++ b/src/common/databases/seeders/seeder.ts @@ -1,599 +1,1618 @@ -import { - // Addresses, - // Contacts, - // Customers, - // DeedHasDocumentTypes, - // DeedTypeHasDocumentTypes, - // DeedTypes, - // Deeds, - // DocumentHistory, - // DocumentTypes, - // Documents, - // EDocumentStatus, - // EFolderStatus, - // EOfficeStatus, - // OfficeFolderHasCustomers, - // OfficeFolders, - // Offices, - // Users, - // ECivility, - // ECustomerStatus, - PrismaClient, -// Roles, -} from "@prisma/client"; +import 'module-alias/register'; +import { EFolderStatus, EOfficeStatus, ECivility, ECustomerStatus, PrismaClient, Prisma } from "@prisma/client"; +import User, { + Address, + Contact, + Customer, + Deed, + DeedType, + Office, + OfficeFolder, + OfficeRole, + Role, + Rule, + DocumentType, +} from "le-coffre-resources/dist/SuperAdmin"; -(async () => { +export default async function main() { const prisma = new PrismaClient(); - console.log(prisma); - // const randomString = () => { - // const chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - // let result = ""; - // for (let i = 10; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)]; - // return result; - // }; - // const uidCustomer1: string = randomString(); - // const uidCustomer2: string = randomString(); + - // const uidContact1: string = randomString(); - // const uidContact2: string = randomString(); - // const uidContact3: string = randomString(); - // const uidContact4: string = randomString(); + const randomString = () => { + const chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + let result = ""; + for (let i = 10; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)]; + return result; + }; - // const uidAddress1: string = randomString(); - // const uidAddress2: string = randomString(); - // const uidAddress3: string = randomString(); - // const uidAddress4: string = randomString(); + const idNot1 = randomString(); + const idNot2 = randomString(); + const idNot3 = randomString(); + const idNot4 = randomString(); + const idNot5 = randomString(); + const idNot6 = randomString(); - // const uidOffice1: string = randomString(); - // const uidOffice2: string = randomString(); + const addresses: Address[] = [ + { + address: "148 Avenue du bac", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Rue Pierre Emillion", + city: "Pacé", + zip_code: 35740, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Rue Pierre Charles", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Rue Pierre Pologne", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Rue Pierre Marcel", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Rue Pierre Jacques", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Rue Pierre Pascal", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Rue Maxime Henry", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Rue Maxime Francis", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Avenue Paul Roger", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Avenue Paul Franck", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Avenue Paul Maréchal", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Avenue Marcel Denis", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Place Alexandre", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Place Alexandre Jacques", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Place Alexandre 2", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Rue du livre", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Place de la joie", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Rue Paul Henry", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Rue Marcelin", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + ]; - // const uidUser1: string = randomString(); - // const uidUser2: string = randomString(); + const contacts: Contact[] = [ + { + address: addresses[0], + first_name: "Manon", + last_name: "Simon", + email: "manon.simon@gmail.com", + phone_number: "06 12 34 56 78", + cell_phone_number: "06 12 34 56 78", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.FEMALE, + }, + { + address: addresses[1], + first_name: "Kevin", + last_name: "Hautefaye", + email: "kevin.hautefaye@gmail.com", + phone_number: "06 23 45 67 89", + cell_phone_number: "06 23 45 67 89", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + { + address: addresses[2], + first_name: "Maxime", + last_name: "Lalo", + email: "maxime.lalo@gmail.com", + phone_number: "06 34 56 78 90", + cell_phone_number: "06 34 56 78 90", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + { + address: addresses[3], + first_name: "Vincent", + last_name: "Brognard", + email: "vincent.brognard@gmail.com", + phone_number: "06 45 67 89 01", + cell_phone_number: "06 45 67 89 01", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + { + address: addresses[4], + first_name: "Maxime", + last_name: "Leroy", + email: "maxime.leroy@hotmail.fr", + phone_number: "06 56 78 90 12", + cell_phone_number: "06 56 78 90 12", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + { + address: addresses[5], + first_name: "Thibault", + last_name: "Dubois", + email: "thibault.dubois@outlook.com", + phone_number: "06 67 89 01 23", + cell_phone_number: "06 67 89 01 23", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + { + address: addresses[6], + first_name: "Léa", + last_name: "Fontaine", + email: "lea.fontaine@gmail.com", + phone_number: "06 78 90 12 34", + cell_phone_number: "06 78 90 12 34", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.FEMALE, + }, + { + address: addresses[7], + first_name: "Guillaume", + last_name: "Renaud", + email: "guillaume.renaud@gmail.com", + phone_number: "06 89 01 23 45", + cell_phone_number: "06 89 01 23 45", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + { + address: addresses[8], + first_name: "Lucie", + last_name: "Chevalier", + email: "lucie.chevalier@outlook.com", + phone_number: "07 12 34 56 78", + cell_phone_number: "07 12 34 56 78", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.FEMALE, + }, + { + address: addresses[9], + first_name: "Sébastien", + last_name: "Dubois", + email: "sebastien.dubois@gmail.com", + phone_number: "07 23 45 67 89", + cell_phone_number: "07 23 45 67 89", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + { + address: addresses[10], + first_name: "Mathilde", + last_name: "Durand", + email: "mathilde.durand@gmail.com", + phone_number: "07 34 56 78 90", + cell_phone_number: "07 34 56 78 90", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.FEMALE, + }, + { + address: addresses[11], + first_name: "Antoine", + last_name: "Bernard", + email: "antoine.bernard@outlook.com", + phone_number: "07 45 67 89 01", + cell_phone_number: "07 45 67 89 01", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + { + address: addresses[12], + first_name: "Camille", + last_name: "Laurent", + email: "camille.laurent@gmail.com", + phone_number: "07 56 78 90 12", + cell_phone_number: "07 56 78 90 12", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.FEMALE, + }, + { + address: addresses[13], + first_name: "Julien", + last_name: "Mercier", + email: "julien.mercier@hotmail.fr", + phone_number: "07 67 89 01 23", + cell_phone_number: "07 67 89 01 23", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + { + address: addresses[14], + first_name: "Charlotte", + last_name: "Lefebvre", + email: "charlotte.lefebvre@gmail.com", + phone_number: "07 78 90 12 34", + cell_phone_number: "07 78 90 12 34", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.FEMALE, + }, + { + address: addresses[15], + first_name: "Caroline", + last_name: "Pallut", + email: "caroline.pallut@gmail.com", + phone_number: "07 89 01 23 45", + cell_phone_number: "07 89 01 23 45", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.FEMALE, + }, + { + address: addresses[16], + first_name: "Nadège", + last_name: "Gauchet", + email: "nedege.gauchet@outlook.com", + phone_number: "06 11 22 33 44", + cell_phone_number: "06 11 22 33 44", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.FEMALE, + }, + { + address: addresses[17], + first_name: "Matthieu", + last_name: "Bougeard", + email: "matthieu.bougeard@gmail.com", + phone_number: "07 22 33 44 55", + cell_phone_number: "07 22 33 44 55", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + { + address: addresses[18], + first_name: "Cécile", + last_name: "Celton", + email: "cecile.celton@outlook.com", + phone_number: "06 55 66 77 88", + cell_phone_number: "06 55 66 77 88", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.FEMALE, + }, + { + address: addresses[19], + first_name: "Gwendal", + last_name: "Texier", + email: "gwendal.texier@gmail.com", + phone_number: "07 88 99 00 11", + cell_phone_number: "07 88 99 00 11", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + ]; - // const uidRole1: string = randomString(); - // const uidRole2: string = randomString(); + const offices: Office[] = [ + { + idNot: idNot1, + name: "Office Rennes", + crpcen: randomString(), + address: addresses[0], + created_at: new Date(), + updated_at: new Date(), + office_status: EOfficeStatus.ACTIVATED, + }, + ]; - // const uidOfficeFolder1: string = randomString(); - // const uidOfficeFolder2: string = randomString(); - // const uidOfficeFolder3: string = randomString(); - // const uidOfficeFolder4: string = randomString(); - // const uidOfficeFolder5: string = randomString(); + const customers: Customer[] = [ + { + contact: contacts[5], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[6], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[7], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[8], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[9], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[10], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[11], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[12], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[13], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[14], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[15], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[16], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[17], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[18], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[19], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + ]; - // const uidDeed1: string = randomString(); - // const uidDeed2: string = randomString(); - // const uidDeed3: string = randomString(); - // const uidDeed4: string = randomString(); - // const uidDeed5: string = randomString(); + const rules: Rule[] = [ + { + name: "GET users", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET offices", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET customers", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET deeds", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET deedtypes", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET documents", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET documentTypes", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET files", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET folders", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET roles", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET rules", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET office-roles", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT users", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT offices", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT customers", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT deeds", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT deedtypes", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT documents", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT documentTypes", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT files", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT folders", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT roles", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT rules", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT office-roles", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST users", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST offices", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST customers", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST deeds", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST deedtypes", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST documents", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST documentTypes", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST files", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST folders", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST roles", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST rules", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST office-roles", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST users", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST offices", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST customers", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST deeds", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST deedtypes", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST documents", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST documentTypes", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST files", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST folders", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST roles", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST rules", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST office-roles", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE users", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE offices", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE customers", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE deeds", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE deedtypes", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE documents", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE documentTypes", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE files", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE folders", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE roles", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE rules", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE office-roles", + created_at: new Date(), + updated_at: new Date(), + }, + + ]; - // const uidDeedType1: string = randomString(); - // const uidDeedType2: string = randomString(); + const roles: Role[] = [ + { + name: "super-admin", + created_at: new Date(), + updated_at: new Date(), + rules: rules, + }, + { + name: "admin", + created_at: new Date(), + updated_at: new Date(), + rules: rules.slice(0,33), + }, + { + name: "notary", + created_at: new Date(), + updated_at: new Date(), + rules: rules.slice(0,22), + }, + { + name: "default", + created_at: new Date(), + updated_at: new Date(), + rules: rules.slice(0,11), + } + ]; - // const uidDocument1: string = randomString(); - // const uidDocument2: string = randomString(); - // const uidDocument3: string = randomString(); - // const uidDocument4: string = randomString(); - // const uidDocument5: string = randomString(); + const officeRoles: OfficeRole[] = [ + { + name: "admin", + created_at: new Date(), + updated_at: new Date(), + office: offices[0]!, + rules: rules.slice(0,40), + }, + { + name: "notary", + created_at: new Date(), + updated_at: new Date(), + office: offices[0]!, + rules: rules.slice(0,33), + }, + { + name: "deputy", + created_at: new Date(), + updated_at: new Date(), + office: offices[0]!, + rules: rules.slice(0,22), + }, + { + name: "listener", + created_at: new Date(), + updated_at: new Date(), + office: offices[0]!, + rules: rules.slice(0,11), + } + ]; - // const uidDocumentType1: string = randomString(); - // const uidDocumentType2: string = randomString(); - // const uidDocumentType3: string = randomString(); + const users: User[] = [ + { + created_at: new Date(), + updated_at: new Date(), + idNot: idNot2, + contact: contacts[0], + office_membership: offices[0], + role: roles[0], + }, + { + created_at: new Date(), + updated_at: new Date(), + idNot: idNot3, + contact: contacts[1], + office_membership: offices[0], + role: roles[1], + }, + { + created_at: new Date(), + updated_at: new Date(), + idNot: idNot4, + contact: contacts[2], + office_membership: offices[0], + role: roles[2], + office_role: officeRoles[2], + }, + { + created_at: new Date(), + updated_at: new Date(), + idNot: idNot5, + contact: contacts[3], + office_membership: offices[0], + role: roles[1], + office_role: officeRoles[3], + }, + { + created_at: new Date(), + updated_at: new Date(), + idNot: idNot6, + contact: contacts[4], + office_membership: offices[0], + role: roles[3], + }, + ]; - // const uidOfficeFolderHasCustomer1: string = randomString(); - // const uidOfficeFolderHasCustomer2: string = randomString(); + const deedTypes: DeedType[] = [ + { + name: "Acte de donation", + archived_at: null, + description: "Acte de donation", + office: offices[0], + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "Acte de vente", + archived_at: null, + description: "Acte de vente", + office: offices[0], + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "Acte de succession", + archived_at: null, + description: "Acte de succession", + office: offices[0], + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "Acte de vente de maison individuelle", + archived_at: null, + description: "Acte de vente de maison individuelle", + office: offices[0], + created_at: new Date(), + updated_at: new Date(), + }, + ]; - // const uidDeedHasDocumentType1: string = randomString(); - // const uidDeedHasDocumentType2: string = randomString(); + const deeds: Deed[] = [ + { + deed_type: deedTypes[0], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[0], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[0], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[0], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[0], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[0], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[0], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[1], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[1], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[1], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[1], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[1], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[1], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[1], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[2], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[2], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[2], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[2], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[2], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[2], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[2], + created_at: new Date(), + updated_at: new Date(), + }, + ]; - // const uidDeedTypeHasDocumentType1: string = randomString(); - // const uidDeedTypeHasDocumentType2: string = randomString(); + const documentTypes: DocumentType[] = [ + { + archived_at: null, + name: "Document d'identité", + office: offices[0], + private_description: + "Document officiel d'identification utilisé par plusieurs personnes pour prouver leur identité et leur nationalité (CNI, passeport)", + public_description: + "Document officiel d'identification utilisé par plusieurs personnes pour prouver leur identité et leur nationalité (CNI, passeport)", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Taxe Foncière", + office: offices[0], + private_description: "Impôt annuel imposé sur les propriétés foncières et utilisé pour financer les services publics locaux.", + public_description: "Impôt annuel imposé sur les propriétés foncières et utilisé pour financer les services publics locaux.", + created_at: new Date(), + updated_at: new Date(), + }, - // const uidDocumentHistory1: string = randomString(); - // const uidDocumentHistory2: string = randomString(); + { + archived_at: null, + name: "Contrat Mariage", + office: offices[0], + private_description: "Accord légal qui établit les droits et les obligations entre deux personnes s'unissant en mariage.", + public_description: "Accord légal qui établit les droits et les obligations entre deux personnes s'unissant en mariage.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Livret de famille", + office: offices[0], + private_description: + "Document officiel qui enregistre les détails et les événements familiaux tels que les mariages, les naissances et les décès d'un couple et de leurs enfants.", + public_description: + "Document officiel qui enregistre les détails et les événements familiaux tels que les mariages, les naissances et les décès d'un couple et de leurs enfants.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Bail commercial", + office: offices[0], + private_description: + "Contrat légal entre un propriétaire et un locataire pour la location d'un bien immobilier utilisé à des fins commerciales ou professionnelles.", + public_description: + "Contrat légal entre un propriétaire et un locataire pour la location d'un bien immobilier utilisé à des fins commerciales ou professionnelles.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Statuts SCI", + office: offices[0], + private_description: "Document légal qui définit les règles et les dispositions régissant la Société Civile Immobilière (SCI).", + public_description: "Document légal qui définit les règles et les dispositions régissant la Société Civile Immobilière (SCI).", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Avis de taxe foncière", + office: offices[0], + private_description: "Notification officielle indiquant le montant de l'impôt foncier dû sur une propriété.", + public_description: "Notification officielle indiquant le montant de l'impôt foncier dû sur une propriété.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Appel de charge de copropriété", + office: offices[0], + private_description: + "Document envoyé aux copropriétaires pour les informer des dépenses et des charges communes liées à la gestion et à l'entretien de l'immeuble.", + public_description: + "Document envoyé aux copropriétaires pour les informer des dépenses et des charges communes liées à la gestion et à l'entretien de l'immeuble.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "PVAG", + office: offices[0], + private_description: + "Compte rendu écrit des discussions, décisions et résolutions prises lors d'une réunion d'assemblée générale de copropriété.", + public_description: + "Compte rendu écrit des discussions, décisions et résolutions prises lors d'une réunion d'assemblée générale de copropriété.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Règlement de copropriété", + office: offices[0], + private_description: + "Document juridique qui établit les règles et les droits des copropriétaires d'un immeuble en copropriété.", + public_description: "Document juridique qui établit les règles et les droits des copropriétaires d'un immeuble en copropriété.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Titre de propriété", + office: offices[0], + private_description: "Document légal qui atteste de la propriété d'un bien immobilier et en identifie le propriétaire.", + public_description: "Document légal qui atteste de la propriété d'un bien immobilier et en identifie le propriétaire.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Plan et loi carrez", + office: offices[0], + private_description: + "Document officiel qui mesure la superficie d'un lot ou d'un bien immobilier, conformément à la loi Carrez qui encadre les transactions immobilières.", + public_description: + "Document officiel qui mesure la superficie d'un lot ou d'un bien immobilier, conformément à la loi Carrez qui encadre les transactions immobilières.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "CNI", + office: offices[0], + private_description: + "Document officiel d'identification délivré par l'État pour prouver l'identité et la nationalité d'une personne.", + public_description: + "Document officiel d'identification délivré par l'État pour prouver l'identité et la nationalité d'une personne.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Modifications règlement copropriété (plusieurs)", + office: offices[0], + private_description: + "Documents légaux qui apportent des changements ou des ajustements aux règles et dispositions du règlement de copropriété initial.", + public_description: + "Documents légaux qui apportent des changements ou des ajustements aux règles et dispositions du règlement de copropriété initial.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Avis de décès", + office: offices[0], + private_description: "Notification officielle délivrée par les autorités compétentes pour informer du décès d'une personne.", + public_description: "Notification officielle délivrée par les autorités compétentes pour informer du décès d'une personne.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Lettre de mission", + office: offices[0], + private_description: + "Document contractuel qui définit les termes et les objectifs d'une mission confiée à une personne ou à une entreprise.", + public_description: + "Document contractuel qui définit les termes et les objectifs d'une mission confiée à une personne ou à une entreprise.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "DPE", + office: offices[0], + private_description: "Diagnostic de Performance Energétique.", + public_description: "Diagnostic de Performance Energétique.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "RIB", + office: offices[0], + private_description: "Relevé d'identité bancaire ou IBAN.", + public_description: "Relevé d'identité bancaire ou IBAN.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Acte d'achat par la SCI", + office: offices[0], + private_description: "Acte d'achat par la SCI.", + public_description: "Acte d'achat par la SCI.", + created_at: new Date(), + updated_at: new Date(), + }, + ]; - // // const existingData = await prisma.contacts.findFirst({ where: { uid: uidContact4 } }); - // // if (existingData) { - // // console.log("Seed data already exists. Skipping seeding process."); - // // return; - // // } + const officeFolders: OfficeFolder[] = [ + { + folder_number: "0001", + name: "Vente par Mme. Simon au profit de Mme. Lextrait", + deed: deeds[0], + status: EFolderStatus.LIVE, + created_at: new Date(), + updated_at: new Date(), + office: offices[0], + description: null, + archived_description: null, + }, + { + folder_number: "0002", + name: "Donation des parts sociales de la société SARL FLORE", + deed: deeds[1], + status: EFolderStatus.LIVE, + created_at: new Date(), + updated_at: new Date(), + office: offices[0], + description: null, + archived_description: null, + }, + { + folder_number: "0003", + name: "Vente par Mme. Lefebvre au profit de Mme. Mathieu", + deed: deeds[2], + status: EFolderStatus.LIVE, + created_at: new Date(), + updated_at: new Date(), + office: offices[0], + description: null, + archived_description: null, + }, + { + folder_number: "0004", + name: "Vente par Mme. Chevalier au profit de M. Daveau", + deed: deeds[3], + status: EFolderStatus.LIVE, + created_at: new Date(), + updated_at: new Date(), + office: offices[0], + description: null, + archived_description: null, + }, + { + folder_number: "0005", + name: "Vente par M. Lalo au profit de Mme. Pigale", + deed: deeds[4], + status: EFolderStatus.LIVE, + created_at: new Date(), + updated_at: new Date(), + office: offices[0], + description: null, + archived_description: null, + }, + { + folder_number: "0006", + name: "Donation des parts sociales de la société SMART-TALENT", + deed: deeds[5], + status: EFolderStatus.LIVE, + created_at: new Date(), + updated_at: new Date(), + office: offices[0], + description: null, + archived_description: null, + }, + { + folder_number: "0007", + name: "Vente par M. Girard au profit de M. Louis", + deed: deeds[6], + status: EFolderStatus.LIVE, + created_at: new Date(), + updated_at: new Date(), + office: offices[0], + description: null, + archived_description: null, + }, + { + folder_number: "0008", + name: "Vente par Mme. Leclerc au profit de M. Louis", + deed: deeds[7], + status: EFolderStatus.LIVE, + created_at: new Date(), + updated_at: new Date(), + office: offices[0], + description: null, + archived_description: null, + }, + { + folder_number: "0009", + name: "Vente par M. Lambert au profit de M. Holmes", + deed: deeds[8], + status: EFolderStatus.LIVE, + created_at: new Date(), + updated_at: new Date(), + office: offices[0], + description: null, + archived_description: null, + }, + ]; + for (const office of offices) { + const officeCreated = await prisma.offices.create({ + data: { + idNot: office.idNot, + name: office.name, + crpcen: office.crpcen, + address: { + create: { + address: office.address!.address, + zip_code: office.address!.zip_code, + city: office.address!.city, + }, + }, + office_status: EOfficeStatus.DESACTIVATED, + }, + }); +; office.uid = officeCreated.uid; + } + for (const rule of rules) { + const ruleCreated = await prisma.rules.create({ + data: { + name: rule.name + }, + }); + rule.uid = ruleCreated.uid; + } - // const customers: Customers[] = [ - // { - // uid: uidCustomer1, - // contact_uid: uidContact1, - // created_at: new Date(), - // updated_at: new Date(), - // status: ECustomerStatus.PENDING, - // }, - // { - // uid: uidCustomer2, - // contact_uid: uidContact2, - // created_at: new Date(), - // updated_at: new Date(), - // status: ECustomerStatus.PENDING, - // }, - // ]; + for (const role of roles) { + const roleCreated = await prisma.roles.create({ + data: { + name: role.name, + rules: { + connect: role.rules?.map((rule) => ({ + uid: rule.uid!, + })), + }, + }, + }); + role.uid = roleCreated.uid; + } - // const addresses: Addresses[] = [ - // { - // uid: uidAddress1, - // address: "123 Main St", - // city: "Los Angeles", - // zip_code: 90001, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // { - // uid: uidAddress2, - // address: "Rue Pierre Emillion", - // city: "Paris", - // zip_code: 75003, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // { - // uid: uidAddress3, - // address: "Rue Pierre Charles", - // city: "Paris", - // zip_code: 75003, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // { - // uid: uidAddress4, - // address: "Rue Pierre Pologne", - // city: "Paris", - // zip_code: 75003, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // ]; + for (const officeRole of officeRoles) { + const officeRoleCreated = await prisma.officeRoles.create({ + data: { + name: officeRole.name, + office: { + connect: { + uid: officeRole.office.uid, + }, + }, + rules: { + connect: officeRole.rules?.map((rule) => ({ + uid: rule.uid!, + })), + }, + }, + }); + officeRole.uid = officeRoleCreated.uid; + } - // const contacts: Contacts[] = [ - // { - // uid: uidContact1, - // address_uid: uidAddress1, - // first_name: "John", - // last_name: "Doe", - // email: "john.doe@example.com", - // phone_number: randomString(), - // cell_phone_number: randomString(), - // birthdate: null, - // created_at: new Date(), - // updated_at: new Date(), - // civility: ECivility.MALE, - // }, - // { - // uid: uidContact2, - // address_uid: uidAddress2, - // first_name: "Jane", - // last_name: "Doe", - // email: "jane.doe@example.com", - // phone_number: randomString(), - // cell_phone_number: randomString(), - // birthdate: null, - // created_at: new Date(), - // updated_at: new Date(), - // civility: ECivility.FEMALE, - // }, - // { - // uid: uidContact3, - // address_uid: uidAddress3, - // first_name: "Maitre Marcelino", - // last_name: "Jack", - // email: "Marcelino.Jack@example.com", - // phone_number: randomString(), - // cell_phone_number: randomString(), - // birthdate: null, - // created_at: new Date(), - // updated_at: new Date(), - // civility: ECivility.MALE, - // }, - // { - // uid: uidContact4, - // address_uid: uidAddress4, - // first_name: "Maitre Massi", - // last_name: "Jack", - // email: "Massi.Jack@example.com", - // phone_number: randomString(), - // cell_phone_number: randomString(), - // birthdate: null, - // created_at: new Date(), - // updated_at: new Date(), - // civility: ECivility.FEMALE, - // }, - // ]; + for (const user of users) { + const createArgs: Prisma.UsersCreateArgs = { + data: { + idNot: user.idNot, + office_membership: { + connectOrCreate: { + where: { + idNot: user.office_membership!.idNot, + }, + create: { + idNot: user.office_membership!.idNot, + name: user.office_membership!.name, + crpcen: user.office_membership!.crpcen, + address: { + create: { + address: user.office_membership!.address!.address, + zip_code: user.office_membership!.address!.zip_code, + city: user.office_membership!.address!.city, + }, + }, + }, + }, + }, + contact: { + create: { + first_name: user.contact!.first_name, + last_name: user.contact!.last_name, + email: user.contact!.email, + phone_number: user.contact!.phone_number, + cell_phone_number: user.contact!.cell_phone_number, + civility: ECivility[user.contact!.civility as keyof typeof ECivility], + address: {}, + }, + }, + role: { + connect: { + uid: user.role!.uid, + }, + }, + }, + }; + if (user.contact!.address) { + createArgs.data.contact!.create!.address!.create = { + address: user.contact!.address.address, + zip_code: user.contact!.address.zip_code, + city: user.contact!.address.city, + }; + } + if (user.office_role) { + createArgs.data.office_role = { + connect: { + uid: user.office_role.uid, + }, + }; + } + const userCreated = await prisma.users.create(createArgs); + user.uid = userCreated.uid; + } - // const offices: Offices[] = [ - // { - // uid: uidOffice1, - // idNot: randomString(), - // name: "LA Office", - // crpcen: randomString(), - // address_uid: uidAddress1, - // created_at: new Date(), - // updated_at: new Date(), - // office_status: EOfficeStatus.ACTIVATED, - // }, - // { - // uid: uidOffice2, - // idNot: randomString(), - // name: "NYC Office", - // crpcen: randomString(), - // address_uid: uidAddress2, - // created_at: new Date(), - // updated_at: new Date(), - // office_status: EOfficeStatus.DESACTIVATED, - // }, - // ]; + for (const customer of customers) { + const createArgs: Prisma.CustomersCreateArgs = { + data: { + status: ECustomerStatus.PENDING, + contact: { + create: { + first_name: customer.contact!.first_name, + last_name: customer.contact!.last_name, + email: customer.contact!.email, + phone_number: customer.contact!.phone_number, + cell_phone_number: customer.contact!.cell_phone_number, + civility: ECivility[customer.contact!.civility as keyof typeof ECivility], + address: {}, + }, + }, + }, + }; - // const roles: Roles[] = [ - // { - // uid: uidRole1, - // name: 'super-admin', - // created_at: new Date(), - // updated_at: new Date(), - // }, - // { - // uid: uidRole2, - // name: 'admin', - // created_at: new Date(), - // updated_at: new Date(), - // } - // ]; + if (customer.contact?.address) { + createArgs.data.contact!.create!.address = { + create: { + address: customer.contact?.address?.address, + zip_code: customer.contact?.address?.zip_code, + city: customer.contact?.address?.city, + }, + }; + } + const customersCreated = await prisma.customers.create(createArgs); + customer.uid = customersCreated.uid; + } - // const users: Users[] = [ - // { - // uid: uidUser1, - // created_at: new Date(), - // updated_at: new Date(), - // idNot: randomString(), - // contact_uid: uidContact1, - // office_uid: uidOffice1, - // roles_uid: uidRole1, - // }, - // { - // uid: uidUser2, - // created_at: new Date(), - // updated_at: new Date(), - // idNot: randomString(), - // contact_uid: uidContact2, - // office_uid: uidOffice2, - // roles_uid: uidRole2, - // }, - // ]; + for (const deedType of deedTypes) { + const createArgs: Prisma.DeedTypesCreateArgs = { + data: { + name: deedType.name, + description: deedType.description, + office: { + connect: { + uid: deedType.office!.uid, + }, + }, + }, + }; + if (deedType.document_types) { + createArgs.data.document_types = { + connect: deedType.document_types.map((documentType) => ({ + uid: documentType.uid, + })), + }; + } + const deedTypeCreated = await prisma.deedTypes.create(createArgs); + deedType.uid = deedTypeCreated.uid; + } - // const officeFolders: OfficeFolders[] = [ - // { - // uid: uidOfficeFolder1, - // folder_number: "0001", - // name: "Dossier", - // deed_uid: uidDeed1, - // status: EFolderStatus.LIVE, - // created_at: new Date(), - // updated_at: new Date(), - // office_uid: uidOffice1, - // description: null, - // archived_description: null, - // }, - // { - // uid: uidOfficeFolder2, - // folder_number: "0002", - // name: "Dossier", - // deed_uid: uidDeed2, - // status: EFolderStatus.LIVE, - // created_at: new Date(), - // updated_at: new Date(), - // office_uid: uidOffice2, - // description: null, - // archived_description: null, - // }, - // { - // uid: uidOfficeFolder3, - // folder_number: "0003", - // name: "Dossier", - // deed_uid: uidDeed3, - // status: EFolderStatus.LIVE, - // created_at: new Date(), - // updated_at: new Date(), - // office_uid: uidOffice2, - // description: null, - // archived_description: null, - // }, - // { - // uid: uidOfficeFolder4, - // folder_number: "0004", - // name: "Dossier", - // deed_uid: uidDeed4, - // status: EFolderStatus.ARCHIVED, - // created_at: new Date(), - // updated_at: new Date(), - // office_uid: uidOffice2, - // description: null, - // archived_description: null, - // }, - // { - // uid: uidOfficeFolder5, - // folder_number: "0005", - // name: "Dossier", - // deed_uid: uidDeed5, - // status: EFolderStatus.ARCHIVED, - // created_at: new Date(), - // updated_at: new Date(), - // office_uid: uidOffice2, - // description: null, - // archived_description: null, - // }, - // ]; + for (const deed of deeds) { + const createArgs: Prisma.DeedsCreateArgs = { + data: { + deed_type: { + connect: { + uid: deed.deed_type!.uid, + }, + }, + }, + }; + const deedTypeWithDocumentTypes = await prisma.deedTypes.findUniqueOrThrow({ + where: { + uid: deed.deed_type!.uid, + }, + include: { document_types: true }, + }); - // const deeds: Deeds[] = [ - // { - // uid: uidDeed1, - // deed_type_uid: uidDeedType1, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // { - // uid: uidDeed2, - // deed_type_uid: uidDeedType2, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // { - // uid: uidDeed3, - // deed_type_uid: uidDeedType2, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // { - // uid: uidDeed4, - // deed_type_uid: uidDeedType2, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // { - // uid: uidDeed5, - // deed_type_uid: uidDeedType2, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // ]; + if (deedTypeWithDocumentTypes.document_types) { + createArgs.data.document_types = { + connect: deedTypeWithDocumentTypes.document_types.map((documentType) => ({ + uid: documentType.uid, + })), + }; + } + const deedCreated = await prisma.deeds.create(createArgs); + deed.uid = deedCreated.uid; + } - // const deedTypes: DeedTypes[] = [ - // { - // uid: uidDeedType1, - // name: "Acte de mariage", - // archived_at: null, - // description: "Acte regroupant deux personnes en mariage", - // office_uid: uidOffice1, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // { - // uid: uidDeedType2, - // name: "Vente d'un bien immobilier", - // archived_at: null, - // description: "Permet de vendre un bien immobilier à une entité ou une personne physique", - // office_uid: uidOffice2, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // ]; + for (const documentType of documentTypes) { + const documentTypeCreated = await prisma.documentTypes.create({ + data: { + name: documentType.name, + public_description: documentType.public_description, + private_description: documentType.private_description, + office: { + connect: { + uid: documentType.office!.uid, + }, + }, + }, + }); + documentType.uid = documentTypeCreated.uid; + } - // const documents: Documents[] = [ - // { - // uid: uidDocument1, - // blockchain_anchor_uid: null, - // depositor_uid: uidCustomer1, - // document_status: EDocumentStatus.DEPOSITED, - // folder_uid: uidOfficeFolder1, - // document_type_uid: uidDocumentType1, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // { - // uid: uidDocument2, - // blockchain_anchor_uid: null, - // depositor_uid: uidCustomer2, - // document_status: EDocumentStatus.ASKED, - // folder_uid: uidOfficeFolder2, - // document_type_uid: uidDocumentType2, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // { - // uid: uidDocument3, - // blockchain_anchor_uid: null, - // depositor_uid: uidCustomer1, - // document_status: EDocumentStatus.ASKED, - // folder_uid: uidOfficeFolder1, - // document_type_uid: uidDocumentType3, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // { - // uid: uidDocument4, - // blockchain_anchor_uid: null, - // depositor_uid: uidCustomer1, - // document_status: EDocumentStatus.ASKED, - // folder_uid: uidOfficeFolder1, - // document_type_uid: uidDocumentType2, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // { - // uid: uidDocument5, - // blockchain_anchor_uid: null, - // depositor_uid: uidCustomer1, - // document_status: EDocumentStatus.ASKED, - // folder_uid: uidOfficeFolder1, - // document_type_uid: uidDocumentType1, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // ]; + for (const officeFolder of officeFolders) { + const officeFolderCreated = await prisma.officeFolders.create({ + data: { + folder_number: officeFolder.folder_number, + name: officeFolder.name, + description: officeFolder.description, + status: EFolderStatus.LIVE, + deed: { + connect: { + uid: officeFolder.deed?.uid, + }, + }, + office: { + connect: { + uid: officeFolder.office!.uid, + }, + }, + stakeholders: { + connect: officeFolder.stakeholders?.map((stakeholder) => ({ + uid: stakeholder.uid!, + })), + } + } + }); + officeFolder.uid = officeFolderCreated.uid; + } - // const documentTypes: DocumentTypes[] = [ - // { - // uid: uidDocumentType1, - // archived_at: null, - // name: "Acte de naissance", - // office_uid: uidOffice1, - // private_description: "Ce document est confidentiel, et ne doit pas être divulgué", - // public_description: "Acte de naissance est un document officiel qui atteste de la naissance d'une personne", - // created_at: new Date(), - // updated_at: new Date(), - // }, - // { - // uid: uidDocumentType2, - // archived_at: null, - // name: "Carte d'identité", - // office_uid: uidOffice1, - // private_description: "Ce document est confidentiel, demander un recto-verso au client", - // public_description: "Carte d'identité est un document officiel qui atteste de l'identité d'une personne", - // created_at: new Date(), - // updated_at: new Date(), - // }, - // { - // uid: uidDocumentType3, - // archived_at: null, - // name: "Autres documents", - // office_uid: uidOffice1, - // private_description: "Ce document est confidentiel, demander un recto-verso au client", - // public_description: "Carte d'identité est un document officiel qui atteste de l'identité d'une personne", - // created_at: new Date(), - // updated_at: new Date(), - // }, - // ]; - - // const officeFolderHasCustomers: OfficeFolderHasCustomers[] = [ - // { - // uid: uidOfficeFolderHasCustomer1, - // customer_uid: uidCustomer1, - // office_folder_uid: uidOfficeFolder1, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // { - // uid: uidOfficeFolderHasCustomer2, - // customer_uid: uidCustomer2, - // office_folder_uid: uidOfficeFolder2, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // ]; - - // const deedHasDocumentTypes: DeedHasDocumentTypes[] = [ - // { - // uid: uidDeedHasDocumentType1, - // deed_uid: uidDeed1, - // document_type_uid: uidDocumentType1, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // { - // uid: uidDeedHasDocumentType2, - // deed_uid: uidDeed2, - // document_type_uid: uidDocumentType2, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // ]; - - // const deedTypeHasDocumentTypes: DeedTypeHasDocumentTypes[] = [ - // { - // uid: uidDeedTypeHasDocumentType1, - // deed_type_uid: uidDeedType1, - // document_type_uid: uidDocumentType1, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // { - // uid: uidDeedTypeHasDocumentType2, - // deed_type_uid: uidDeedType2, - // document_type_uid: uidDocumentType2, - // created_at: new Date(), - // updated_at: new Date(), - // }, - // ]; - - // const documentHistories: DocumentHistory[] = [ - // { - // uid: uidDocumentHistory1, - // document_status: EDocumentStatus.ASKED, - // document_uid: uidDocument1, - // refused_reason: "", - // created_at: new Date(), - // updated_at: new Date(), - // }, - // { - // uid: uidDocumentHistory2, - // document_status: EDocumentStatus.DEPOSITED, - // document_uid: uidDocument1, - // refused_reason: "Le document n'est pas conforme", - // created_at: new Date(), - // updated_at: new Date(), - // }, - // ]; - - // for (const address of addresses) { - // await prisma.addresses.create({ data: address }); - // } - - // for (const contact of contacts) { - // await prisma.contacts.create({ data: contact }); - // } - - // for (const office of offices) { - // await prisma.offices.create({ data: office }); - // } - - // for (const role of roles) { - // await prisma.roles.create({ data: role }); - // } - - // for (const user of users) { - // await prisma.users.create({ data: user }); - // } - - // for (const customer of customers) { - // await prisma.customers.create({ data: customer }); - // } - - // for (const deedType of deedTypes) { - // await prisma.deedTypes.create({ data: deedType }); - // } - - // for (const deed of deeds) { - // await prisma.deeds.create({ data: deed }); - // } - // for (const officeFolder of officeFolders) { - // await prisma.officeFolders.create({ data: officeFolder }); - // } - - // for (const documentType of documentTypes) { - // await prisma.documentTypes.create({ data: documentType }); - // } - - // for (const document of documents) { - // await prisma.documents.create({ data: document }); - // } - - // for (const documentHistory of documentHistories) { - // await prisma.documentHistory.create({ data: documentHistory }); - // } - - // for (const officeFolderHasCustomer of officeFolderHasCustomers) { - // await prisma.officeFolderHasCustomers.create({ data: officeFolderHasCustomer }); - // } - - // for (const deedHasDocumentType of deedHasDocumentTypes) { - // await prisma.deedHasDocumentTypes.create({ data: deedHasDocumentType }); - // } - - // for (const deedTypeHasDocumentType of deedTypeHasDocumentTypes) { - // await prisma.deedTypeHasDocumentTypes.create({ data: deedTypeHasDocumentType }); - // } - - // console.log(">MOCK DATA - Seeding completed!"); -})(); + console.log(">MOCK DATA - Seeding completed!"); +} +main(); diff --git a/src/common/databases/seeders/seeder2.ts b/src/common/databases/seeders/seeder2.ts deleted file mode 100644 index c16b9a91..00000000 --- a/src/common/databases/seeders/seeder2.ts +++ /dev/null @@ -1,1963 +0,0 @@ -import { - Addresses, - Contacts, - Customers, - DeedHasDocumentTypes, - DeedTypeHasDocumentTypes, - DeedTypes, - Deeds, - DocumentTypes, - Documents, - EFolderStatus, - EOfficeStatus, - OfficeFolderHasCustomers, - OfficeFolders, - Offices, - Users, - ECivility, - ECustomerStatus, - PrismaClient, - Roles, - Rules, - OfficeRoles, -} from "@prisma/client"; - -(async () => { - const prisma = new PrismaClient(); - - const existingData = await prisma.contacts.findFirst({ where: { email: "john.doe@example.com" } }); - if (existingData) { - console.log("Seed data already exists. Skipping seeding process."); - return; - } - - const randomString = () => { - const chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - let result = ""; - for (let i = 10; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)]; - return result; - }; - const uidCustomer1: string = randomString(); - const uidCustomer2: string = randomString(); - const uidCustomer3: string = randomString(); - const uidCustomer4: string = randomString(); - const uidCustomer5: string = randomString(); - const uidCustomer6: string = randomString(); - const uidCustomer7: string = randomString(); - const uidCustomer8: string = randomString(); - const uidCustomer9: string = randomString(); - const uidCustomer10: string = randomString(); - const uidCustomer11: string = randomString(); - const uidCustomer12: string = randomString(); - const uidCustomer13: string = randomString(); - const uidCustomer14: string = randomString(); - const uidCustomer15: string = randomString(); - - const uidContact1: string = randomString(); - const uidContact2: string = randomString(); - const uidContact3: string = randomString(); - const uidContact4: string = randomString(); - const uidContact5: string = randomString(); - const uidContact6: string = randomString(); - const uidContact7: string = randomString(); - const uidContact8: string = randomString(); - const uidContact9: string = randomString(); - const uidContact10: string = randomString(); - const uidContact11: string = randomString(); - const uidContact12: string = randomString(); - const uidContact13: string = randomString(); - const uidContact14: string = randomString(); - const uidContact15: string = randomString(); - const uidContact16: string = randomString(); - const uidContact17: string = randomString(); - const uidContact18: string = randomString(); - const uidContact19: string = randomString(); - const uidContact20: string = randomString(); - - const uidAddress1: string = randomString(); - const uidAddress2: string = randomString(); - const uidAddress3: string = randomString(); - const uidAddress4: string = randomString(); - const uidAddress5: string = randomString(); - const uidAddress6: string = randomString(); - const uidAddress7: string = randomString(); - const uidAddress8: string = randomString(); - const uidAddress9: string = randomString(); - const uidAddress10: string = randomString(); - const uidAddress11: string = randomString(); - const uidAddress12: string = randomString(); - const uidAddress13: string = randomString(); - const uidAddress14: string = randomString(); - const uidAddress15: string = randomString(); - const uidAddress16: string = randomString(); - const uidAddress17: string = randomString(); - const uidAddress18: string = randomString(); - const uidAddress19: string = randomString(); - const uidAddress20: string = randomString(); - - const uidOffice1: string = randomString(); - - const uidUser1: string = randomString(); - const uidUser2: string = randomString(); - const uidUser3: string = randomString(); - const uidUser4: string = randomString(); - const uidUser5: string = randomString(); - - const uidRole1: string = randomString(); - const uidRole2: string = randomString(); - const uidOfficeRole1: string = randomString(); - const uidOfficeRole2: string = randomString(); - - const uidRule1: string = randomString(); - const uidRule2: string = randomString(); - - const uidOfficeFolder1: string = randomString(); - const uidOfficeFolder2: string = randomString(); - const uidOfficeFolder3: string = randomString(); - const uidOfficeFolder4: string = randomString(); - const uidOfficeFolder5: string = randomString(); - const uidOfficeFolder6: string = randomString(); - const uidOfficeFolder7: string = randomString(); - const uidOfficeFolder8: string = randomString(); - const uidOfficeFolder9: string = randomString(); - - const uidDeed1: string = randomString(); - const uidDeed2: string = randomString(); - const uidDeed3: string = randomString(); - const uidDeed4: string = randomString(); - const uidDeed5: string = randomString(); - const uidDeed6: string = randomString(); - const uidDeed7: string = randomString(); - const uidDeed8: string = randomString(); - const uidDeed9: string = randomString(); - const uidDeed10: string = randomString(); - const uidDeed11: string = randomString(); - const uidDeed12: string = randomString(); - const uidDeed13: string = randomString(); - const uidDeed14: string = randomString(); - const uidDeed15: string = randomString(); - const uidDeed16: string = randomString(); - const uidDeed17: string = randomString(); - const uidDeed18: string = randomString(); - const uidDeed19: string = randomString(); - const uidDeed20: string = randomString(); - const uidDeed21: string = randomString(); - - - const uidDeedType1: string = randomString(); - const uidDeedType2: string = randomString(); - const uidDeedType3: string = randomString(); - const uidDeedType4: string = randomString(); - - const uidDocumentType1: string = randomString(); - const uidDocumentType2: string = randomString(); - const uidDocumentType3: string = randomString(); - const uidDocumentType4: string = randomString(); - const uidDocumentType5: string = randomString(); - const uidDocumentType6: string = randomString(); - const uidDocumentType7: string = randomString(); - const uidDocumentType8: string = randomString(); - const uidDocumentType9: string = randomString(); - const uidDocumentType10: string = randomString(); - const uidDocumentType11: string = randomString(); - const uidDocumentType12: string = randomString(); - const uidDocumentType13: string = randomString(); - const uidDocumentType14: string = randomString(); - const uidDocumentType15: string = randomString(); - const uidDocumentType16: string = randomString(); - const uidDocumentType17: string = randomString(); - const uidDocumentType18: string = randomString(); - const uidDocumentType19: string = randomString(); - - - const uidOfficeFolderHasCustomer1: string = randomString(); - const uidOfficeFolderHasCustomer3: string = randomString(); - const uidOfficeFolderHasCustomer4: string = randomString(); - - const uidDeedHasDocumentType1: string = randomString(); - const uidDeedHasDocumentType2: string = randomString(); - const uidDeedHasDocumentType3: string = randomString(); - const uidDeedHasDocumentType4: string = randomString(); - const uidDeedHasDocumentType5: string = randomString(); - const uidDeedHasDocumentType6: string = randomString(); - const uidDeedHasDocumentType7: string = randomString(); - const uidDeedHasDocumentType8: string = randomString(); - const uidDeedHasDocumentType9: string = randomString(); - const uidDeedHasDocumentType10: string = randomString(); - const uidDeedHasDocumentType11: string = randomString(); - const uidDeedHasDocumentType12: string = randomString(); - const uidDeedHasDocumentType13: string = randomString(); - const uidDeedHasDocumentType14: string = randomString(); - const uidDeedHasDocumentType15: string = randomString(); - const uidDeedHasDocumentType16: string = randomString(); - const uidDeedHasDocumentType17: string = randomString(); - const uidDeedHasDocumentType18: string = randomString(); - const uidDeedHasDocumentType19: string = randomString(); - const uidDeedHasDocumentType20: string = randomString(); - const uidDeedHasDocumentType21: string = randomString(); - const uidDeedHasDocumentType22: string = randomString(); - const uidDeedHasDocumentType23: string = randomString(); - const uidDeedHasDocumentType24: string = randomString(); - const uidDeedHasDocumentType25: string = randomString(); - const uidDeedHasDocumentType26: string = randomString(); - const uidDeedHasDocumentType27: string = randomString(); - const uidDeedHasDocumentType28: string = randomString(); - const uidDeedHasDocumentType29: string = randomString(); - const uidDeedHasDocumentType30: string = randomString(); - const uidDeedHasDocumentType31: string = randomString(); - const uidDeedHasDocumentType32: string = randomString(); - const uidDeedHasDocumentType33: string = randomString(); - const uidDeedHasDocumentType34: string = randomString(); - const uidDeedHasDocumentType35: string = randomString(); - const uidDeedHasDocumentType36: string = randomString(); - const uidDeedHasDocumentType37: string = randomString(); - const uidDeedHasDocumentType38: string = randomString(); - const uidDeedHasDocumentType39: string = randomString(); - const uidDeedHasDocumentType40: string = randomString(); - const uidDeedHasDocumentType41: string = randomString(); - const uidDeedHasDocumentType42: string = randomString(); - const uidDeedHasDocumentType43: string = randomString(); - const uidDeedHasDocumentType44: string = randomString(); - const uidDeedHasDocumentType45: string = randomString(); - - - - const uidDeedTypeHasDocumentType1: string = randomString(); - const uidDeedTypeHasDocumentType2: string = randomString(); - const uidDeedTypeHasDocumentType3: string = randomString(); - const uidDeedTypeHasDocumentType4: string = randomString(); - const uidDeedTypeHasDocumentType5: string = randomString(); - const uidDeedTypeHasDocumentType6: string = randomString(); - const uidDeedTypeHasDocumentType7: string = randomString(); - const uidDeedTypeHasDocumentType8: string = randomString(); - const uidDeedTypeHasDocumentType9: string = randomString(); - const uidDeedTypeHasDocumentType10: string = randomString(); - const uidDeedTypeHasDocumentType11: string = randomString(); - const uidDeedTypeHasDocumentType12: string = randomString(); - const uidDeedTypeHasDocumentType13: string = randomString(); - const uidDeedTypeHasDocumentType14: string = randomString(); - const uidDeedTypeHasDocumentType15: string = randomString(); - const uidDeedTypeHasDocumentType16: string = randomString(); - const uidDeedTypeHasDocumentType17: string = randomString(); - const uidDeedTypeHasDocumentType18: string = randomString(); - const uidDeedTypeHasDocumentType19: string = randomString(); - const uidDeedTypeHasDocumentType20: string = randomString(); - const uidDeedTypeHasDocumentType21: string = randomString(); - const uidDeedTypeHasDocumentType22: string = randomString(); - - - - - const customers: Customers[] = [ - { - uid: uidCustomer1, - contact_uid: uidContact1, - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - uid: uidCustomer2, - contact_uid: uidContact2, - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - uid: uidCustomer3, - contact_uid: uidContact3, - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - uid: uidCustomer4, - contact_uid: uidContact4, - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - uid: uidCustomer5, - contact_uid: uidContact5, - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - uid: uidCustomer6, - contact_uid: uidContact6, - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - uid: uidCustomer7, - contact_uid: uidContact7, - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - uid: uidCustomer8, - contact_uid: uidContact8, - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - uid: uidCustomer9, - contact_uid: uidContact9, - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - uid: uidCustomer10, - contact_uid: uidContact10, - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - uid: uidCustomer11, - contact_uid: uidContact11, - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - uid: uidCustomer12, - contact_uid: uidContact12, - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - uid: uidCustomer13, - contact_uid: uidContact13, - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - uid: uidCustomer14, - contact_uid: uidContact14, - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - uid: uidCustomer15, - contact_uid: uidContact15, - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - ]; - - const addresses: Addresses[] = [ - { - uid: uidAddress1, - address: "148 Avenue du bac", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress2, - address: "Rue Pierre Emillion", - city: "Pacé", - zip_code: 35740, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress3, - address: "Rue Pierre Charles", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress4, - address: "Rue Pierre Pologne", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress5, - address: "Rue Pierre Marcel", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress6, - address: "Rue Pierre Jacques", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress7, - address: "Rue Pierre Pascal", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress8, - address: "Rue Maxime Henry", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress9, - address: "Rue Maxime Francis", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress10, - address: "Avenue Paul Roger", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress11, - address: "Avenue Paul Franck", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress12, - address: "Avenue Paul Maréchal", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress13, - address: "Avenue Marcel Denis", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress14, - address: "Place Alexandre", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress15, - address: "Place Alexandre Jacques", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress16, - address: "Place Alexandre 2", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress17, - address: "Rue du livre", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress18, - address: "Place de la joie", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress19, - address: "Rue Paul Henry", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidAddress20, - address: "Rue Marcelin", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - - ]; - - const contacts: Contacts[] = [ - { - uid: uidContact1, - address_uid: uidAddress1, - first_name: "Manon", - last_name: "Simon", - email: "manon.simon@gmail.com", - phone_number: "06 12 34 56 78", - cell_phone_number: "06 12 34 56 78", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.FEMALE, - }, - { - uid: uidContact2, - address_uid: uidAddress2, - first_name: "Kevin", - last_name: "Hautefaye", - email: "kevin.hautefaye@gmail.com", - phone_number: "06 23 45 67 89", - cell_phone_number: "06 23 45 67 89", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - uid: uidContact3, - address_uid: uidAddress3, - first_name: "Maxime", - last_name: "Lalo", - email: "maxime.lalo@gmail.com", - phone_number: "06 34 56 78 90", - cell_phone_number: "06 34 56 78 90", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - uid: uidContact4, - address_uid: uidAddress4, - first_name: "Vincent", - last_name: "Brognard", - email: "vincent.brognard@gmail.com", - phone_number: "06 45 67 89 01", - cell_phone_number: "06 45 67 89 01", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - uid: uidContact5, - address_uid: uidAddress5, - first_name: "Maxime", - last_name: "Leroy", - email: "maxime.leroy@hotmail.fr", - phone_number: "06 56 78 90 12", - cell_phone_number: "06 56 78 90 12", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - uid: uidContact6, - address_uid: uidAddress6, - first_name: "Thibault", - last_name: "Dubois", - email: "thibault.dubois@outlook.com", - phone_number: "06 67 89 01 23", - cell_phone_number: "06 67 89 01 23", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - uid: uidContact7, - address_uid: uidAddress7, - first_name: "Léa", - last_name: "Fontaine", - email: "lea.fontaine@gmail.com", - phone_number: "06 78 90 12 34", - cell_phone_number: "06 78 90 12 34", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.FEMALE, - }, - { - uid: uidContact8, - address_uid: uidAddress8, - first_name: "Guillaume", - last_name: "Renaud", - email: "guillaume.renaud@gmail.com", - phone_number: "06 89 01 23 45", - cell_phone_number: "06 89 01 23 45", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - uid: uidContact9, - address_uid: uidAddress9, - first_name: "Lucie", - last_name: "Chevalier", - email: "lucie.chevalier@outlook.com", - phone_number: "07 12 34 56 78", - cell_phone_number: "07 12 34 56 78", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.FEMALE, - }, - { - uid: uidContact10, - address_uid: uidAddress10, - first_name: "Sébastien", - last_name: "Dubois", - email: "sebastien.dubois@gmail.com", - phone_number: "07 23 45 67 89", - cell_phone_number: "07 23 45 67 89", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - uid: uidContact11, - address_uid: uidAddress11, - first_name: "Mathilde", - last_name: "Durand", - email: "mathilde.durand@gmail.com", - phone_number: "07 34 56 78 90", - cell_phone_number: "07 34 56 78 90", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.FEMALE, - }, - { - uid: uidContact12, - address_uid: uidAddress12, - first_name: "Antoine", - last_name: "Bernard", - email: "antoine.bernard@outlook.com", - phone_number: "07 45 67 89 01", - cell_phone_number: "07 45 67 89 01", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - uid: uidContact13, - address_uid: uidAddress13, - first_name: "Camille", - last_name: "Laurent", - email: "camille.laurent@gmail.com", - phone_number: "07 56 78 90 12", - cell_phone_number: "07 56 78 90 12", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.FEMALE, - }, - { - uid: uidContact14, - address_uid: uidAddress14, - first_name: "Julien", - last_name: "Mercier", - email: "julien.mercier@hotmail.fr", - phone_number: "07 67 89 01 23", - cell_phone_number: "07 67 89 01 23", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - uid: uidContact15, - address_uid: uidAddress15, - first_name: "Charlotte", - last_name: "Lefebvre", - email: "charlotte.lefebvre@gmail.com", - phone_number: "07 78 90 12 34", - cell_phone_number: "07 78 90 12 34", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.FEMALE, - }, - { - uid: uidContact16, - address_uid: uidAddress16, - first_name: "Caroline", - last_name: "Pallut", - email: "caroline.pallut@gmail.com", - phone_number: "07 89 01 23 45", - cell_phone_number: "07 89 01 23 45", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.FEMALE, - }, - { - uid: uidContact17, - address_uid: uidAddress17, - first_name: "Nadège", - last_name: "Gauchet", - email: "nedege.gauchet@outlook.com", - phone_number: "06 11 22 33 44", - cell_phone_number: "06 11 22 33 44", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.FEMALE, - }, - { - uid: uidContact18, - address_uid: uidAddress18, - first_name: "Matthieu", - last_name: "Bougeard", - email: "matthieu.bougeard@gmail.com", - phone_number: "07 22 33 44 55", - cell_phone_number: "07 22 33 44 55", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - uid: uidContact19, - address_uid: uidAddress19, - first_name: "Cécile", - last_name: "Celton", - email: "cecile.celton@outlook.com", - phone_number: "06 55 66 77 88", - cell_phone_number: "06 55 66 77 88", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.FEMALE, - }, - { - uid: uidContact20, - address_uid: uidAddress20, - first_name: "Gwendal", - last_name: "Texier", - email: "gwendal.texier@gmail.com", - phone_number: "07 88 99 00 11", - cell_phone_number: "07 88 99 00 11", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - ]; - - const offices: Offices[] = [ - { - uid: uidOffice1, - idNot: randomString(), - name: "Office Rennes", - crpcen: randomString(), - address_uid: uidAddress1, - created_at: new Date(), - updated_at: new Date(), - office_status: EOfficeStatus.ACTIVATED, - } - ]; - - const rules: Rules[] = [ - { - uid: uidRule1, - name: 'GET users', - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidRule2, - name: 'GET offices', - created_at: new Date(), - updated_at: new Date(), - } - ]; - - const roles: Roles[] = [ - { - uid: uidRole1, - name: 'super-admin', - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidRole2, - name: 'admin', - created_at: new Date(), - updated_at: new Date(), - } - ]; - - const officeRoles: OfficeRoles[] = [ - { - uid: uidOfficeRole1, - name: 'super-admin', - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - }, - { - uid: uidOfficeRole2, - name: 'admin', - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - } - ]; - - const users: Users[] = [ - { - uid: uidUser1, - created_at: new Date(), - updated_at: new Date(), - idNot: randomString(), - contact_uid: uidContact16, - office_uid: uidOffice1, - roles_uid: uidRole1, - office_role_uid: uidOfficeRole1, - }, - { - uid: uidUser2, - created_at: new Date(), - updated_at: new Date(), - idNot: randomString(), - contact_uid: uidContact17, - office_uid: uidOffice1, - roles_uid: uidRole2, - office_role_uid: uidOfficeRole2, - }, - { - uid: uidUser3, - created_at: new Date(), - updated_at: new Date(), - idNot: randomString(), - contact_uid: uidContact18, - office_uid: uidOffice1, - roles_uid: uidRole1, - office_role_uid: null, - }, - { - uid: uidUser4, - created_at: new Date(), - updated_at: new Date(), - idNot: randomString(), - contact_uid: uidContact19, - office_uid: uidOffice1, - roles_uid: uidRole2, - office_role_uid: null, - }, - { - uid: uidUser5, - created_at: new Date(), - updated_at: new Date(), - idNot: randomString(), - contact_uid: uidContact20, - office_uid: uidOffice1, - roles_uid: uidRole1, - office_role_uid: null, - }, - ]; - - const officeFolders: OfficeFolders[] = [ - { - uid: uidOfficeFolder1, - folder_number: "0001", - name: "Vente par Mme. Simon au profit de Mme. Lextrait", - deed_uid: uidDeed1, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder2, - folder_number: "0002", - name: "Donation des parts sociales de la société SARL FLORE", - deed_uid: uidDeed2, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder3, - folder_number: "0003", - name: "Vente par Mme. Lefebvre au profit de Mme. Mathieu", - deed_uid: uidDeed3, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder4, - folder_number: "0004", - name: "Vente par Mme. Chevalier au profit de M. Daveau", - deed_uid: uidDeed4, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder5, - folder_number: "0005", - name: "Vente par M. Lalo au profit de Mme. Pigale", - deed_uid: uidDeed5, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder6, - folder_number: "0006", - name: "Donation des parts sociales de la société SMART-TALENT", - deed_uid: uidDeed6, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder7, - folder_number: "0007", - name: "Vente par M. Girard au profit de M. Louis", - deed_uid: uidDeed7, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder8, - folder_number: "0008", - name: "Vente par Mme. Leclerc au profit de M. Louis", - deed_uid: uidDeed8, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - { - uid: uidOfficeFolder9, - folder_number: "0009", - name: "Vente par M. Lambert au profit de M. Holmes", - deed_uid: uidDeed9, - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office_uid: uidOffice1, - description: null, - archived_description: null, - }, - ]; - - const deeds: Deeds[] = [ - { - uid: uidDeed1, - deed_type_uid: uidDeedType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed2, - deed_type_uid: uidDeedType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed3, - deed_type_uid: uidDeedType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed4, - deed_type_uid: uidDeedType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed5, - deed_type_uid: uidDeedType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed6, - deed_type_uid: uidDeedType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed7, - deed_type_uid: uidDeedType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed8, - deed_type_uid: uidDeedType2, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed9, - deed_type_uid: uidDeedType2, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed10, - deed_type_uid: uidDeedType2, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed11, - deed_type_uid: uidDeedType2, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed12, - deed_type_uid: uidDeedType2, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed13, - deed_type_uid: uidDeedType2, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed14, - deed_type_uid: uidDeedType2, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed15, - deed_type_uid: uidDeedType3, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed16, - deed_type_uid: uidDeedType3, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed17, - deed_type_uid: uidDeedType3, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed18, - deed_type_uid: uidDeedType3, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed19, - deed_type_uid: uidDeedType3, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed20, - deed_type_uid: uidDeedType3, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeed21, - deed_type_uid: uidDeedType3, - created_at: new Date(), - updated_at: new Date(), - }, - ]; - - const deedTypes: DeedTypes[] = [ - { - uid: uidDeedType1, - name: "Acte de donation", - archived_at: null, - description: "Acte de donation", - office_uid: uidOffice1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedType2, - name: "Acte de vente", - archived_at: null, - description: "Acte de vente", - office_uid: uidOffice1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedType3, - name: "Acte de succession", - archived_at: null, - description: "Acte de succession", - office_uid: uidOffice1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedType4, - name: "Acte de vente de maison individuelle", - archived_at: null, - description: "Acte de vente de maison individuelle", - office_uid: uidOffice1, - created_at: new Date(), - updated_at: new Date(), - }, - - ]; - - const documents: Documents[] = [ - ]; - - const documentTypes: DocumentTypes[] = [ - { - uid: uidDocumentType1, - archived_at: null, - name: "Document d'identité", - office_uid: uidOffice1, - private_description: "Document officiel d'identification utilisé par plusieurs personnes pour prouver leur identité et leur nationalité (CNI, passeport)", - public_description: "Document officiel d'identification utilisé par plusieurs personnes pour prouver leur identité et leur nationalité (CNI, passeport)", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentType2, - archived_at: null, - name: "Taxe Foncière", - office_uid: uidOffice1, - private_description: "Impôt annuel imposé sur les propriétés foncières et utilisé pour financer les services publics locaux.", - public_description: "Impôt annuel imposé sur les propriétés foncières et utilisé pour financer les services publics locaux.", - created_at: new Date(), - updated_at: new Date(), - }, - - { - uid: uidDocumentType3, - archived_at: null, - name: "Contrat Mariage", - office_uid: uidOffice1, - private_description: "Accord légal qui établit les droits et les obligations entre deux personnes s'unissant en mariage.", - public_description: "Accord légal qui établit les droits et les obligations entre deux personnes s'unissant en mariage.", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentType4, - archived_at: null, - name: "Livret de famille", - office_uid: uidOffice1, - private_description: "Document officiel qui enregistre les détails et les événements familiaux tels que les mariages, les naissances et les décès d'un couple et de leurs enfants.", - public_description: "Document officiel qui enregistre les détails et les événements familiaux tels que les mariages, les naissances et les décès d'un couple et de leurs enfants.", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentType16, - archived_at: null, - name: "Bail commercial", - office_uid: uidOffice1, - private_description: "Contrat légal entre un propriétaire et un locataire pour la location d'un bien immobilier utilisé à des fins commerciales ou professionnelles.", - public_description: "Contrat légal entre un propriétaire et un locataire pour la location d'un bien immobilier utilisé à des fins commerciales ou professionnelles.", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentType5, - archived_at: null, - name: "Statuts SCI", - office_uid: uidOffice1, - private_description: "Document légal qui définit les règles et les dispositions régissant la Société Civile Immobilière (SCI).", - public_description: "Document légal qui définit les règles et les dispositions régissant la Société Civile Immobilière (SCI).", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentType6, - archived_at: null, - name: "Avis de taxe foncière", - office_uid: uidOffice1, - private_description: "Notification officielle indiquant le montant de l'impôt foncier dû sur une propriété.", - public_description: "Notification officielle indiquant le montant de l'impôt foncier dû sur une propriété.", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentType7, - archived_at: null, - name: "Appel de charge de copropriété", - office_uid: uidOffice1, - private_description: "Document envoyé aux copropriétaires pour les informer des dépenses et des charges communes liées à la gestion et à l'entretien de l'immeuble.", - public_description: "Document envoyé aux copropriétaires pour les informer des dépenses et des charges communes liées à la gestion et à l'entretien de l'immeuble.", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentType8, - archived_at: null, - name: "PVAG", - office_uid: uidOffice1, - private_description: "Compte rendu écrit des discussions, décisions et résolutions prises lors d'une réunion d'assemblée générale de copropriété.", - public_description: "Compte rendu écrit des discussions, décisions et résolutions prises lors d'une réunion d'assemblée générale de copropriété.", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentType9, - archived_at: null, - name: "Règlement de copropriété", - office_uid: uidOffice1, - private_description: "Document juridique qui établit les règles et les droits des copropriétaires d'un immeuble en copropriété.", - public_description: "Document juridique qui établit les règles et les droits des copropriétaires d'un immeuble en copropriété.", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentType10, - archived_at: null, - name: "Titre de propriété", - office_uid: uidOffice1, - private_description: "Document légal qui atteste de la propriété d'un bien immobilier et en identifie le propriétaire.", - public_description: "Document légal qui atteste de la propriété d'un bien immobilier et en identifie le propriétaire.", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentType11, - archived_at: null, - name: "Plan et loi carrez", - office_uid: uidOffice1, - private_description: "Document officiel qui mesure la superficie d'un lot ou d'un bien immobilier, conformément à la loi Carrez qui encadre les transactions immobilières.", - public_description: "Document officiel qui mesure la superficie d'un lot ou d'un bien immobilier, conformément à la loi Carrez qui encadre les transactions immobilières.", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentType12, - archived_at: null, - name: "CNI", - office_uid: uidOffice1, - private_description: "Document officiel d'identification délivré par l'État pour prouver l'identité et la nationalité d'une personne.", - public_description: "Document officiel d'identification délivré par l'État pour prouver l'identité et la nationalité d'une personne.", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentType13, - archived_at: null, - name: "Modifications règlement copropriété (plusieurs)", - office_uid: uidOffice1, - private_description: "Documents légaux qui apportent des changements ou des ajustements aux règles et dispositions du règlement de copropriété initial.", - public_description: "Documents légaux qui apportent des changements ou des ajustements aux règles et dispositions du règlement de copropriété initial.", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentType14, - archived_at: null, - name: "Avis de décès", - office_uid: uidOffice1, - private_description: "Notification officielle délivrée par les autorités compétentes pour informer du décès d'une personne.", - public_description: "Notification officielle délivrée par les autorités compétentes pour informer du décès d'une personne.", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentType15, - archived_at: null, - name: "Lettre de mission", - office_uid: uidOffice1, - private_description: "Document contractuel qui définit les termes et les objectifs d'une mission confiée à une personne ou à une entreprise.", - public_description: "Document contractuel qui définit les termes et les objectifs d'une mission confiée à une personne ou à une entreprise.", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentType17, - archived_at: null, - name: "DPE", - office_uid: uidOffice1, - private_description: "Diagnostic de Performance Energétique.", - public_description: "Diagnostic de Performance Energétique.", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentType18, - archived_at: null, - name: "RIB", - office_uid: uidOffice1, - private_description: "Relevé d'identité bancaire ou IBAN.", - public_description: "Relevé d'identité bancaire ou IBAN.", - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDocumentType19, - archived_at: null, - name: "Acte d'achat par la SCI", - office_uid: uidOffice1, - private_description: "Acte d'achat par la SCI.", - public_description: "Acte d'achat par la SCI.", - created_at: new Date(), - updated_at: new Date(), - }, - ]; - - const officeFolderHasCustomers: OfficeFolderHasCustomers[] = [ - { - uid: uidOfficeFolderHasCustomer1, - customer_uid: uidCustomer1, - office_folder_uid: uidOfficeFolder1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidOfficeFolderHasCustomer3, - customer_uid: uidCustomer3, - office_folder_uid: uidOfficeFolder3, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidOfficeFolderHasCustomer4, - customer_uid: uidCustomer4, - office_folder_uid: uidOfficeFolder4, - created_at: new Date(), - updated_at: new Date(), - }, - - ]; - - const deedHasDocumentTypes: DeedHasDocumentTypes[] = [ - { - uid: uidDeedHasDocumentType1, - deed_uid: uidDeed1, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType2, - deed_uid: uidDeed1, - document_type_uid: uidDocumentType6, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType3, - deed_uid: uidDeed1, - document_type_uid: uidDocumentType10, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType4, - deed_uid: uidDeed1, - document_type_uid: uidDocumentType17, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType5, - deed_uid: uidDeed1, - document_type_uid: uidDocumentType18, - created_at: new Date(), - updated_at: new Date(), - }, - - - { - uid: uidDeedHasDocumentType6, - deed_uid: uidDeed2, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType7, - deed_uid: uidDeed2, - document_type_uid: uidDocumentType6, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType8, - deed_uid: uidDeed2, - document_type_uid: uidDocumentType10, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType9, - deed_uid: uidDeed2, - document_type_uid: uidDocumentType17, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType10, - deed_uid: uidDeed2, - document_type_uid: uidDocumentType18, - created_at: new Date(), - updated_at: new Date(), - }, - - - { - uid: uidDeedHasDocumentType11, - deed_uid: uidDeed3, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType12, - deed_uid: uidDeed3, - document_type_uid: uidDocumentType6, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType13, - deed_uid: uidDeed3, - document_type_uid: uidDocumentType10, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType14, - deed_uid: uidDeed3, - document_type_uid: uidDocumentType17, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType15, - deed_uid: uidDeed3, - document_type_uid: uidDocumentType18, - created_at: new Date(), - updated_at: new Date(), - }, - - - { - uid: uidDeedHasDocumentType16, - deed_uid: uidDeed4, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType17, - deed_uid: uidDeed4, - document_type_uid: uidDocumentType6, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType18, - deed_uid: uidDeed4, - document_type_uid: uidDocumentType10, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType19, - deed_uid: uidDeed4, - document_type_uid: uidDocumentType17, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType20, - deed_uid: uidDeed4, - document_type_uid: uidDocumentType18, - created_at: new Date(), - updated_at: new Date(), - }, - - - { - uid: uidDeedHasDocumentType21, - deed_uid: uidDeed5, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType22, - deed_uid: uidDeed5, - document_type_uid: uidDocumentType6, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType23, - deed_uid: uidDeed5, - document_type_uid: uidDocumentType10, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType24, - deed_uid: uidDeed5, - document_type_uid: uidDocumentType17, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType25, - deed_uid: uidDeed5, - document_type_uid: uidDocumentType18, - created_at: new Date(), - updated_at: new Date(), - }, - - - { - uid: uidDeedHasDocumentType26, - deed_uid: uidDeed6, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType27, - deed_uid: uidDeed6, - document_type_uid: uidDocumentType6, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType28, - deed_uid: uidDeed6, - document_type_uid: uidDocumentType10, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType29, - deed_uid: uidDeed6, - document_type_uid: uidDocumentType17, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType30, - deed_uid: uidDeed6, - document_type_uid: uidDocumentType18, - created_at: new Date(), - updated_at: new Date(), - }, - - - { - uid: uidDeedHasDocumentType31, - deed_uid: uidDeed7, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType32, - deed_uid: uidDeed7, - document_type_uid: uidDocumentType6, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType33, - deed_uid: uidDeed7, - document_type_uid: uidDocumentType10, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType34, - deed_uid: uidDeed7, - document_type_uid: uidDocumentType17, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType35, - deed_uid: uidDeed7, - document_type_uid: uidDocumentType18, - created_at: new Date(), - updated_at: new Date(), - }, - - - { - uid: uidDeedHasDocumentType36, - deed_uid: uidDeed8, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType37, - deed_uid: uidDeed8, - document_type_uid: uidDocumentType6, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType38, - deed_uid: uidDeed8, - document_type_uid: uidDocumentType10, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType39, - deed_uid: uidDeed8, - document_type_uid: uidDocumentType17, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType40, - deed_uid: uidDeed8, - document_type_uid: uidDocumentType18, - created_at: new Date(), - updated_at: new Date(), - }, - - - { - uid: uidDeedHasDocumentType41, - deed_uid: uidDeed9, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType42, - deed_uid: uidDeed9, - document_type_uid: uidDocumentType6, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType43, - deed_uid: uidDeed9, - document_type_uid: uidDocumentType10, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType44, - deed_uid: uidDeed9, - document_type_uid: uidDocumentType17, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedHasDocumentType45, - deed_uid: uidDeed9, - document_type_uid: uidDocumentType18, - created_at: new Date(), - updated_at: new Date(), - }, - ]; - - const deedTypeHasDocumentTypes: DeedTypeHasDocumentTypes[] = [ - { - uid: uidDeedTypeHasDocumentType1, - deed_type_uid: uidDeedType1, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedTypeHasDocumentType2, - deed_type_uid: uidDeedType1, - document_type_uid: uidDocumentType2, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedTypeHasDocumentType3, - deed_type_uid: uidDeedType1, - document_type_uid: uidDocumentType3, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedTypeHasDocumentType9, - deed_type_uid: uidDeedType1, - document_type_uid: uidDocumentType4, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedTypeHasDocumentType10, - deed_type_uid: uidDeedType1, - document_type_uid: uidDocumentType16, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedTypeHasDocumentType11, - deed_type_uid: uidDeedType1, - document_type_uid: uidDocumentType5, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedTypeHasDocumentType12, - deed_type_uid: uidDeedType1, - document_type_uid: uidDocumentType19, - created_at: new Date(), - updated_at: new Date(), - }, - - - { - uid: uidDeedTypeHasDocumentType13, - deed_type_uid: uidDeedType2, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedTypeHasDocumentType14, - deed_type_uid: uidDeedType2, - document_type_uid: uidDocumentType13, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedTypeHasDocumentType15, - deed_type_uid: uidDeedType2, - document_type_uid: uidDocumentType2, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedTypeHasDocumentType16, - deed_type_uid: uidDeedType2, - document_type_uid: uidDocumentType8, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedTypeHasDocumentType17, - deed_type_uid: uidDeedType2, - document_type_uid: uidDocumentType10, - created_at: new Date(), - updated_at: new Date(), - }, - - - { - uid: uidDeedTypeHasDocumentType18, - deed_type_uid: uidDeedType3, - document_type_uid: uidDocumentType14, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedTypeHasDocumentType19, - deed_type_uid: uidDeedType3, - document_type_uid: uidDocumentType15, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedTypeHasDocumentType20, - deed_type_uid: uidDeedType3, - document_type_uid: uidDocumentType4, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedTypeHasDocumentType21, - deed_type_uid: uidDeedType3, - document_type_uid: uidDocumentType10, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedTypeHasDocumentType22, - deed_type_uid: uidDeedType3, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - - - { - uid: uidDeedTypeHasDocumentType4, - deed_type_uid: uidDeedType4, - document_type_uid: uidDocumentType1, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedTypeHasDocumentType5, - deed_type_uid: uidDeedType4, - document_type_uid: uidDocumentType6, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedTypeHasDocumentType6, - deed_type_uid: uidDeedType4, - document_type_uid: uidDocumentType10, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedTypeHasDocumentType7, - deed_type_uid: uidDeedType4, - document_type_uid: uidDocumentType17, - created_at: new Date(), - updated_at: new Date(), - }, - { - uid: uidDeedTypeHasDocumentType8, - deed_type_uid: uidDeedType4, - document_type_uid: uidDocumentType18, - created_at: new Date(), - updated_at: new Date(), - }, - ]; - - - for (const address of addresses) { - await prisma.addresses.create({ data: address }); - } - - for (const contact of contacts) { - await prisma.contacts.create({ data: contact }); - } - - for (const office of offices) { - await prisma.offices.create({ data: office }); - } - - for (const rule of rules) { - await prisma.rules.create({ data: rule }); - } - - for (const role of roles) { - await prisma.roles.create({ data: role }); - } - - for (const officeRole of officeRoles) { - await prisma.officeRoles.create({ data: officeRole }); - } - - for (const user of users) { - await prisma.users.create({ data: user }); - } - - for (const customer of customers) { - await prisma.customers.create({ data: customer }); - } - - for (const deedType of deedTypes) { - await prisma.deedTypes.create({ data: deedType }); - } - - for (const deed of deeds) { - await prisma.deeds.create({ data: deed }); - } - for (const officeFolder of officeFolders) { - await prisma.officeFolders.create({ data: officeFolder }); - } - - for (const documentType of documentTypes) { - await prisma.documentTypes.create({ data: documentType }); - } - - for (const document of documents) { - await prisma.documents.create({ data: document }); - } - - for (const officeFolderHasCustomer of officeFolderHasCustomers) { - await prisma.officeFolderHasCustomers.create({ data: officeFolderHasCustomer }); - } - - for (const deedHasDocumentType of deedHasDocumentTypes) { - await prisma.deedHasDocumentTypes.create({ data: deedHasDocumentType }); - } - - for (const deedTypeHasDocumentType of deedTypeHasDocumentTypes) { - await prisma.deedTypeHasDocumentTypes.create({ data: deedTypeHasDocumentType }); - } - - console.log(">MOCK DATA - Seeding completed!"); -})(); diff --git a/src/common/repositories/AddressesRepository.ts b/src/common/repositories/AddressesRepository.ts deleted file mode 100644 index 268d9059..00000000 --- a/src/common/repositories/AddressesRepository.ts +++ /dev/null @@ -1,38 +0,0 @@ -import Database from "@Common/databases/database"; -import BaseRepository from "@Repositories/BaseRepository"; -import { Service } from "typedi"; -import { Addresses } from "@prisma/client"; - -@Service() -export default class AddressesRepository extends BaseRepository { - constructor(private database: Database) { - super(); - } - protected get model() { - return this.database.getClient().addresses; - } - protected get instanceDb() { - return this.database.getClient(); - } - - /** - * @description : Find many addresses - */ - public async findMany(query: any): Promise { - query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); - return this.model.findMany(query); - } - - /** - * @description : Find one address - */ - public async findOneByUid(uid: string): Promise { - const addressEntity = await this.model.findUnique({ - where: { - uid: uid, - }, - }); - - return addressEntity; - } -} diff --git a/src/common/repositories/ContactsRepository.ts b/src/common/repositories/ContactsRepository.ts deleted file mode 100644 index 26836b4a..00000000 --- a/src/common/repositories/ContactsRepository.ts +++ /dev/null @@ -1,38 +0,0 @@ -import Database from "@Common/databases/database"; -import BaseRepository from "@Repositories/BaseRepository"; -import { Service } from "typedi"; -import { Contacts } from "@prisma/client"; - -@Service() -export default class ContactsRepository extends BaseRepository { - constructor(private database: Database) { - super(); - } - protected get model() { - return this.database.getClient().contacts; - } - protected get instanceDb() { - return this.database.getClient(); - } - - /** - * @description : Find many contacts - */ - public async findMany(query: any): Promise { - query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); - return this.model.findMany(query); - } - - /** - * @description : Find unique contact - */ - public async findOneByUid(uid: string): Promise { - const contactEntity = await this.model.findUnique({ - where: { - uid: uid, - }, - }); - - return contactEntity; - } -} diff --git a/src/common/repositories/CustomersRepository.ts b/src/common/repositories/CustomersRepository.ts index c1b48c22..a4ebfe4a 100644 --- a/src/common/repositories/CustomersRepository.ts +++ b/src/common/repositories/CustomersRepository.ts @@ -19,11 +19,7 @@ export default class CustomersRepository extends BaseRepository { /** * @description : Find many customers */ - public async findMany(query: Prisma.CustomersFindManyArgs): Promise< - (Customers & { - contact: Contacts; - })[] - > { + public async findMany(query: Prisma.CustomersFindManyArgs) { query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); if (!query.include) return this.model.findMany({ ...query, include: { contact: true } }); return this.model.findMany({ ...query, include: { contact: { include: { address: true } } } }); @@ -32,7 +28,7 @@ export default class CustomersRepository extends BaseRepository { /** * @description : Create a customer */ - public async create(customer: Customer): Promise { + public async create(customer: Customer): Promise { const createArgs: Prisma.CustomersCreateArgs = { data: { status: ECustomerStatus.PENDING, @@ -50,12 +46,12 @@ export default class CustomersRepository extends BaseRepository { }, }; - if (customer.contact!.address) { + if (customer.contact?.address) { createArgs.data.contact!.create!.address = { create: { - address: customer.contact!.address!.address, - zip_code: customer.contact!.address!.zip_code, - city: customer.contact!.address!.city, + address: customer.contact?.address?.address, + zip_code: customer.contact?.address?.zip_code, + city: customer.contact?.address?.city, }, }; } @@ -65,7 +61,7 @@ export default class CustomersRepository extends BaseRepository { /** * @description : Update data from a customer */ - public async update(uid: string, customer: Customer): Promise { + public async update(uid: string, customer: Customer): Promise { const updateArgs: Prisma.CustomersUpdateArgs = { where: { uid: uid, @@ -98,17 +94,12 @@ export default class CustomersRepository extends BaseRepository { /** * @description : Find unique customer */ - public async findOneByUid(uid: string, query?: any): Promise { - const findOneArgs: Prisma.CustomersFindUniqueArgs = { + public async findOneByUid(uid: string, query?: Prisma.CustomersInclude) { + return this.model.findUnique({ where: { uid: uid, }, - }; - if (query) { - findOneArgs.include = query; - } - const customerEntity = await this.model.findUnique(findOneArgs); - - return customerEntity; + include: query, + }); } } diff --git a/src/common/repositories/DeedTypesRepository.ts b/src/common/repositories/DeedTypesRepository.ts index 7a695488..3004726a 100644 --- a/src/common/repositories/DeedTypesRepository.ts +++ b/src/common/repositories/DeedTypesRepository.ts @@ -1,7 +1,7 @@ import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; -import { DeedTypes, Prisma } from "@prisma/client"; +import { DeedTypes, DocumentTypes, Prisma } from "@prisma/client"; import { DeedType } from "le-coffre-resources/dist/SuperAdmin"; @Service() @@ -19,7 +19,7 @@ export default class DeedTypesRepository extends BaseRepository { /** * @description : Find many deed types */ - public async findMany(query: any): Promise { + public async findMany(query: Prisma.DeedTypesFindManyArgs): Promise { query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); return this.model.findMany(query); } @@ -39,23 +39,20 @@ export default class DeedTypesRepository extends BaseRepository { }, }, }; - if (deedType.deed_type_has_document_types) { - createArgs.data.deed_type_has_document_types = { - createMany: { - data: deedType.deed_type_has_document_types.map((relation) => ({ - document_type_uid: relation.document_type.uid!, - })), - skipDuplicates: true, - }, + if (deedType.document_types) { + createArgs.data.document_types = { + connect: deedType.document_types.map((documentType) => ({ + uid: documentType.uid, + })), }; } - return this.model.create(createArgs); + return this.model.create({...createArgs, include: { document_types: true }}); } /** * @description : Update data of a deed type */ - public async update(uid: string, deedType: DeedType): Promise { + public async update(uid: string, deedType: DeedType): Promise { const updateArgs: Prisma.DeedTypesUpdateArgs = { where: { uid: uid, @@ -69,39 +66,26 @@ export default class DeedTypesRepository extends BaseRepository { uid: deedType.office!.uid, }, }, - }, - include: { - deed_type_has_document_types: true, + document_types: { + set: deedType.document_types?.map((documentType) => ({ + uid: documentType.uid!, + })) + } }, }; - if (deedType.deed_type_has_document_types) { - updateArgs.data.deed_type_has_document_types = { - deleteMany: { deed_type_uid: uid }, - createMany: { - data: deedType.deed_type_has_document_types.map((relation) => ({ - document_type_uid: relation.document_type.uid!, - })), - skipDuplicates: true, - }, - }; - } - return this.model.update(updateArgs); + + return this.model.update({...updateArgs, include: { document_types: true }}); } /** * @description : Find unique deed type */ - public async findOneByUid(uid: string, query?: any): Promise { - const findOneArgs: Prisma.DeedTypesFindUniqueArgs = { + public async findOneByUid(uid: string, query?: Prisma.DeedTypesInclude) { + return this.model.findUnique({ where: { uid: uid, }, - }; - if (query) { - findOneArgs.include = query; - } - const deedTypeEntity = await this.model.findUnique(findOneArgs); - - return deedTypeEntity; + include: query, + }); } } diff --git a/src/common/repositories/DeedsRepository.ts b/src/common/repositories/DeedsRepository.ts index ce6bef38..80fbe59a 100644 --- a/src/common/repositories/DeedsRepository.ts +++ b/src/common/repositories/DeedsRepository.ts @@ -1,7 +1,7 @@ import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; -import { Deeds, Prisma } from "@prisma/client"; +import { Deeds, DocumentTypes, Prisma } from "@prisma/client"; import { Deed } from "le-coffre-resources/dist/Notary"; @Service() @@ -19,7 +19,7 @@ export default class DeedsRepository extends BaseRepository { /** * @description : Find many users */ - public async findMany(query: any): Promise { + public async findMany(query: Prisma.DeedsFindManyArgs) { query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); return this.model.findMany(query); } @@ -27,7 +27,7 @@ export default class DeedsRepository extends BaseRepository { /** * @description : Create a deed based on a deed type */ - public async create(deed: Deed): Promise { + public async create(deed: Deed): Promise { const createArgs: Prisma.DeedsCreateArgs = { data: { deed_type: { @@ -41,66 +41,53 @@ export default class DeedsRepository extends BaseRepository { where: { uid: deed.deed_type!.uid, }, - include: { deed_type_has_document_types: true }, + include: { 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_uid: relation.document_type_uid, - })), - skipDuplicates: true, - }, + if (deedTypeWithDocumentTypes.document_types) { + createArgs.data.document_types = { + connect: deedTypeWithDocumentTypes.document_types.map((documentType) => ({ + uid: documentType.uid, + })), }; } - return this.model.create(createArgs); + return this.model.create({ ...createArgs, include: { document_types: true } }); } /** * @description : Update data of a deed type */ - public async update(uid: string, deed: Deed): Promise { + public async update(uid: string, deed: Deed): Promise { const updateArgs: Prisma.DeedsUpdateArgs = { where: { uid: uid, }, - data: {}, + data: { + document_types: { + set: deed.document_types?.map((documentType) => ({ + uid: documentType.uid!, + })), + }, + }, include: { - deed_has_document_types: true, + document_types: true, }, }; - - if (deed.deed_has_document_types) { - updateArgs.data.deed_has_document_types = { - deleteMany: { deed_uid: uid }, - createMany: { - data: deed.deed_has_document_types.map((relation) => ({ - document_type_uid: relation.document_type.uid!, - })), - skipDuplicates: true, - }, - }; - } - return this.model.update(updateArgs); + + return this.model.update({ ...updateArgs, include: { document_types: true } }); } /** * @description : Find unique deed */ - public async findOneByUid(uid: string, query?: any): Promise { - const findOneArgs: Prisma.DeedsFindUniqueArgs = { + public async findOneByUid(uid: string, query?: Prisma.DeedsInclude) { + return this.model.findUnique({ where: { uid: uid, }, - }; - if (query) { - findOneArgs.include = query; - } - const deedTypeEntity = await this.model.findUnique(findOneArgs); - - return deedTypeEntity; + include: query, + }); } } diff --git a/src/common/repositories/DocumentTypesRepository.ts b/src/common/repositories/DocumentTypesRepository.ts index 04d785ba..0a0eab32 100644 --- a/src/common/repositories/DocumentTypesRepository.ts +++ b/src/common/repositories/DocumentTypesRepository.ts @@ -19,7 +19,7 @@ export default class DocumentTypesRepository extends BaseRepository { /** * @description : Find many document types */ - public async findMany(query: any): Promise { + public async findMany(query: Prisma.DocumentTypesFindManyArgs) { query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); return this.model.findMany(query); } @@ -28,7 +28,7 @@ export default class DocumentTypesRepository extends BaseRepository { * @description : Create a document type */ public async create(documentType: DocumentType): Promise { - return this.model.create({ + const createArgs: Prisma.DocumentTypesCreateArgs = { data: { name: documentType.name, public_description: documentType.public_description, @@ -39,14 +39,15 @@ export default class DocumentTypesRepository extends BaseRepository { }, }, }, - }); + }; + return this.model.create(createArgs); } /** * @description : update given document type */ public async update(uid: string, documentType: DocumentType): Promise { - return this.model.update({ + const updateArgs: Prisma.DocumentTypesUpdateArgs = { where: { uid: uid, }, @@ -60,24 +61,21 @@ export default class DocumentTypesRepository extends BaseRepository { uid: documentType.office!.uid, }, }, - }, - }); + } + }; + + return this.model.update(updateArgs); } /** * @description : find unique document type */ - public async findOneByUid(uid: string, query?: any): Promise { - const findOneArgs: Prisma.DocumentTypesFindUniqueArgs = { + public async findOneByUid(uid: string, query?: Prisma.DocumentTypesInclude) { + return this.model.findUnique({ where: { uid: uid, }, - }; - if (query) { - findOneArgs.include = query; - } - const documentTypeEntity = await this.model.findUnique(findOneArgs); - - return documentTypeEntity; + include: query, + }); } } diff --git a/src/common/repositories/DocumentsRepository.ts b/src/common/repositories/DocumentsRepository.ts index d6e784c9..2f1f08d6 100644 --- a/src/common/repositories/DocumentsRepository.ts +++ b/src/common/repositories/DocumentsRepository.ts @@ -1,7 +1,7 @@ import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; -import { Documents, EDocumentStatus, Prisma } from "@prisma/client"; +import { DocumentTypes, Documents, EDocumentStatus, Prisma } from "@prisma/client"; import { Document } from "le-coffre-resources/dist/SuperAdmin"; @Service() @@ -19,7 +19,7 @@ export default class DocumentsRepository extends BaseRepository { /** * @description : Find many documents */ - public async findMany(query: any): Promise { + public async findMany(query: Prisma.DocumentsFindManyArgs) { query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); return this.model.findMany(query); } @@ -27,8 +27,8 @@ export default class DocumentsRepository extends BaseRepository { /** * @description : Create a document */ - public async create(document: Document): Promise { - const documentCreated = await this.model.create({ + public async create(document: Document): Promise { + const createArgs: Prisma.DocumentsCreateArgs = { data: { folder: { connect: { @@ -46,7 +46,9 @@ export default class DocumentsRepository extends BaseRepository { }, }, }, - }); + }; + + const documentCreated = await this.model.create({...createArgs, include: {document_type: true}}); await this.instanceDb.documentHistory.create({ data: { @@ -64,15 +66,29 @@ export default class DocumentsRepository extends BaseRepository { /** * @description : Create many documents linked to an office folder */ - public async createMany(documents: Document[]): Promise { - return this.model.createMany({ + public async createMany(documents: Document[]): Promise { + const createArgs: Prisma.DocumentsCreateManyArgs = { data: documents.map((document) => ({ folder_uid: document.folder!.uid!, depositor_uid: document.depositor!.uid!, document_type_uid: document.document_type!.uid!, })), skipDuplicates: true, - }); + }; + + const batchPayload = await this.model.createMany(createArgs); + + const documentsCreated = await this.model.findMany({orderBy: {created_at: 'desc'}, take: batchPayload.count}); + + const createHistoryArgs: Prisma.DocumentHistoryCreateManyArgs = { + data: documentsCreated.map((document) => ({ + document_uid: document.uid!, + })), + skipDuplicates: true, + }; + await this.instanceDb.documentHistory.createMany(createHistoryArgs); + + return documentsCreated; } /** @@ -109,17 +125,12 @@ export default class DocumentsRepository extends BaseRepository { /** * @description : Find unique document */ - public async findOneByUid(uid: string, query?: any): Promise { - const findOneArgs: Prisma.DocumentsFindUniqueArgs = { + public async findOneByUid(uid: string, query?: Prisma.DocumentsInclude) { + return this.model.findUnique({ where: { uid: uid, }, - }; - if (query) { - findOneArgs.include = query; - } - const documentEntity = await this.model.findUnique(findOneArgs); - - return documentEntity; + include: query, + }); } } diff --git a/src/common/repositories/FilesRepository.ts b/src/common/repositories/FilesRepository.ts index 9a0816c9..d7998b54 100644 --- a/src/common/repositories/FilesRepository.ts +++ b/src/common/repositories/FilesRepository.ts @@ -1,7 +1,7 @@ import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; -import { Files } from "@prisma/client"; +import { Documents, Files, Prisma } from "@prisma/client"; import { File } from "le-coffre-resources/dist/SuperAdmin"; @Service() @@ -19,7 +19,7 @@ export default class FilesRepository extends BaseRepository { /** * @description : Find many files */ - public async findMany(query: any): Promise { + public async findMany(query: Prisma.FilesFindManyArgs) { query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); return this.model.findMany(query); } @@ -27,8 +27,8 @@ export default class FilesRepository extends BaseRepository { /** * @description : Create a file linked to a document */ - public async create(file: File, key: string): Promise { - return this.model.create({ + public async create(file: File, key: string): Promise { + const createArgs: Prisma.FilesCreateArgs = { data: { document: { connect: { @@ -40,30 +40,35 @@ export default class FilesRepository extends BaseRepository { mimetype: file.mimetype, size: file.size, key: key - }, - include: { document: true } - }); + } + }; + return this.model.create({...createArgs, include: { document: true }}); } /** * @description : Update data of a file */ - public async update(uid: string, file: File): Promise { - return this.model.update({ + public async update(uid: string, file: File, key: string): Promise { + const updateArgs: Prisma.FilesUpdateArgs = { where: { uid: uid, }, data: { + file_name: file.file_name, file_path: file.file_path, - }, - }); + mimetype: file.mimetype, + size: file.size, + key: key + } + }; + return this.model.update({...updateArgs, include: { document: true }}); } /** * @description : Delete a file key and archive */ - public async deleteKeyAndArchive(uid: string): Promise { - return this.model.update({ + public async deleteKeyAndArchive(uid: string): Promise { + const updateArgs: Prisma.FilesUpdateArgs = { where: { uid: uid, }, @@ -71,19 +76,19 @@ export default class FilesRepository extends BaseRepository { key: null, archived_at: new Date(Date.now()) } - }); + }; + return this.model.update({...updateArgs, include: { document: true }}); } /** * @description : Find unique file */ - public async findOneByUid(uid: string): Promise { - const fileEntity = await this.model.findUnique({ + public async findOneByUid(uid: string, query?: Prisma.FilesInclude) { + return this.model.findUnique({ where: { uid: uid, }, + include: query, }); - - return fileEntity; } } diff --git a/src/common/repositories/OfficeFoldersRepository.ts b/src/common/repositories/OfficeFoldersRepository.ts index d148cc46..70530560 100644 --- a/src/common/repositories/OfficeFoldersRepository.ts +++ b/src/common/repositories/OfficeFoldersRepository.ts @@ -1,7 +1,7 @@ import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; -import { EFolderStatus, OfficeFolders, Prisma } from "@prisma/client"; +import { Customers, Documents, EFolderStatus, OfficeFolders, Prisma, Users } from "@prisma/client"; import { OfficeFolder } from "le-coffre-resources/dist/SuperAdmin"; @Service() @@ -19,7 +19,7 @@ export default class OfficeFoldersRepository extends BaseRepository { /** * @description : Find many office folders */ - public async findMany(query: any): Promise { + public async findMany(query: Prisma.OfficeFoldersFindManyArgs) { query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); return this.model.findMany(query); } @@ -27,7 +27,7 @@ export default class OfficeFoldersRepository extends BaseRepository { /** * @description : Create new office folder with stakeholders */ - public async create(officeFolder: OfficeFolder): Promise { + public async create(officeFolder: OfficeFolder): Promise { const createArgs: Prisma.OfficeFoldersCreateArgs = { data: { folder_number: officeFolder.folder_number, @@ -36,7 +36,7 @@ export default class OfficeFoldersRepository extends BaseRepository { status: EFolderStatus.LIVE, deed: { connect: { - uid: officeFolder.deed?.uid + uid: officeFolder.deed?.uid, }, }, office: { @@ -44,28 +44,24 @@ export default class OfficeFoldersRepository extends BaseRepository { uid: officeFolder.office!.uid, }, }, - }, - include: { - office_folder_has_stakeholder: true, - }, - }; - if (officeFolder.office_folder_has_stakeholder) { - createArgs.data.office_folder_has_stakeholder = { - createMany: { - data: officeFolder.office_folder_has_stakeholder.map((relation) => ({ - user_stakeholder_uid: relation.user_stakeholder.uid!, + stakeholders: { + connect: officeFolder.stakeholders?.map((stakeholder) => ({ + uid: stakeholder.uid!, })), - skipDuplicates: true, - }, - }; - } - return this.model.create(createArgs); + } + } + }; + + return this.model.create({...createArgs, include: {stakeholders: true}}); } /** * @description : Update data of an office folder */ - public async update(officeFolderuid: string, officeFolder: OfficeFolder): Promise { + public async update( + officeFolderuid: string, + officeFolder: OfficeFolder, + ): Promise { const updateArgs: Prisma.OfficeFoldersUpdateArgs = { where: { uid: officeFolderuid, @@ -76,64 +72,44 @@ export default class OfficeFoldersRepository extends BaseRepository { description: officeFolder.description, status: EFolderStatus[officeFolder.status as keyof typeof EFolderStatus], archived_description: officeFolder.archived_description, - }, - include: { - office_folder_has_stakeholder: true, - office_folder_has_customers: true, - documents: true, + stakeholders: { + set: officeFolder.stakeholders?.map((stakeholder) => ({ + uid: stakeholder.uid!, + })), + }, + customers: { + set: officeFolder.customers?.map((customer) => ({ + uid: customer.uid!, + })), + }, + documents: { + set: officeFolder.documents?.map((document) => ({ + uid: document.uid!, + })), + }, }, }; - if (officeFolder.office_folder_has_stakeholder) { - updateArgs.data.office_folder_has_stakeholder = { - deleteMany: { office_folder_uid: officeFolderuid }, - createMany: { - data: officeFolder.office_folder_has_stakeholder.map((relation) => ({ - user_stakeholder_uid: relation.user_stakeholder.uid!, - })), - skipDuplicates: true, - }, - }; - } - if (officeFolder.office_folder_has_customers) { - updateArgs.data.office_folder_has_customers = { - deleteMany: { office_folder_uid: officeFolderuid }, - createMany: { - data: officeFolder.office_folder_has_customers.map((relation) => ({ - customer_uid: relation.customer.uid!, - })), - skipDuplicates: true, - }, - }; - } - if (officeFolder.documents) { - updateArgs.data.documents = { - createMany: { - data: officeFolder.documents.map((relation) => ({ - document_type_uid: relation.document_type!.uid!, - depositor_uid: relation.depositor!.uid!, - })), - skipDuplicates: true, - }, - }; - } - return this.model.update(updateArgs); + + return this.model.update({ + ...updateArgs, + include: { + stakeholders: true, + customers: true, + documents: true, + }, + }); } /** * @description : Find one office folder */ - public async findOneByUid(uid: string, query?: any): Promise { - const findOneArgs: Prisma.OfficeFoldersFindUniqueArgs = { + public async findOneByUid(uid: string, query?: Prisma.OfficeFoldersInclude) { + return this.model.findUnique({ where: { uid: uid, }, - }; - if (query) { - findOneArgs.include = query; - } - const officeFolderEntity = await this.model.findUnique(findOneArgs); - - return officeFolderEntity; + include: query, + }); } /** diff --git a/src/common/repositories/OfficeRolesRepository.ts b/src/common/repositories/OfficeRolesRepository.ts index a197e725..781920ef 100644 --- a/src/common/repositories/OfficeRolesRepository.ts +++ b/src/common/repositories/OfficeRolesRepository.ts @@ -1,7 +1,7 @@ import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; -import { OfficeRoles, Prisma } from "@prisma/client"; +import { OfficeRoles, Prisma, Rules } from "@prisma/client"; import { OfficeRole } from "le-coffre-resources/dist/SuperAdmin"; @Service() @@ -19,7 +19,7 @@ export default class OfficeRolesRepository extends BaseRepository { /** * @description : Find many officeRoles */ - public async findMany(query: any): Promise { + public async findMany(query: Prisma.OfficeRolesFindManyArgs) { query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); return this.model.findMany(query); } @@ -27,7 +27,7 @@ export default class OfficeRolesRepository extends BaseRepository { /** * @description : Create new officeRole with rules */ - public async create(officeRole: OfficeRole): Promise { + public async create(officeRole: OfficeRole): Promise { const createArgs: Prisma.OfficeRolesCreateArgs = { data: { name: officeRole.name, @@ -44,13 +44,13 @@ export default class OfficeRolesRepository extends BaseRepository { }, }; - return this.model.create(createArgs); + return this.model.create({...createArgs, include: {rules: true}}); } /** * @description : Update data of a officeRole with rules */ - public async update(officeRole: OfficeRole): Promise { + public async update(officeRole: OfficeRole): Promise { const updateArgs: Prisma.OfficeRolesUpdateArgs = { where: { uid: officeRole.uid, @@ -65,24 +65,19 @@ export default class OfficeRolesRepository extends BaseRepository { }, }; - return this.model.update(updateArgs); + return this.model.update({...updateArgs, include: {rules: true}}); } /** * @description : Find one officeRole */ - public async findOneByUid(uid: string, query?: any): Promise { - const findOneArgs: Prisma.OfficeRolesFindUniqueArgs = { + public async findOneByUid(uid: string, query?: Prisma.OfficeRolesInclude) { + return this.model.findUnique({ where: { uid: uid, }, - }; - if (query) { - findOneArgs.include = query; - } - const officeRoleEntity = await this.model.findUnique(findOneArgs); - - return officeRoleEntity; + include: query, + }); } /** diff --git a/src/common/repositories/OfficesRepository.ts b/src/common/repositories/OfficesRepository.ts index e74a1d52..f1b72517 100644 --- a/src/common/repositories/OfficesRepository.ts +++ b/src/common/repositories/OfficesRepository.ts @@ -19,7 +19,7 @@ export default class OfficesRepository extends BaseRepository { /** * @description : Find many users */ - public async findMany(query: any): Promise { + public async findMany(query: Prisma.OfficesFindManyArgs) { query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); return this.model.findMany(query); @@ -29,7 +29,7 @@ export default class OfficesRepository extends BaseRepository { * @description : Create an office */ public async create(office: OfficeRessource): Promise { - return this.model.create({ + const createArgs: Prisma.OfficesCreateArgs = { data: { idNot: office.idNot, name: office.name, @@ -43,14 +43,15 @@ export default class OfficesRepository extends BaseRepository { }, office_status: EOfficeStatus.DESACTIVATED, }, - }); + }; + return this.model.create(createArgs); } /** * @description : Update data from an office */ public async update(uid: string, office: OfficeRessource): Promise { - return this.model.update({ + const updateArgs: Prisma.OfficesUpdateArgs = { where: { uid: uid, }, @@ -65,23 +66,29 @@ export default class OfficesRepository extends BaseRepository { }, office_status: EOfficeStatus[office.office_status as keyof typeof EOfficeStatus], }, + }; + return this.model.update(updateArgs); + } + + /** + * @description : Find one office + */ + public async findOneByUid(uid: string, query?: Prisma.OfficesInclude) { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: query, }); } /** * @description : Find one office */ - public async findOneByUid(uid: string, query?: any): Promise { - const findOneArgs: Prisma.OfficesFindUniqueArgs = { - where: { - uid: uid, - }, - }; - if (query) { - findOneArgs.include = query; - } - const officeEntity = await this.model.findUnique(findOneArgs); - - return officeEntity; + public async findOneByProvider(providerName: string, id: string, query?: Prisma.OfficesInclude) { + return this.model.findUnique({ + where: { [providerName]: id }, + include: query, + }); } } diff --git a/src/common/repositories/RolesRepository.ts b/src/common/repositories/RolesRepository.ts index 56e5f919..20d203c7 100644 --- a/src/common/repositories/RolesRepository.ts +++ b/src/common/repositories/RolesRepository.ts @@ -19,7 +19,7 @@ export default class RolesRepository extends BaseRepository { /** * @description : Find many roles */ - public async findMany(query: any): Promise { + public async findMany(query: Prisma.RolesFindManyArgs) { query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); return this.model.findMany(query); } @@ -66,18 +66,13 @@ export default class RolesRepository extends BaseRepository { /** * @description : Find one role */ - public async findOneByUid(uid: string, query?: any): Promise { - const findOneArgs: Prisma.RolesFindUniqueArgs = { + public async findOneByUid(uid: string, query?: Prisma.RolesInclude) { + return this.model.findUnique({ where: { uid: uid, }, - }; - if (query) { - findOneArgs.include = query; - } - const roleEntity = await this.model.findUnique(findOneArgs); - - return roleEntity; + include: query, + }); } /** diff --git a/src/common/repositories/RulesRepository.ts b/src/common/repositories/RulesRepository.ts index 7d015429..431d2cc7 100644 --- a/src/common/repositories/RulesRepository.ts +++ b/src/common/repositories/RulesRepository.ts @@ -19,7 +19,7 @@ export default class RulesRepository extends BaseRepository { /** * @description : Find many rules */ - public async findMany(query: any): Promise { + public async findMany(query: Prisma.RulesFindManyArgs) { query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); return this.model.findMany(query); } @@ -56,18 +56,13 @@ export default class RulesRepository extends BaseRepository { /** * @description : Find one rule */ - public async findOneByUid(uid: string, query?: any): Promise { - const findOneArgs: Prisma.RulesFindUniqueArgs = { + public async findOneByUid(uid: string, query?: Prisma.RulesInclude) { + return this.model.findUnique({ where: { uid: uid, }, - }; - if (query) { - findOneArgs.include = query; - } - const ruleEntity = await this.model.findUnique(findOneArgs); - - return ruleEntity; + include: query, + }); } /** diff --git a/src/common/repositories/UsersRepository.ts b/src/common/repositories/UsersRepository.ts index 8767fb5a..a2f89268 100644 --- a/src/common/repositories/UsersRepository.ts +++ b/src/common/repositories/UsersRepository.ts @@ -157,18 +157,13 @@ export default class UsersRepository extends BaseRepository { /** * @description : Find one user */ - public async findOneByUid(uid: string, query?: any): Promise { - const findOneArgs: Prisma.UsersFindUniqueArgs = { + public async findOneByUid(uid: string, query?: Prisma.UsersInclude){ + return this.model.findUnique({ where: { uid: uid, }, - }; - if (query) { - findOneArgs.include = query; - } - const userEntity = await this.model.findUnique(findOneArgs); - - return userEntity; + include: query, + }); } /** diff --git a/src/services/common/AddressesService/AddressesService.ts b/src/services/common/AddressesService/AddressesService.ts deleted file mode 100644 index 4054aaba..00000000 --- a/src/services/common/AddressesService/AddressesService.ts +++ /dev/null @@ -1,27 +0,0 @@ -import AddressesRepository from "@Repositories/AddressesRepository"; -import BaseService from "@Services/BaseService"; -import { Addresses } from "@prisma/client"; -import { Service } from "typedi"; - -@Service() -export default class AddressesService extends BaseService { - constructor(private addressRepository: AddressesRepository) { - super(); - } - - /** - * @description : Get all addresses - * @throws {Error} If addresses cannot be get - */ - public async get(query: any): Promise { - return this.addressRepository.findMany(query); - } - - /** - * @description : Get a address by uid - * @throws {Error} If address cannot be get - */ - public async getByUid(uid: string): Promise { - return this.addressRepository.findOneByUid(uid); - } -} diff --git a/src/services/common/AuthService/AuthService.ts b/src/services/common/AuthService/AuthService.ts index 39348d51..2890f951 100644 --- a/src/services/common/AuthService/AuthService.ts +++ b/src/services/common/AuthService/AuthService.ts @@ -32,19 +32,29 @@ export default class AuthService extends BaseService { if (!user) return null; const rules: string[] = []; - if (user.office_role?.rules.length) { - user.office_role.rules.forEach((relation: any) => { - rules.push(relation.rule.name); + if (user.office_role) { + user.office_role.rules.forEach((rule) => { + rules.push(rule.name); }); - return { userId: user.uid, openId: {providerName: providerName, userId: user.idNot}, office_IdNot_Id: user.office_membership.idNot, role: user.role.name, rules: rules }; + return { + userId: user.uid, + openId: { providerName: providerName, userId: user.idNot }, + office_IdNot_Id: user.office_membership.idNot, + role: user.role.name, + rules: rules, + }; } - if (!rules.length) { - user.role.rules.forEach((relation: any) => { - rules.push(relation.rule.name); - }); - } - return { userId: user.uid, openId: {providerName: providerName, userId: user.idNot}, office_IdNot_Id: user.office_membership.idNot, role: user.role.name, rules: rules }; + user.role.rules.forEach((rule) => { + rules.push(rule.name); + }); + return { + userId: user.uid, + openId: { providerName: providerName, userId: user.idNot }, + office_IdNot_Id: user.office_membership.idNot, + role: user.role.name, + rules: rules, + }; } public generateAccessToken(user: any): string { diff --git a/src/services/common/ContactsService/ContactsService.ts b/src/services/common/ContactsService/ContactsService.ts deleted file mode 100644 index 116c9cbe..00000000 --- a/src/services/common/ContactsService/ContactsService.ts +++ /dev/null @@ -1,27 +0,0 @@ -import ContactsRepository from "@Repositories/ContactsRepository"; -import BaseService from "@Services/BaseService"; -import { Contacts } from "@prisma/client"; -import { Service } from "typedi"; - -@Service() -export default class ContactsService extends BaseService { - constructor(private contactRepository: ContactsRepository) { - super(); - } - - /** - * @description : Get all contacts - * @throws {Error} If contacts cannot be get - */ - public async get(query: any): Promise { - return this.contactRepository.findMany(query); - } - - /** - * @description : Get a contact by uid - * @throws {Error} If contact cannot be get - */ - public async getByUid(uid: string): Promise { - return this.contactRepository.findOneByUid(uid); - } -} diff --git a/src/services/common/FilesService/FilesService.ts b/src/services/common/FilesService/FilesService.ts index 78cf9588..6118a4eb 100644 --- a/src/services/common/FilesService/FilesService.ts +++ b/src/services/common/FilesService/FilesService.ts @@ -72,7 +72,8 @@ export default class FilesService extends BaseService { * @throws {Error} If file cannot be modified */ public async update(uid: string, file: File): Promise { - return this.filesRepository.update(uid, file); + const key = v4(); + return this.filesRepository.update(uid, file, key); } /** diff --git a/src/services/customer/DocumentsService/DocumentsService.ts b/src/services/customer/DocumentsService/DocumentsService.ts index e8aeec5e..e04a1864 100644 --- a/src/services/customer/DocumentsService/DocumentsService.ts +++ b/src/services/customer/DocumentsService/DocumentsService.ts @@ -1,4 +1,4 @@ -import { Documents, Prisma } from "@prisma/client"; +import { Documents } from "@prisma/client"; import { Document } from "le-coffre-resources/dist/Customer"; import DocumentsRepository from "@Repositories/DocumentsRepository"; import BaseService from "@Services/BaseService"; @@ -30,7 +30,7 @@ export default class DocumentsService extends BaseService { * @description : Create new documents * @throws {Error} If documents or one of them cannot be created */ - public async createMany(documents: Document[]): Promise { + public async createMany(documents: Document[]): Promise { return this.documentsRepository.createMany(documents); } diff --git a/src/services/super-admin/DocumentsService/DocumentsService.ts b/src/services/super-admin/DocumentsService/DocumentsService.ts index bf7a421b..5310e5bb 100644 --- a/src/services/super-admin/DocumentsService/DocumentsService.ts +++ b/src/services/super-admin/DocumentsService/DocumentsService.ts @@ -1,4 +1,4 @@ -import { Documents, Prisma } from "@prisma/client"; +import { Documents } from "@prisma/client"; import { Document } from "le-coffre-resources/dist/SuperAdmin"; import DocumentsRepository from "@Repositories/DocumentsRepository"; import BaseService from "@Services/BaseService"; @@ -30,7 +30,7 @@ export default class DocumentsService extends BaseService { * @description : Create new documents * @throws {Error} If documents or one of them cannot be created */ - public async createMany(documents: Document[]): Promise { + public async createMany(documents: Document[]): Promise { return this.documentsRepository.createMany(documents); } diff --git a/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts b/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts index 91fd7113..6de0e5dc 100644 --- a/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts +++ b/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts @@ -59,11 +59,11 @@ export default class OfficeFoldersService extends BaseService { * @throws {Error} If document cannot be deleted */ public async delete(uid: string): Promise { - const officeFolderEntity = await this.officeFoldersRepository.findOneByUid(uid, { office_folder_has_customers: true }); + const officeFolderEntity = await this.officeFoldersRepository.findOneByUid(uid, { customers: true }); if(!officeFolderEntity) throw new Error('office folder not found'); const officeFolder = OfficeFolder.hydrate(officeFolderEntity, { strategy: "excludeAll" }); - if (officeFolder.office_folder_has_customers && officeFolder.office_folder_has_customers.length !== 0) { + if (officeFolder.customers?.length) { throw new Error("This folder is used by customers"); } return this.officeFoldersRepository.delete(uid); diff --git a/src/test/config/Init.ts b/src/test/config/Init.ts index a488d9a0..74721622 100644 --- a/src/test/config/Init.ts +++ b/src/test/config/Init.ts @@ -5,6 +5,7 @@ import { ECivility, ECustomerStatus, Offices, + Prisma, PrismaClient, Roles, Rules, @@ -43,23 +44,26 @@ export const initDocumentType = (documentType: DocumentType, office: Office): Pr }); }; -export const initDeedType = (deedType: DeedType, office: Office, documentTypes?: string[]): Promise => { - return prisma.deedTypes.create({ +export const initDeedType = (deedType: DeedType): Promise => { + const createArgs: Prisma.DeedTypesCreateArgs = { data: { name: deedType.name, description: deedType.description, - archived_at: null, - office_uid: office.uid!, - deed_type_has_document_types: { - createMany: { - data: documentTypes!.map((documentType) => ({ - document_type_uid: documentType, - })), - skipDuplicates: true, + office: { + connect: { + uid: deedType.office!.uid, }, }, }, - }); + }; + if (deedType.document_types) { + createArgs.data.document_types = { + connect: deedType.document_types.map((documentType) => ({ + uid: documentType.uid, + })), + }; + } + return prisma.deedTypes.create(createArgs); }; export const initCustomers = (customer: Customer): Promise => { diff --git a/src/test/config/MockedData.ts b/src/test/config/MockedData.ts index 051fe912..89292170 100644 --- a/src/test/config/MockedData.ts +++ b/src/test/config/MockedData.ts @@ -144,14 +144,7 @@ export const deedType: DeedType = { office: office, created_at: null, updated_at: null, - deed_type_has_document_types: [ - { - document_type: documentType, - deed_type: new DeedType(), - created_at: null, - updated_at: null, - }, - ], + document_types: [documentType], }; export const deedType_: DeedType = { @@ -197,34 +190,8 @@ export const officeFolder: OfficeFolder = { status: "ARCHIVED", deed: deed, office: office, - office_folder_has_customers: [ - { - customer: customer, - office_folder: new OfficeFolder(), - created_at: null, - updated_at: null, - }, - { - customer: customer_, - office_folder: new OfficeFolder(), - created_at: null, - updated_at: null, - }, - ], - office_folder_has_stakeholder: [ - { - user_stakeholder: user, - office_folder: new OfficeFolder(), - created_at: null, - updated_at: null, - }, - { - user_stakeholder: user_, - office_folder: new OfficeFolder(), - created_at: null, - updated_at: null, - }, - ], + customers: [customer, customer_], + stakeholders: [user, user_], created_at: null, updated_at: null, }; diff --git a/src/test/services/super-admin/DeedService.test.ts b/src/test/services/super-admin/DeedService.test.ts index 6e67e3fd..2628cff0 100644 --- a/src/test/services/super-admin/DeedService.test.ts +++ b/src/test/services/super-admin/DeedService.test.ts @@ -16,7 +16,7 @@ beforeAll(async () => { office.uid = (await initOffice(office)).uid; documentType.uid = (await initDocumentType(documentType, office)).uid; documentType_.uid = (await initDocumentType(documentType_, office)).uid; - deedType.uid = (await initDeedType(deedType, office, [documentType.uid])).uid; + deedType.uid = (await initDeedType(deedType)).uid; }); afterAll(async () => { @@ -46,9 +46,9 @@ describe("test create function", () => { }); it("should have by default the same document types as its deed type ", async () => { - const deedWithDocumentTypes = await prisma.deeds.findFirstOrThrow({ include: { deed_has_document_types: true } }); - expect(deedWithDocumentTypes.deed_has_document_types.length).toEqual(1); - expect(deedWithDocumentTypes.deed_has_document_types[0]?.document_type_uid).toEqual(documentType.uid); + const deedWithDocumentTypes = await prisma.deeds.findFirstOrThrow({ include: { document_types: true } }); + expect(deedWithDocumentTypes.document_types.length).toEqual(1); + expect(deedWithDocumentTypes.document_types[0]?.uid).toEqual(documentType.uid); }); it("should create a the same deed based on existing deed type", async () => { @@ -83,20 +83,7 @@ describe("test update function", () => { const deedUid = (await prisma.deeds.findFirstOrThrow({ where: { deed_type_uid: deedType.uid } })).uid; let deedToUpdate: Deed = JSON.parse(JSON.stringify(deed)); - deedToUpdate.deed_has_document_types = [ - { - document_type: documentType, - deed: new Deed(), - created_at: null, - updated_at: null, - }, - { - document_type: documentType_, - deed: new Deed(), - created_at: null, - updated_at: null, - }, - ]; + deedToUpdate.document_types = [documentType, documentType_]; await DeedServiceTest.update(deedUid, deedToUpdate); @@ -105,30 +92,17 @@ describe("test update function", () => { uid: deedUid, }, include: { - deed_has_document_types: true, + document_types: true, }, }); - expect(deedUpdated.deed_has_document_types.length).toEqual(2); + expect(deedUpdated.document_types.length).toEqual(2); }); it("should not add document types to a deed type that already has those document types ", async () => { const deedUid = (await prisma.deeds.findFirstOrThrow({ where: { deed_type_uid: deedType.uid } })).uid; let deedToUpdate: Deed = JSON.parse(JSON.stringify(deed)); - deedToUpdate.deed_has_document_types = [ - { - document_type: documentType, - deed: new Deed(), - created_at: null, - updated_at: null, - }, - { - document_type: documentType_, - deed: new Deed(), - created_at: null, - updated_at: null, - }, - ]; + deedToUpdate.document_types = [documentType, documentType_]; await DeedServiceTest.update(deedUid, deedToUpdate); @@ -137,10 +111,10 @@ describe("test update function", () => { uid: deedUid, }, include: { - deed_has_document_types: true, + document_types: true, }, }); - expect(deedUpdated.deed_has_document_types.length).toEqual(2); + expect(deedUpdated.document_types.length).toEqual(2); }); it("should delete document types from a deed", async () => { @@ -148,7 +122,7 @@ describe("test update function", () => { let deedToUpdate: Deed = JSON.parse(JSON.stringify(deed)); // set relation between deed and document types empty - deedToUpdate.deed_has_document_types = []; + deedToUpdate.document_types = []; await DeedServiceTest.update(deedUid, deedToUpdate); @@ -157,10 +131,10 @@ describe("test update function", () => { uid: deedUid, }, include: { - deed_has_document_types: true, + document_types: true, }, }); - expect(deedUpdated.deed_has_document_types.length).toEqual(0); + expect(deedUpdated.document_types.length).toEqual(0); }); }); diff --git a/src/test/services/super-admin/DeedTypesService.test.ts b/src/test/services/super-admin/DeedTypesService.test.ts index af923ad1..57ea73d9 100644 --- a/src/test/services/super-admin/DeedTypesService.test.ts +++ b/src/test/services/super-admin/DeedTypesService.test.ts @@ -188,20 +188,7 @@ describe("test update function", () => { const deedTypeUid = (await prisma.deedTypes.findFirstOrThrow({ where: { name: deedType.name, office_uid: office.uid } })).uid; let deedTypeToUpdate: DeedType = JSON.parse(JSON.stringify(deedType)); - deedTypeToUpdate.deed_type_has_document_types = [ - { - document_type: documentType, - deed_type: new DeedType(), - created_at: null, - updated_at: null, - }, - { - document_type: documentType_, - deed_type: new DeedType(), - created_at: null, - updated_at: null, - }, - ]; + deedTypeToUpdate.document_types = [documentType, documentType_]; await DeedTypeServiceTest.update(deedTypeUid, deedTypeToUpdate); @@ -210,30 +197,17 @@ describe("test update function", () => { uid: deedTypeUid, }, include: { - deed_type_has_document_types: true, + document_types: true, }, }); - expect(deedTypeUpdated.deed_type_has_document_types.length).toEqual(2); + expect(deedTypeUpdated.document_types.length).toEqual(2); }); it("should not add document types to a deed type that already has those document types ", async () => { const deedTypeUid = (await prisma.deedTypes.findFirstOrThrow({ where: { name: deedType.name, office_uid: office.uid } })).uid; let deedTypeToUpdate: DeedType = JSON.parse(JSON.stringify(deedType)); - deedTypeToUpdate.deed_type_has_document_types = [ - { - document_type: documentType, - deed_type: new DeedType(), - created_at: null, - updated_at: null, - }, - { - document_type: documentType_, - deed_type: new DeedType(), - created_at: null, - updated_at: null, - }, - ]; + deedTypeToUpdate.document_types = [documentType, documentType_]; await DeedTypeServiceTest.update(deedTypeUid, deedTypeToUpdate); @@ -242,10 +216,10 @@ describe("test update function", () => { uid: deedTypeUid, }, include: { - deed_type_has_document_types: true, + document_types: true, }, }); - expect(deedTypeUpdated.deed_type_has_document_types.length).toEqual(2); + expect(deedTypeUpdated.document_types.length).toEqual(2); }); it("should delete document types from a deed", async () => { @@ -253,7 +227,7 @@ describe("test update function", () => { let deedTypeToUpdate: DeedType = JSON.parse(JSON.stringify(deedType)); // set relation between deed and document types empty - deedTypeToUpdate.deed_type_has_document_types = []; + deedTypeToUpdate.document_types = []; await DeedTypeServiceTest.update(deedTypeUid, deedTypeToUpdate); @@ -262,10 +236,10 @@ describe("test update function", () => { uid: deedTypeUid, }, include: { - deed_type_has_document_types: true, + document_types: true, }, }); - expect(deedTypeUpdated.deed_type_has_document_types.length).toEqual(0); + expect(deedTypeUpdated.document_types.length).toEqual(0); }); }); diff --git a/src/test/services/super-admin/OfficeFolderService.test.ts b/src/test/services/super-admin/OfficeFolderService.test.ts index c0c52549..78ea6f54 100644 --- a/src/test/services/super-admin/OfficeFolderService.test.ts +++ b/src/test/services/super-admin/OfficeFolderService.test.ts @@ -1,6 +1,6 @@ import "module-alias/register"; import "reflect-metadata"; -import { OfficeFolderHasCustomers, OfficeFolderHasStakeholders, PrismaClient } from "prisma/prisma-client"; +import { PrismaClient } from "prisma/prisma-client"; import { customer, customer_, deedType, documentType, documentType_, office, officeFolder, officeFolder_, user, user_ } from "@Test/config/MockedData"; import Container from "typedi"; import OfficeFoldersRepository from "@Repositories/OfficeFoldersRepository"; @@ -18,7 +18,7 @@ beforeAll(async () => { office.uid = (await initOffice(office)).uid; documentType.uid = (await initDocumentType(documentType, office)).uid; documentType_.uid = (await initDocumentType(documentType_, office)).uid; - deedType.uid = (await initDeedType(deedType, office, [documentType.uid])).uid; + deedType.uid = (await initDeedType(deedType)).uid; user.uid = (await initUsers(user)).uid; user_.uid = (await initUsers(user_)).uid; customer.uid = (await initCustomers(customer)).uid; @@ -72,40 +72,9 @@ describe("test create function", () => { it("should contains stakeholders", async () => { const officeFolderCreated = await prisma.officeFolders.findFirstOrThrow({ - include: { office_folder_has_stakeholder: true }, + include: { stakeholders: true }, }); - const stakeholderRelation = await prisma.officeFolderHasStakeholders.findUniqueOrThrow({ - where: { - office_folder_uid_user_stakeholder_uid: { - user_stakeholder_uid: user.uid!, - office_folder_uid: officeFolderCreated.uid, - }, - }, - }); - const stakeholderRelation_ = await prisma.officeFolderHasStakeholders.findUniqueOrThrow({ - where: { - office_folder_uid_user_stakeholder_uid: { - user_stakeholder_uid: user_.uid!, - office_folder_uid: officeFolderCreated.uid, - }, - }, - }); - expect(officeFolderCreated.office_folder_has_stakeholder.length).toEqual(2); - const stakeholder: OfficeFolderHasStakeholders = { - uid: stakeholderRelation.uid, - office_folder_uid: officeFolderCreated.uid, - user_stakeholder_uid: user.uid!, - created_at: officeFolderCreated.created_at, - updated_at: officeFolderCreated.updated_at, - }; - const stakeholder_: OfficeFolderHasStakeholders = { - uid: stakeholderRelation_.uid, - office_folder_uid: officeFolderCreated.uid, - user_stakeholder_uid: user_.uid!, - created_at: officeFolderCreated.created_at, - updated_at: officeFolderCreated.updated_at, - }; - expect(officeFolderCreated.office_folder_has_stakeholder).toEqual(expect.arrayContaining([stakeholder, stakeholder_])); + expect(officeFolderCreated.stakeholders).toEqual([user, user_]); }); it("should not create a new office folder with folder number already created", async () => { @@ -131,123 +100,51 @@ describe("test create function", () => { describe("test update function", () => { it("should add customers", async () => { let officeFolderCreated = await prisma.officeFolders.findFirstOrThrow({ - include: { office_folder_has_customers: true }, + include: { customers: true }, }); - expect(officeFolderCreated.office_folder_has_customers).toEqual([]); + expect(officeFolderCreated.customers).toEqual([]); // mocked data contains the customers await OfficeFolderServiceTest.update(officeFolderCreated.uid, officeFolder); - const customerRelation = await prisma.officeFolderHasCustomers.findUniqueOrThrow({ - where: { - office_folder_uid_customer_uid: { - customer_uid: customer.uid!, - office_folder_uid: officeFolderCreated.uid, - }, - }, - }); - const customerRelation_ = await prisma.officeFolderHasCustomers.findUniqueOrThrow({ - where: { - office_folder_uid_customer_uid: { - customer_uid: customer_.uid!, - office_folder_uid: officeFolderCreated.uid, - }, - }, - }); - officeFolderCreated = await prisma.officeFolders.findFirstOrThrow({ - include: { office_folder_has_customers: true }, + include: { customers: true }, }); - expect(officeFolderCreated.office_folder_has_customers.length).toEqual(2); - const officeFolderHasCustomer: OfficeFolderHasCustomers = { - uid: customerRelation.uid, - office_folder_uid: officeFolderCreated.uid, - customer_uid: customer.uid!, - created_at: customerRelation.created_at, - updated_at: customerRelation.updated_at, - }; - const officeFolderHasCustomer_: OfficeFolderHasCustomers = { - uid: customerRelation_.uid, - office_folder_uid: officeFolderCreated.uid, - customer_uid: customer_.uid!, - created_at: customerRelation_.created_at, - updated_at: customerRelation_.updated_at, - }; - expect(officeFolderCreated.office_folder_has_customers).toEqual( - expect.arrayContaining([officeFolderHasCustomer, officeFolderHasCustomer_]), - ); + expect(officeFolderCreated.customers.length).toEqual([customer, customer_].length); }); it("should remove customers", async () => { let officeFolderCreated = await prisma.officeFolders.findFirstOrThrow({ - include: { office_folder_has_customers: true }, + include: { customers: true }, }); - expect(officeFolderCreated.office_folder_has_customers.length).toEqual(2); + expect(officeFolderCreated.customers.length).toEqual(2); let officeFolderWithLessCustomers: OfficeFolder = JSON.parse(JSON.stringify(officeFolder)); - officeFolderWithLessCustomers.office_folder_has_customers!.pop(); + officeFolderWithLessCustomers.customers!.pop(); // mocked data contains the customers await OfficeFolderServiceTest.update(officeFolderCreated.uid, officeFolderWithLessCustomers); - const customerRelation = await prisma.officeFolderHasCustomers.findUniqueOrThrow({ - where: { - office_folder_uid_customer_uid: { - customer_uid: customer.uid!, - office_folder_uid: officeFolderCreated.uid, - }, - }, - }); - - officeFolderCreated = await prisma.officeFolders.findFirstOrThrow({ - include: { office_folder_has_customers: true }, - }); - - expect(officeFolderCreated.office_folder_has_customers.length).toEqual(1); - const officeFolderHasCustomer: OfficeFolderHasCustomers = { - uid: customerRelation.uid, - office_folder_uid: officeFolderCreated.uid, - customer_uid: customer.uid!, - created_at: customerRelation.created_at, - updated_at: customerRelation.updated_at, - }; - expect(officeFolderCreated.office_folder_has_customers).toEqual([officeFolderHasCustomer]); + expect(officeFolderCreated.customers.length).toEqual([customer]); }); it("should remove stakeholders", async () => { let officeFolderCreated = await prisma.officeFolders.findFirstOrThrow({ - include: { office_folder_has_stakeholder: true }, + include: { stakeholders: true }, }); - expect(officeFolderCreated.office_folder_has_stakeholder.length).toEqual(2); + expect(officeFolderCreated.stakeholders.length).toEqual(2); let officeFolderWithLessStakeholders: OfficeFolder = JSON.parse(JSON.stringify(officeFolder)); - officeFolderWithLessStakeholders.office_folder_has_stakeholder!.pop(); + officeFolderWithLessStakeholders.stakeholders!.pop(); // mocked data contains the customers await OfficeFolderServiceTest.update(officeFolderCreated.uid, officeFolderWithLessStakeholders); - const stakeholderRelation = await prisma.officeFolderHasStakeholders.findUniqueOrThrow({ - where: { - office_folder_uid_user_stakeholder_uid: { - user_stakeholder_uid: user.uid!, - office_folder_uid: officeFolderCreated.uid, - }, - }, - }); - officeFolderCreated = await prisma.officeFolders.findFirstOrThrow({ - include: { office_folder_has_stakeholder: true }, + include: { stakeholders: true }, }); - expect(officeFolderCreated.office_folder_has_stakeholder.length).toEqual(1); - const officeFolderHasStakeholder: OfficeFolderHasStakeholders = { - uid: stakeholderRelation.uid, - office_folder_uid: officeFolderCreated.uid, - user_stakeholder_uid: user.uid!, - created_at: stakeholderRelation.created_at, - updated_at: stakeholderRelation.updated_at, - }; - expect(officeFolderCreated.office_folder_has_stakeholder).toEqual([officeFolderHasStakeholder]); + expect(officeFolderCreated.stakeholders).toEqual([user]); }); it("should archivate an office folder", async () => { const officeFolderCreated = await prisma.officeFolders.findFirstOrThrow({}); diff --git a/tsconfig.json b/tsconfig.json index b0dd3f39..88257ffd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -69,7 +69,7 @@ "@ControllerPattern/*": [ "src/common/system/controller-pattern/*" ], - "@Test/*":[ + "@Test/*": [ "src/test/*" ], }, @@ -95,8 +95,7 @@ "include": [ "**/*.ts", "**/*.tsx", - "src/app/api/admin/UsersController.ts" -, "src/common/databases/seeders/seeder.ts" ], + ], "exclude": [ "node_modules" ] From afedf92526630336948111369be361a9ff927119 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Fri, 30 Jun 2023 09:57:30 +0200 Subject: [PATCH 026/134] fix reflect-metadata import --- src/entries/App.ts | 3 --- src/services/common/AuthService/AuthService.ts | 1 - 2 files changed, 4 deletions(-) diff --git a/src/entries/App.ts b/src/entries/App.ts index 0b426b5d..f500c7f6 100644 --- a/src/entries/App.ts +++ b/src/entries/App.ts @@ -5,10 +5,8 @@ import ExpressServer from "@Common/system/ExpressServer"; import routes from "@App/index"; import cors from "cors"; import bodyParser from "body-parser"; -// import TezosLink from "@Common/databases/TezosLink"; import errorHandler from "@App/middlewares/ErrorHandler"; import { BackendVariables } from "@Common/config/variables/Variables"; -//import fileHandler from "@App/middlewares/FileHandler"; import multer from "multer"; @@ -22,7 +20,6 @@ const storage = multer.memoryStorage(); const rootUrl = variables.APP_ROOT_URL; const label = variables.APP_LABEL ?? "Unknown Service"; - // Container.get(TezosLink).connect(); Container.get(ExpressServer).init({ label, port: parseInt(port), diff --git a/src/services/common/AuthService/AuthService.ts b/src/services/common/AuthService/AuthService.ts index 2890f951..0a6088a7 100644 --- a/src/services/common/AuthService/AuthService.ts +++ b/src/services/common/AuthService/AuthService.ts @@ -1,4 +1,3 @@ -import "reflect-metadata"; import jwt, { VerifyCallback } from "jsonwebtoken"; import BaseService from "@Services/BaseService"; import { BackendVariables } from "@Common/config/variables/Variables"; From c2856de59a4256f4ae63671abfe0d54a5fec1a28 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Mon, 3 Jul 2023 16:17:20 +0200 Subject: [PATCH 027/134] add office membership control on services --- src/app/api/idnot/UserController.ts | 1 + .../api/super-admin/DeedTypesController.ts | 13 +++-- src/app/api/super-admin/DeedsController.ts | 11 +++- .../super-admin/DocumentTypesController.ts | 19 +++---- .../api/super-admin/DocumentsController.ts | 16 ++++-- src/app/api/super-admin/FilesController.ts | 17 +++--- .../super-admin/OfficeFoldersController.ts | 28 +++------ .../api/super-admin/OfficeRolesController.ts | 14 +++-- src/app/api/super-admin/UsersController.ts | 2 +- .../OfficeMembershipHandlers/DeedHandler.ts | 35 ++++++++++++ .../DeedTypeHandler.ts | 43 ++++++++++++++ .../DocumentHandler.ts | 40 +++++++++++++ .../DocumentTypeHandler.ts | 32 +++++++++++ .../OfficeMembershipHandlers/FileHandler.ts | 35 ++++++++++++ .../OfficeMembershipHandlers/FolderHandler.ts | 57 +++++++++++++++++++ .../OfficeRoleHandler.ts | 32 +++++++++++ .../OfficeMembershipHandlers/UserHandler.ts | 32 +++++++++++ .../20230703120600_v9/migration.sql | 23 ++++++++ .../20230703122557_v10/migration.sql | 15 +++++ .../20230703123246_v11/migration.sql | 14 +++++ .../repositories/DeedTypesRepository.ts | 12 ++++ src/common/repositories/DeedsRepository.ts | 15 +++++ .../repositories/DocumentTypesRepository.ts | 12 ++++ .../repositories/DocumentsRepository.ts | 12 ++++ src/common/repositories/FilesRepository.ts | 12 ++++ .../repositories/OfficeFoldersRepository.ts | 12 ++++ .../repositories/OfficeRolesRepository.ts | 12 ++++ src/common/repositories/UsersRepository.ts | 34 +++++++---- .../common/AuthService/AuthService.ts | 6 +- .../common/FilesService/FilesService.ts | 16 ++++-- .../DeedTypesService/DeedTypesService.ts | 14 ++++- .../super-admin/DeedsService/DeedsService.ts | 10 +++- .../DocumentTypesService.ts | 14 ++++- .../DocumentsService/DocumentsService.ts | 14 ++++- .../OfficeFoldersService.ts | 13 ++++- .../OfficeRolesService/OfficeRolesService.ts | 12 +++- .../super-admin/UsersService/UsersService.ts | 10 +++- 37 files changed, 618 insertions(+), 91 deletions(-) create mode 100644 src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts create mode 100644 src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts create mode 100644 src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts create mode 100644 src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts create mode 100644 src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts create mode 100644 src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts create mode 100644 src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts create mode 100644 src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts create mode 100644 src/common/databases/migrations/20230703120600_v9/migration.sql create mode 100644 src/common/databases/migrations/20230703122557_v10/migration.sql create mode 100644 src/common/databases/migrations/20230703123246_v11/migration.sql diff --git a/src/app/api/idnot/UserController.ts b/src/app/api/idnot/UserController.ts index 24863fff..4e15195f 100644 --- a/src/app/api/idnot/UserController.ts +++ b/src/app/api/idnot/UserController.ts @@ -49,6 +49,7 @@ export default class UserController extends ApiController { //success this.httpSuccess(response, { accessToken, refreshToken }); } catch (error) { + console.log(error); this.httpInternalError(response); return; } diff --git a/src/app/api/super-admin/DeedTypesController.ts b/src/app/api/super-admin/DeedTypesController.ts index d890bc2c..02805535 100644 --- a/src/app/api/super-admin/DeedTypesController.ts +++ b/src/app/api/super-admin/DeedTypesController.ts @@ -3,11 +3,12 @@ import { Controller, Get, Post, Put } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import { Service } from "typedi"; import DeedTypesService from "@Services/super-admin/DeedTypesService/DeedTypesService"; -import { DeedTypes } from "@prisma/client"; +import { DeedTypes, Prisma } from "@prisma/client"; import { DeedType } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import deedTypeHandler from "@App/middlewares/OfficeMembershipHandlers/DeedTypeHandler"; @Controller() @Service() @@ -25,6 +26,10 @@ export default class DeedTypesController extends ApiController { try { //get query const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.DeedTypesWhereInput = {office: {uid: officeId}}; + query.where = officeWhereInput; + //call service to get prisma entity const deedTypeEntities: DeedTypes[] = await this.deedTypesService.get(query); @@ -43,7 +48,7 @@ export default class DeedTypesController extends ApiController { * @description Create a new deedtype * @returns Deedtype created */ - @Post("/api/v1/super-admin/deed-types", [authHandler,ruleHandler]) + @Post("/api/v1/super-admin/deed-types", [authHandler,ruleHandler,deedTypeHandler]) protected async post(req: Request, response: Response) { try { //init DeedType resource with request body values @@ -72,7 +77,7 @@ export default class DeedTypesController extends ApiController { * @description Modify a specific deedtype by uid * @returns Deedtype modified */ - @Put("/api/v1/super-admin/deed-types/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/deed-types/:uid", [authHandler,ruleHandler,deedTypeHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -114,7 +119,7 @@ export default class DeedTypesController extends ApiController { * @description Get a specific deedtype by uid * @returns IDeedtype */ - @Get("/api/v1/super-admin/deed-types/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/deed-types/:uid", [authHandler,ruleHandler,deedTypeHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/DeedsController.ts b/src/app/api/super-admin/DeedsController.ts index 2dd94592..e08a4163 100644 --- a/src/app/api/super-admin/DeedsController.ts +++ b/src/app/api/super-admin/DeedsController.ts @@ -3,11 +3,12 @@ import { Controller, Get, Put } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import DeedsService from "@Services/super-admin/DeedsService/DeedsService"; import { Service } from "typedi"; -import { Deeds } from "@prisma/client"; +import { Deeds, Prisma } from "@prisma/client"; import { Deed } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import deedHandler from "@App/middlewares/OfficeMembershipHandlers/DeedHandler"; @Controller() @Service() @@ -25,6 +26,10 @@ export default class DeedsController extends ApiController { try { //get query const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.DeedsWhereInput = { deed_type: {office: {uid: officeId}}}; + query.where = officeWhereInput; + //call service to get prisma entity const deedEntities: Deeds[] = await this.deedsService.get(query); @@ -43,7 +48,7 @@ export default class DeedsController extends ApiController { * @description Get a specific deed by uid * @returns Deed */ - @Get("/api/v1/super-admin/deeds/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/deeds/:uid", [authHandler,ruleHandler,deedHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -81,7 +86,7 @@ export default class DeedsController extends ApiController { /** * @description Modify a specific deed by uid */ - @Put("/api/v1/super-admin/deeds/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/deeds/:uid", [authHandler,ruleHandler,deedHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/DocumentTypesController.ts b/src/app/api/super-admin/DocumentTypesController.ts index 99cef9ac..7251fee5 100644 --- a/src/app/api/super-admin/DocumentTypesController.ts +++ b/src/app/api/super-admin/DocumentTypesController.ts @@ -3,12 +3,13 @@ import { Controller, Get, Post, Put } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import { Service } from "typedi"; import DocumentTypesService from "@Services/super-admin/DocumentTypesService/DocumentTypesService"; -import { DocumentTypes } from "@prisma/client"; +import { DocumentTypes, Prisma } from "@prisma/client"; import ObjectHydrate from "@Common/helpers/ObjectHydrate"; import { DocumentType } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import documentTypeHandler from "@App/middlewares/OfficeMembershipHandlers/DocumentTypeHandler"; @Controller() @Service() @@ -25,6 +26,9 @@ export default class DocumentTypesController extends ApiController { try { //get query const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.DocumentTypesWhereInput = {office: {uid: officeId}}; + query.where = officeWhereInput; //call service to get prisma entity const documentTypeEntities: DocumentTypes[] = await this.documentTypesService.get(query); @@ -45,7 +49,7 @@ export default class DocumentTypesController extends ApiController { /** * @description Create a new documentType */ - @Post("/api/v1/super-admin/document-types", [authHandler,ruleHandler]) + @Post("/api/v1/super-admin/document-types", [authHandler,ruleHandler,documentTypeHandler]) protected async post(req: Request, response: Response) { try { //init DocumentType resource with request body values @@ -69,7 +73,7 @@ export default class DocumentTypesController extends ApiController { /** * @description Modify a specific documentType by uid */ - @Put("/api/v1/super-admin/document-types/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/document-types/:uid", [authHandler,ruleHandler,documentTypeHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -109,7 +113,7 @@ export default class DocumentTypesController extends ApiController { /** * @description Get a specific documentType by uid */ - @Get("/api/v1/super-admin/document-types/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/document-types/:uid", [authHandler,ruleHandler,documentTypeHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -128,13 +132,8 @@ export default class DocumentTypesController extends ApiController { documentTypeEntity = await this.documentTypesService.getByUid(uid); } - if (!documentTypeEntity) { - this.httpNotFoundRequest(response, "document not found"); - return; - } - //Hydrate ressource with prisma entity - const user = ObjectHydrate.hydrate(new DocumentType(), documentTypeEntity, { strategy: "excludeAll" }); + const user = ObjectHydrate.hydrate(new DocumentType(), documentTypeEntity!, { strategy: "excludeAll" }); //success this.httpSuccess(response, user); diff --git a/src/app/api/super-admin/DocumentsController.ts b/src/app/api/super-admin/DocumentsController.ts index cfc5bb2f..e4800a7b 100644 --- a/src/app/api/super-admin/DocumentsController.ts +++ b/src/app/api/super-admin/DocumentsController.ts @@ -3,11 +3,12 @@ import { Controller, Delete, Get, Post, Put } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import { Service } from "typedi"; import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; -import { Documents } from "@prisma/client"; +import { Documents, Prisma } from "@prisma/client"; import { Document } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import documentHandler from "@App/middlewares/OfficeMembershipHandlers/DocumentHandler"; @Controller() @Service() @@ -25,9 +26,12 @@ export default class DocumentsController extends ApiController { try { //get query const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.DocumentsWhereInput = { document_type: {office: {uid: officeId}}}; + query.where = officeWhereInput; //call service to get prisma entity - const documentEntities: Documents[] = await this.documentsService.get(query); + const documentEntities = await this.documentsService.get(query); //Hydrate ressource with prisma entity const documents = Document.hydrateArray(documentEntities, { strategy: "excludeAll" }); @@ -44,7 +48,7 @@ export default class DocumentsController extends ApiController { * @description Create a new document * @returns IDocument created */ - @Post("/api/v1/super-admin/documents", [authHandler,ruleHandler]) + @Post("/api/v1/super-admin/documents", [authHandler,ruleHandler,documentHandler]) protected async post(req: Request, response: Response) { try { //init Document resource with request body values @@ -72,7 +76,7 @@ export default class DocumentsController extends ApiController { /** * @description Update a specific document */ - @Put("/api/v1/super-admin/documents/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/documents/:uid", [authHandler,ruleHandler,documentHandler]) protected async update(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -111,7 +115,7 @@ export default class DocumentsController extends ApiController { /** * @description Delete a specific document */ - @Delete("/api/v1/super-admin/documents/:uid", [authHandler,ruleHandler]) + @Delete("/api/v1/super-admin/documents/:uid", [authHandler,ruleHandler,documentHandler]) protected async delete(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -144,7 +148,7 @@ export default class DocumentsController extends ApiController { /** * @description Get a specific document by uid */ - @Get("/api/v1/super-admin/documents/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/documents/:uid", [authHandler,ruleHandler,documentHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/FilesController.ts b/src/app/api/super-admin/FilesController.ts index 465e684f..915596e3 100644 --- a/src/app/api/super-admin/FilesController.ts +++ b/src/app/api/super-admin/FilesController.ts @@ -3,12 +3,13 @@ import { Controller, Delete, Get, Post, Put } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import { Service } from "typedi"; import FilesService from "@Services/common/FilesService/FilesService"; -import { Files } from "@prisma/client"; +import { Files, Prisma } from "@prisma/client"; import { File } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import fileHandler from "@App/middlewares/FileHandler"; @Controller() @Service() @@ -26,7 +27,9 @@ export default class FilesController extends ApiController { try { //get query const query = JSON.parse(req.query["q"] as string); - + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.FilesWhereInput = {document: {folder: {office: {uid: officeId}}}}; + query.where = officeWhereInput; //call service to get prisma entity const fileEntities = await this.filesService.get(query); @@ -44,7 +47,7 @@ export default class FilesController extends ApiController { /** * @description Get a specific File by uid */ - @Get("/api/v1/super-admin/files/download/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/files/download/:uid", [authHandler,ruleHandler,fileHandler]) protected async download(req: Request, response: Response) { const uid = req.params["uid"]; if (!uid) { @@ -73,7 +76,7 @@ export default class FilesController extends ApiController { * @description Create a new File * @returns File created */ - @Post("/api/v1/super-admin/files", [authHandler,ruleHandler]) + @Post("/api/v1/super-admin/files", [authHandler,ruleHandler,fileHandler]) protected async post(req: Request, response: Response) { try { //get file @@ -114,7 +117,7 @@ export default class FilesController extends ApiController { /** * @description Update a specific file */ - @Put("/api/v1/super-admin/files/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/files/:uid", [authHandler,ruleHandler,fileHandler]) protected async update(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -152,7 +155,7 @@ export default class FilesController extends ApiController { /** * @description Delete a specific File */ - @Delete("/api/v1/super-admin/files/:uid", [authHandler,ruleHandler]) + @Delete("/api/v1/super-admin/files/:uid", [authHandler,ruleHandler,fileHandler]) protected async delete(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -190,7 +193,7 @@ export default class FilesController extends ApiController { /** * @description Get a specific File by uid */ - @Get("/api/v1/super-admin/files/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/files/:uid", [authHandler,ruleHandler,fileHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/OfficeFoldersController.ts b/src/app/api/super-admin/OfficeFoldersController.ts index 6999e03b..c4b037c4 100644 --- a/src/app/api/super-admin/OfficeFoldersController.ts +++ b/src/app/api/super-admin/OfficeFoldersController.ts @@ -3,11 +3,12 @@ import { Controller, Delete, Get, Post, Put } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import OfficeFoldersService from "@Services/super-admin/OfficeFoldersService/OfficeFoldersService"; import { Service } from "typedi"; -import { OfficeFolders } from "@prisma/client"; +import { OfficeFolders, Prisma } from "@prisma/client"; import { OfficeFolder } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import folderHandler from "@App/middlewares/OfficeMembershipHandlers/FolderHandler"; @Controller() @Service() @@ -24,7 +25,9 @@ export default class OfficeFoldersController extends ApiController { try { //get query const query = JSON.parse(req.query["q"] as string); - + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.OfficeFoldersWhereInput = {office: {uid: officeId}}; + query.where = officeWhereInput; //call service to get prisma entity const officeFolderEntities: OfficeFolders[] = await this.officeFoldersService.get(query); @@ -43,25 +46,12 @@ export default class OfficeFoldersController extends ApiController { /** * @description Create a new folder */ - @Post("/api/v1/super-admin/folders", [authHandler,ruleHandler]) + @Post("/api/v1/super-admin/folders", [authHandler,ruleHandler,folderHandler]) protected async post(req: Request, response: Response) { try { //init OfficeFolder resource with request body values const officeFolderRessource = OfficeFolder.hydrate(req.body); await officeFolderRessource.validateOrReject?.({ groups: ["createFolder"] , forbidUnknownValues: false }); - - const officeFolderNumberExist = await this.officeFoldersService.get({where: {folder_number: officeFolderRessource.folder_number}}); - - - if (officeFolderNumberExist.length > 0) { - this.httpValidationError(response, [{ - property: "folder_number", - constraints: { - unique: "folder_number must be unique", - }, - }]); - return; - } //call service to get prisma entity const officeFolderEntity = await this.officeFoldersService.create(officeFolderRessource); @@ -80,7 +70,7 @@ export default class OfficeFoldersController extends ApiController { /** * @description Modify a specific folder by uid */ - @Put("/api/v1/super-admin/folders/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/folders/:uid", [authHandler,ruleHandler,folderHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -122,7 +112,7 @@ export default class OfficeFoldersController extends ApiController { * @description Get a specific folder by uid * @returns IFolder */ - @Get("/api/v1/super-admin/folders/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/folders/:uid", [authHandler,ruleHandler,folderHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -161,7 +151,7 @@ export default class OfficeFoldersController extends ApiController { /** * @description Delete a specific folder */ - @Delete("/api/v1/super-admin/folders/:uid", [authHandler,ruleHandler]) + @Delete("/api/v1/super-admin/folders/:uid", [authHandler,ruleHandler,folderHandler]) protected async delete(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/OfficeRolesController.ts b/src/app/api/super-admin/OfficeRolesController.ts index dd7de7a0..2d5c422d 100644 --- a/src/app/api/super-admin/OfficeRolesController.ts +++ b/src/app/api/super-admin/OfficeRolesController.ts @@ -5,9 +5,10 @@ import OfficeRolesService from "@Services/super-admin/OfficeRolesService/OfficeR import { Service } from "typedi"; import { validateOrReject } from "class-validator"; import { OfficeRole } from "le-coffre-resources/dist/Notary"; -import { OfficeRoles } from "@prisma/client"; +import { OfficeRoles, Prisma } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import officeRoleHandler from "@App/middlewares/OfficeMembershipHandlers/OfficeRoleHandler"; @Controller() @Service() @@ -24,7 +25,10 @@ export default class OfficeRolesController extends ApiController { try { //get query const query = JSON.parse(req.query["q"] as string); - + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.OfficeRolesWhereInput = {office: {uid: officeId}}; + query.where = officeWhereInput; + //call service to get prisma entity const officeRolesEntities = await this.officeRolesService.get(query); @@ -42,7 +46,7 @@ export default class OfficeRolesController extends ApiController { /** * @description Create a new officeRole */ - @Post("/api/v1/super-admin/office-roles", [authHandler,ruleHandler]) + @Post("/api/v1/super-admin/office-roles", [authHandler,ruleHandler,officeRoleHandler]) protected async getAddresses(req: Request, response: Response) { try { //init IOfficeRole resource with request body values @@ -70,7 +74,7 @@ export default class OfficeRolesController extends ApiController { /** * @description Modify a specific officeRole by uid */ - @Put("/api/v1/super-admin/office-roles/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/office-roles/:uid", [authHandler,ruleHandler,officeRoleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -111,7 +115,7 @@ export default class OfficeRolesController extends ApiController { /** * @description Get a specific officeRole by uid */ - @Get("/api/v1/super-admin/office-roles/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/office-roles/:uid", [authHandler,ruleHandler,officeRoleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index aa2de89c..0d2032ef 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -43,7 +43,7 @@ export default class UsersController extends ApiController { * @description Create a new user */ @Post("/api/v1/super-admin/users", [authHandler, ruleHandler]) - protected async getAddresses(req: Request, response: Response) { + protected async create(req: Request, response: Response) { try { //init IUser resource with request body values const userEntity = User.hydrate(req.body); diff --git a/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts new file mode 100644 index 00000000..7c674676 --- /dev/null +++ b/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts @@ -0,0 +1,35 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import DeedsService from "@Services/super-admin/DeedsService/DeedsService"; +import { DocumentType } from "le-coffre-resources/dist/SuperAdmin"; +import { NextFunction, Request, Response } from "express"; +import Container from "typedi"; + +export default async function deedHandler(req: Request, response: Response, next: NextFunction) { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const documentTypes: DocumentType[] = req.body.document_types; + + const deedService = Container.get(DeedsService); + const deed = await deedService.getOneByUidWithOffice(uid!); + + if (!deed) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + + if (deed.deed_type.office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + + if(documentTypes) { + documentTypes.forEach((documentType) => { + if (documentType.office?.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + }); + } + + next(); +} diff --git a/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts new file mode 100644 index 00000000..1f2ae532 --- /dev/null +++ b/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts @@ -0,0 +1,43 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import DeedTypesService from "@Services/super-admin/DeedTypesService/DeedTypesService"; +import { DocumentType } from "le-coffre-resources/dist/SuperAdmin"; +import { NextFunction, Request, Response } from "express"; +import Container from "typedi"; + +export default async function deedTypeHandler(req: Request, response: Response, next: NextFunction) { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const documentTypes: DocumentType[] = req.body.document_types; + const office = req.body.office; + + if(office && office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + + if (uid) { + const deedTypeService = Container.get(DeedTypesService); + const deedType = await deedTypeService.getByUidWithOffice(uid!); + + if (!deedType) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + + if (deedType.office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + if (documentTypes) { + documentTypes.forEach((documentType) => { + if (documentType.office?.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + }); + } + + next(); +} diff --git a/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts new file mode 100644 index 00000000..8690b0c6 --- /dev/null +++ b/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts @@ -0,0 +1,40 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import { DocumentType } from "le-coffre-resources/dist/SuperAdmin"; +import { NextFunction, Request, Response } from "express"; +import Container from "typedi"; +import { OfficeFolder } from "le-coffre-resources/dist/SuperAdmin"; +import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; + +export default async function documentHandler(req: Request, response: Response, next: NextFunction) { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const documentType: DocumentType = req.body.document_type; + const folder: OfficeFolder = req.body.folder; + + if (folder && folder.office?.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + + if (documentType && documentType.office?.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + + if (uid) { + const documentService = Container.get(DocumentsService); + const document = await documentService.getByUidWithOffice(uid!); + + if (!document) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + + if (document.document_type.office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + next(); +} diff --git a/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts new file mode 100644 index 00000000..14d0a148 --- /dev/null +++ b/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts @@ -0,0 +1,32 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import { NextFunction, Request, Response } from "express"; +import Container from "typedi"; +import DocumentTypesService from "@Services/super-admin/DocumentTypesService/DocumentTypesService"; + +export default async function documentTypeHandler(req: Request, response: Response, next: NextFunction) { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const office = req.body.office; + + if (office && office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + + if (uid) { + const documentTypeService = Container.get(DocumentTypesService); + const documentType = await documentTypeService.getByUidWithOffice(uid!); + + if (!documentType) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + + if (documentType.office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + next(); +} diff --git a/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts new file mode 100644 index 00000000..446c411b --- /dev/null +++ b/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts @@ -0,0 +1,35 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import { NextFunction, Request, Response } from "express"; +import Container from "typedi"; +import { OfficeFolder } from "le-coffre-resources/dist/SuperAdmin"; +import FilesService from "@Services/common/FilesService/FilesService"; + +export default async function fileHandler(req: Request, response: Response, next: NextFunction) { + const officeId = req.body.user.office_Id; + let uid = req.path && req.path.split("/")[5]; + const folder: OfficeFolder = req.body.document.folder; + + if (folder && folder.office?.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + + if(!uid) uid = req.path && req.path.split("/")[6]; + + if (uid) { + const fileService = Container.get(FilesService); + const file = await fileService.getByUidWithOffice(uid!); + + if (!file) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + + if (file.document.folder.office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + next(); +} diff --git a/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts new file mode 100644 index 00000000..34a587fa --- /dev/null +++ b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts @@ -0,0 +1,57 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import { NextFunction, Request, Response } from "express"; +import Container from "typedi"; +import OfficeFoldersService from "@Services/super-admin/OfficeFoldersService/OfficeFoldersService"; +import DeedTypesService from "@Services/super-admin/DeedTypesService/DeedTypesService"; + +export default async function folderHandler(req: Request, response: Response, next: NextFunction) { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const office = req.body.office; + const officeFolderNumber = req.body.folder_number; + const deedType = req.body.deed.deed_type; + + if (office && office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + + if(deedType) { + const deedTypeService = Container.get(DeedTypesService); + const deedTypeWithOffice = await deedTypeService.getByUidWithOffice(deedType.uid!); + if (!deedTypeWithOffice) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + if(deedTypeWithOffice.office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + const officeFolderService = Container.get(OfficeFoldersService); + + if (officeFolderNumber) { + const officeFoldersWithSameNumber = await officeFolderService.get({ where: { folder_number: officeFolderNumber, office: {uid: officeId}}}); + if (officeFoldersWithSameNumber.length) { + response.sendStatus(HttpCodes.BAD_REQUEST); + return; + } + } + + if (uid) { + const officeFolder = await officeFolderService.getByUidWithOffice(uid!); + + if (!officeFolder) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + + if (officeFolder.office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + next(); +} diff --git a/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts new file mode 100644 index 00000000..3d53f901 --- /dev/null +++ b/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts @@ -0,0 +1,32 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import { NextFunction, Request, Response } from "express"; +import Container from "typedi"; +import OfficeRolesService from "@Services/super-admin/OfficeRolesService/OfficeRolesService"; + +export default async function officeRoleHandler(req: Request, response: Response, next: NextFunction) { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const office = req.body.office; + + if (office && office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + + if (uid) { + const officeRoleService = Container.get(OfficeRolesService); + const officeRole = await officeRoleService.getByUidWithOffice(uid!); + + if (!officeRole) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + + if (officeRole.office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + next(); +} diff --git a/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts new file mode 100644 index 00000000..2d007397 --- /dev/null +++ b/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts @@ -0,0 +1,32 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import { NextFunction, Request, Response } from "express"; +import Container from "typedi"; +import UsersService from "@Services/super-admin/UsersService/UsersService"; + +export default async function userHandler(req: Request, response: Response, next: NextFunction) { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const office = req.body.office_membership; + + if (office && office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + + if (uid) { + const userService = Container.get(UsersService); + const user = await userService.getByUidWithOffice(uid!); + + if (!user) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + + if (user.office_membership.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + next(); +} diff --git a/src/common/databases/migrations/20230703120600_v9/migration.sql b/src/common/databases/migrations/20230703120600_v9/migration.sql new file mode 100644 index 00000000..720264aa --- /dev/null +++ b/src/common/databases/migrations/20230703120600_v9/migration.sql @@ -0,0 +1,23 @@ +-- DropForeignKey +ALTER TABLE "users" DROP CONSTRAINT "users_contact_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "users" DROP CONSTRAINT "users_office_role_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "users" DROP CONSTRAINT "users_office_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "users" DROP CONSTRAINT "users_roles_uid_fkey"; + +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_contact_uid_fkey" FOREIGN KEY ("contact_uid") REFERENCES "contacts"("uid") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_roles_uid_fkey" FOREIGN KEY ("roles_uid") REFERENCES "roles"("uid") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_office_role_uid_fkey" FOREIGN KEY ("office_role_uid") REFERENCES "office_roles"("uid") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_office_uid_fkey" FOREIGN KEY ("office_uid") REFERENCES "offices"("uid") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/src/common/databases/migrations/20230703122557_v10/migration.sql b/src/common/databases/migrations/20230703122557_v10/migration.sql new file mode 100644 index 00000000..8d7c8594 --- /dev/null +++ b/src/common/databases/migrations/20230703122557_v10/migration.sql @@ -0,0 +1,15 @@ +/* + Warnings: + + - A unique constraint covering the columns `[idNot,uid]` on the table `users` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[contact_uid,uid]` on the table `users` will be added. If there are existing duplicate values, this will fail. + +*/ +-- DropIndex +DROP INDEX "users_idNot_key"; + +-- CreateIndex +CREATE UNIQUE INDEX "users_idNot_uid_key" ON "users"("idNot", "uid"); + +-- CreateIndex +CREATE UNIQUE INDEX "users_contact_uid_uid_key" ON "users"("contact_uid", "uid"); diff --git a/src/common/databases/migrations/20230703123246_v11/migration.sql b/src/common/databases/migrations/20230703123246_v11/migration.sql new file mode 100644 index 00000000..842ec44e --- /dev/null +++ b/src/common/databases/migrations/20230703123246_v11/migration.sql @@ -0,0 +1,14 @@ +/* + Warnings: + + - A unique constraint covering the columns `[idNot]` on the table `users` will be added. If there are existing duplicate values, this will fail. + +*/ +-- DropIndex +DROP INDEX "users_contact_uid_uid_key"; + +-- DropIndex +DROP INDEX "users_idNot_uid_key"; + +-- CreateIndex +CREATE UNIQUE INDEX "users_idNot_key" ON "users"("idNot"); diff --git a/src/common/repositories/DeedTypesRepository.ts b/src/common/repositories/DeedTypesRepository.ts index 3004726a..41106d37 100644 --- a/src/common/repositories/DeedTypesRepository.ts +++ b/src/common/repositories/DeedTypesRepository.ts @@ -88,4 +88,16 @@ export default class DeedTypesRepository extends BaseRepository { include: query, }); } + + /** + * @description : Find unique deed type with relations + */ + public async findOneByUidWithOffice(uid: string) { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: { office: true }, + }); + } } diff --git a/src/common/repositories/DeedsRepository.ts b/src/common/repositories/DeedsRepository.ts index 80fbe59a..7b488515 100644 --- a/src/common/repositories/DeedsRepository.ts +++ b/src/common/repositories/DeedsRepository.ts @@ -90,4 +90,19 @@ export default class DeedsRepository extends BaseRepository { 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}}, + } + }); + } } diff --git a/src/common/repositories/DocumentTypesRepository.ts b/src/common/repositories/DocumentTypesRepository.ts index 0a0eab32..3b3cbf65 100644 --- a/src/common/repositories/DocumentTypesRepository.ts +++ b/src/common/repositories/DocumentTypesRepository.ts @@ -78,4 +78,16 @@ export default class DocumentTypesRepository extends BaseRepository { include: query, }); } + + /** + * @description : Find unique document type with relations + */ + public async findOneByUidWithOffice(uid: string) { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: {office: true}, + }); + } } diff --git a/src/common/repositories/DocumentsRepository.ts b/src/common/repositories/DocumentsRepository.ts index 2f1f08d6..ba4de950 100644 --- a/src/common/repositories/DocumentsRepository.ts +++ b/src/common/repositories/DocumentsRepository.ts @@ -133,4 +133,16 @@ export default class DocumentsRepository extends BaseRepository { include: query, }); } + + /** + * @description : Find unique document with relations + */ + public async findOneByUidWithOffice(uid: string) { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: {folder: {include: {office: true}}, document_type: {include: {office: true}}}, + }); + } } diff --git a/src/common/repositories/FilesRepository.ts b/src/common/repositories/FilesRepository.ts index d7998b54..f7d7a2f9 100644 --- a/src/common/repositories/FilesRepository.ts +++ b/src/common/repositories/FilesRepository.ts @@ -91,4 +91,16 @@ export default class FilesRepository extends BaseRepository { include: query, }); } + + /** + * @description : Find unique file with office + */ + public async findOneByUidWithOffice(uid: string) { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: {document: {include: {folder: {include: {office: true}}}}}, + }); + } } diff --git a/src/common/repositories/OfficeFoldersRepository.ts b/src/common/repositories/OfficeFoldersRepository.ts index 70530560..96db2950 100644 --- a/src/common/repositories/OfficeFoldersRepository.ts +++ b/src/common/repositories/OfficeFoldersRepository.ts @@ -112,6 +112,18 @@ export default class OfficeFoldersRepository extends BaseRepository { }); } + /** + * @description : Find one office folder + */ + public async findOneByUidWithOffice(uid: string) { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: {office: true}, + }); + } + /** * @description : Delete a folder */ diff --git a/src/common/repositories/OfficeRolesRepository.ts b/src/common/repositories/OfficeRolesRepository.ts index 781920ef..b7c5edb1 100644 --- a/src/common/repositories/OfficeRolesRepository.ts +++ b/src/common/repositories/OfficeRolesRepository.ts @@ -80,6 +80,18 @@ export default class OfficeRolesRepository extends BaseRepository { }); } + /** + * @description : Find one officeRole with office + */ + public async findOneByUidWithOffice(uid: string) { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: {office: true}, + }); + } + /** * @description : Delete a officeRole */ diff --git a/src/common/repositories/UsersRepository.ts b/src/common/repositories/UsersRepository.ts index a2f89268..6838dfd7 100644 --- a/src/common/repositories/UsersRepository.ts +++ b/src/common/repositories/UsersRepository.ts @@ -55,10 +55,9 @@ export default class UsersRepository extends BaseRepository { first_name: user.contact!.first_name, last_name: user.contact!.last_name, email: user.contact!.email, - phone_number: user.contact!.phone_number, + phone_number: user.contact?.phone_number, cell_phone_number: user.contact!.cell_phone_number, - civility: ECivility[user.contact!.civility as keyof typeof ECivility], - address: {}, + civility: ECivility[user.contact?.civility as keyof typeof ECivility] }, }, role: { @@ -82,7 +81,7 @@ export default class UsersRepository extends BaseRepository { }, }; } - return this.model.create({ ...createArgs, include: { contact: true, office_membership: { include: { address: true } } } }); + return this.model.create(createArgs); } /** @@ -129,19 +128,18 @@ export default class UsersRepository extends BaseRepository { first_name: user.contact!.first_name, last_name: user.contact!.last_name, email: user.contact!.email, - phone_number: user.contact!.phone_number, - cell_phone_number: user.contact!.cell_phone_number, - civility: ECivility[user.contact!.civility as keyof typeof ECivility], - address: {}, + phone_number: user.contact?.phone_number, + cell_phone_number: user.contact?.cell_phone_number, + civility: ECivility[user.contact?.civility as keyof typeof ECivility] }, }, }, }; - if (user.contact!.address) { + if (user.contact?.address) { updateArgs.data.contact!.update!.address!.update = { - address: user.contact!.address!.address, - zip_code: user.contact!.address!.zip_code, - city: user.contact!.address!.city, + address: user.contact?.address?.address, + zip_code: user.contact?.address?.zip_code, + city: user.contact?.address?.city, }; } if (user.office_role) { @@ -166,6 +164,18 @@ export default class UsersRepository extends BaseRepository { }); } + /** + * @description : Find one user with office + */ + public async findOneByUidWithOffice(uid: string){ + return this.model.findUnique({ + where: { + uid: uid, + }, + include: {office_membership: true}, + }); + } + /** * @description : Find one user */ diff --git a/src/services/common/AuthService/AuthService.ts b/src/services/common/AuthService/AuthService.ts index 0a6088a7..4c496cf0 100644 --- a/src/services/common/AuthService/AuthService.ts +++ b/src/services/common/AuthService/AuthService.ts @@ -14,7 +14,7 @@ interface IJwtPayload { providerName: PROVIDER_OPENID; userId: string | number; }; - office_IdNot_Id: string; + office_Id: string; role: string; rules: string[]; } @@ -38,7 +38,7 @@ export default class AuthService extends BaseService { return { userId: user.uid, openId: { providerName: providerName, userId: user.idNot }, - office_IdNot_Id: user.office_membership.idNot, + office_Id: user.office_membership.uid, role: user.role.name, rules: rules, }; @@ -50,7 +50,7 @@ export default class AuthService extends BaseService { return { userId: user.uid, openId: { providerName: providerName, userId: user.idNot }, - office_IdNot_Id: user.office_membership.idNot, + office_Id: user.office_membership.uid, role: user.role.name, rules: rules, }; diff --git a/src/services/common/FilesService/FilesService.ts b/src/services/common/FilesService/FilesService.ts index 6118a4eb..a1618ec1 100644 --- a/src/services/common/FilesService/FilesService.ts +++ b/src/services/common/FilesService/FilesService.ts @@ -7,7 +7,7 @@ import IpfsService from "../IpfsService/IpfsService"; import { BackendVariables } from "@Common/config/variables/Variables"; import { Readable } from "stream"; import {v4} from "uuid"; -import { Files } from "@prisma/client"; +import { Files, Prisma } from "@prisma/client"; import fetch from "node-fetch"; @@ -26,7 +26,7 @@ export default class FilesService extends BaseService { * @description : Get all files * @throws {Error} If files cannot be ge */ - public async get(query: any): Promise { + public async get(query: Prisma.FilesFindManyArgs) { return this.filesRepository.findMany(query); } @@ -34,8 +34,16 @@ export default class FilesService extends BaseService { * @description : Get a file by uid * @throws {Error} If project cannot be created */ - public async getByUid(uid: string): Promise { - return this.filesRepository.findOneByUid(uid); + public async getByUid(uid: string, query?: Prisma.FilesInclude) { + return this.filesRepository.findOneByUid(uid, query); + } + + /** + * @description : Get a file by uid with office + * @throws {Error} If project cannot be created + */ + public async getByUidWithOffice(uid: string) { + return this.filesRepository.findOneByUidWithOffice(uid); } /** diff --git a/src/services/super-admin/DeedTypesService/DeedTypesService.ts b/src/services/super-admin/DeedTypesService/DeedTypesService.ts index 7bb48f09..6e5fda52 100644 --- a/src/services/super-admin/DeedTypesService/DeedTypesService.ts +++ b/src/services/super-admin/DeedTypesService/DeedTypesService.ts @@ -1,4 +1,4 @@ -import { DeedTypes } from "@prisma/client"; +import { DeedTypes, Prisma } from "@prisma/client"; import DeedTypesRepository from "@Repositories/DeedTypesRepository"; import BaseService from "@Services/BaseService"; import { DeedType } from "le-coffre-resources/dist/SuperAdmin"; @@ -16,7 +16,7 @@ export default class DeedTypesService extends BaseService { * @description : Get all deed-types * @throws {Error} If deed-types cannot be get */ - public async get(query: any): Promise { + public async get(query: Prisma.DeedTypesFindManyArgs) { return this.deedTypeRepository.findMany(query); } @@ -40,7 +40,15 @@ export default class DeedTypesService extends BaseService { * @description : Get a deedtype by uid * @throws {Error} If deed-type cannot be get by uid */ - public async getByUid(uid: string, query?: any): Promise { + public async getByUid(uid: string, query?: Prisma.DeedTypesInclude): Promise { return this.deedTypeRepository.findOneByUid(uid, query); } + + /** + * @description : Get a deedtype by uid + * @throws {Error} If deed-type cannot be get by uid + */ + public async getByUidWithOffice(uid: string) { + return this.deedTypeRepository.findOneByUidWithOffice(uid); + } } diff --git a/src/services/super-admin/DeedsService/DeedsService.ts b/src/services/super-admin/DeedsService/DeedsService.ts index 055d24cf..cc7acfe4 100644 --- a/src/services/super-admin/DeedsService/DeedsService.ts +++ b/src/services/super-admin/DeedsService/DeedsService.ts @@ -1,4 +1,4 @@ -import { Deeds } from "@prisma/client"; +import { Deeds, Prisma } from "@prisma/client"; import DeedsRepository from "@Repositories/DeedsRepository"; import BaseService from "@Services/BaseService"; import { Deed } from "le-coffre-resources/dist/SuperAdmin"; @@ -14,7 +14,7 @@ export default class DeedsService extends BaseService { * @description : Get all deeds * @throws {Error} If deeds cannot be get */ - public async get(query: any) { + public async get(query: Prisma.DeedsFindManyArgs) { return this.deedRepository.findMany(query); } @@ -38,7 +38,11 @@ export default class DeedsService extends BaseService { * @description : Get a deed by uid * @throws {Error} If deed-type cannot be get by uid */ - public async getByUid(uid: string, query?: any): Promise { + public async getByUid(uid: string, query?: Prisma.DeedsInclude) { return this.deedRepository.findOneByUid(uid, query); } + + public async getOneByUidWithOffice(uid: string) { + return this.deedRepository.findOneByUidWithOffice(uid); + } } diff --git a/src/services/super-admin/DocumentTypesService/DocumentTypesService.ts b/src/services/super-admin/DocumentTypesService/DocumentTypesService.ts index 0f93d721..678c58f9 100644 --- a/src/services/super-admin/DocumentTypesService/DocumentTypesService.ts +++ b/src/services/super-admin/DocumentTypesService/DocumentTypesService.ts @@ -1,4 +1,4 @@ -import { DocumentTypes } from "@prisma/client"; +import { DocumentTypes, Prisma } from "@prisma/client"; import DocumentTypesRepository from "@Repositories/DocumentTypesRepository"; import BaseService from "@Services/BaseService"; import { DocumentType } from "le-coffre-resources/dist/SuperAdmin"; @@ -14,7 +14,7 @@ export default class DocumentTypesService extends BaseService { * @description : Get all document-types * @throws {Error} If document-types cannot be get */ - public async get(query: any): Promise { + public async get(query: Prisma.DocumentTypesFindManyArgs) { return this.documentTypeRepository.findMany(query); } @@ -38,7 +38,15 @@ export default class DocumentTypesService extends BaseService { * @description : Get a document-type by uid * @throws {Error} If document-type is not found */ - public async getByUid(uid: string, query?: any): Promise { + public async getByUid(uid: string, query?: Prisma.DocumentTypesInclude): Promise { return this.documentTypeRepository.findOneByUid(uid, query); } + + /** + * @description : Get a document-type by uid with relations + * @throws {Error} If document-type is not found + */ + public async getByUidWithOffice(uid: string) { + return this.documentTypeRepository.findOneByUidWithOffice(uid); + } } diff --git a/src/services/super-admin/DocumentsService/DocumentsService.ts b/src/services/super-admin/DocumentsService/DocumentsService.ts index 5310e5bb..581aa563 100644 --- a/src/services/super-admin/DocumentsService/DocumentsService.ts +++ b/src/services/super-admin/DocumentsService/DocumentsService.ts @@ -1,4 +1,4 @@ -import { Documents } from "@prisma/client"; +import { Documents, Prisma } from "@prisma/client"; import { Document } from "le-coffre-resources/dist/SuperAdmin"; import DocumentsRepository from "@Repositories/DocumentsRepository"; import BaseService from "@Services/BaseService"; @@ -14,7 +14,7 @@ export default class DocumentsService extends BaseService { * @description : Get all documents * @throws {Error} If documents cannot be get */ - public async get(query: any) { + public async get(query: Prisma.DocumentsFindManyArgs) { return this.documentsRepository.findMany(query); } @@ -61,7 +61,15 @@ export default class DocumentsService extends BaseService { * @description : Get a document by uid * @throws {Error} If document cannot be get by uid */ - public async getByUid(uid: string, query?: any): Promise { + public async getByUid(uid: string, query?: Prisma.DocumentsInclude) { 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); + } } diff --git a/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts b/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts index 6de0e5dc..32d142cf 100644 --- a/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts +++ b/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts @@ -5,6 +5,7 @@ import { OfficeFolder } from "le-coffre-resources/dist/SuperAdmin"; import { Service } from "typedi"; import DeedTypesService from "../DeedTypesService/DeedTypesService"; import DeedsRepository from "@Repositories/DeedsRepository"; +import { Prisma } from "@prisma/client"; @Service() @@ -21,7 +22,7 @@ export default class OfficeFoldersService extends BaseService { * @description : Get all folders * @throws {Error} If folders cannot be get */ - public async get(query: any): Promise { + public async get(query: Prisma.OfficeFoldersFindManyArgs) { return this.officeFoldersRepository.findMany(query); } @@ -50,10 +51,18 @@ export default class OfficeFoldersService extends BaseService { * @description : Get a folder by uid * @throws {Error} If folder cannot be get by uid */ - public async getByUid(uid: string, query?: any): Promise { + public async getByUid(uid: string, query?: Prisma.OfficeFoldersInclude) { return this.officeFoldersRepository.findOneByUid(uid, query); } + /** + * @description : Get a folder by uid + * @throws {Error} If folder cannot be get by uid + */ + public async getByUidWithOffice(uid: string) { + return this.officeFoldersRepository.findOneByUidWithOffice(uid); + } + /** * @description : Delete a folder * @throws {Error} If document cannot be deleted diff --git a/src/services/super-admin/OfficeRolesService/OfficeRolesService.ts b/src/services/super-admin/OfficeRolesService/OfficeRolesService.ts index e50ac7e4..69d1e80d 100644 --- a/src/services/super-admin/OfficeRolesService/OfficeRolesService.ts +++ b/src/services/super-admin/OfficeRolesService/OfficeRolesService.ts @@ -14,7 +14,7 @@ export default class OfficeRolesService extends BaseService { * @description : Get all officeRoles * @throws {Error} If officeRoles cannot be get */ - public get(query: Prisma.OfficeRolesFindManyArgs): Promise { + public get(query: Prisma.OfficeRolesFindManyArgs) { return this.officeRoleRepository.findMany(query); } @@ -38,7 +38,15 @@ export default class OfficeRolesService extends BaseService { * @description : Get a officeRole by uid * @throws {Error} If officeRole cannot be get by uid */ - public getByUid(uid: string, query?: any): Promise { + public getByUid(uid: string, query?: Prisma.OfficeRolesInclude) { return this.officeRoleRepository.findOneByUid(uid, query); } + + /** + * @description : Get a officeRole by uid + * @throws {Error} If officeRole cannot be get by uid + */ + public getByUidWithOffice(uid: string) { + return this.officeRoleRepository.findOneByUidWithOffice(uid); + } } diff --git a/src/services/super-admin/UsersService/UsersService.ts b/src/services/super-admin/UsersService/UsersService.ts index 4c2a27b3..832e86eb 100644 --- a/src/services/super-admin/UsersService/UsersService.ts +++ b/src/services/super-admin/UsersService/UsersService.ts @@ -39,10 +39,18 @@ export default class UsersService extends BaseService { * @description : Get a user by uid * @throws {Error} If user cannot be get by uid */ - public getByUid(uid: string, query?: any): Promise { + public getByUid(uid: string, query?: Prisma.UsersInclude) { return this.userRepository.findOneByUid(uid, query); } + /** + * @description : Get a user by uid with office + * @throws {Error} If user cannot be get by uid + */ + public getByUidWithOffice(uid: string) { + return this.userRepository.findOneByUidWithOffice(uid); + } + /** * @description : Get a user by uid * @throws {Error} If user cannot be get by uid From 4e632e27edeadbe2d0e535cb5c039c3003f6c649 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Mon, 3 Jul 2023 18:22:50 +0200 Subject: [PATCH 028/134] add document types control on office ownership --- .../OfficeMembershipHandlers/DeedHandler.ts | 45 +++++++++++-------- .../DeedTypeHandler.ts | 11 ++++- .../DocumentHandler.ts | 15 +++++-- .../OfficeMembershipHandlers/FileHandler.ts | 4 +- 4 files changed, 49 insertions(+), 26 deletions(-) diff --git a/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts index 7c674676..5e3110b9 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts @@ -3,33 +3,40 @@ import DeedsService from "@Services/super-admin/DeedsService/DeedsService"; import { DocumentType } from "le-coffre-resources/dist/SuperAdmin"; import { NextFunction, Request, Response } from "express"; import Container from "typedi"; +import DocumentTypesService from "@Services/super-admin/DocumentTypesService/DocumentTypesService"; export default async function deedHandler(req: Request, response: Response, next: NextFunction) { const officeId = req.body.user.office_Id; const uid = req.path && req.path.split("/")[5]; - const documentTypes: DocumentType[] = req.body.document_types; + const documentTypes: DocumentType[] = req.body.document_types; - const deedService = Container.get(DeedsService); - const deed = await deedService.getOneByUidWithOffice(uid!); + const deedService = Container.get(DeedsService); + const deed = await deedService.getOneByUidWithOffice(uid!); - if (!deed) { - response.sendStatus(HttpCodes.NOT_FOUND); - return; - } + if (!deed) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } - if (deed.deed_type.office.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); - return; - } + if (deed.deed_type.office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } - if(documentTypes) { - documentTypes.forEach((documentType) => { - if (documentType.office?.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); - return; - } - }); - } + if (documentTypes) { + const documentTypeService = Container.get(DocumentTypesService); + documentTypes.forEach(async (documentType) => { + const deedTypeWithOffice = await documentTypeService.getByUidWithOffice(documentType.uid!); + if (!deedTypeWithOffice) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + if (deedTypeWithOffice.office?.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + }); + } next(); } diff --git a/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts index 1f2ae532..1a59f17a 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts @@ -3,6 +3,7 @@ import DeedTypesService from "@Services/super-admin/DeedTypesService/DeedTypesSe import { DocumentType } from "le-coffre-resources/dist/SuperAdmin"; import { NextFunction, Request, Response } from "express"; import Container from "typedi"; +import DocumentTypesService from "@Services/super-admin/DocumentTypesService/DocumentTypesService"; export default async function deedTypeHandler(req: Request, response: Response, next: NextFunction) { const officeId = req.body.user.office_Id; @@ -31,8 +32,14 @@ export default async function deedTypeHandler(req: Request, response: Response, } if (documentTypes) { - documentTypes.forEach((documentType) => { - if (documentType.office?.uid != officeId) { + const documentTypeService = Container.get(DocumentTypesService); + documentTypes.forEach(async(documentType) => { + const documentTypeWithOffice = await documentTypeService.getByUidWithOffice(documentType.uid!); + if(!documentTypeWithOffice) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + if (documentTypeWithOffice.office?.uid != officeId) { response.sendStatus(HttpCodes.UNAUTHORIZED); return; } diff --git a/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts index 8690b0c6..208ded12 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts @@ -4,6 +4,7 @@ import { NextFunction, Request, Response } from "express"; import Container from "typedi"; import { OfficeFolder } from "le-coffre-resources/dist/SuperAdmin"; import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; +import DocumentTypesService from "@Services/super-admin/DocumentTypesService/DocumentTypesService"; export default async function documentHandler(req: Request, response: Response, next: NextFunction) { const officeId = req.body.user.office_Id; @@ -16,9 +17,17 @@ export default async function documentHandler(req: Request, response: Response, return; } - if (documentType && documentType.office?.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); - return; + if (documentType) { + const documentTypeService = Container.get(DocumentTypesService); + const documentTypeWithOffice = await documentTypeService.getByUidWithOffice(documentType.uid!); + if(!documentTypeWithOffice) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + if (documentTypeWithOffice.office?.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } } if (uid) { diff --git a/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts index 446c411b..6745b721 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts @@ -13,8 +13,8 @@ export default async function fileHandler(req: Request, response: Response, next response.sendStatus(HttpCodes.UNAUTHORIZED); return; } - - if(!uid) uid = req.path && req.path.split("/")[6]; + + if(uid === "download") uid = req.path && req.path.split("/")[6]; if (uid) { const fileService = Container.get(FilesService); From afec5a5cea86b9ffb3bbcc1b54fdc4aeefae2c7f Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Tue, 4 Jul 2023 14:05:25 +0200 Subject: [PATCH 029/134] add more input checks and format --- src/app/api/idnot/UserController.ts | 13 ++++---- .../api/super-admin/CustomersController.ts | 10 +++--- .../api/super-admin/DeedTypesController.ts | 12 +++---- src/app/api/super-admin/DeedsController.ts | 12 +++---- .../super-admin/DocumentTypesController.ts | 12 +++---- .../api/super-admin/DocumentsController.ts | 16 +++++----- src/app/api/super-admin/FilesController.ts | 25 ++++++--------- .../super-admin/OfficeFoldersController.ts | 16 +++++----- .../api/super-admin/OfficeRolesController.ts | 12 +++---- src/app/api/super-admin/OfficesController.ts | 6 ++-- src/app/api/super-admin/RolesController.ts | 8 ++--- src/app/api/super-admin/RulesController.ts | 12 +++---- src/app/api/super-admin/UsersController.ts | 6 ++-- src/app/index.ts | 1 - src/app/middlewares/AuthHandler.ts | 31 +++++++++---------- src/app/middlewares/FileHandler.ts | 22 ------------- .../OfficeMembershipHandlers/DeedHandler.ts | 20 ++++++------ .../DeedTypeHandler.ts | 6 ++-- .../DocumentHandler.ts | 17 +++++++--- .../DocumentTypeHandler.ts | 2 +- .../OfficeMembershipHandlers/FileHandler.ts | 21 ++++++++----- .../OfficeMembershipHandlers/FolderHandler.ts | 8 +++-- .../OfficeRoleHandler.ts | 2 +- .../OfficeMembershipHandlers/UserHandler.ts | 2 +- src/app/middlewares/RulesHandler.ts | 27 ++++++++-------- src/common/config/variables/Variables.ts | 5 ++- src/common/databases/seeders/seeder.ts | 30 +++++++++--------- .../repositories/DeedTypesRepository.ts | 12 +++---- src/common/repositories/DeedsRepository.ts | 6 ++-- .../repositories/DocumentTypesRepository.ts | 4 +-- .../repositories/DocumentsRepository.ts | 10 +++--- src/common/repositories/FilesRepository.ts | 26 ++++++++-------- .../repositories/OfficeFoldersRepository.ts | 12 +++---- .../repositories/OfficeRolesRepository.ts | 10 +++--- src/common/repositories/RulesRepository.ts | 8 ++--- src/common/repositories/UsersRepository.ts | 14 ++++----- src/common/system/OpenIdInterface.ts | 4 +-- src/entries/App.ts | 10 ++++-- .../common/CryptoService/CryptoService.ts | 5 ++- .../common/FilesService/FilesService.ts | 22 ++++++------- .../common/IpfsService/IpfsService.ts | 4 +-- .../common/OpenIdService/OpenIdService.ts | 2 +- .../DocumentsService/DocumentsService.ts | 4 +-- .../DeedTypesService/DeedTypesService.ts | 4 +-- .../DocumentTypesService.ts | 2 +- .../DocumentsService/DocumentsService.ts | 10 +++--- .../OfficeFoldersService.ts | 15 +++++---- .../OfficeRolesService/OfficeRolesService.ts | 2 +- .../super-admin/RolesService/RolesService.ts | 2 +- .../super-admin/RulesService/RulesService.ts | 2 +- .../super-admin/UsersService/UsersService.ts | 2 +- .../super-admin/CustomersService.test.ts | 2 +- .../super-admin/DeedTypesService.test.ts | 7 +++-- .../super-admin/DocumentTypesService.test.ts | 10 ++++-- .../super-admin/OfficeFolderService.test.ts | 21 +++++++++++-- 55 files changed, 298 insertions(+), 288 deletions(-) delete mode 100644 src/app/middlewares/FileHandler.ts diff --git a/src/app/api/idnot/UserController.ts b/src/app/api/idnot/UserController.ts index 4e15195f..2dd2029a 100644 --- a/src/app/api/idnot/UserController.ts +++ b/src/app/api/idnot/UserController.ts @@ -24,13 +24,13 @@ export default class UserController extends ApiController { try { const code = req.params["code"]; if (!code) throw new Error("code is required"); - const token = await fetch('https://qual-connexion.idnot.fr/IdPOAuth2/token/idnot_idp_v1', {method: 'POST'}); + const token = await fetch("https://qual-connexion.idnot.fr/IdPOAuth2/token/idnot_idp_v1", { method: "POST" }); console.log(token); //const user = await this.authService.getUserFromIdNotTokens(code!); //success this.httpSuccess(response); } catch (error) { - console.log(error) + console.log(error); this.httpInternalError(response); return; } @@ -46,10 +46,9 @@ export default class UserController extends ApiController { const accessToken = this.authService.generateAccessToken(payload); const refreshToken = this.authService.generateRefreshToken(payload); - //success + //success this.httpSuccess(response, { accessToken, refreshToken }); } catch (error) { - console.log(error); this.httpInternalError(response); return; } @@ -73,9 +72,9 @@ export default class UserController extends ApiController { return; } - const user = userPayload as JwtPayload; - delete user.iat; - delete user!.exp; + const user = userPayload as JwtPayload; + delete user.iat; + delete user!.exp; accessToken = this.authService.generateAccessToken(user); }); diff --git a/src/app/api/super-admin/CustomersController.ts b/src/app/api/super-admin/CustomersController.ts index 440de50b..ca108b25 100644 --- a/src/app/api/super-admin/CustomersController.ts +++ b/src/app/api/super-admin/CustomersController.ts @@ -19,7 +19,7 @@ export default class CustomersController extends ApiController { /** * @description Get all customers */ - @Get("/api/v1/super-admin/customers", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/customers", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -42,7 +42,7 @@ export default class CustomersController extends ApiController { /** * @description Create a new customer */ - @Post("/api/v1/super-admin/customers", [authHandler,ruleHandler]) + @Post("/api/v1/super-admin/customers", [authHandler, ruleHandler]) protected async post(req: Request, response: Response) { try { //init IUser resource with request body values @@ -68,7 +68,7 @@ export default class CustomersController extends ApiController { /** * @description Modify a specific customer by uid */ - @Put("/api/v1/super-admin/customers/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/customers/:uid", [authHandler, ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -86,7 +86,7 @@ export default class CustomersController extends ApiController { //init IUser resource with request body values const customerEntity = Customer.hydrate(req.body); - + //validate user await validateOrReject(customerEntity, { groups: ["updateCustomer"], forbidUnknownValues: false }); @@ -109,7 +109,7 @@ export default class CustomersController extends ApiController { /** * @description Get a specific customer by uid */ - @Get("/api/v1/super-admin/customers/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/customers/:uid", [authHandler, ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/DeedTypesController.ts b/src/app/api/super-admin/DeedTypesController.ts index 02805535..40de058e 100644 --- a/src/app/api/super-admin/DeedTypesController.ts +++ b/src/app/api/super-admin/DeedTypesController.ts @@ -21,13 +21,13 @@ export default class DeedTypesController extends ApiController { * @description Get all deedtypes * @returns Deedtype[] list of deedtypes */ - @Get("/api/v1/super-admin/deed-types", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/deed-types", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query const query = JSON.parse(req.query["q"] as string); const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.DeedTypesWhereInput = {office: {uid: officeId}}; + const officeWhereInput: Prisma.DeedTypesWhereInput = { office: { uid: officeId } }; query.where = officeWhereInput; //call service to get prisma entity @@ -48,7 +48,7 @@ export default class DeedTypesController extends ApiController { * @description Create a new deedtype * @returns Deedtype created */ - @Post("/api/v1/super-admin/deed-types", [authHandler,ruleHandler,deedTypeHandler]) + @Post("/api/v1/super-admin/deed-types", [authHandler, ruleHandler, deedTypeHandler]) protected async post(req: Request, response: Response) { try { //init DeedType resource with request body values @@ -77,7 +77,7 @@ export default class DeedTypesController extends ApiController { * @description Modify a specific deedtype by uid * @returns Deedtype modified */ - @Put("/api/v1/super-admin/deed-types/:uid", [authHandler,ruleHandler,deedTypeHandler]) + @Put("/api/v1/super-admin/deed-types/:uid", [authHandler, ruleHandler, deedTypeHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -92,7 +92,7 @@ export default class DeedTypesController extends ApiController { this.httpNotFoundRequest(response, "deed type not found"); return; } - + //init DeedType resource with request body values const deedTypeEntity = DeedType.hydrate(req.body); @@ -119,7 +119,7 @@ export default class DeedTypesController extends ApiController { * @description Get a specific deedtype by uid * @returns IDeedtype */ - @Get("/api/v1/super-admin/deed-types/:uid", [authHandler,ruleHandler,deedTypeHandler]) + @Get("/api/v1/super-admin/deed-types/:uid", [authHandler, ruleHandler, deedTypeHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/DeedsController.ts b/src/app/api/super-admin/DeedsController.ts index e08a4163..a2d8eb2e 100644 --- a/src/app/api/super-admin/DeedsController.ts +++ b/src/app/api/super-admin/DeedsController.ts @@ -21,13 +21,13 @@ export default class DeedsController extends ApiController { * @description Get all deeds * @returns Deed[] list of deeds */ - @Get("/api/v1/super-admin/deeds", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/deeds", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query const query = JSON.parse(req.query["q"] as string); const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.DeedsWhereInput = { deed_type: {office: {uid: officeId}}}; + const officeWhereInput: Prisma.DeedsWhereInput = { deed_type: { office: { uid: officeId } } }; query.where = officeWhereInput; //call service to get prisma entity @@ -48,7 +48,7 @@ export default class DeedsController extends ApiController { * @description Get a specific deed by uid * @returns Deed */ - @Get("/api/v1/super-admin/deeds/:uid", [authHandler,ruleHandler,deedHandler]) + @Get("/api/v1/super-admin/deeds/:uid", [authHandler, ruleHandler, deedHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -86,7 +86,7 @@ export default class DeedsController extends ApiController { /** * @description Modify a specific deed by uid */ - @Put("/api/v1/super-admin/deeds/:uid", [authHandler,ruleHandler,deedHandler]) + @Put("/api/v1/super-admin/deeds/:uid", [authHandler, ruleHandler, deedHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -104,9 +104,9 @@ export default class DeedsController extends ApiController { //init OfficeFolder resource with request body values const deedEntity = Deed.hydrate(req.body); - + //validate folder - await validateOrReject(deedEntity, { groups: ["updateDeed"], forbidUnknownValues: false }); + await validateOrReject(deedEntity, { groups: ["updateDeed"], forbidUnknownValues: false }); //call service to get prisma entity const deedEntityUpdated = await this.deedsService.update(uid, deedEntity); diff --git a/src/app/api/super-admin/DocumentTypesController.ts b/src/app/api/super-admin/DocumentTypesController.ts index 7251fee5..5690a57a 100644 --- a/src/app/api/super-admin/DocumentTypesController.ts +++ b/src/app/api/super-admin/DocumentTypesController.ts @@ -21,13 +21,13 @@ export default class DocumentTypesController extends ApiController { /** * @description Get all document-types */ - @Get("/api/v1/super-admin/document-types", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/document-types", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query const query = JSON.parse(req.query["q"] as string); const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.DocumentTypesWhereInput = {office: {uid: officeId}}; + const officeWhereInput: Prisma.DocumentTypesWhereInput = { office: { uid: officeId } }; query.where = officeWhereInput; //call service to get prisma entity @@ -49,7 +49,7 @@ export default class DocumentTypesController extends ApiController { /** * @description Create a new documentType */ - @Post("/api/v1/super-admin/document-types", [authHandler,ruleHandler,documentTypeHandler]) + @Post("/api/v1/super-admin/document-types", [authHandler, ruleHandler, documentTypeHandler]) protected async post(req: Request, response: Response) { try { //init DocumentType resource with request body values @@ -73,7 +73,7 @@ export default class DocumentTypesController extends ApiController { /** * @description Modify a specific documentType by uid */ - @Put("/api/v1/super-admin/document-types/:uid", [authHandler,ruleHandler,documentTypeHandler]) + @Put("/api/v1/super-admin/document-types/:uid", [authHandler, ruleHandler, documentTypeHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -92,7 +92,7 @@ export default class DocumentTypesController extends ApiController { const documentTypeEntity = DocumentType.hydrate(req.body); //validate user - await validateOrReject(documentTypeEntity, { groups: ["update"] }); + await validateOrReject(documentTypeEntity, { groups: ["updateDocumentType"] }); //call service to get prisma entity const documentTypeEntityUpdated = await this.documentTypesService.update(uid, documentTypeEntity); @@ -113,7 +113,7 @@ export default class DocumentTypesController extends ApiController { /** * @description Get a specific documentType by uid */ - @Get("/api/v1/super-admin/document-types/:uid", [authHandler,ruleHandler,documentTypeHandler]) + @Get("/api/v1/super-admin/document-types/:uid", [authHandler, ruleHandler, documentTypeHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/DocumentsController.ts b/src/app/api/super-admin/DocumentsController.ts index e4800a7b..e9644829 100644 --- a/src/app/api/super-admin/DocumentsController.ts +++ b/src/app/api/super-admin/DocumentsController.ts @@ -21,13 +21,13 @@ export default class DocumentsController extends ApiController { * @description Get all documents * @returns IDocument[] list of documents */ - @Get("/api/v1/super-admin/documents", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/documents", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query const query = JSON.parse(req.query["q"] as string); const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.DocumentsWhereInput = { document_type: {office: {uid: officeId}}}; + const officeWhereInput: Prisma.DocumentsWhereInput = { document_type: { office: { uid: officeId } } }; query.where = officeWhereInput; //call service to get prisma entity @@ -48,7 +48,7 @@ export default class DocumentsController extends ApiController { * @description Create a new document * @returns IDocument created */ - @Post("/api/v1/super-admin/documents", [authHandler,ruleHandler,documentHandler]) + @Post("/api/v1/super-admin/documents", [authHandler, ruleHandler, documentHandler]) protected async post(req: Request, response: Response) { try { //init Document resource with request body values @@ -76,7 +76,7 @@ export default class DocumentsController extends ApiController { /** * @description Update a specific document */ - @Put("/api/v1/super-admin/documents/:uid", [authHandler,ruleHandler,documentHandler]) + @Put("/api/v1/super-admin/documents/:uid", [authHandler, ruleHandler, documentHandler]) protected async update(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -84,7 +84,7 @@ export default class DocumentsController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - + const documentFound = await this.documentsService.getByUid(uid); if (!documentFound) { @@ -93,7 +93,7 @@ export default class DocumentsController extends ApiController { } //init Document resource with request body values - const documentEntity = Document.hydrate(req.body); + const documentEntity = Document.hydrate(req.body); //validate document await validateOrReject(documentEntity, { groups: ["updateDocument"] }); @@ -115,7 +115,7 @@ export default class DocumentsController extends ApiController { /** * @description Delete a specific document */ - @Delete("/api/v1/super-admin/documents/:uid", [authHandler,ruleHandler,documentHandler]) + @Delete("/api/v1/super-admin/documents/:uid", [authHandler, ruleHandler, documentHandler]) protected async delete(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -148,7 +148,7 @@ export default class DocumentsController extends ApiController { /** * @description Get a specific document by uid */ - @Get("/api/v1/super-admin/documents/:uid", [authHandler,ruleHandler,documentHandler]) + @Get("/api/v1/super-admin/documents/:uid", [authHandler, ruleHandler, documentHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/FilesController.ts b/src/app/api/super-admin/FilesController.ts index 915596e3..33611649 100644 --- a/src/app/api/super-admin/FilesController.ts +++ b/src/app/api/super-admin/FilesController.ts @@ -9,7 +9,7 @@ import { validateOrReject } from "class-validator"; import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; -import fileHandler from "@App/middlewares/FileHandler"; +import fileHandler from "@App/middlewares/OfficeMembershipHandlers/FileHandler"; @Controller() @Service() @@ -22,13 +22,13 @@ export default class FilesController extends ApiController { * @description Get all Files * @returns File[] list of Files */ - @Get("/api/v1/super-admin/files", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/files", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query const query = JSON.parse(req.query["q"] as string); const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.FilesWhereInput = {document: {folder: {office: {uid: officeId}}}}; + const officeWhereInput: Prisma.FilesWhereInput = { document: { folder: { office: { uid: officeId } } } }; query.where = officeWhereInput; //call service to get prisma entity const fileEntities = await this.filesService.get(query); @@ -47,7 +47,7 @@ export default class FilesController extends ApiController { /** * @description Get a specific File by uid */ - @Get("/api/v1/super-admin/files/download/:uid", [authHandler,ruleHandler,fileHandler]) + @Get("/api/v1/super-admin/files/download/:uid", [authHandler, ruleHandler, fileHandler]) protected async download(req: Request, response: Response) { const uid = req.params["uid"]; if (!uid) { @@ -76,7 +76,7 @@ export default class FilesController extends ApiController { * @description Create a new File * @returns File created */ - @Post("/api/v1/super-admin/files", [authHandler,ruleHandler,fileHandler]) + @Post("/api/v1/super-admin/files", [authHandler, ruleHandler, fileHandler]) protected async post(req: Request, response: Response) { try { //get file @@ -93,13 +93,8 @@ export default class FilesController extends ApiController { const document = await this.documentService.getByUid(fileEntity.document!.uid!); - if(!document){ - this.httpNotFoundRequest(response, "document not found"); - return; - } - - document.document_status = "DEPOSITED"; - await this.documentService.update(document.uid!, document); + document!.document_status = "DEPOSITED"; + await this.documentService.update(document!.uid!, document!); //Hydrate ressource with prisma entity const fileEntityHydrated = File.hydrate(fileEntityCreated, { @@ -117,7 +112,7 @@ export default class FilesController extends ApiController { /** * @description Update a specific file */ - @Put("/api/v1/super-admin/files/:uid", [authHandler,ruleHandler,fileHandler]) + @Put("/api/v1/super-admin/files/:uid", [authHandler, ruleHandler, fileHandler]) protected async update(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -155,7 +150,7 @@ export default class FilesController extends ApiController { /** * @description Delete a specific File */ - @Delete("/api/v1/super-admin/files/:uid", [authHandler,ruleHandler,fileHandler]) + @Delete("/api/v1/super-admin/files/:uid", [authHandler, ruleHandler, fileHandler]) protected async delete(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -193,7 +188,7 @@ export default class FilesController extends ApiController { /** * @description Get a specific File by uid */ - @Get("/api/v1/super-admin/files/:uid", [authHandler,ruleHandler,fileHandler]) + @Get("/api/v1/super-admin/files/:uid", [authHandler, ruleHandler, fileHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/OfficeFoldersController.ts b/src/app/api/super-admin/OfficeFoldersController.ts index c4b037c4..259250a4 100644 --- a/src/app/api/super-admin/OfficeFoldersController.ts +++ b/src/app/api/super-admin/OfficeFoldersController.ts @@ -20,17 +20,17 @@ export default class OfficeFoldersController extends ApiController { /** * @description Get all folders */ - @Get("/api/v1/super-admin/folders", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/folders", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query const query = JSON.parse(req.query["q"] as string); const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.OfficeFoldersWhereInput = {office: {uid: officeId}}; + const officeWhereInput: Prisma.OfficeFoldersWhereInput = { office: { uid: officeId } }; query.where = officeWhereInput; //call service to get prisma entity const officeFolderEntities: OfficeFolders[] = await this.officeFoldersService.get(query); - + //Hydrate ressource with prisma entity const officeFolders = OfficeFolder.hydrateArray(officeFolderEntities, { strategy: "excludeAll", @@ -46,12 +46,12 @@ export default class OfficeFoldersController extends ApiController { /** * @description Create a new folder */ - @Post("/api/v1/super-admin/folders", [authHandler,ruleHandler,folderHandler]) + @Post("/api/v1/super-admin/folders", [authHandler, ruleHandler, folderHandler]) protected async post(req: Request, response: Response) { try { //init OfficeFolder resource with request body values const officeFolderRessource = OfficeFolder.hydrate(req.body); - await officeFolderRessource.validateOrReject?.({ groups: ["createFolder"] , forbidUnknownValues: false }); + await officeFolderRessource.validateOrReject?.({ groups: ["createFolder"], forbidUnknownValues: false }); //call service to get prisma entity const officeFolderEntity = await this.officeFoldersService.create(officeFolderRessource); @@ -70,7 +70,7 @@ export default class OfficeFoldersController extends ApiController { /** * @description Modify a specific folder by uid */ - @Put("/api/v1/super-admin/folders/:uid", [authHandler,ruleHandler,folderHandler]) + @Put("/api/v1/super-admin/folders/:uid", [authHandler, ruleHandler, folderHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -112,7 +112,7 @@ export default class OfficeFoldersController extends ApiController { * @description Get a specific folder by uid * @returns IFolder */ - @Get("/api/v1/super-admin/folders/:uid", [authHandler,ruleHandler,folderHandler]) + @Get("/api/v1/super-admin/folders/:uid", [authHandler, ruleHandler, folderHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -151,7 +151,7 @@ export default class OfficeFoldersController extends ApiController { /** * @description Delete a specific folder */ - @Delete("/api/v1/super-admin/folders/:uid", [authHandler,ruleHandler,folderHandler]) + @Delete("/api/v1/super-admin/folders/:uid", [authHandler, ruleHandler, folderHandler]) protected async delete(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/OfficeRolesController.ts b/src/app/api/super-admin/OfficeRolesController.ts index 2d5c422d..7adff4a8 100644 --- a/src/app/api/super-admin/OfficeRolesController.ts +++ b/src/app/api/super-admin/OfficeRolesController.ts @@ -20,15 +20,15 @@ export default class OfficeRolesController extends ApiController { /** * @description Get all officeRoles */ - @Get("/api/v1/super-admin/officeRoles", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/officeRoles", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query const query = JSON.parse(req.query["q"] as string); const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.OfficeRolesWhereInput = {office: {uid: officeId}}; + const officeWhereInput: Prisma.OfficeRolesWhereInput = { office: { uid: officeId } }; query.where = officeWhereInput; - + //call service to get prisma entity const officeRolesEntities = await this.officeRolesService.get(query); @@ -46,7 +46,7 @@ export default class OfficeRolesController extends ApiController { /** * @description Create a new officeRole */ - @Post("/api/v1/super-admin/office-roles", [authHandler,ruleHandler,officeRoleHandler]) + @Post("/api/v1/super-admin/office-roles", [authHandler, ruleHandler, officeRoleHandler]) protected async getAddresses(req: Request, response: Response) { try { //init IOfficeRole resource with request body values @@ -74,7 +74,7 @@ export default class OfficeRolesController extends ApiController { /** * @description Modify a specific officeRole by uid */ - @Put("/api/v1/super-admin/office-roles/:uid", [authHandler,ruleHandler,officeRoleHandler]) + @Put("/api/v1/super-admin/office-roles/:uid", [authHandler, ruleHandler, officeRoleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -115,7 +115,7 @@ export default class OfficeRolesController extends ApiController { /** * @description Get a specific officeRole by uid */ - @Get("/api/v1/super-admin/office-roles/:uid", [authHandler,ruleHandler,officeRoleHandler]) + @Get("/api/v1/super-admin/office-roles/:uid", [authHandler, ruleHandler, officeRoleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/OfficesController.ts b/src/app/api/super-admin/OfficesController.ts index 2ec24cc1..9a282bfd 100644 --- a/src/app/api/super-admin/OfficesController.ts +++ b/src/app/api/super-admin/OfficesController.ts @@ -37,7 +37,7 @@ export default class OfficesController extends ApiController { /** * @description Create a new office */ - @Post("/api/v1/super-admin/offices", [authHandler,ruleHandler]) + @Post("/api/v1/super-admin/offices", [authHandler, ruleHandler]) protected async post(req: Request, response: Response) { try { //init IUser resource with request body values @@ -60,7 +60,7 @@ export default class OfficesController extends ApiController { /** * @description Modify a specific office by uid */ - @Put("/api/v1/super-admin/offices/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/offices/:uid", [authHandler, ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -95,7 +95,7 @@ export default class OfficesController extends ApiController { /** * @description Get a specific office by uid */ - @Get("/api/v1/super-admin/offices/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/offices/:uid", [authHandler, ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/RolesController.ts b/src/app/api/super-admin/RolesController.ts index c4ac55af..a8afcf27 100644 --- a/src/app/api/super-admin/RolesController.ts +++ b/src/app/api/super-admin/RolesController.ts @@ -19,7 +19,7 @@ export default class RolesController extends ApiController { /** * @description Get all roles */ - @Get("/api/v1/super-admin/roles", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/roles", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -42,7 +42,7 @@ export default class RolesController extends ApiController { /** * @description Create a new role */ - @Post("/api/v1/super-admin/roles", [authHandler,ruleHandler]) + @Post("/api/v1/super-admin/roles", [authHandler, ruleHandler]) protected async getAddresses(req: Request, response: Response) { try { //init IRole resource with request body values @@ -70,7 +70,7 @@ export default class RolesController extends ApiController { /** * @description Modify a specific role by uid */ - @Put("/api/v1/super-admin/roles/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/roles/:uid", [authHandler, ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -111,7 +111,7 @@ export default class RolesController extends ApiController { /** * @description Get a specific role by uid */ - @Get("/api/v1/super-admin/roles/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/roles/:uid", [authHandler, ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/RulesController.ts b/src/app/api/super-admin/RulesController.ts index 84038796..6dd93840 100644 --- a/src/app/api/super-admin/RulesController.ts +++ b/src/app/api/super-admin/RulesController.ts @@ -19,7 +19,7 @@ export default class RulesController extends ApiController { /** * @description Get all rules */ - @Get("/api/v1/super-admin/rules", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/rules", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -42,15 +42,15 @@ export default class RulesController extends ApiController { /** * @description Create a new rule */ - @Post("/api/v1/super-admin/rules", [authHandler,ruleHandler]) + @Post("/api/v1/super-admin/rules", [authHandler, ruleHandler]) protected async getAddresses(req: Request, response: Response) { try { //init IRule resource with request body values const ruleEntity = Rule.hydrate(req.body); //validate rule - await validateOrReject(ruleEntity, {groups: ["createRule"]}); - + await validateOrReject(ruleEntity, { groups: ["createRule"] }); + //call service to get prisma entity const ruleEntityCreated = await this.rulesService.create(ruleEntity); @@ -70,7 +70,7 @@ export default class RulesController extends ApiController { /** * @description Modify a specific rule by uid */ - @Put("/api/v1/super-admin/rules/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/rules/:uid", [authHandler, ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -111,7 +111,7 @@ export default class RulesController extends ApiController { /** * @description Get a specific rule by uid */ - @Get("/api/v1/super-admin/rules/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/rules/:uid", [authHandler, ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index 0d2032ef..ca058591 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -19,7 +19,7 @@ export default class UsersController extends ApiController { /** * @description Get all users */ - @Get("/api/v1/super-admin/users", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/users", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -70,7 +70,7 @@ export default class UsersController extends ApiController { /** * @description Modify a specific user by uid */ - @Put("/api/v1/super-admin/users/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/users/:uid", [authHandler, ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -111,7 +111,7 @@ export default class UsersController extends ApiController { /** * @description Get a specific user by uid */ - @Get("/api/v1/super-admin/users/:uid",[authHandler,ruleHandler]) + @Get("/api/v1/super-admin/users/:uid", [authHandler, ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/index.ts b/src/app/index.ts index 9848d5c1..94124553 100644 --- a/src/app/index.ts +++ b/src/app/index.ts @@ -14,7 +14,6 @@ import FilesController from "./api/super-admin/FilesController"; import RulesController from "./api/super-admin/RulesController"; import RolesController from "./api/super-admin/RolesController"; - /** * @description This allow to declare all controllers used in the application */ diff --git a/src/app/middlewares/AuthHandler.ts b/src/app/middlewares/AuthHandler.ts index 3ab26600..6d7116bc 100644 --- a/src/app/middlewares/AuthHandler.ts +++ b/src/app/middlewares/AuthHandler.ts @@ -4,22 +4,21 @@ import { NextFunction, Request, Response } from "express"; import Container from "typedi"; export default function authHandler(req: Request, response: Response, next: NextFunction) { - const authHeader = req.headers['authorization']; - const token = authHeader && authHeader.split(' ')[1]; + const authHeader = req.headers["authorization"]; + const token = authHeader && authHeader.split(" ")[1]; - if (!token) { - response.sendStatus(HttpCodes.UNAUTHORIZED) - return; - } + if (!token) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } - const authService = Container.get(AuthService); - authService.verifyAccessToken(token, (err, userPayload) => { - if (err) { - response.sendStatus(HttpCodes.UNAUTHORIZED); - return; - } - req.body.user = userPayload - next(); - }); + const authService = Container.get(AuthService); + authService.verifyAccessToken(token, (err, userPayload) => { + if (err) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + req.body.user = userPayload; + next(); + }); } - diff --git a/src/app/middlewares/FileHandler.ts b/src/app/middlewares/FileHandler.ts deleted file mode 100644 index 3a6138ac..00000000 --- a/src/app/middlewares/FileHandler.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { NextFunction, Request, Response } from "express"; -import multer from "multer"; - -export default function fileHandler(req: Request, response: Response, next: NextFunction) { - const storage = multer.memoryStorage() - const upload = multer({storage:storage}).single('file'); - - // Here call the upload middleware of multer - upload(req, response, function (err) { - if (err instanceof multer.MulterError) { - // A Multer error occurred when uploading. - const err = new Error('Multer error'); - return next(err) - } else if (err) { - // An unknown error occurred when uploading. - const err = new Error('Server Error') - return next(err) - } - next() - }) -} - diff --git a/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts index 5e3110b9..a9f227ea 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts @@ -10,17 +10,19 @@ export default async function deedHandler(req: Request, response: Response, next const uid = req.path && req.path.split("/")[5]; const documentTypes: DocumentType[] = req.body.document_types; - const deedService = Container.get(DeedsService); - const deed = await deedService.getOneByUidWithOffice(uid!); + if (uid) { + const deedService = Container.get(DeedsService); + const deed = await deedService.getOneByUidWithOffice(uid); - if (!deed) { - response.sendStatus(HttpCodes.NOT_FOUND); - return; - } + if (!deed) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } - if (deed.deed_type.office.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); - return; + if (deed.deed_type.office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } } if (documentTypes) { diff --git a/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts index 1a59f17a..e1513793 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts @@ -11,7 +11,7 @@ export default async function deedTypeHandler(req: Request, response: Response, const documentTypes: DocumentType[] = req.body.document_types; const office = req.body.office; - if(office && office.uid != officeId) { + if (office && office.uid != officeId) { response.sendStatus(HttpCodes.UNAUTHORIZED); return; } @@ -33,9 +33,9 @@ export default async function deedTypeHandler(req: Request, response: Response, if (documentTypes) { const documentTypeService = Container.get(DocumentTypesService); - documentTypes.forEach(async(documentType) => { + documentTypes.forEach(async (documentType) => { const documentTypeWithOffice = await documentTypeService.getByUidWithOffice(documentType.uid!); - if(!documentTypeWithOffice) { + if (!documentTypeWithOffice) { response.sendStatus(HttpCodes.NOT_FOUND); return; } diff --git a/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts index 208ded12..163bf374 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts @@ -5,6 +5,7 @@ import Container from "typedi"; import { OfficeFolder } from "le-coffre-resources/dist/SuperAdmin"; import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; import DocumentTypesService from "@Services/super-admin/DocumentTypesService/DocumentTypesService"; +import OfficeFoldersService from "@Services/super-admin/OfficeFoldersService/OfficeFoldersService"; export default async function documentHandler(req: Request, response: Response, next: NextFunction) { const officeId = req.body.user.office_Id; @@ -12,15 +13,23 @@ export default async function documentHandler(req: Request, response: Response, const documentType: DocumentType = req.body.document_type; const folder: OfficeFolder = req.body.folder; - if (folder && folder.office?.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); - return; + if (folder) { + const officeFolderService = Container.get(OfficeFoldersService); + const officeFolderWithOffice = await officeFolderService.getByUidWithOffice(folder.uid!); + if (!officeFolderWithOffice) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + if (officeFolderWithOffice.office?.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } } if (documentType) { const documentTypeService = Container.get(DocumentTypesService); const documentTypeWithOffice = await documentTypeService.getByUidWithOffice(documentType.uid!); - if(!documentTypeWithOffice) { + if (!documentTypeWithOffice) { response.sendStatus(HttpCodes.NOT_FOUND); return; } diff --git a/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts index 14d0a148..991ea796 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts @@ -27,6 +27,6 @@ export default async function documentTypeHandler(req: Request, response: Respon return; } } - + next(); } diff --git a/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts index 6745b721..387c50bf 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts @@ -1,20 +1,28 @@ import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; import { NextFunction, Request, Response } from "express"; import Container from "typedi"; -import { OfficeFolder } from "le-coffre-resources/dist/SuperAdmin"; import FilesService from "@Services/common/FilesService/FilesService"; +import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; export default async function fileHandler(req: Request, response: Response, next: NextFunction) { const officeId = req.body.user.office_Id; let uid = req.path && req.path.split("/")[5]; - const folder: OfficeFolder = req.body.document.folder; + const document = req.body.document; - if (folder && folder.office?.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); - return; + if (document) { + const documentService = Container.get(DocumentsService); + const documentWithOffice = await documentService.getByUidWithOffice(document.uid!); + if (!documentWithOffice) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + if (documentWithOffice.folder.office?.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } } - if(uid === "download") uid = req.path && req.path.split("/")[6]; + if (uid === "download") uid = req.path && req.path.split("/")[6]; if (uid) { const fileService = Container.get(FilesService); @@ -24,7 +32,6 @@ export default async function fileHandler(req: Request, response: Response, next response.sendStatus(HttpCodes.NOT_FOUND); return; } - if (file.document.folder.office.uid != officeId) { response.sendStatus(HttpCodes.UNAUTHORIZED); return; diff --git a/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts index 34a587fa..9f2f7f57 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts @@ -16,14 +16,14 @@ export default async function folderHandler(req: Request, response: Response, ne return; } - if(deedType) { + if (deedType) { const deedTypeService = Container.get(DeedTypesService); const deedTypeWithOffice = await deedTypeService.getByUidWithOffice(deedType.uid!); if (!deedTypeWithOffice) { response.sendStatus(HttpCodes.NOT_FOUND); return; } - if(deedTypeWithOffice.office.uid != officeId) { + if (deedTypeWithOffice.office.uid != officeId) { response.sendStatus(HttpCodes.UNAUTHORIZED); return; } @@ -32,7 +32,9 @@ export default async function folderHandler(req: Request, response: Response, ne const officeFolderService = Container.get(OfficeFoldersService); if (officeFolderNumber) { - const officeFoldersWithSameNumber = await officeFolderService.get({ where: { folder_number: officeFolderNumber, office: {uid: officeId}}}); + const officeFoldersWithSameNumber = await officeFolderService.get({ + where: { folder_number: officeFolderNumber, office: { uid: officeId } }, + }); if (officeFoldersWithSameNumber.length) { response.sendStatus(HttpCodes.BAD_REQUEST); return; diff --git a/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts index 3d53f901..961c11f7 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts @@ -27,6 +27,6 @@ export default async function officeRoleHandler(req: Request, response: Response return; } } - + next(); } diff --git a/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts index 2d007397..21b6c8eb 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts @@ -27,6 +27,6 @@ export default async function userHandler(req: Request, response: Response, next return; } } - + next(); } diff --git a/src/app/middlewares/RulesHandler.ts b/src/app/middlewares/RulesHandler.ts index c1a4d6e6..36e36099 100644 --- a/src/app/middlewares/RulesHandler.ts +++ b/src/app/middlewares/RulesHandler.ts @@ -2,21 +2,20 @@ import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; import { NextFunction, Request, Response } from "express"; export default async function ruleHandler(req: Request, response: Response, next: NextFunction) { - const rules = req.body.user.rules; - const service = req.path && req.path.split('/')[4]; - const namespace = req.path && req.path.split('/')[3]; - const role = req.body.user.role; + const rules = req.body.user.rules; + const service = req.path && req.path.split("/")[4]; + const namespace = req.path && req.path.split("/")[3]; + const role = req.body.user.role; - if(namespace != 'notary' && role != namespace) { - response.sendStatus(HttpCodes.UNAUTHORIZED); - return; - } + if (namespace != "notary" && role != namespace) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } - if(!rules.includes(req.method + ' ' + service)) { - response.sendStatus(HttpCodes.UNAUTHORIZED); - return; - } + if (!rules.includes(req.method + " " + service)) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } - next(); + next(); } - diff --git a/src/common/config/variables/Variables.ts b/src/common/config/variables/Variables.ts index 95a8a427..41ee2912 100644 --- a/src/common/config/variables/Variables.ts +++ b/src/common/config/variables/Variables.ts @@ -86,9 +86,8 @@ export class BackendVariables { try { await validateOrReject(this, validationOptions); - } - catch(error) { - if(process.env["NODE_ENV"] === "development") { + } catch (error) { + if (process.env["NODE_ENV"] === "development") { throw error; } throw new Error("Some env variables are required!"); diff --git a/src/common/databases/seeders/seeder.ts b/src/common/databases/seeders/seeder.ts index a64ab0b5..25fb518c 100644 --- a/src/common/databases/seeders/seeder.ts +++ b/src/common/databases/seeders/seeder.ts @@ -1,4 +1,4 @@ -import 'module-alias/register'; +import "module-alias/register"; import { EFolderStatus, EOfficeStatus, ECivility, ECustomerStatus, PrismaClient, Prisma } from "@prisma/client"; import User, { Address, @@ -16,7 +16,6 @@ import User, { export default async function main() { const prisma = new PrismaClient(); - const randomString = () => { const chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; @@ -824,7 +823,6 @@ export default async function main() { created_at: new Date(), updated_at: new Date(), }, - ]; const roles: Role[] = [ @@ -838,20 +836,20 @@ export default async function main() { name: "admin", created_at: new Date(), updated_at: new Date(), - rules: rules.slice(0,33), + rules: rules.slice(0, 33), }, { name: "notary", created_at: new Date(), updated_at: new Date(), - rules: rules.slice(0,22), + rules: rules.slice(0, 22), }, { name: "default", created_at: new Date(), updated_at: new Date(), - rules: rules.slice(0,11), - } + rules: rules.slice(0, 11), + }, ]; const officeRoles: OfficeRole[] = [ @@ -860,29 +858,29 @@ export default async function main() { created_at: new Date(), updated_at: new Date(), office: offices[0]!, - rules: rules.slice(0,40), + rules: rules.slice(0, 40), }, { name: "notary", created_at: new Date(), updated_at: new Date(), office: offices[0]!, - rules: rules.slice(0,33), + rules: rules.slice(0, 33), }, { name: "deputy", created_at: new Date(), updated_at: new Date(), office: offices[0]!, - rules: rules.slice(0,22), + rules: rules.slice(0, 22), }, { name: "listener", created_at: new Date(), updated_at: new Date(), office: offices[0]!, - rules: rules.slice(0,11), - } + rules: rules.slice(0, 11), + }, ]; const users: User[] = [ @@ -1385,12 +1383,12 @@ export default async function main() { office_status: EOfficeStatus.DESACTIVATED, }, }); -; office.uid = officeCreated.uid; + office.uid = officeCreated.uid; } for (const rule of rules) { const ruleCreated = await prisma.rules.create({ data: { - name: rule.name + name: rule.name, }, }); rule.uid = ruleCreated.uid; @@ -1607,8 +1605,8 @@ export default async function main() { connect: officeFolder.stakeholders?.map((stakeholder) => ({ uid: stakeholder.uid!, })), - } - } + }, + }, }); officeFolder.uid = officeFolderCreated.uid; } diff --git a/src/common/repositories/DeedTypesRepository.ts b/src/common/repositories/DeedTypesRepository.ts index 41106d37..62059131 100644 --- a/src/common/repositories/DeedTypesRepository.ts +++ b/src/common/repositories/DeedTypesRepository.ts @@ -46,13 +46,13 @@ export default class DeedTypesRepository extends BaseRepository { })), }; } - return this.model.create({...createArgs, include: { document_types: true }}); + return this.model.create({ ...createArgs, include: { document_types: true } }); } /** * @description : Update data of a deed type */ - public async update(uid: string, deedType: DeedType): Promise { + public async update(uid: string, deedType: DeedType): Promise { const updateArgs: Prisma.DeedTypesUpdateArgs = { where: { uid: uid, @@ -69,12 +69,12 @@ export default class DeedTypesRepository extends BaseRepository { document_types: { set: deedType.document_types?.map((documentType) => ({ uid: documentType.uid!, - })) - } + })), + }, }, }; - - return this.model.update({...updateArgs, include: { document_types: true }}); + + return this.model.update({ ...updateArgs, include: { document_types: true } }); } /** diff --git a/src/common/repositories/DeedsRepository.ts b/src/common/repositories/DeedsRepository.ts index 7b488515..becc4d55 100644 --- a/src/common/repositories/DeedsRepository.ts +++ b/src/common/repositories/DeedsRepository.ts @@ -100,9 +100,9 @@ export default class DeedsRepository extends BaseRepository { uid: uid, }, include: { - deed_type: {include: {office: true}}, - document_types: {include: {office: true}}, - } + deed_type: { include: { office: true } }, + document_types: { include: { office: true } }, + }, }); } } diff --git a/src/common/repositories/DocumentTypesRepository.ts b/src/common/repositories/DocumentTypesRepository.ts index 3b3cbf65..f395bc91 100644 --- a/src/common/repositories/DocumentTypesRepository.ts +++ b/src/common/repositories/DocumentTypesRepository.ts @@ -61,7 +61,7 @@ export default class DocumentTypesRepository extends BaseRepository { uid: documentType.office!.uid, }, }, - } + }, }; return this.model.update(updateArgs); @@ -87,7 +87,7 @@ export default class DocumentTypesRepository extends BaseRepository { where: { uid: uid, }, - include: {office: true}, + include: { office: true }, }); } } diff --git a/src/common/repositories/DocumentsRepository.ts b/src/common/repositories/DocumentsRepository.ts index ba4de950..5a81d7ca 100644 --- a/src/common/repositories/DocumentsRepository.ts +++ b/src/common/repositories/DocumentsRepository.ts @@ -27,7 +27,7 @@ export default class DocumentsRepository extends BaseRepository { /** * @description : Create a document */ - public async create(document: Document): Promise { + public async create(document: Document): Promise { const createArgs: Prisma.DocumentsCreateArgs = { data: { folder: { @@ -48,7 +48,7 @@ export default class DocumentsRepository extends BaseRepository { }, }; - const documentCreated = await this.model.create({...createArgs, include: {document_type: true}}); + const documentCreated = await this.model.create({ ...createArgs, include: { document_type: true } }); await this.instanceDb.documentHistory.create({ data: { @@ -78,7 +78,7 @@ export default class DocumentsRepository extends BaseRepository { const batchPayload = await this.model.createMany(createArgs); - const documentsCreated = await this.model.findMany({orderBy: {created_at: 'desc'}, take: batchPayload.count}); + const documentsCreated = await this.model.findMany({ orderBy: { created_at: "desc" }, take: batchPayload.count }); const createHistoryArgs: Prisma.DocumentHistoryCreateManyArgs = { data: documentsCreated.map((document) => ({ @@ -106,7 +106,7 @@ export default class DocumentsRepository extends BaseRepository { document_status: EDocumentStatus[document.document_status as keyof typeof EDocumentStatus], refused_reason: refusedReason, }, - } + }, }, }); } @@ -142,7 +142,7 @@ export default class DocumentsRepository extends BaseRepository { where: { uid: uid, }, - include: {folder: {include: {office: true}}, document_type: {include: {office: true}}}, + include: { folder: { include: { office: true } }, document_type: { include: { office: true } } }, }); } } diff --git a/src/common/repositories/FilesRepository.ts b/src/common/repositories/FilesRepository.ts index f7d7a2f9..100e10a2 100644 --- a/src/common/repositories/FilesRepository.ts +++ b/src/common/repositories/FilesRepository.ts @@ -27,7 +27,7 @@ export default class FilesRepository extends BaseRepository { /** * @description : Create a file linked to a document */ - public async create(file: File, key: string): Promise { + public async create(file: File, key: string): Promise { const createArgs: Prisma.FilesCreateArgs = { data: { document: { @@ -39,16 +39,16 @@ export default class FilesRepository extends BaseRepository { file_path: file.file_path, mimetype: file.mimetype, size: file.size, - key: key - } + key: key, + }, }; - return this.model.create({...createArgs, include: { document: true }}); + return this.model.create({ ...createArgs, include: { document: true } }); } /** * @description : Update data of a file */ - public async update(uid: string, file: File, key: string): Promise { + public async update(uid: string, file: File, key: string): Promise { const updateArgs: Prisma.FilesUpdateArgs = { where: { uid: uid, @@ -58,26 +58,26 @@ export default class FilesRepository extends BaseRepository { file_path: file.file_path, mimetype: file.mimetype, size: file.size, - key: key - } + key: key, + }, }; - return this.model.update({...updateArgs, include: { document: true }}); + return this.model.update({ ...updateArgs, include: { document: true } }); } /** * @description : Delete a file key and archive */ - public async deleteKeyAndArchive(uid: string): Promise { + public async deleteKeyAndArchive(uid: string): Promise { const updateArgs: Prisma.FilesUpdateArgs = { where: { uid: uid, }, data: { key: null, - archived_at: new Date(Date.now()) - } + archived_at: new Date(Date.now()), + }, }; - return this.model.update({...updateArgs, include: { document: true }}); + return this.model.update({ ...updateArgs, include: { document: true } }); } /** @@ -100,7 +100,7 @@ export default class FilesRepository extends BaseRepository { where: { uid: uid, }, - include: {document: {include: {folder: {include: {office: true}}}}}, + include: { document: { include: { folder: { include: { office: true } } } } }, }); } } diff --git a/src/common/repositories/OfficeFoldersRepository.ts b/src/common/repositories/OfficeFoldersRepository.ts index 96db2950..e36d2b36 100644 --- a/src/common/repositories/OfficeFoldersRepository.ts +++ b/src/common/repositories/OfficeFoldersRepository.ts @@ -27,7 +27,7 @@ export default class OfficeFoldersRepository extends BaseRepository { /** * @description : Create new office folder with stakeholders */ - public async create(officeFolder: OfficeFolder): Promise { + public async create(officeFolder: OfficeFolder): Promise { const createArgs: Prisma.OfficeFoldersCreateArgs = { data: { folder_number: officeFolder.folder_number, @@ -48,11 +48,11 @@ export default class OfficeFoldersRepository extends BaseRepository { connect: officeFolder.stakeholders?.map((stakeholder) => ({ uid: stakeholder.uid!, })), - } - } + }, + }, }; - - return this.model.create({...createArgs, include: {stakeholders: true}}); + + return this.model.create({ ...createArgs, include: { stakeholders: true } }); } /** @@ -120,7 +120,7 @@ export default class OfficeFoldersRepository extends BaseRepository { where: { uid: uid, }, - include: {office: true}, + include: { office: true }, }); } diff --git a/src/common/repositories/OfficeRolesRepository.ts b/src/common/repositories/OfficeRolesRepository.ts index b7c5edb1..940c9bc4 100644 --- a/src/common/repositories/OfficeRolesRepository.ts +++ b/src/common/repositories/OfficeRolesRepository.ts @@ -27,7 +27,7 @@ export default class OfficeRolesRepository extends BaseRepository { /** * @description : Create new officeRole with rules */ - public async create(officeRole: OfficeRole): Promise { + public async create(officeRole: OfficeRole): Promise { const createArgs: Prisma.OfficeRolesCreateArgs = { data: { name: officeRole.name, @@ -44,13 +44,13 @@ export default class OfficeRolesRepository extends BaseRepository { }, }; - return this.model.create({...createArgs, include: {rules: true}}); + return this.model.create({ ...createArgs, include: { rules: true } }); } /** * @description : Update data of a officeRole with rules */ - public async update(officeRole: OfficeRole): Promise { + public async update(officeRole: OfficeRole): Promise { const updateArgs: Prisma.OfficeRolesUpdateArgs = { where: { uid: officeRole.uid, @@ -65,7 +65,7 @@ export default class OfficeRolesRepository extends BaseRepository { }, }; - return this.model.update({...updateArgs, include: {rules: true}}); + return this.model.update({ ...updateArgs, include: { rules: true } }); } /** @@ -88,7 +88,7 @@ export default class OfficeRolesRepository extends BaseRepository { where: { uid: uid, }, - include: {office: true}, + include: { office: true }, }); } diff --git a/src/common/repositories/RulesRepository.ts b/src/common/repositories/RulesRepository.ts index 431d2cc7..7781290b 100644 --- a/src/common/repositories/RulesRepository.ts +++ b/src/common/repositories/RulesRepository.ts @@ -30,10 +30,10 @@ export default class RulesRepository extends BaseRepository { public async create(rule: Rule): Promise { const createArgs: Prisma.RulesCreateArgs = { data: { - name: rule.name + name: rule.name, }, }; - + return this.model.create(createArgs); } @@ -46,10 +46,10 @@ export default class RulesRepository extends BaseRepository { uid: rule.uid, }, data: { - name: rule.name + name: rule.name, }, }; - + return this.model.update(updateArgs); } diff --git a/src/common/repositories/UsersRepository.ts b/src/common/repositories/UsersRepository.ts index 6838dfd7..7f98728b 100644 --- a/src/common/repositories/UsersRepository.ts +++ b/src/common/repositories/UsersRepository.ts @@ -57,7 +57,7 @@ export default class UsersRepository extends BaseRepository { email: user.contact!.email, phone_number: user.contact?.phone_number, cell_phone_number: user.contact!.cell_phone_number, - civility: ECivility[user.contact?.civility as keyof typeof ECivility] + civility: ECivility[user.contact?.civility as keyof typeof ECivility], }, }, role: { @@ -130,7 +130,7 @@ export default class UsersRepository extends BaseRepository { email: user.contact!.email, phone_number: user.contact?.phone_number, cell_phone_number: user.contact?.cell_phone_number, - civility: ECivility[user.contact?.civility as keyof typeof ECivility] + civility: ECivility[user.contact?.civility as keyof typeof ECivility], }, }, }, @@ -155,7 +155,7 @@ export default class UsersRepository extends BaseRepository { /** * @description : Find one user */ - public async findOneByUid(uid: string, query?: Prisma.UsersInclude){ + public async findOneByUid(uid: string, query?: Prisma.UsersInclude) { return this.model.findUnique({ where: { uid: uid, @@ -167,12 +167,12 @@ export default class UsersRepository extends BaseRepository { /** * @description : Find one user with office */ - public async findOneByUidWithOffice(uid: string){ + public async findOneByUidWithOffice(uid: string) { return this.model.findUnique({ where: { uid: uid, }, - include: {office_membership: true}, + include: { office_membership: true }, }); } @@ -183,8 +183,8 @@ export default class UsersRepository extends BaseRepository { return this.model.findUnique({ where: { [providerName]: id }, include: { - role: { include: { rules: true } } , - office_role: { include: { rules: true } } , + role: { include: { rules: true } }, + office_role: { include: { rules: true } }, office_membership: true, }, }); diff --git a/src/common/system/OpenIdInterface.ts b/src/common/system/OpenIdInterface.ts index 62700e63..997a903e 100644 --- a/src/common/system/OpenIdInterface.ts +++ b/src/common/system/OpenIdInterface.ts @@ -21,10 +21,10 @@ export type OpenIdConfig = { scopes_supported: string[]; issuer: string; jwks_uri: string; -} +}; export default interface OpenIdInterface { - getOpenIdConfig(): Promise + getOpenIdConfig(): Promise; verifyIdToken(signingKey: string): Promise; getSigningKeys(jwksUri: string): Promise; } diff --git a/src/entries/App.ts b/src/entries/App.ts index f500c7f6..85468296 100644 --- a/src/entries/App.ts +++ b/src/entries/App.ts @@ -9,8 +9,7 @@ import errorHandler from "@App/middlewares/ErrorHandler"; import { BackendVariables } from "@Common/config/variables/Variables"; import multer from "multer"; - -const storage = multer.memoryStorage(); +const storage = multer.memoryStorage(); (async () => { try { @@ -24,7 +23,12 @@ const storage = multer.memoryStorage(); label, port: parseInt(port), rootUrl, - middlwares: [cors({ origin: "*" }), multer({storage:storage}).single('file'), bodyParser.urlencoded({ extended: true }), bodyParser.json()], + middlwares: [ + cors({ origin: "*" }), + multer({ storage: storage }).single("file"), + bodyParser.urlencoded({ extended: true }), + bodyParser.json(), + ], errorHandler, }); diff --git a/src/services/common/CryptoService/CryptoService.ts b/src/services/common/CryptoService/CryptoService.ts index 5ac62af1..893f62c5 100644 --- a/src/services/common/CryptoService/CryptoService.ts +++ b/src/services/common/CryptoService/CryptoService.ts @@ -5,7 +5,6 @@ import crypto from "crypto"; @Service() export default class CryptoService extends BaseService { - private static readonly CRYPTO_ALGORITHM = "aes-256-ctr"; constructor(protected variables: BackendVariables) { @@ -13,7 +12,7 @@ export default class CryptoService extends BaseService { } private getKey(key: string) { - return crypto.createHash('sha256').update(String(key)).digest('base64').slice(0, 32); + return crypto.createHash("sha256").update(String(key)).digest("base64").slice(0, 32); } /** @@ -29,7 +28,7 @@ export default class CryptoService extends BaseService { const result = Buffer.concat([iv, cipher.update(buffer), cipher.final()]); return result; } - + /** * @description : decrypt data with an initialization vector * @throws {Error} If data cannot be decrypted diff --git a/src/services/common/FilesService/FilesService.ts b/src/services/common/FilesService/FilesService.ts index a1618ec1..0f13bc9d 100644 --- a/src/services/common/FilesService/FilesService.ts +++ b/src/services/common/FilesService/FilesService.ts @@ -6,11 +6,10 @@ import CryptoService from "../CryptoService/CryptoService"; import IpfsService from "../IpfsService/IpfsService"; import { BackendVariables } from "@Common/config/variables/Variables"; import { Readable } from "stream"; -import {v4} from "uuid"; +import { v4 } from "uuid"; import { Files, Prisma } from "@prisma/client"; import fetch from "node-fetch"; - @Service() export default class FilesService extends BaseService { constructor( @@ -34,7 +33,7 @@ export default class FilesService extends BaseService { * @description : Get a file by uid * @throws {Error} If project cannot be created */ - public async getByUid(uid: string, query?: Prisma.FilesInclude) { + public async getByUid(uid: string, query?: Prisma.FilesInclude) { return this.filesRepository.findOneByUid(uid, query); } @@ -42,7 +41,7 @@ export default class FilesService extends BaseService { * @description : Get a file by uid with office * @throws {Error} If project cannot be created */ - public async getByUidWithOffice(uid: string) { + public async getByUidWithOffice(uid: string) { return this.filesRepository.findOneByUidWithOffice(uid); } @@ -55,7 +54,7 @@ export default class FilesService extends BaseService { if (!file?.key) return null; const fileResult = await fetch(file.file_path); const fileArrayBuffer = await fileResult.arrayBuffer(); - return {file: file, buffer: await this.cryptoService.decrypt(Buffer.from(fileArrayBuffer), file.key)}; + return { file: file, buffer: await this.cryptoService.decrypt(Buffer.from(fileArrayBuffer), file.key) }; } /** @@ -63,14 +62,15 @@ export default class FilesService extends BaseService { * @throws {Error} If file cannot be created */ public async create(file: File, fileData: Express.Multer.File) { - const key = v4(); + const key = v4(); const encryptedFile = await this.cryptoService.encrypt(fileData.buffer, key); const upload = await this.ipfsService.pinFile(Readable.from(encryptedFile), fileData.originalname); - const fileToCreate: File = file; + let fileToCreate: File = file; fileToCreate.file_name = fileData.originalname; fileToCreate.file_path = this.variables.PINATA_GATEWAY.concat(upload.IpfsHash); fileToCreate.mimetype = fileData.mimetype; fileToCreate.size = fileData.size; + fileToCreate.archived_at = null; return this.filesRepository.create(fileToCreate, key); } @@ -80,7 +80,7 @@ export default class FilesService extends BaseService { * @throws {Error} If file cannot be modified */ public async update(uid: string, file: File): Promise { - const key = v4(); + const key = v4(); return this.filesRepository.update(uid, file, key); } @@ -91,13 +91,13 @@ export default class FilesService extends BaseService { public async deleteKeyAndArchive(uid: string): Promise { try { const fileToUnpin = await this.filesRepository.findOneByUid(uid); - if(!fileToUnpin) throw new Error("file not found"); + if (!fileToUnpin) throw new Error("file not found"); const fileHash = fileToUnpin.file_path.substring(this.variables.PINATA_GATEWAY.length); await this.ipfsService.unpinFile(fileHash); - } catch(error) { + } catch (error) { console.error(error); } - + return this.filesRepository.deleteKeyAndArchive(uid); } } diff --git a/src/services/common/IpfsService/IpfsService.ts b/src/services/common/IpfsService/IpfsService.ts index cc0f3df7..87a77b56 100644 --- a/src/services/common/IpfsService/IpfsService.ts +++ b/src/services/common/IpfsService/IpfsService.ts @@ -9,7 +9,7 @@ export default class FilesService extends BaseService { private ipfsClient: pinataSDK; constructor(protected variables: BackendVariables) { super(); - this.ipfsClient = new pinataSDK({ pinataApiKey: variables.PINATA_API_KEY, pinataSecretApiKey: variables.PINATA_API_SECRET }) + this.ipfsClient = new pinataSDK({ pinataApiKey: variables.PINATA_API_KEY, pinataSecretApiKey: variables.PINATA_API_SECRET }); } /** @@ -17,7 +17,7 @@ export default class FilesService extends BaseService { * @throws {Error} If file cannot be pinned */ public async pinFile(stream: Readable, fileName: string) { - return this.ipfsClient.pinFileToIPFS(stream, {pinataMetadata : {name: fileName}}); + return this.ipfsClient.pinFileToIPFS(stream, { pinataMetadata: { name: fileName } }); } /** diff --git a/src/services/common/OpenIdService/OpenIdService.ts b/src/services/common/OpenIdService/OpenIdService.ts index c6785c83..6f34bc58 100644 --- a/src/services/common/OpenIdService/OpenIdService.ts +++ b/src/services/common/OpenIdService/OpenIdService.ts @@ -20,7 +20,7 @@ export type OpenIdConfig = { scopes_supported: string[]; issuer: string; jwks_uri: string; -} +}; @Service() export default class OpenIdService extends BaseService { diff --git a/src/services/customer/DocumentsService/DocumentsService.ts b/src/services/customer/DocumentsService/DocumentsService.ts index e04a1864..a3cc2e16 100644 --- a/src/services/customer/DocumentsService/DocumentsService.ts +++ b/src/services/customer/DocumentsService/DocumentsService.ts @@ -38,7 +38,7 @@ export default class DocumentsService extends BaseService { * @description : Modify a document * @throws {Error} If document cannot be modified */ - public async update(uid: string, document: Document): Promise { + public async update(uid: string, document: Document): Promise { return this.documentsRepository.update(uid, document); } @@ -46,7 +46,7 @@ export default class DocumentsService extends BaseService { * @description : Delete a document * @throws {Error} If document cannot be deleted */ - public async delete(uid: string): Promise { + public async delete(uid: string): Promise { return this.documentsRepository.delete(uid); } diff --git a/src/services/super-admin/DeedTypesService/DeedTypesService.ts b/src/services/super-admin/DeedTypesService/DeedTypesService.ts index 6e5fda52..4c94017e 100644 --- a/src/services/super-admin/DeedTypesService/DeedTypesService.ts +++ b/src/services/super-admin/DeedTypesService/DeedTypesService.ts @@ -6,9 +6,7 @@ import { Service } from "typedi"; @Service() export default class DeedTypesService extends BaseService { - constructor( - private deedTypeRepository: DeedTypesRepository, - ) { + constructor(private deedTypeRepository: DeedTypesRepository) { super(); } diff --git a/src/services/super-admin/DocumentTypesService/DocumentTypesService.ts b/src/services/super-admin/DocumentTypesService/DocumentTypesService.ts index 678c58f9..835c3485 100644 --- a/src/services/super-admin/DocumentTypesService/DocumentTypesService.ts +++ b/src/services/super-admin/DocumentTypesService/DocumentTypesService.ts @@ -38,7 +38,7 @@ export default class DocumentTypesService extends BaseService { * @description : Get a document-type by uid * @throws {Error} If document-type is not found */ - public async getByUid(uid: string, query?: Prisma.DocumentTypesInclude): Promise { + public async getByUid(uid: string, query?: Prisma.DocumentTypesInclude): Promise { return this.documentTypeRepository.findOneByUid(uid, query); } diff --git a/src/services/super-admin/DocumentsService/DocumentsService.ts b/src/services/super-admin/DocumentsService/DocumentsService.ts index 581aa563..c86fcb0f 100644 --- a/src/services/super-admin/DocumentsService/DocumentsService.ts +++ b/src/services/super-admin/DocumentsService/DocumentsService.ts @@ -38,7 +38,7 @@ export default class DocumentsService extends BaseService { * @description : Modify a document * @throws {Error} If document cannot be modified */ - public async update(uid: string, document: Partial, refused_reason?: string): Promise { + public async update(uid: string, document: Partial, refused_reason?: string): Promise { return this.documentsRepository.update(uid, document, refused_reason); } @@ -46,11 +46,11 @@ export default class DocumentsService extends BaseService { * @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"); + 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" }); - + if (document.files && document.files.length !== 0) { throw new Error("Can't delete a document with file"); } diff --git a/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts b/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts index 32d142cf..846a5982 100644 --- a/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts +++ b/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts @@ -1,4 +1,4 @@ -import { OfficeFolders } from ".prisma/client"; +import { OfficeFolders } from ".prisma/client"; import OfficeFoldersRepository from "@Repositories/OfficeFoldersRepository"; import BaseService from "@Services/BaseService"; import { OfficeFolder } from "le-coffre-resources/dist/SuperAdmin"; @@ -7,13 +7,12 @@ import DeedTypesService from "../DeedTypesService/DeedTypesService"; import DeedsRepository from "@Repositories/DeedsRepository"; import { Prisma } from "@prisma/client"; - @Service() export default class OfficeFoldersService extends BaseService { constructor( private officeFoldersRepository: OfficeFoldersRepository, private deedTypeService: DeedTypesService, - private deedRepository: DeedsRepository + private deedRepository: DeedsRepository, ) { super(); } @@ -22,7 +21,7 @@ export default class OfficeFoldersService extends BaseService { * @description : Get all folders * @throws {Error} If folders cannot be get */ - public async get(query: Prisma.OfficeFoldersFindManyArgs) { + public async get(query: Prisma.OfficeFoldersFindManyArgs) { return this.officeFoldersRepository.findMany(query); } @@ -32,8 +31,8 @@ export default class OfficeFoldersService extends BaseService { */ public async create(officeFolderEntity: OfficeFolder): Promise { const deedType = await this.deedTypeService.getByUid(officeFolderEntity.deed!.deed_type!.uid!); - if(!deedType) throw new Error('deed type not found'); - if(deedType.archived_at) throw new Error('deed type is archived'); + if (!deedType) throw new Error("deed type not found"); + if (deedType.archived_at) throw new Error("deed type is archived"); const deed = await this.deedRepository.create(officeFolderEntity.deed!); officeFolderEntity.deed!.uid = deed.uid; return this.officeFoldersRepository.create(officeFolderEntity); @@ -69,9 +68,9 @@ export default class OfficeFoldersService extends BaseService { */ public async delete(uid: string): Promise { const officeFolderEntity = await this.officeFoldersRepository.findOneByUid(uid, { customers: true }); - if(!officeFolderEntity) throw new Error('office folder not found'); + if (!officeFolderEntity) throw new Error("office folder not found"); const officeFolder = OfficeFolder.hydrate(officeFolderEntity, { strategy: "excludeAll" }); - + if (officeFolder.customers?.length) { throw new Error("This folder is used by customers"); } diff --git a/src/services/super-admin/OfficeRolesService/OfficeRolesService.ts b/src/services/super-admin/OfficeRolesService/OfficeRolesService.ts index 69d1e80d..b352b412 100644 --- a/src/services/super-admin/OfficeRolesService/OfficeRolesService.ts +++ b/src/services/super-admin/OfficeRolesService/OfficeRolesService.ts @@ -2,7 +2,7 @@ import BaseService from "@Services/BaseService"; import { Service } from "typedi"; import OfficeRolesRepository from "@Repositories/OfficeRolesRepository"; import { OfficeRole } from "le-coffre-resources/dist/SuperAdmin"; -import {Prisma, OfficeRoles } from "@prisma/client"; +import { Prisma, OfficeRoles } from "@prisma/client"; @Service() export default class OfficeRolesService extends BaseService { diff --git a/src/services/super-admin/RolesService/RolesService.ts b/src/services/super-admin/RolesService/RolesService.ts index bbe52248..b26dd317 100644 --- a/src/services/super-admin/RolesService/RolesService.ts +++ b/src/services/super-admin/RolesService/RolesService.ts @@ -3,7 +3,7 @@ import "reflect-metadata"; import { Service } from "typedi"; import RolesRepository from "@Repositories/RolesRepository"; import { Role } from "le-coffre-resources/dist/SuperAdmin"; -import {Prisma, Roles } from "@prisma/client"; +import { Prisma, Roles } from "@prisma/client"; @Service() export default class RolesService extends BaseService { diff --git a/src/services/super-admin/RulesService/RulesService.ts b/src/services/super-admin/RulesService/RulesService.ts index edc4ce64..053c2cce 100644 --- a/src/services/super-admin/RulesService/RulesService.ts +++ b/src/services/super-admin/RulesService/RulesService.ts @@ -3,7 +3,7 @@ import "reflect-metadata"; import { Service } from "typedi"; import RulesRepository from "@Repositories/RulesRepository"; import { Rule } from "le-coffre-resources/dist/SuperAdmin"; -import {Prisma, Rules } from "@prisma/client"; +import { Prisma, Rules } from "@prisma/client"; @Service() export default class RulesService extends BaseService { diff --git a/src/services/super-admin/UsersService/UsersService.ts b/src/services/super-admin/UsersService/UsersService.ts index 832e86eb..da350fea 100644 --- a/src/services/super-admin/UsersService/UsersService.ts +++ b/src/services/super-admin/UsersService/UsersService.ts @@ -3,7 +3,7 @@ import "reflect-metadata"; import { Service } from "typedi"; import UsersRepository from "@Repositories/UsersRepository"; import User from "le-coffre-resources/dist/SuperAdmin"; -import {Prisma, Users } from "@prisma/client"; +import { Prisma, Users } from "@prisma/client"; @Service() export default class UsersService extends BaseService { diff --git a/src/test/services/super-admin/CustomersService.test.ts b/src/test/services/super-admin/CustomersService.test.ts index 7ea5944c..4b3f383e 100644 --- a/src/test/services/super-admin/CustomersService.test.ts +++ b/src/test/services/super-admin/CustomersService.test.ts @@ -151,7 +151,7 @@ describe("test update function", () => { describe("test get function", () => { it("should return an array of Customers", async () => { - const req = {} + const req = {}; const customers = await CustomersServiceTest.get(req); // verify result typing diff --git a/src/test/services/super-admin/DeedTypesService.test.ts b/src/test/services/super-admin/DeedTypesService.test.ts index 57ea73d9..8e66eb54 100644 --- a/src/test/services/super-admin/DeedTypesService.test.ts +++ b/src/test/services/super-admin/DeedTypesService.test.ts @@ -269,7 +269,7 @@ describe("test get function", () => { }); it("should return an array of DeedTypes per offices", async () => { - const deedTypesForFirstOffice = await DeedTypeServiceTest.get({ where: { office: {uid: office.uid} }, orderBy: { name: "asc" } }); + const deedTypesForFirstOffice = await DeedTypeServiceTest.get({ where: { office: { uid: office.uid } }, orderBy: { name: "asc" } }); expect(deedTypesForFirstOffice.length).toEqual(1); @@ -279,7 +279,10 @@ describe("test get function", () => { expect(deedTypesForFirstOffice[0]?.archived_at).toBeNull(); expect(deedTypesForFirstOffice[0]?.office_uid).toEqual(office.uid); - const deedTypesForSecondOffice = await DeedTypeServiceTest.get({ where: { office: {uid: office_.uid} }, orderBy: { name: "asc" } }); + const deedTypesForSecondOffice = await DeedTypeServiceTest.get({ + where: { office: { uid: office_.uid } }, + orderBy: { name: "asc" }, + }); expect(deedTypesForSecondOffice.length).toEqual(2); diff --git a/src/test/services/super-admin/DocumentTypesService.test.ts b/src/test/services/super-admin/DocumentTypesService.test.ts index b6d98045..821a455f 100644 --- a/src/test/services/super-admin/DocumentTypesService.test.ts +++ b/src/test/services/super-admin/DocumentTypesService.test.ts @@ -241,7 +241,10 @@ describe("test get function", () => { }); it("should return an array of DocumentTypes per offices", async () => { - const documentTypesForFirstOffice = await DocumentTypesServiceTest.get({ where: { office: {uid : office.uid }}, orderBy: { name: "asc" } }); + const documentTypesForFirstOffice = await DocumentTypesServiceTest.get({ + where: { office: { uid: office.uid } }, + orderBy: { name: "asc" }, + }); expect(documentTypesForFirstOffice.length).toEqual(1); @@ -252,7 +255,10 @@ describe("test get function", () => { expect(documentTypesForFirstOffice[0]?.archived_at).toBeNull(); expect(documentTypesForFirstOffice[0]?.office_uid).toEqual(office.uid); - const documentTypesForSecondOffice = await DocumentTypesServiceTest.get({ where: { office: {uid : office_.uid }}, orderBy: { name: "asc" } }); + const documentTypesForSecondOffice = await DocumentTypesServiceTest.get({ + where: { office: { uid: office_.uid } }, + orderBy: { name: "asc" }, + }); expect(documentTypesForSecondOffice.length).toEqual(2); diff --git a/src/test/services/super-admin/OfficeFolderService.test.ts b/src/test/services/super-admin/OfficeFolderService.test.ts index 78ea6f54..909a6ddd 100644 --- a/src/test/services/super-admin/OfficeFolderService.test.ts +++ b/src/test/services/super-admin/OfficeFolderService.test.ts @@ -1,7 +1,18 @@ import "module-alias/register"; import "reflect-metadata"; import { PrismaClient } from "prisma/prisma-client"; -import { customer, customer_, deedType, documentType, documentType_, office, officeFolder, officeFolder_, user, user_ } from "@Test/config/MockedData"; +import { + customer, + customer_, + deedType, + documentType, + documentType_, + office, + officeFolder, + officeFolder_, + user, + user_, +} from "@Test/config/MockedData"; import Container from "typedi"; import OfficeFoldersRepository from "@Repositories/OfficeFoldersRepository"; import OfficeFolderService from "@Services/super-admin/OfficeFoldersService/OfficeFoldersService"; @@ -12,7 +23,11 @@ import DeedsRepository from "@Repositories/DeedsRepository"; const prisma = new PrismaClient(); -const OfficeFolderServiceTest = new OfficeFolderService(Container.get(OfficeFoldersRepository), Container.get(DeedTypesService), Container.get(DeedsRepository)); +const OfficeFolderServiceTest = new OfficeFolderService( + Container.get(OfficeFoldersRepository), + Container.get(DeedTypesService), + Container.get(DeedsRepository), +); beforeAll(async () => { office.uid = (await initOffice(office)).uid; @@ -48,7 +63,7 @@ describe("test create function", () => { }); it("should not create a new office folder if deed type is archived", async () => { - let officeFolderWithArchivatedDeedType: OfficeFolder = JSON.parse(JSON.stringify(officeFolder)); + let officeFolderWithArchivatedDeedType: OfficeFolder = JSON.parse(JSON.stringify(officeFolder)); // try to create a new deed with unknown deed type async function createOfficeFolderWithArchivedDeedType() { await OfficeFolderServiceTest.create(officeFolderWithArchivatedDeedType); From 70d0fb6e71a2da599061ed9d6dcc7b0088cd4833 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Tue, 4 Jul 2023 18:09:45 +0200 Subject: [PATCH 030/134] add controllers and services by namespace --- package.json | 2 +- src/app/api/admin/CustomersController.ts | 146 ++++++++++++ src/app/api/admin/DeedTypesController.ts | 156 +++++++++++++ src/app/api/admin/DeedsController.ts | 126 ++++++++++ src/app/api/admin/DocumentTypesController.ts | 145 ++++++++++++ src/app/api/admin/DocumentsController.ts | 185 +++++++++++++++ src/app/api/admin/FilesController.ts | 140 +++++++++++ src/app/api/admin/OfficeFoldersController.ts | 183 +++++++++++++++ src/app/api/admin/OfficeRolesController.ts | 151 ++++++++++++ src/app/api/admin/OfficesController.ts | 72 ++++++ src/app/api/admin/RolesController.ts | 77 ++++++ src/app/api/admin/RulesController.ts | 77 ++++++ src/app/api/admin/UsersController.ts | 81 +++++++ src/app/api/customer/DocumentsController.ts | 116 +--------- src/app/api/customer/FilesController.ts | 219 ++++++++++++++++++ .../api/franceConnect/CustomerController.ts | 64 +++++ src/app/api/notary/CustomersController.ts | 146 ++++++++++++ src/app/api/notary/DeedTypesController.ts | 156 +++++++++++++ src/app/api/notary/DeedsController.ts | 126 ++++++++++ src/app/api/notary/DocumentTypesController.ts | 145 ++++++++++++ src/app/api/notary/DocumentsController.ts | 185 +++++++++++++++ src/app/api/notary/FilesController.ts | 140 +++++++++++ src/app/api/notary/OfficeFoldersController.ts | 183 +++++++++++++++ src/app/api/notary/OfficeRolesController.ts | 81 +++++++ src/app/api/notary/OfficesController.ts | 72 ++++++ src/app/api/notary/RolesController.ts | 77 ++++++ src/app/api/notary/RulesController.ts | 77 ++++++ src/app/api/notary/UsersController.ts | 81 +++++++ src/app/api/super-admin/FilesController.ts | 83 +------ .../api/super-admin/OfficeRolesController.ts | 2 +- src/app/api/super-admin/RolesController.ts | 2 +- src/app/api/super-admin/RulesController.ts | 2 +- src/app/api/super-admin/UsersController.ts | 2 +- .../CustomerHandler/DocumentHandler.ts | 23 ++ .../CustomerHandler/FileHandler.ts | 37 +++ src/common/repositories/ContactRepository.ts | 29 +++ .../repositories/CustomersRepository.ts | 17 +- .../repositories/DeedTypesRepository.ts | 4 +- src/common/repositories/DeedsRepository.ts | 6 +- .../repositories/DocumentsRepository.ts | 6 +- src/common/repositories/FilesRepository.ts | 20 +- .../repositories/OfficeFoldersRepository.ts | 6 +- .../repositories/OfficeRolesRepository.ts | 6 +- src/common/repositories/UsersRepository.ts | 14 +- .../CustomersService/CustomersService.ts | 52 +++++ .../DeedTypesService/DeedTypesService.ts | 52 +++++ .../admin/DeedsService/DeedsService.ts | 48 ++++ .../DocumentTypesService.ts | 52 +++++ .../DocumentsService/DocumentsService.ts | 75 ++++++ .../OfficeFoldersService.ts | 79 +++++++ .../OfficeRolesService/OfficeRolesService.ts | 52 +++++ .../admin/OfficesService/OfficesService.ts | 27 +++ .../admin/RolesService/RolesService.ts | 45 ++++ .../admin/RulesService/RulesService.ts | 45 ++++ .../admin/UsersService/UsersService.ts | 61 +++++ .../common/AuthService/AuthService.ts | 31 ++- src/services/common/ContactService.ts | 19 ++ .../common/FilesService/FilesService.ts | 8 + .../CustomersService/CustomersService.ts | 52 +++++ .../DeedTypesService/DeedTypesService.ts | 52 +++++ .../notary/DeedsService/DeedsService.ts | 48 ++++ .../DocumentTypesService.ts | 52 +++++ .../DocumentsService/DocumentsService.ts | 75 ++++++ .../OfficeFoldersService.ts | 79 +++++++ .../OfficeRolesService/OfficeRolesService.ts | 35 +++ .../notary/OfficesService/OfficesService.ts | 27 +++ .../notary/RolesService/RolesService.ts | 28 +++ .../notary/RulesService/RulesService.ts | 28 +++ .../notary/UsersService/UsersService.ts | 61 +++++ .../CustomersService/CustomersService.ts | 10 +- .../DocumentsService/DocumentsService.ts | 2 +- 71 files changed, 4633 insertions(+), 230 deletions(-) create mode 100644 src/app/api/admin/CustomersController.ts create mode 100644 src/app/api/admin/DeedTypesController.ts create mode 100644 src/app/api/admin/DeedsController.ts create mode 100644 src/app/api/admin/DocumentTypesController.ts create mode 100644 src/app/api/admin/DocumentsController.ts create mode 100644 src/app/api/admin/FilesController.ts create mode 100644 src/app/api/admin/OfficeFoldersController.ts create mode 100644 src/app/api/admin/OfficeRolesController.ts create mode 100644 src/app/api/admin/OfficesController.ts create mode 100644 src/app/api/admin/RolesController.ts create mode 100644 src/app/api/admin/RulesController.ts create mode 100644 src/app/api/admin/UsersController.ts create mode 100644 src/app/api/customer/FilesController.ts create mode 100644 src/app/api/franceConnect/CustomerController.ts create mode 100644 src/app/api/notary/CustomersController.ts create mode 100644 src/app/api/notary/DeedTypesController.ts create mode 100644 src/app/api/notary/DeedsController.ts create mode 100644 src/app/api/notary/DocumentTypesController.ts create mode 100644 src/app/api/notary/DocumentsController.ts create mode 100644 src/app/api/notary/FilesController.ts create mode 100644 src/app/api/notary/OfficeFoldersController.ts create mode 100644 src/app/api/notary/OfficeRolesController.ts create mode 100644 src/app/api/notary/OfficesController.ts create mode 100644 src/app/api/notary/RolesController.ts create mode 100644 src/app/api/notary/RulesController.ts create mode 100644 src/app/api/notary/UsersController.ts create mode 100644 src/app/middlewares/CustomerHandler/DocumentHandler.ts create mode 100644 src/app/middlewares/CustomerHandler/FileHandler.ts create mode 100644 src/common/repositories/ContactRepository.ts create mode 100644 src/services/admin/CustomersService/CustomersService.ts create mode 100644 src/services/admin/DeedTypesService/DeedTypesService.ts create mode 100644 src/services/admin/DeedsService/DeedsService.ts create mode 100644 src/services/admin/DocumentTypesService/DocumentTypesService.ts create mode 100644 src/services/admin/DocumentsService/DocumentsService.ts create mode 100644 src/services/admin/OfficeFoldersService/OfficeFoldersService.ts create mode 100644 src/services/admin/OfficeRolesService/OfficeRolesService.ts create mode 100644 src/services/admin/OfficesService/OfficesService.ts create mode 100644 src/services/admin/RolesService/RolesService.ts create mode 100644 src/services/admin/RulesService/RulesService.ts create mode 100644 src/services/admin/UsersService/UsersService.ts create mode 100644 src/services/common/ContactService.ts create mode 100644 src/services/notary/CustomersService/CustomersService.ts create mode 100644 src/services/notary/DeedTypesService/DeedTypesService.ts create mode 100644 src/services/notary/DeedsService/DeedsService.ts create mode 100644 src/services/notary/DocumentTypesService/DocumentTypesService.ts create mode 100644 src/services/notary/DocumentsService/DocumentsService.ts create mode 100644 src/services/notary/OfficeFoldersService/OfficeFoldersService.ts create mode 100644 src/services/notary/OfficeRolesService/OfficeRolesService.ts create mode 100644 src/services/notary/OfficesService/OfficesService.ts create mode 100644 src/services/notary/RolesService/RolesService.ts create mode 100644 src/services/notary/RulesService/RulesService.ts create mode 100644 src/services/notary/UsersService/UsersService.ts diff --git a/package.json b/package.json index d2d12d63..02876930 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "cors": "^2.8.5", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.54", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.55", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", diff --git a/src/app/api/admin/CustomersController.ts b/src/app/api/admin/CustomersController.ts new file mode 100644 index 00000000..01097a90 --- /dev/null +++ b/src/app/api/admin/CustomersController.ts @@ -0,0 +1,146 @@ +import { Response, Request } from "express"; +import { Controller, Get, Post, Put } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import CustomersService from "@Services/admin/CustomersService/CustomersService"; +import { Service } from "typedi"; +import { Customer } from "le-coffre-resources/dist/Admin"; +import { Customers } from "@prisma/client"; +import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; + +@Controller() +@Service() +export default class CustomersController extends ApiController { + constructor(private customersService: CustomersService) { + super(); + } + + /** + * @description Get all customers + */ + @Get("/api/v1/admin/customers", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + + //call service to get prisma entity + const customersEntities = await this.customersService.get(query); + + //Hydrate ressource with prisma entity + const customers = Customer.hydrateArray(customersEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, customers); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Create a new customer + */ + @Post("/api/v1/admin/customers", [authHandler, ruleHandler]) + protected async post(req: Request, response: Response) { + try { + //init IUser resource with request body values + const customerEntity = Customer.hydrate(req.body); + //validate user + await validateOrReject(customerEntity, { groups: ["createCustomer"], forbidUnknownValues: false }); + + //call service to get prisma entity + const customerEntityCreated = await this.customersService.create(customerEntity); + //Hydrate ressource with prisma entity + const customer = Customer.hydrate(customerEntityCreated, { + strategy: "excludeAll", + }); + + //success + this.httpCreated(response, customer); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Modify a specific customer by uid + */ + @Put("/api/v1/admin/customers/:uid", [authHandler, ruleHandler]) + protected async put(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const userFound = await this.customersService.getByUid(uid); + + if (!userFound) { + this.httpNotFoundRequest(response, "user not found"); + return; + } + + //init IUser resource with request body values + const customerEntity = Customer.hydrate(req.body); + + //validate user + await validateOrReject(customerEntity, { groups: ["updateCustomer"], forbidUnknownValues: false }); + + //call service to get prisma entity + const customerEntityUpdated = await this.customersService.update(uid, customerEntity); + + //Hydrate ressource with prisma entity + const customer = Customer.hydrate(customerEntityUpdated, { + strategy: "excludeAll", + }); + + //success + this.httpSuccess(response, customer); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific customer by uid + */ + @Get("/api/v1/admin/customers/:uid", [authHandler, ruleHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + let customerEntity: Customers | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + customerEntity = await this.customersService.getByUid(uid, query); + } else { + //call service to get prisma entity + customerEntity = await this.customersService.getByUid(uid); + } + + if (!customerEntity) { + this.httpNotFoundRequest(response, "customer not found"); + return; + } + + //Hydrate ressource with prisma entity + const customer = Customer.hydrate(customerEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, customer); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/admin/DeedTypesController.ts b/src/app/api/admin/DeedTypesController.ts new file mode 100644 index 00000000..247dca8f --- /dev/null +++ b/src/app/api/admin/DeedTypesController.ts @@ -0,0 +1,156 @@ +import { Response, Request } from "express"; +import { Controller, Get, Post, Put } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import { Service } from "typedi"; +import DeedTypesService from "@Services/admin/DeedTypesService/DeedTypesService"; +import { DeedTypes, Prisma } from "@prisma/client"; +import { DeedType } from "le-coffre-resources/dist/Admin"; +import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; +import deedTypeHandler from "@App/middlewares/OfficeMembershipHandlers/DeedTypeHandler"; + +@Controller() +@Service() +export default class DeedTypesController extends ApiController { + constructor(private deedTypesService: DeedTypesService) { + super(); + } + + /** + * @description Get all deedtypes + * @returns Deedtype[] list of deedtypes + */ + @Get("/api/v1/admin/deed-types", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.DeedTypesWhereInput = { office: { uid: officeId } }; + query.where = officeWhereInput; + + //call service to get prisma entity + const deedTypeEntities: DeedTypes[] = await this.deedTypesService.get(query); + + //Hydrate ressource with prisma entity + const DeedTypes = DeedType.hydrateArray(deedTypeEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, DeedTypes); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Create a new deedtype + * @returns Deedtype created + */ + @Post("/api/v1/admin/deed-types", [authHandler, ruleHandler, deedTypeHandler]) + protected async post(req: Request, response: Response) { + try { + //init DeedType resource with request body values + const deedTypeEntity = DeedType.hydrate(req.body); + + //validate deed type + await validateOrReject(deedTypeEntity, { groups: ["createDeedType"], forbidUnknownValues: false }); + + //call service to get prisma entity + const deedTypeEntityCreated = await this.deedTypesService.create(deedTypeEntity); + + //Hydrate ressource with prisma entity + const deedType = DeedType.hydrate(deedTypeEntityCreated, { + strategy: "excludeAll", + }); + + //success + this.httpCreated(response, deedType); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Modify a specific deedtype by uid + * @returns Deedtype modified + */ + @Put("/api/v1/admin/deed-types/:uid", [authHandler, ruleHandler, deedTypeHandler]) + protected async put(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const deedTypeFound = await this.deedTypesService.getByUid(uid); + + if (!deedTypeFound) { + this.httpNotFoundRequest(response, "deed type not found"); + return; + } + + //init DeedType resource with request body values + const deedTypeEntity = DeedType.hydrate(req.body); + + //validate deed type + await validateOrReject(deedTypeEntity, { groups: ["updateDeedType"] }); + + //call service to get prisma entity + const deedTypeEntityUpdated = await this.deedTypesService.update(uid, deedTypeEntity); + + //Hydrate ressource with prisma entity + const deedType = DeedType.hydrate(deedTypeEntityUpdated, { + strategy: "excludeAll", + }); + + //success + this.httpSuccess(response, deedType); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific deedtype by uid + * @returns IDeedtype + */ + @Get("/api/v1/admin/deed-types/:uid", [authHandler, ruleHandler, deedTypeHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + let deedTypeEntity: DeedTypes | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + deedTypeEntity = await this.deedTypesService.getByUid(uid, query); + } else { + //call service to get prisma entity + deedTypeEntity = await this.deedTypesService.getByUid(uid); + } + + if (!deedTypeEntity) { + this.httpNotFoundRequest(response, "deed type not found"); + return; + } + + //Hydrate ressource with prisma entity + const deedType = DeedType.hydrate(deedTypeEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, deedType); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/admin/DeedsController.ts b/src/app/api/admin/DeedsController.ts new file mode 100644 index 00000000..c811f309 --- /dev/null +++ b/src/app/api/admin/DeedsController.ts @@ -0,0 +1,126 @@ +import { Response, Request } from "express"; +import { Controller, Get, Put } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import DeedsService from "@Services/admin/DeedsService/DeedsService"; +import { Service } from "typedi"; +import { Deeds, Prisma } from "@prisma/client"; +import { Deed } from "le-coffre-resources/dist/Admin"; +import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; +import deedHandler from "@App/middlewares/OfficeMembershipHandlers/DeedHandler"; + +@Controller() +@Service() +export default class DeedsController extends ApiController { + constructor(private deedsService: DeedsService) { + super(); + } + + /** + * @description Get all deeds + * @returns Deed[] list of deeds + */ + @Get("/api/v1/admin/deeds", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.DeedsWhereInput = { deed_type: { office: { uid: officeId } } }; + query.where = officeWhereInput; + + //call service to get prisma entity + const deedEntities: Deeds[] = await this.deedsService.get(query); + + //Hydrate ressource with prisma entity + const deeds = Deed.hydrateArray(deedEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, deeds); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific deed by uid + * @returns Deed + */ + @Get("/api/v1/admin/deeds/:uid", [authHandler, ruleHandler, deedHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + let deedEntity: Deeds | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + deedEntity = await this.deedsService.getByUid(uid, query); + } else { + //call service to get prisma entity + deedEntity = await this.deedsService.getByUid(uid); + } + + if (!deedEntity) { + this.httpNotFoundRequest(response, "deed not found"); + return; + } + + //Hydrate ressource with prisma entity + const deed = Deed.hydrate(deedEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, deed); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Modify a specific deed by uid + */ + @Put("/api/v1/admin/deeds/:uid", [authHandler, ruleHandler, deedHandler]) + protected async put(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const deedFound = await this.deedsService.getByUid(uid); + + if (!deedFound) { + this.httpNotFoundRequest(response, "deed not found"); + return; + } + + //init OfficeFolder resource with request body values + const deedEntity = Deed.hydrate(req.body); + + //validate folder + await validateOrReject(deedEntity, { groups: ["updateDeed"], forbidUnknownValues: false }); + + //call service to get prisma entity + const deedEntityUpdated = await this.deedsService.update(uid, deedEntity); + + //Hydrate ressource with prisma entity + const deed = Deed.hydrate(deedEntityUpdated, { + strategy: "excludeAll", + }); + + //success + this.httpSuccess(response, deed); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/admin/DocumentTypesController.ts b/src/app/api/admin/DocumentTypesController.ts new file mode 100644 index 00000000..1bb2e009 --- /dev/null +++ b/src/app/api/admin/DocumentTypesController.ts @@ -0,0 +1,145 @@ +import { Response, Request } from "express"; +import { Controller, Get, Post, Put } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import { Service } from "typedi"; +import DocumentTypesService from "@Services/admin/DocumentTypesService/DocumentTypesService"; +import { DocumentTypes, Prisma } from "@prisma/client"; +import ObjectHydrate from "@Common/helpers/ObjectHydrate"; +import { DocumentType } from "le-coffre-resources/dist/Admin"; +import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; +import documentTypeHandler from "@App/middlewares/OfficeMembershipHandlers/DocumentTypeHandler"; + +@Controller() +@Service() +export default class DocumentTypesController extends ApiController { + constructor(private documentTypesService: DocumentTypesService) { + super(); + } + + /** + * @description Get all document-types + */ + @Get("/api/v1/admin/document-types", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.DocumentTypesWhereInput = { office: { uid: officeId } }; + query.where = officeWhereInput; + + //call service to get prisma entity + const documentTypeEntities: DocumentTypes[] = await this.documentTypesService.get(query); + + //Hydrate ressource with prisma entity + const documentTypes = DocumentType.hydrateArray(documentTypeEntities, { + strategy: "excludeAll", + }); + + //success + this.httpSuccess(response, documentTypes); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Create a new documentType + */ + @Post("/api/v1/admin/document-types", [authHandler, ruleHandler, documentTypeHandler]) + protected async post(req: Request, response: Response) { + try { + //init DocumentType resource with request body values + const documentTypeEntity = DocumentType.hydrate(req.body); + //validate user + await validateOrReject(documentTypeEntity, { groups: ["createDocumentType"], forbidUnknownValues: false }); + //call service to get prisma entity + const documentTypeEntityCreated = await this.documentTypesService.create(documentTypeEntity); + //Hydrate ressource with prisma entity + const userEntityCreated = DocumentType.hydrate(documentTypeEntityCreated, { + strategy: "excludeAll", + }); + //success + this.httpCreated(response, userEntityCreated); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Modify a specific documentType by uid + */ + @Put("/api/v1/admin/document-types/:uid", [authHandler, ruleHandler, documentTypeHandler]) + protected async put(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const documentTypeFound = await this.documentTypesService.getByUid(uid); + + if (!documentTypeFound) { + this.httpNotFoundRequest(response, "document type not found"); + return; + } + //init DocumentType resource with request body values + const documentTypeEntity = DocumentType.hydrate(req.body); + + //validate user + await validateOrReject(documentTypeEntity, { groups: ["updateDocumentType"] }); + + //call service to get prisma entity + const documentTypeEntityUpdated = await this.documentTypesService.update(uid, documentTypeEntity); + + //Hydrate ressource with prisma entity + const documentType = DocumentType.hydrate(documentTypeEntityUpdated, { + strategy: "excludeAll", + }); + + //success + this.httpSuccess(response, documentType); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific documentType by uid + */ + @Get("/api/v1/admin/document-types/:uid", [authHandler, ruleHandler, documentTypeHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + let documentTypeEntity: DocumentTypes | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + documentTypeEntity = await this.documentTypesService.getByUid(uid, query); + } else { + //call service to get prisma entity + documentTypeEntity = await this.documentTypesService.getByUid(uid); + } + + //Hydrate ressource with prisma entity + const user = ObjectHydrate.hydrate(new DocumentType(), documentTypeEntity!, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, user); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/admin/DocumentsController.ts b/src/app/api/admin/DocumentsController.ts new file mode 100644 index 00000000..854d6ba5 --- /dev/null +++ b/src/app/api/admin/DocumentsController.ts @@ -0,0 +1,185 @@ +import { Response, Request } from "express"; +import { Controller, Delete, Get, Post, Put } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import { Service } from "typedi"; +import DocumentsService from "@Services/admin/DocumentsService/DocumentsService"; +import { Documents, Prisma } from "@prisma/client"; +import { Document } from "le-coffre-resources/dist/Admin"; +import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; +import documentHandler from "@App/middlewares/OfficeMembershipHandlers/DocumentHandler"; + +@Controller() +@Service() +export default class DocumentsController extends ApiController { + constructor(private documentsService: DocumentsService) { + super(); + } + + /** + * @description Get all documents + * @returns IDocument[] list of documents + */ + @Get("/api/v1/admin/documents", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.DocumentsWhereInput = { document_type: { office: { uid: officeId } } }; + query.where = officeWhereInput; + + //call service to get prisma entity + const documentEntities = await this.documentsService.get(query); + + //Hydrate ressource with prisma entity + const documents = Document.hydrateArray(documentEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, documents); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Create a new document + * @returns IDocument created + */ + @Post("/api/v1/admin/documents", [authHandler, ruleHandler, documentHandler]) + protected async post(req: Request, response: Response) { + try { + //init Document resource with request body values + const documentEntity = Document.hydrate(req.body); + + //validate document + await validateOrReject(documentEntity, { groups: ["createDocument"], forbidUnknownValues: false }); + + //call service to get prisma entity + const documentEntityCreated = await this.documentsService.create(documentEntity); + + //Hydrate ressource with prisma entity + const document = Document.hydrate(documentEntityCreated, { + strategy: "excludeAll", + }); + + //success + this.httpCreated(response, document); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Update a specific document + */ + @Put("/api/v1/admin/documents/:uid", [authHandler, ruleHandler, documentHandler]) + protected async update(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const documentFound = await this.documentsService.getByUid(uid); + + if (!documentFound) { + this.httpNotFoundRequest(response, "document not found"); + return; + } + + //init Document resource with request body values + const documentEntity = Document.hydrate(req.body); + + //validate document + await validateOrReject(documentEntity, { groups: ["updateDocument"] }); + + //call service to get prisma entity + const documentEntityUpdated: Documents = await this.documentsService.update(uid, documentEntity, req.body.refused_reason); + + //Hydrate ressource with prisma entity + const document = Document.hydrate(documentEntityUpdated, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, document); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Delete a specific document + */ + @Delete("/api/v1/admin/documents/:uid", [authHandler, ruleHandler, documentHandler]) + protected async delete(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const documentFound = await this.documentsService.getByUid(uid); + + if (!documentFound) { + this.httpNotFoundRequest(response, "document not found"); + return; + } + + //call service to get prisma entity + const documentEntity: Documents = await this.documentsService.delete(uid); + + //Hydrate ressource with prisma entity + const document = Document.hydrate(documentEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, document); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific document by uid + */ + @Get("/api/v1/admin/documents/:uid", [authHandler, ruleHandler, documentHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + let documentEntity: Documents | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + documentEntity = await this.documentsService.getByUid(uid, query); + } else { + //call service to get prisma entity + documentEntity = await this.documentsService.getByUid(uid); + } + + if (!documentEntity) { + this.httpNotFoundRequest(response, "document not found"); + return; + } + + //Hydrate ressource with prisma entity + const document = Document.hydrate(documentEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, document); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/admin/FilesController.ts b/src/app/api/admin/FilesController.ts new file mode 100644 index 00000000..b6fe9050 --- /dev/null +++ b/src/app/api/admin/FilesController.ts @@ -0,0 +1,140 @@ +import { Response, Request } from "express"; +import { Controller, Delete, Get } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import { Service } from "typedi"; +import FilesService from "@Services/common/FilesService/FilesService"; +import { Prisma } from "@prisma/client"; +import { File } from "le-coffre-resources/dist/Admin"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; +import fileHandler from "@App/middlewares/OfficeMembershipHandlers/FileHandler"; + +@Controller() +@Service() +export default class FilesController extends ApiController { + constructor(private filesService: FilesService) { + super(); + } + + /** + * @description Get all Files + * @returns File[] list of Files + */ + @Get("/api/v1/admin/files", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.FilesWhereInput = { document: { folder: { office: { uid: officeId } } } }; + query.where = officeWhereInput; + //call service to get prisma entity + const fileEntities = await this.filesService.get(query); + + //Hydrate ressource with prisma entity + const files = File.hydrateArray(fileEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, files); + } catch (error) { + this.httpBadRequest(response, error); + return; + } + } + + /** + * @description Get a specific File by uid + */ + @Get("/api/v1/admin/files/download/:uid", [authHandler, ruleHandler, fileHandler]) + protected async download(req: Request, response: Response) { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "uid not found"); + return; + } + try { + const fileInfo = await this.filesService.download(uid); + + if (!fileInfo) { + this.httpNotFoundRequest(response, "file not found"); + return; + } + + response.setHeader("Content-Type", fileInfo.file.mimetype); + response.setHeader("Content-Disposition", `inline; filename=${encodeURIComponent(fileInfo.file.file_name)}`); + + this.httpSuccess(response, fileInfo.buffer); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Delete a specific File + */ + @Delete("/api/v1/admin/files/:uid", [authHandler, ruleHandler, fileHandler]) + protected async delete(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const fileFound = await this.filesService.getByUid(uid); + + if (!fileFound) { + this.httpNotFoundRequest(response, "file not found"); + return; + } + + //call service to get prisma entity + const fileEntity = await this.filesService.deleteKeyAndArchive(uid); + + if (!fileEntity) { + this.httpNotFoundRequest(response, "file not found"); + return; + } + + //Hydrate ressource with prisma entity + const file = File.hydrate(fileEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, file); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific File by uid + */ + @Get("/api/v1/admin/files/:uid", [authHandler, ruleHandler, fileHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const fileEntity = await this.filesService.getByUid(uid); + + if (!fileEntity) { + this.httpNotFoundRequest(response, "file not found"); + return; + } + + //Hydrate ressource with prisma entity + const file = File.hydrate(fileEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, file); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/admin/OfficeFoldersController.ts b/src/app/api/admin/OfficeFoldersController.ts new file mode 100644 index 00000000..95c79f2e --- /dev/null +++ b/src/app/api/admin/OfficeFoldersController.ts @@ -0,0 +1,183 @@ +import { Response, Request } from "express"; +import { Controller, Delete, Get, Post, Put } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import OfficeFoldersService from "@Services/admin/OfficeFoldersService/OfficeFoldersService"; +import { Service } from "typedi"; +import { OfficeFolders, Prisma } from "@prisma/client"; +import { OfficeFolder } from "le-coffre-resources/dist/Admin"; +import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; +import folderHandler from "@App/middlewares/OfficeMembershipHandlers/FolderHandler"; + +@Controller() +@Service() +export default class OfficeFoldersController extends ApiController { + constructor(private officeFoldersService: OfficeFoldersService) { + super(); + } + + /** + * @description Get all folders + */ + @Get("/api/v1/admin/folders", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.OfficeFoldersWhereInput = { office: { uid: officeId } }; + query.where = officeWhereInput; + //call service to get prisma entity + const officeFolderEntities: OfficeFolders[] = await this.officeFoldersService.get(query); + + //Hydrate ressource with prisma entity + const officeFolders = OfficeFolder.hydrateArray(officeFolderEntities, { + strategy: "excludeAll", + }); + //success + this.httpSuccess(response, officeFolders); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Create a new folder + */ + @Post("/api/v1/admin/folders", [authHandler, ruleHandler, folderHandler]) + protected async post(req: Request, response: Response) { + try { + //init OfficeFolder resource with request body values + const officeFolderRessource = OfficeFolder.hydrate(req.body); + await officeFolderRessource.validateOrReject?.({ groups: ["createFolder"], forbidUnknownValues: false }); + + //call service to get prisma entity + const officeFolderEntity = await this.officeFoldersService.create(officeFolderRessource); + //Hydrate ressource with prisma entity + const officeFolders = OfficeFolder.hydrate(officeFolderEntity, { + strategy: "excludeAll", + }); + //success + this.httpCreated(response, officeFolders); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Modify a specific folder by uid + */ + @Put("/api/v1/admin/folders/:uid", [authHandler, ruleHandler, folderHandler]) + protected async put(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const officeFolderFound = await this.officeFoldersService.getByUid(uid); + + if (!officeFolderFound) { + this.httpNotFoundRequest(response, "office folder not found"); + return; + } + + //init OfficeFolder resource with request body values + const officeFolderEntity = OfficeFolder.hydrate(req.body); + + //validate folder + await validateOrReject(officeFolderEntity, { groups: ["updateFolder"], forbidUnknownValues: false }); + + //call service to get prisma entity + const officeFolderEntityUpdated = await this.officeFoldersService.update(uid, officeFolderEntity); + + //Hydrate ressource with prisma entity + const officeFolders = OfficeFolder.hydrate(officeFolderEntityUpdated, { + strategy: "excludeAll", + }); + + //success + this.httpSuccess(response, officeFolders); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific folder by uid + * @returns IFolder + */ + @Get("/api/v1/admin/folders/:uid", [authHandler, ruleHandler, folderHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + let officeFolderEntity: OfficeFolders | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + officeFolderEntity = await this.officeFoldersService.getByUid(uid, query); + } else { + //call service to get prisma entity + officeFolderEntity = await this.officeFoldersService.getByUid(uid); + } + + if (!officeFolderEntity) { + this.httpNotFoundRequest(response, "folder not found"); + return; + } + + //Hydrate ressource with prisma entity + const officeFolder = OfficeFolder.hydrate(officeFolderEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, officeFolder); + } catch (error) { + this.httpInternalError(response, error); + return; + } + this.httpSuccess(response, await this.officeFoldersService.getByUid("uid")); + } + + /** + * @description Delete a specific folder + */ + @Delete("/api/v1/admin/folders/:uid", [authHandler, ruleHandler, folderHandler]) + protected async delete(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const officeFolderFound = await this.officeFoldersService.getByUid(uid); + + if (!officeFolderFound) { + this.httpNotFoundRequest(response, "office folder not found"); + return; + } + + //call service to get prisma entity + const officeFoldertEntity: OfficeFolders = await this.officeFoldersService.delete(uid); + + //Hydrate ressource with prisma entity + const officeFolder = OfficeFolder.hydrate(officeFoldertEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, officeFolder); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/admin/OfficeRolesController.ts b/src/app/api/admin/OfficeRolesController.ts new file mode 100644 index 00000000..afe5e15d --- /dev/null +++ b/src/app/api/admin/OfficeRolesController.ts @@ -0,0 +1,151 @@ +import { Response, Request } from "express"; +import { Controller, Get, Post, Put } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import OfficeRolesService from "@Services/admin/OfficeRolesService/OfficeRolesService"; +import { Service } from "typedi"; +import { validateOrReject } from "class-validator"; +import { OfficeRole } from "le-coffre-resources/dist/Admin"; +import { OfficeRoles, Prisma } from "@prisma/client"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; +import officeRoleHandler from "@App/middlewares/OfficeMembershipHandlers/OfficeRoleHandler"; + +@Controller() +@Service() +export default class OfficeRolesController extends ApiController { + constructor(private officeRolesService: OfficeRolesService) { + super(); + } + + /** + * @description Get all officeRoles + */ + @Get("/api/v1/admin/officeRoles", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.OfficeRolesWhereInput = { office: { uid: officeId } }; + query.where = officeWhereInput; + + //call service to get prisma entity + const officeRolesEntities = await this.officeRolesService.get(query); + + //Hydrate ressource with prisma entity + const officeRoles = OfficeRole.hydrateArray(officeRolesEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, officeRoles); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Create a new officeRole + */ + @Post("/api/v1/admin/office-roles", [authHandler, ruleHandler, officeRoleHandler]) + protected async getAddresses(req: Request, response: Response) { + try { + //init IOfficeRole resource with request body values + const officeRoleEntity = OfficeRole.hydrate(req.body); + + //validate officeRole + await validateOrReject(officeRoleEntity, { groups: ["createOfficeRole"] }); + + //call service to get prisma entity + const officeRoleEntityCreated = await this.officeRolesService.create(officeRoleEntity); + + //Hydrate ressource with prisma entity + const officeRole = OfficeRole.hydrate(officeRoleEntityCreated, { + strategy: "excludeAll", + }); + + //success + this.httpCreated(response, officeRole); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Modify a specific officeRole by uid + */ + @Put("/api/v1/admin/office-roles/:uid", [authHandler, ruleHandler, officeRoleHandler]) + protected async put(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const officeRoleFound = await this.officeRolesService.getByUid(uid); + + if (!officeRoleFound) { + this.httpNotFoundRequest(response, "officeRole not found"); + return; + } + + //init IOfficeRole resource with request body values + const officeRoleEntity = OfficeRole.hydrate(req.body); + + //validate officeRole + await validateOrReject(officeRoleEntity, { groups: ["updateOfficeRole"] }); + + //call service to get prisma entity + const officeRoleEntityUpdated = await this.officeRolesService.update(officeRoleEntity); + + //Hydrate ressource with prisma entity + const officeRole = OfficeRole.hydrate(officeRoleEntityUpdated, { + strategy: "excludeAll", + }); + + //success + this.httpSuccess(response, officeRole); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific officeRole by uid + */ + @Get("/api/v1/admin/office-roles/:uid", [authHandler, ruleHandler, officeRoleHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + let officeRoleEntity: OfficeRoles | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + officeRoleEntity = await this.officeRolesService.getByUid(uid, query); + } else { + //call service to get prisma entity + officeRoleEntity = await this.officeRolesService.getByUid(uid); + } + + if (!officeRoleEntity) { + this.httpNotFoundRequest(response, "officeRole not found"); + return; + } + + //Hydrate ressource with prisma entity + const officeRole = OfficeRole.hydrate(officeRoleEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, officeRole); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/admin/OfficesController.ts b/src/app/api/admin/OfficesController.ts new file mode 100644 index 00000000..76c98668 --- /dev/null +++ b/src/app/api/admin/OfficesController.ts @@ -0,0 +1,72 @@ +import { Response, Request } from "express"; +import { Controller, Get } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import OfficesService from "@Services/admin/OfficesService/OfficesService"; +import { Service } from "typedi"; +import { Offices } from "@prisma/client"; +import { Office as OfficeResource } from "le-coffre-resources/dist/Admin"; +import ruleHandler from "@App/middlewares/RulesHandler"; +import authHandler from "@App/middlewares/AuthHandler"; + +@Controller() +@Service() +export default class OfficesController extends ApiController { + constructor(private officesService: OfficesService) { + super(); + } + /** + * @description Get all offices + */ + @Get("/api/v1/admin/offices", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + //call service to get prisma entity + const officesEntities: Offices[] = await this.officesService.get(query); + //Hydrate ressource with prisma entity + const offices = OfficeResource.hydrateArray(officesEntities, { strategy: "excludeAll" }); + //success + this.httpSuccess(response, offices); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific office by uid + */ + @Get("/api/v1/admin/offices/:uid", [authHandler, ruleHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + let officeEntity: Offices | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + officeEntity = await this.officesService.getByUid(uid, query); + } else { + //call service to get prisma entity + officeEntity = await this.officesService.getByUid(uid); + } + + if (!officeEntity) { + this.httpNotFoundRequest(response, "office not found"); + return; + } + + //Hydrate ressource with prisma entity + const office = OfficeResource.hydrate(officeEntity, { strategy: "excludeAll" }); + //success + this.httpSuccess(response, office); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/admin/RolesController.ts b/src/app/api/admin/RolesController.ts new file mode 100644 index 00000000..b587ce3d --- /dev/null +++ b/src/app/api/admin/RolesController.ts @@ -0,0 +1,77 @@ +import { Response, Request } from "express"; +import { Controller, Get } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import RolesService from "@Services/admin/RolesService/RolesService"; +import { Service } from "typedi"; +import { Role } from "le-coffre-resources/dist/Admin"; +import { Roles } from "@prisma/client"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; + +@Controller() +@Service() +export default class RolesController extends ApiController { + constructor(private rolesService: RolesService) { + super(); + } + + /** + * @description Get all roles + */ + @Get("/api/v1/admin/roles", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + + //call service to get prisma entity + const rolesEntities = await this.rolesService.get(query); + + //Hydrate ressource with prisma entity + const roles = Role.hydrateArray(rolesEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, roles); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific role by uid + */ + @Get("/api/v1/admin/roles/:uid", [authHandler, ruleHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + let roleEntity: Roles | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + roleEntity = await this.rolesService.getByUid(uid, query); + } else { + //call service to get prisma entity + roleEntity = await this.rolesService.getByUid(uid); + } + + if (!roleEntity) { + this.httpNotFoundRequest(response, "role not found"); + return; + } + + //Hydrate ressource with prisma entity + const role = Role.hydrate(roleEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, role); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/admin/RulesController.ts b/src/app/api/admin/RulesController.ts new file mode 100644 index 00000000..49641e09 --- /dev/null +++ b/src/app/api/admin/RulesController.ts @@ -0,0 +1,77 @@ +import { Response, Request } from "express"; +import { Controller, Get } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import RulesService from "@Services/admin/RulesService/RulesService"; +import { Service } from "typedi"; +import { Rule } from "le-coffre-resources/dist/Admin"; +import { Rules } from "@prisma/client"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; + +@Controller() +@Service() +export default class RulesController extends ApiController { + constructor(private rulesService: RulesService) { + super(); + } + + /** + * @description Get all rules + */ + @Get("/api/v1/admin/rules", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + + //call service to get prisma entity + const rulesEntities = await this.rulesService.get(query); + + //Hydrate ressource with prisma entity + const rules = Rule.hydrateArray(rulesEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, rules); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific rule by uid + */ + @Get("/api/v1/admin/rules/:uid", [authHandler, ruleHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + let ruleEntity: Rules | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + ruleEntity = await this.rulesService.getByUid(uid, query); + } else { + //call service to get prisma entity + ruleEntity = await this.rulesService.getByUid(uid); + } + + if (!ruleEntity) { + this.httpNotFoundRequest(response, "rule not found"); + return; + } + + //Hydrate ressource with prisma entity + const rule = Rule.hydrate(ruleEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, rule); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/admin/UsersController.ts b/src/app/api/admin/UsersController.ts new file mode 100644 index 00000000..941dc67f --- /dev/null +++ b/src/app/api/admin/UsersController.ts @@ -0,0 +1,81 @@ +import { Response, Request } from "express"; +import { Controller, Get } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import UsersService from "@Services/admin/UsersService/UsersService"; +import { Service } from "typedi"; +import User from "le-coffre-resources/dist/Admin"; +import { Prisma, Users } from "@prisma/client"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; +import userHandler from "@App/middlewares/OfficeMembershipHandlers/UserHandler"; + +@Controller() +@Service() +export default class UsersController extends ApiController { + constructor(private usersService: UsersService) { + super(); + } + + /** + * @description Get all users + */ + @Get("/api/v1/admin/users", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.UsersWhereInput = { office_membership: { uid: officeId } }; + query.where = officeWhereInput; + + //call service to get prisma entity + const usersEntities = await this.usersService.get(query); + + //Hydrate ressource with prisma entity + const users = User.hydrateArray(usersEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, users); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific user by uid + */ + @Get("/api/v1/admin/users/:uid", [authHandler, ruleHandler, userHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + let userEntity: Users | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + userEntity = await this.usersService.getByUid(uid, query); + } else { + //call service to get prisma entity + userEntity = await this.usersService.getByUid(uid); + } + + if (!userEntity) { + this.httpNotFoundRequest(response, "user not found"); + return; + } + + //Hydrate ressource with prisma entity + const user = User.hydrate(userEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, user); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/customer/DocumentsController.ts b/src/app/api/customer/DocumentsController.ts index 8be29e46..eca88301 100644 --- a/src/app/api/customer/DocumentsController.ts +++ b/src/app/api/customer/DocumentsController.ts @@ -1,11 +1,12 @@ import { Response, Request } from "express"; -import { Controller, Delete, Get, Post, Put } from "@ControllerPattern/index"; +import { Controller, Get } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import { Service } from "typedi"; import DocumentsService from "@Services/customer/DocumentsService/DocumentsService"; -import { Documents } from "@prisma/client"; +import { Documents, Prisma } from "@prisma/client"; import { Document } from "le-coffre-resources/dist/Customer"; -import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import documentHandler from "@App/middlewares/CustomerHandler/DocumentHandler"; @Controller() @Service() @@ -18,11 +19,14 @@ export default class DocumentsController extends ApiController { * @description Get all documents * @returns IDocument[] list of documents */ - @Get("/api/v1/customer/documents") + @Get("/api/v1/customer/documents", [authHandler]) protected async get(req: Request, response: Response) { try { //get query const query = JSON.parse(req.query["q"] as string); + const customerId: string = req.body.user.customerId; + const customerWhereInput: Prisma.DocumentsWhereInput ={ depositor: { uid: customerId } }; + query.where = customerWhereInput; //call service to get prisma entity const documentEntities: Documents[] = await this.documentsService.get(query); @@ -38,112 +42,10 @@ export default class DocumentsController extends ApiController { } } - /** - * @description Create a new document - * @returns IDocument created - */ - @Post("/api/v1/customer/documents") - protected async post(req: Request, response: Response) { - try { - //init Document resource with request body values - const documentEntity = Document.hydrate(req.body); - - //validate document - await validateOrReject(documentEntity, { groups: ["createDocument"] }); - - //call service to get prisma entity - const documentEntityCreated = await this.documentsService.create(documentEntity); - - //Hydrate ressource with prisma entity - const document = Document.hydrate(documentEntityCreated, { - strategy: "excludeAll", - }); - - //success - this.httpSuccess(response, document); - } catch (error) { - this.httpInternalError(response); - return; - } - } - - /** - * @description Update a specific document - */ - @Put("/api/v1/customer/documents/:uid") - protected async update(req: Request, response: Response) { - try { - const uid = req.params["uid"]; - if (!uid) { - this.httpBadRequest(response, "No uid provided"); - return; - } - - const documentFound = await this.documentsService.getByUid(uid); - - if (!documentFound) { - this.httpNotFoundRequest(response, "document not found"); - return; - } - - //init Document resource with request body values - const documentEntity = new Document(); - Document.hydrate(documentEntity, req.body); - - //validate document - await validateOrReject(documentEntity, { groups: ["createDocument"] }); - - //call service to get prisma entity - const documentEntityUpdated: Documents = await this.documentsService.update(uid, documentEntity); - - //Hydrate ressource with prisma entity - const document = Document.hydrate(documentEntityUpdated, { strategy: "excludeAll" }); - - //success - this.httpSuccess(response, document); - } catch (error) { - this.httpInternalError(response); - return; - } - } - - /** - * @description Delete a specific document - */ - @Delete("/api/v1/customer/documents/:uid") - protected async delete(req: Request, response: Response) { - try { - const uid = req.params["uid"]; - if (!uid) { - this.httpBadRequest(response, "No uid provided"); - return; - } - - const documentEntity = await this.documentsService.getByUid(uid); - - if (!documentEntity) { - this.httpNotFoundRequest(response, "document not found"); - return; - } - - //call service to get prisma entity - const documentEntityDeleted: Documents = await this.documentsService.delete(uid); - - //Hydrate ressource with prisma entity - const document = Document.hydrate(documentEntityDeleted, { strategy: "excludeAll" }); - - //success - this.httpSuccess(response, document); - } catch (error) { - this.httpInternalError(response); - return; - } - } - /** * @description Get a specific document by uid */ - @Get("/api/v1/customer/documents/:uid") + @Get("/api/v1/customer/documents/:uid",[authHandler,documentHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/customer/FilesController.ts b/src/app/api/customer/FilesController.ts new file mode 100644 index 00000000..ca3ee229 --- /dev/null +++ b/src/app/api/customer/FilesController.ts @@ -0,0 +1,219 @@ +import { Response, Request } from "express"; +import { Controller, Delete, Get, Post, Put } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import { Service } from "typedi"; +import FilesService from "@Services/common/FilesService/FilesService"; +import { Files, Prisma } from "@prisma/client"; +import { File } from "le-coffre-resources/dist/Customer"; +import { Document } from "le-coffre-resources/dist/Customer"; +import { validateOrReject } from "class-validator"; +import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; +import authHandler from "@App/middlewares/AuthHandler"; +import fileHandler from "@App/middlewares/CustomerHandler/FileHandler"; + +@Controller() +@Service() +export default class FilesController extends ApiController { + constructor(private filesService: FilesService, private documentService: DocumentsService) { + super(); + } + + /** + * @description Get all Files + * @returns File[] list of Files + */ + @Get("/api/v1/customer/files", [authHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + const customerId: string = req.body.user.customerId; + const customerWhereInput: Prisma.FilesWhereInput = { document: { depositor: { uid: customerId } } }; + query.where = customerWhereInput; + //call service to get prisma entity + const fileEntities = await this.filesService.get(query); + + //Hydrate ressource with prisma entity + const files = File.hydrateArray(fileEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, files); + } catch (error) { + this.httpBadRequest(response, error); + return; + } + } + + /** + * @description Get a specific File by uid + */ + @Get("/api/v1/customer/files/download/:uid", [authHandler, fileHandler]) + protected async download(req: Request, response: Response) { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "uid not found"); + return; + } + try { + const fileInfo = await this.filesService.download(uid); + + if (!fileInfo) { + this.httpNotFoundRequest(response, "file not found"); + return; + } + + response.setHeader("Content-Type", fileInfo.file.mimetype); + response.setHeader("Content-Disposition", `inline; filename=${encodeURIComponent(fileInfo.file.file_name)}`); + + this.httpSuccess(response, fileInfo.buffer); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Create a new File + * @returns File created + */ + @Post("/api/v1/customer/files", [authHandler, fileHandler]) + protected async post(req: Request, response: Response) { + try { + //get file + if (!req.file) throw new Error("No file provided"); + + //init File resource with request body values + const fileEntity = File.hydrate(JSON.parse(req.body["q"])); + + //validate File + await validateOrReject(fileEntity, { groups: ["createFile"] }); + + //call service to get prisma entity + const fileEntityCreated = await this.filesService.create(fileEntity, req.file); + + const document = await this.documentService.getByUid(fileEntity.document!.uid!); + + const documentToUpdate = Document.hydrate(document!); + + documentToUpdate!.document_status = "DEPOSITED"; + await this.documentService.update(document!.uid!, documentToUpdate); + + //Hydrate ressource with prisma entity + const fileEntityHydrated = File.hydrate(fileEntityCreated, { + strategy: "excludeAll", + }); + + //success + this.httpCreated(response, fileEntityHydrated); + } catch (error) { + this.httpBadRequest(response, error); + return; + } + } + + /** + * @description Update a specific file + */ + @Put("/api/v1/customer/files/:uid", [authHandler, fileHandler]) + protected async update(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + throw new Error("No uid provided"); + } + + const fileFound = await this.filesService.getByUid(uid); + + if (!fileFound) { + this.httpNotFoundRequest(response, "file not found"); + return; + } + + //init File resource with request body values + const fileEntity = File.hydrate(req.body); + + //validate file + await validateOrReject(fileEntity, { groups: ["updateFile"] }); + + //call service to get prisma entity + const fileEntityUpdated: Files = await this.filesService.update(uid, fileEntity); + + //Hydrate ressource with prisma entity + const file = File.hydrate(fileEntityUpdated, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, file); + } catch (error) { + this.httpBadRequest(response, error); + return; + } + } + + /** + * @description Delete a specific File + */ + @Delete("/api/v1/customer/files/:uid", [authHandler, fileHandler]) + protected async delete(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const fileFound = await this.filesService.getByUid(uid); + + if (!fileFound) { + this.httpNotFoundRequest(response, "file not found"); + return; + } + + //call service to get prisma entity + const fileEntity = await this.filesService.deleteKeyAndArchive(uid); + + if (!fileEntity) { + this.httpNotFoundRequest(response, "file not found"); + return; + } + + //Hydrate ressource with prisma entity + const file = File.hydrate(fileEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, file); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific File by uid + */ + @Get("/api/v1/customer/files/:uid", [authHandler, fileHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const fileEntity = await this.filesService.getByUid(uid); + + if (!fileEntity) { + this.httpNotFoundRequest(response, "file not found"); + return; + } + + //Hydrate ressource with prisma entity + const file = File.hydrate(fileEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, file); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/franceConnect/CustomerController.ts b/src/app/api/franceConnect/CustomerController.ts new file mode 100644 index 00000000..54e19b12 --- /dev/null +++ b/src/app/api/franceConnect/CustomerController.ts @@ -0,0 +1,64 @@ +import { Response, Request } from "express"; +import { Controller, Post } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import { Service } from "typedi"; +import AuthService from "@Services/common/AuthService/AuthService"; +import { JwtPayload } from "jsonwebtoken"; + +@Controller() +@Service() +export default class CustomerController extends ApiController { + constructor(private authService: AuthService) { + super(); + } + + @Post("/api/v1/france-connect/customer/login/:email") + protected async login(req: Request, response: Response) { + try { + const email = req.params["email"]; + if (!email) throw new Error("email is required"); + + const payload = await this.authService.getCustomerJwtPayload(email); + const accessToken = this.authService.generateAccessToken(payload); + const refreshToken = this.authService.generateRefreshToken(payload); + + //success + this.httpSuccess(response, { accessToken, refreshToken }); + } catch (error) { + this.httpInternalError(response); + return; + } + } + + @Post("/api/v1/france-connect/customer/refresh-token") + protected async refreshToken(req: Request, response: Response) { + try { + const authHeader = req.headers["authorization"]; + const token = authHeader && authHeader.split(" ")[1]; + + if (!token) { + this.httpBadRequest(response); + return; + } + + let accessToken; + this.authService.verifyRefreshToken(token, (err, customerPayload) => { + if (err) { + this.httpUnauthorized(response); + return; + } + + const customer = customerPayload as JwtPayload; + delete customer.iat; + delete customer!.exp; + accessToken = this.authService.generateAccessToken(customer); + }); + + //success + this.httpSuccess(response, accessToken); + } catch (error) { + this.httpInternalError(response); + return; + } + } +} diff --git a/src/app/api/notary/CustomersController.ts b/src/app/api/notary/CustomersController.ts new file mode 100644 index 00000000..f1372d8b --- /dev/null +++ b/src/app/api/notary/CustomersController.ts @@ -0,0 +1,146 @@ +import { Response, Request } from "express"; +import { Controller, Get, Post, Put } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import CustomersService from "@Services/notary/CustomersService/CustomersService"; +import { Service } from "typedi"; +import { Customer } from "le-coffre-resources/dist/Notary"; +import { Customers } from "@prisma/client"; +import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; + +@Controller() +@Service() +export default class CustomersController extends ApiController { + constructor(private customersService: CustomersService) { + super(); + } + + /** + * @description Get all customers + */ + @Get("/api/v1/notary/customers", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + + //call service to get prisma entity + const customersEntities = await this.customersService.get(query); + + //Hydrate ressource with prisma entity + const customers = Customer.hydrateArray(customersEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, customers); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Create a new customer + */ + @Post("/api/v1/notary/customers", [authHandler, ruleHandler]) + protected async post(req: Request, response: Response) { + try { + //init IUser resource with request body values + const customerEntity = Customer.hydrate(req.body); + //validate user + await validateOrReject(customerEntity, { groups: ["createCustomer"], forbidUnknownValues: false }); + + //call service to get prisma entity + const customerEntityCreated = await this.customersService.create(customerEntity); + //Hydrate ressource with prisma entity + const customer = Customer.hydrate(customerEntityCreated, { + strategy: "excludeAll", + }); + + //success + this.httpCreated(response, customer); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Modify a specific customer by uid + */ + @Put("/api/v1/notary/customers/:uid", [authHandler, ruleHandler]) + protected async put(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const userFound = await this.customersService.getByUid(uid); + + if (!userFound) { + this.httpNotFoundRequest(response, "user not found"); + return; + } + + //init IUser resource with request body values + const customerEntity = Customer.hydrate(req.body); + + //validate user + await validateOrReject(customerEntity, { groups: ["updateCustomer"], forbidUnknownValues: false }); + + //call service to get prisma entity + const customerEntityUpdated = await this.customersService.update(uid, customerEntity); + + //Hydrate ressource with prisma entity + const customer = Customer.hydrate(customerEntityUpdated, { + strategy: "excludeAll", + }); + + //success + this.httpSuccess(response, customer); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific customer by uid + */ + @Get("/api/v1/notary/customers/:uid", [authHandler, ruleHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + let customerEntity: Customers | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + customerEntity = await this.customersService.getByUid(uid, query); + } else { + //call service to get prisma entity + customerEntity = await this.customersService.getByUid(uid); + } + + if (!customerEntity) { + this.httpNotFoundRequest(response, "customer not found"); + return; + } + + //Hydrate ressource with prisma entity + const customer = Customer.hydrate(customerEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, customer); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/notary/DeedTypesController.ts b/src/app/api/notary/DeedTypesController.ts new file mode 100644 index 00000000..0ea44863 --- /dev/null +++ b/src/app/api/notary/DeedTypesController.ts @@ -0,0 +1,156 @@ +import { Response, Request } from "express"; +import { Controller, Get, Post, Put } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import { Service } from "typedi"; +import DeedTypesService from "@Services/notary/DeedTypesService/DeedTypesService"; +import { DeedTypes, Prisma } from "@prisma/client"; +import { DeedType } from "le-coffre-resources/dist/Notary"; +import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; +import deedTypeHandler from "@App/middlewares/OfficeMembershipHandlers/DeedTypeHandler"; + +@Controller() +@Service() +export default class DeedTypesController extends ApiController { + constructor(private deedTypesService: DeedTypesService) { + super(); + } + + /** + * @description Get all deedtypes + * @returns Deedtype[] list of deedtypes + */ + @Get("/api/v1/notary/deed-types", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.DeedTypesWhereInput = { office: { uid: officeId } }; + query.where = officeWhereInput; + + //call service to get prisma entity + const deedTypeEntities: DeedTypes[] = await this.deedTypesService.get(query); + + //Hydrate ressource with prisma entity + const DeedTypes = DeedType.hydrateArray(deedTypeEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, DeedTypes); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Create a new deedtype + * @returns Deedtype created + */ + @Post("/api/v1/notary/deed-types", [authHandler, ruleHandler, deedTypeHandler]) + protected async post(req: Request, response: Response) { + try { + //init DeedType resource with request body values + const deedTypeEntity = DeedType.hydrate(req.body); + + //validate deed type + await validateOrReject(deedTypeEntity, { groups: ["createDeedType"], forbidUnknownValues: false }); + + //call service to get prisma entity + const deedTypeEntityCreated = await this.deedTypesService.create(deedTypeEntity); + + //Hydrate ressource with prisma entity + const deedType = DeedType.hydrate(deedTypeEntityCreated, { + strategy: "excludeAll", + }); + + //success + this.httpCreated(response, deedType); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Modify a specific deedtype by uid + * @returns Deedtype modified + */ + @Put("/api/v1/notary/deed-types/:uid", [authHandler, ruleHandler, deedTypeHandler]) + protected async put(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const deedTypeFound = await this.deedTypesService.getByUid(uid); + + if (!deedTypeFound) { + this.httpNotFoundRequest(response, "deed type not found"); + return; + } + + //init DeedType resource with request body values + const deedTypeEntity = DeedType.hydrate(req.body); + + //validate deed type + await validateOrReject(deedTypeEntity, { groups: ["updateDeedType"] }); + + //call service to get prisma entity + const deedTypeEntityUpdated = await this.deedTypesService.update(uid, deedTypeEntity); + + //Hydrate ressource with prisma entity + const deedType = DeedType.hydrate(deedTypeEntityUpdated, { + strategy: "excludeAll", + }); + + //success + this.httpSuccess(response, deedType); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific deedtype by uid + * @returns IDeedtype + */ + @Get("/api/v1/notary/deed-types/:uid", [authHandler, ruleHandler, deedTypeHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + let deedTypeEntity: DeedTypes | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + deedTypeEntity = await this.deedTypesService.getByUid(uid, query); + } else { + //call service to get prisma entity + deedTypeEntity = await this.deedTypesService.getByUid(uid); + } + + if (!deedTypeEntity) { + this.httpNotFoundRequest(response, "deed type not found"); + return; + } + + //Hydrate ressource with prisma entity + const deedType = DeedType.hydrate(deedTypeEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, deedType); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/notary/DeedsController.ts b/src/app/api/notary/DeedsController.ts new file mode 100644 index 00000000..8ac0d98b --- /dev/null +++ b/src/app/api/notary/DeedsController.ts @@ -0,0 +1,126 @@ +import { Response, Request } from "express"; +import { Controller, Get, Put } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import DeedsService from "@Services/notary/DeedsService/DeedsService"; +import { Service } from "typedi"; +import { Deeds, Prisma } from "@prisma/client"; +import { Deed } from "le-coffre-resources/dist/Notary"; +import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; +import deedHandler from "@App/middlewares/OfficeMembershipHandlers/DeedHandler"; + +@Controller() +@Service() +export default class DeedsController extends ApiController { + constructor(private deedsService: DeedsService) { + super(); + } + + /** + * @description Get all deeds + * @returns Deed[] list of deeds + */ + @Get("/api/v1/notary/deeds", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.DeedsWhereInput = { deed_type: { office: { uid: officeId } } }; + query.where = officeWhereInput; + + //call service to get prisma entity + const deedEntities: Deeds[] = await this.deedsService.get(query); + + //Hydrate ressource with prisma entity + const deeds = Deed.hydrateArray(deedEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, deeds); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific deed by uid + * @returns Deed + */ + @Get("/api/v1/notary/deeds/:uid", [authHandler, ruleHandler, deedHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + let deedEntity: Deeds | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + deedEntity = await this.deedsService.getByUid(uid, query); + } else { + //call service to get prisma entity + deedEntity = await this.deedsService.getByUid(uid); + } + + if (!deedEntity) { + this.httpNotFoundRequest(response, "deed not found"); + return; + } + + //Hydrate ressource with prisma entity + const deed = Deed.hydrate(deedEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, deed); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Modify a specific deed by uid + */ + @Put("/api/v1/notary/deeds/:uid", [authHandler, ruleHandler, deedHandler]) + protected async put(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const deedFound = await this.deedsService.getByUid(uid); + + if (!deedFound) { + this.httpNotFoundRequest(response, "deed not found"); + return; + } + + //init OfficeFolder resource with request body values + const deedEntity = Deed.hydrate(req.body); + + //validate folder + await validateOrReject(deedEntity, { groups: ["updateDeed"], forbidUnknownValues: false }); + + //call service to get prisma entity + const deedEntityUpdated = await this.deedsService.update(uid, deedEntity); + + //Hydrate ressource with prisma entity + const deed = Deed.hydrate(deedEntityUpdated, { + strategy: "excludeAll", + }); + + //success + this.httpSuccess(response, deed); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/notary/DocumentTypesController.ts b/src/app/api/notary/DocumentTypesController.ts new file mode 100644 index 00000000..4cc25b5a --- /dev/null +++ b/src/app/api/notary/DocumentTypesController.ts @@ -0,0 +1,145 @@ +import { Response, Request } from "express"; +import { Controller, Get, Post, Put } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import { Service } from "typedi"; +import DocumentTypesService from "@Services/notary/DocumentTypesService/DocumentTypesService"; +import { DocumentTypes, Prisma } from "@prisma/client"; +import ObjectHydrate from "@Common/helpers/ObjectHydrate"; +import { DocumentType } from "le-coffre-resources/dist/Notary"; +import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; +import documentTypeHandler from "@App/middlewares/OfficeMembershipHandlers/DocumentTypeHandler"; + +@Controller() +@Service() +export default class DocumentTypesController extends ApiController { + constructor(private documentTypesService: DocumentTypesService) { + super(); + } + + /** + * @description Get all document-types + */ + @Get("/api/v1/notary/document-types", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.DocumentTypesWhereInput = { office: { uid: officeId } }; + query.where = officeWhereInput; + + //call service to get prisma entity + const documentTypeEntities: DocumentTypes[] = await this.documentTypesService.get(query); + + //Hydrate ressource with prisma entity + const documentTypes = DocumentType.hydrateArray(documentTypeEntities, { + strategy: "excludeAll", + }); + + //success + this.httpSuccess(response, documentTypes); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Create a new documentType + */ + @Post("/api/v1/notary/document-types", [authHandler, ruleHandler, documentTypeHandler]) + protected async post(req: Request, response: Response) { + try { + //init DocumentType resource with request body values + const documentTypeEntity = DocumentType.hydrate(req.body); + //validate user + await validateOrReject(documentTypeEntity, { groups: ["createDocumentType"], forbidUnknownValues: false }); + //call service to get prisma entity + const documentTypeEntityCreated = await this.documentTypesService.create(documentTypeEntity); + //Hydrate ressource with prisma entity + const userEntityCreated = DocumentType.hydrate(documentTypeEntityCreated, { + strategy: "excludeAll", + }); + //success + this.httpCreated(response, userEntityCreated); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Modify a specific documentType by uid + */ + @Put("/api/v1/notary/document-types/:uid", [authHandler, ruleHandler, documentTypeHandler]) + protected async put(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const documentTypeFound = await this.documentTypesService.getByUid(uid); + + if (!documentTypeFound) { + this.httpNotFoundRequest(response, "document type not found"); + return; + } + //init DocumentType resource with request body values + const documentTypeEntity = DocumentType.hydrate(req.body); + + //validate user + await validateOrReject(documentTypeEntity, { groups: ["updateDocumentType"] }); + + //call service to get prisma entity + const documentTypeEntityUpdated = await this.documentTypesService.update(uid, documentTypeEntity); + + //Hydrate ressource with prisma entity + const documentType = DocumentType.hydrate(documentTypeEntityUpdated, { + strategy: "excludeAll", + }); + + //success + this.httpSuccess(response, documentType); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific documentType by uid + */ + @Get("/api/v1/notary/document-types/:uid", [authHandler, ruleHandler, documentTypeHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + let documentTypeEntity: DocumentTypes | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + documentTypeEntity = await this.documentTypesService.getByUid(uid, query); + } else { + //call service to get prisma entity + documentTypeEntity = await this.documentTypesService.getByUid(uid); + } + + //Hydrate ressource with prisma entity + const user = ObjectHydrate.hydrate(new DocumentType(), documentTypeEntity!, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, user); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/notary/DocumentsController.ts b/src/app/api/notary/DocumentsController.ts new file mode 100644 index 00000000..b6b35314 --- /dev/null +++ b/src/app/api/notary/DocumentsController.ts @@ -0,0 +1,185 @@ +import { Response, Request } from "express"; +import { Controller, Delete, Get, Post, Put } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import { Service } from "typedi"; +import DocumentsService from "@Services/notary/DocumentsService/DocumentsService"; +import { Documents, Prisma } from "@prisma/client"; +import { Document } from "le-coffre-resources/dist/Notary"; +import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; +import documentHandler from "@App/middlewares/OfficeMembershipHandlers/DocumentHandler"; + +@Controller() +@Service() +export default class DocumentsController extends ApiController { + constructor(private documentsService: DocumentsService) { + super(); + } + + /** + * @description Get all documents + * @returns IDocument[] list of documents + */ + @Get("/api/v1/notary/documents", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.DocumentsWhereInput = { document_type: { office: { uid: officeId } } }; + query.where = officeWhereInput; + + //call service to get prisma entity + const documentEntities = await this.documentsService.get(query); + + //Hydrate ressource with prisma entity + const documents = Document.hydrateArray(documentEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, documents); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Create a new document + * @returns IDocument created + */ + @Post("/api/v1/notary/documents", [authHandler, ruleHandler, documentHandler]) + protected async post(req: Request, response: Response) { + try { + //init Document resource with request body values + const documentEntity = Document.hydrate(req.body); + + //validate document + await validateOrReject(documentEntity, { groups: ["createDocument"], forbidUnknownValues: false }); + + //call service to get prisma entity + const documentEntityCreated = await this.documentsService.create(documentEntity); + + //Hydrate ressource with prisma entity + const document = Document.hydrate(documentEntityCreated, { + strategy: "excludeAll", + }); + + //success + this.httpCreated(response, document); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Update a specific document + */ + @Put("/api/v1/notary/documents/:uid", [authHandler, ruleHandler, documentHandler]) + protected async update(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const documentFound = await this.documentsService.getByUid(uid); + + if (!documentFound) { + this.httpNotFoundRequest(response, "document not found"); + return; + } + + //init Document resource with request body values + const documentEntity = Document.hydrate(req.body); + + //validate document + await validateOrReject(documentEntity, { groups: ["updateDocument"] }); + + //call service to get prisma entity + const documentEntityUpdated: Documents = await this.documentsService.update(uid, documentEntity, req.body.refused_reason); + + //Hydrate ressource with prisma entity + const document = Document.hydrate(documentEntityUpdated, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, document); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Delete a specific document + */ + @Delete("/api/v1/notary/documents/:uid", [authHandler, ruleHandler, documentHandler]) + protected async delete(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const documentFound = await this.documentsService.getByUid(uid); + + if (!documentFound) { + this.httpNotFoundRequest(response, "document not found"); + return; + } + + //call service to get prisma entity + const documentEntity: Documents = await this.documentsService.delete(uid); + + //Hydrate ressource with prisma entity + const document = Document.hydrate(documentEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, document); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific document by uid + */ + @Get("/api/v1/notary/documents/:uid", [authHandler, ruleHandler, documentHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + let documentEntity: Documents | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + documentEntity = await this.documentsService.getByUid(uid, query); + } else { + //call service to get prisma entity + documentEntity = await this.documentsService.getByUid(uid); + } + + if (!documentEntity) { + this.httpNotFoundRequest(response, "document not found"); + return; + } + + //Hydrate ressource with prisma entity + const document = Document.hydrate(documentEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, document); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/notary/FilesController.ts b/src/app/api/notary/FilesController.ts new file mode 100644 index 00000000..5e32a319 --- /dev/null +++ b/src/app/api/notary/FilesController.ts @@ -0,0 +1,140 @@ +import { Response, Request } from "express"; +import { Controller, Delete, Get } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import { Service } from "typedi"; +import FilesService from "@Services/common/FilesService/FilesService"; +import { Prisma } from "@prisma/client"; +import { File } from "le-coffre-resources/dist/Notary"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; +import fileHandler from "@App/middlewares/OfficeMembershipHandlers/FileHandler"; + +@Controller() +@Service() +export default class FilesController extends ApiController { + constructor(private filesService: FilesService) { + super(); + } + + /** + * @description Get all Files + * @returns File[] list of Files + */ + @Get("/api/v1/notary/files", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.FilesWhereInput = { document: { folder: { office: { uid: officeId } } } }; + query.where = officeWhereInput; + //call service to get prisma entity + const fileEntities = await this.filesService.get(query); + + //Hydrate ressource with prisma entity + const files = File.hydrateArray(fileEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, files); + } catch (error) { + this.httpBadRequest(response, error); + return; + } + } + + /** + * @description Get a specific File by uid + */ + @Get("/api/v1/notary/files/download/:uid", [authHandler, ruleHandler, fileHandler]) + protected async download(req: Request, response: Response) { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "uid not found"); + return; + } + try { + const fileInfo = await this.filesService.download(uid); + + if (!fileInfo) { + this.httpNotFoundRequest(response, "file not found"); + return; + } + + response.setHeader("Content-Type", fileInfo.file.mimetype); + response.setHeader("Content-Disposition", `inline; filename=${encodeURIComponent(fileInfo.file.file_name)}`); + + this.httpSuccess(response, fileInfo.buffer); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Delete a specific File + */ + @Delete("/api/v1/notary/files/:uid", [authHandler, ruleHandler, fileHandler]) + protected async delete(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const fileFound = await this.filesService.getByUid(uid); + + if (!fileFound) { + this.httpNotFoundRequest(response, "file not found"); + return; + } + + //call service to get prisma entity + const fileEntity = await this.filesService.deleteKeyAndArchive(uid); + + if (!fileEntity) { + this.httpNotFoundRequest(response, "file not found"); + return; + } + + //Hydrate ressource with prisma entity + const file = File.hydrate(fileEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, file); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific File by uid + */ + @Get("/api/v1/notary/files/:uid", [authHandler, ruleHandler, fileHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const fileEntity = await this.filesService.getByUid(uid); + + if (!fileEntity) { + this.httpNotFoundRequest(response, "file not found"); + return; + } + + //Hydrate ressource with prisma entity + const file = File.hydrate(fileEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, file); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/notary/OfficeFoldersController.ts b/src/app/api/notary/OfficeFoldersController.ts new file mode 100644 index 00000000..2468dcb8 --- /dev/null +++ b/src/app/api/notary/OfficeFoldersController.ts @@ -0,0 +1,183 @@ +import { Response, Request } from "express"; +import { Controller, Delete, Get, Post, Put } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import OfficeFoldersService from "@Services/notary/OfficeFoldersService/OfficeFoldersService"; +import { Service } from "typedi"; +import { OfficeFolders, Prisma } from "@prisma/client"; +import { OfficeFolder } from "le-coffre-resources/dist/Notary"; +import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; +import folderHandler from "@App/middlewares/OfficeMembershipHandlers/FolderHandler"; + +@Controller() +@Service() +export default class OfficeFoldersController extends ApiController { + constructor(private officeFoldersService: OfficeFoldersService) { + super(); + } + + /** + * @description Get all folders + */ + @Get("/api/v1/notary/folders", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.OfficeFoldersWhereInput = { office: { uid: officeId } }; + query.where = officeWhereInput; + //call service to get prisma entity + const officeFolderEntities: OfficeFolders[] = await this.officeFoldersService.get(query); + + //Hydrate ressource with prisma entity + const officeFolders = OfficeFolder.hydrateArray(officeFolderEntities, { + strategy: "excludeAll", + }); + //success + this.httpSuccess(response, officeFolders); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Create a new folder + */ + @Post("/api/v1/notary/folders", [authHandler, ruleHandler, folderHandler]) + protected async post(req: Request, response: Response) { + try { + //init OfficeFolder resource with request body values + const officeFolderRessource = OfficeFolder.hydrate(req.body); + await officeFolderRessource.validateOrReject?.({ groups: ["createFolder"], forbidUnknownValues: false }); + + //call service to get prisma entity + const officeFolderEntity = await this.officeFoldersService.create(officeFolderRessource); + //Hydrate ressource with prisma entity + const officeFolders = OfficeFolder.hydrate(officeFolderEntity, { + strategy: "excludeAll", + }); + //success + this.httpCreated(response, officeFolders); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Modify a specific folder by uid + */ + @Put("/api/v1/notary/folders/:uid", [authHandler, ruleHandler, folderHandler]) + protected async put(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const officeFolderFound = await this.officeFoldersService.getByUid(uid); + + if (!officeFolderFound) { + this.httpNotFoundRequest(response, "office folder not found"); + return; + } + + //init OfficeFolder resource with request body values + const officeFolderEntity = OfficeFolder.hydrate(req.body); + + //validate folder + await validateOrReject(officeFolderEntity, { groups: ["updateFolder"], forbidUnknownValues: false }); + + //call service to get prisma entity + const officeFolderEntityUpdated = await this.officeFoldersService.update(uid, officeFolderEntity); + + //Hydrate ressource with prisma entity + const officeFolders = OfficeFolder.hydrate(officeFolderEntityUpdated, { + strategy: "excludeAll", + }); + + //success + this.httpSuccess(response, officeFolders); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific folder by uid + * @returns IFolder + */ + @Get("/api/v1/notary/folders/:uid", [authHandler, ruleHandler, folderHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + let officeFolderEntity: OfficeFolders | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + officeFolderEntity = await this.officeFoldersService.getByUid(uid, query); + } else { + //call service to get prisma entity + officeFolderEntity = await this.officeFoldersService.getByUid(uid); + } + + if (!officeFolderEntity) { + this.httpNotFoundRequest(response, "folder not found"); + return; + } + + //Hydrate ressource with prisma entity + const officeFolder = OfficeFolder.hydrate(officeFolderEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, officeFolder); + } catch (error) { + this.httpInternalError(response, error); + return; + } + this.httpSuccess(response, await this.officeFoldersService.getByUid("uid")); + } + + /** + * @description Delete a specific folder + */ + @Delete("/api/v1/notary/folders/:uid", [authHandler, ruleHandler, folderHandler]) + protected async delete(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const officeFolderFound = await this.officeFoldersService.getByUid(uid); + + if (!officeFolderFound) { + this.httpNotFoundRequest(response, "office folder not found"); + return; + } + + //call service to get prisma entity + const officeFoldertEntity: OfficeFolders = await this.officeFoldersService.delete(uid); + + //Hydrate ressource with prisma entity + const officeFolder = OfficeFolder.hydrate(officeFoldertEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, officeFolder); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/notary/OfficeRolesController.ts b/src/app/api/notary/OfficeRolesController.ts new file mode 100644 index 00000000..c351741b --- /dev/null +++ b/src/app/api/notary/OfficeRolesController.ts @@ -0,0 +1,81 @@ +import { Response, Request } from "express"; +import { Controller, Get } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import OfficeRolesService from "@Services/notary/OfficeRolesService/OfficeRolesService"; +import { Service } from "typedi"; +import { OfficeRole } from "le-coffre-resources/dist/Notary"; +import { OfficeRoles, Prisma } from "@prisma/client"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; +import officeRoleHandler from "@App/middlewares/OfficeMembershipHandlers/OfficeRoleHandler"; + +@Controller() +@Service() +export default class OfficeRolesController extends ApiController { + constructor(private officeRolesService: OfficeRolesService) { + super(); + } + + /** + * @description Get all officeRoles + */ + @Get("/api/v1/notary/officeRoles", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.OfficeRolesWhereInput = { office: { uid: officeId } }; + query.where = officeWhereInput; + + //call service to get prisma entity + const officeRolesEntities = await this.officeRolesService.get(query); + + //Hydrate ressource with prisma entity + const officeRoles = OfficeRole.hydrateArray(officeRolesEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, officeRoles); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific officeRole by uid + */ + @Get("/api/v1/notary/office-roles/:uid", [authHandler, ruleHandler, officeRoleHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + let officeRoleEntity: OfficeRoles | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + officeRoleEntity = await this.officeRolesService.getByUid(uid, query); + } else { + //call service to get prisma entity + officeRoleEntity = await this.officeRolesService.getByUid(uid); + } + + if (!officeRoleEntity) { + this.httpNotFoundRequest(response, "officeRole not found"); + return; + } + + //Hydrate ressource with prisma entity + const officeRole = OfficeRole.hydrate(officeRoleEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, officeRole); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/notary/OfficesController.ts b/src/app/api/notary/OfficesController.ts new file mode 100644 index 00000000..eef0066a --- /dev/null +++ b/src/app/api/notary/OfficesController.ts @@ -0,0 +1,72 @@ +import { Response, Request } from "express"; +import { Controller, Get } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import OfficesService from "@Services/notary/OfficesService/OfficesService"; +import { Service } from "typedi"; +import { Offices } from "@prisma/client"; +import { Office as OfficeResource } from "le-coffre-resources/dist/Notary"; +import ruleHandler from "@App/middlewares/RulesHandler"; +import authHandler from "@App/middlewares/AuthHandler"; + +@Controller() +@Service() +export default class OfficesController extends ApiController { + constructor(private officesService: OfficesService) { + super(); + } + /** + * @description Get all offices + */ + @Get("/api/v1/notary/offices", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + //call service to get prisma entity + const officesEntities: Offices[] = await this.officesService.get(query); + //Hydrate ressource with prisma entity + const offices = OfficeResource.hydrateArray(officesEntities, { strategy: "excludeAll" }); + //success + this.httpSuccess(response, offices); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific office by uid + */ + @Get("/api/v1/notary/offices/:uid", [authHandler, ruleHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + let officeEntity: Offices | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + officeEntity = await this.officesService.getByUid(uid, query); + } else { + //call service to get prisma entity + officeEntity = await this.officesService.getByUid(uid); + } + + if (!officeEntity) { + this.httpNotFoundRequest(response, "office not found"); + return; + } + + //Hydrate ressource with prisma entity + const office = OfficeResource.hydrate(officeEntity, { strategy: "excludeAll" }); + //success + this.httpSuccess(response, office); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/notary/RolesController.ts b/src/app/api/notary/RolesController.ts new file mode 100644 index 00000000..15d3711c --- /dev/null +++ b/src/app/api/notary/RolesController.ts @@ -0,0 +1,77 @@ +import { Response, Request } from "express"; +import { Controller, Get } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import RolesService from "@Services/notary/RolesService/RolesService"; +import { Service } from "typedi"; +import { Role } from "le-coffre-resources/dist/Notary"; +import { Roles } from "@prisma/client"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; + +@Controller() +@Service() +export default class RolesController extends ApiController { + constructor(private rolesService: RolesService) { + super(); + } + + /** + * @description Get all roles + */ + @Get("/api/v1/notary/roles", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + + //call service to get prisma entity + const rolesEntities = await this.rolesService.get(query); + + //Hydrate ressource with prisma entity + const roles = Role.hydrateArray(rolesEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, roles); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific role by uid + */ + @Get("/api/v1/notary/roles/:uid", [authHandler, ruleHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + let roleEntity: Roles | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + roleEntity = await this.rolesService.getByUid(uid, query); + } else { + //call service to get prisma entity + roleEntity = await this.rolesService.getByUid(uid); + } + + if (!roleEntity) { + this.httpNotFoundRequest(response, "role not found"); + return; + } + + //Hydrate ressource with prisma entity + const role = Role.hydrate(roleEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, role); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/notary/RulesController.ts b/src/app/api/notary/RulesController.ts new file mode 100644 index 00000000..773ba05a --- /dev/null +++ b/src/app/api/notary/RulesController.ts @@ -0,0 +1,77 @@ +import { Response, Request } from "express"; +import { Controller, Get } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import RulesService from "@Services/notary/RulesService/RulesService"; +import { Service } from "typedi"; +import { Rule } from "le-coffre-resources/dist/Notary"; +import { Rules } from "@prisma/client"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; + +@Controller() +@Service() +export default class RulesController extends ApiController { + constructor(private rulesService: RulesService) { + super(); + } + + /** + * @description Get all rules + */ + @Get("/api/v1/notary/rules", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + + //call service to get prisma entity + const rulesEntities = await this.rulesService.get(query); + + //Hydrate ressource with prisma entity + const rules = Rule.hydrateArray(rulesEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, rules); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific rule by uid + */ + @Get("/api/v1/notary/rules/:uid", [authHandler, ruleHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + let ruleEntity: Rules | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + ruleEntity = await this.rulesService.getByUid(uid, query); + } else { + //call service to get prisma entity + ruleEntity = await this.rulesService.getByUid(uid); + } + + if (!ruleEntity) { + this.httpNotFoundRequest(response, "rule not found"); + return; + } + + //Hydrate ressource with prisma entity + const rule = Rule.hydrate(ruleEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, rule); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/notary/UsersController.ts b/src/app/api/notary/UsersController.ts new file mode 100644 index 00000000..c2836a60 --- /dev/null +++ b/src/app/api/notary/UsersController.ts @@ -0,0 +1,81 @@ +import { Response, Request } from "express"; +import { Controller, Get } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import UsersService from "@Services/notary/UsersService/UsersService"; +import { Service } from "typedi"; +import User from "le-coffre-resources/dist/Notary"; +import { Prisma, Users } from "@prisma/client"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; +import userHandler from "@App/middlewares/OfficeMembershipHandlers/UserHandler"; + +@Controller() +@Service() +export default class UsersController extends ApiController { + constructor(private usersService: UsersService) { + super(); + } + + /** + * @description Get all users + */ + @Get("/api/v1/notary/users", [authHandler, ruleHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.UsersWhereInput = { office_membership: { uid: officeId } }; + query.where = officeWhereInput; + + //call service to get prisma entity + const usersEntities = await this.usersService.get(query); + + //Hydrate ressource with prisma entity + const users = User.hydrateArray(usersEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, users); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific user by uid + */ + @Get("/api/v1/notary/users/:uid", [authHandler, ruleHandler, userHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + let userEntity: Users | null; + //get query + if (req.query["q"]) { + const query = JSON.parse(req.query["q"] as string); + userEntity = await this.usersService.getByUid(uid, query); + } else { + //call service to get prisma entity + userEntity = await this.usersService.getByUid(uid); + } + + if (!userEntity) { + this.httpNotFoundRequest(response, "user not found"); + return; + } + + //Hydrate ressource with prisma entity + const user = User.hydrate(userEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, user); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/super-admin/FilesController.ts b/src/app/api/super-admin/FilesController.ts index 33611649..78b99b4c 100644 --- a/src/app/api/super-admin/FilesController.ts +++ b/src/app/api/super-admin/FilesController.ts @@ -1,12 +1,10 @@ import { Response, Request } from "express"; -import { Controller, Delete, Get, Post, Put } from "@ControllerPattern/index"; +import { Controller, Delete, Get } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import { Service } from "typedi"; import FilesService from "@Services/common/FilesService/FilesService"; -import { Files, Prisma } from "@prisma/client"; +import { Prisma } from "@prisma/client"; import { File } from "le-coffre-resources/dist/SuperAdmin"; -import { validateOrReject } from "class-validator"; -import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import fileHandler from "@App/middlewares/OfficeMembershipHandlers/FileHandler"; @@ -14,7 +12,7 @@ import fileHandler from "@App/middlewares/OfficeMembershipHandlers/FileHandler"; @Controller() @Service() export default class FilesController extends ApiController { - constructor(private filesService: FilesService, private documentService: DocumentsService) { + constructor(private filesService: FilesService) { super(); } @@ -72,81 +70,6 @@ export default class FilesController extends ApiController { } } - /** - * @description Create a new File - * @returns File created - */ - @Post("/api/v1/super-admin/files", [authHandler, ruleHandler, fileHandler]) - protected async post(req: Request, response: Response) { - try { - //get file - if (!req.file) throw new Error("No file provided"); - - //init File resource with request body values - const fileEntity = File.hydrate(JSON.parse(req.body["q"])); - - //validate File - await validateOrReject(fileEntity, { groups: ["createFile"] }); - - //call service to get prisma entity - const fileEntityCreated = await this.filesService.create(fileEntity, req.file); - - const document = await this.documentService.getByUid(fileEntity.document!.uid!); - - document!.document_status = "DEPOSITED"; - await this.documentService.update(document!.uid!, document!); - - //Hydrate ressource with prisma entity - const fileEntityHydrated = File.hydrate(fileEntityCreated, { - strategy: "excludeAll", - }); - - //success - this.httpCreated(response, fileEntityHydrated); - } catch (error) { - this.httpBadRequest(response, error); - return; - } - } - - /** - * @description Update a specific file - */ - @Put("/api/v1/super-admin/files/:uid", [authHandler, ruleHandler, fileHandler]) - protected async update(req: Request, response: Response) { - try { - const uid = req.params["uid"]; - if (!uid) { - throw new Error("No uid provided"); - } - - const fileFound = await this.filesService.getByUid(uid); - - if (!fileFound) { - this.httpNotFoundRequest(response, "file not found"); - return; - } - - //init File resource with request body values - const fileEntity = File.hydrate(req.body); - - //validate file - await validateOrReject(fileEntity, { groups: ["updateFile"] }); - - //call service to get prisma entity - const fileEntityUpdated: Files = await this.filesService.update(uid, fileEntity); - - //Hydrate ressource with prisma entity - const file = File.hydrate(fileEntityUpdated, { strategy: "excludeAll" }); - - //success - this.httpSuccess(response, file); - } catch (error) { - this.httpBadRequest(response, error); - return; - } - } - /** * @description Delete a specific File */ diff --git a/src/app/api/super-admin/OfficeRolesController.ts b/src/app/api/super-admin/OfficeRolesController.ts index 7adff4a8..ae2702f7 100644 --- a/src/app/api/super-admin/OfficeRolesController.ts +++ b/src/app/api/super-admin/OfficeRolesController.ts @@ -4,7 +4,7 @@ import ApiController from "@Common/system/controller-pattern/ApiController"; import OfficeRolesService from "@Services/super-admin/OfficeRolesService/OfficeRolesService"; import { Service } from "typedi"; import { validateOrReject } from "class-validator"; -import { OfficeRole } from "le-coffre-resources/dist/Notary"; +import { OfficeRole } from "le-coffre-resources/dist/SuperAdmin"; import { OfficeRoles, Prisma } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; diff --git a/src/app/api/super-admin/RolesController.ts b/src/app/api/super-admin/RolesController.ts index a8afcf27..e5c774e5 100644 --- a/src/app/api/super-admin/RolesController.ts +++ b/src/app/api/super-admin/RolesController.ts @@ -4,7 +4,7 @@ import ApiController from "@Common/system/controller-pattern/ApiController"; import RolesService from "@Services/super-admin/RolesService/RolesService"; import { Service } from "typedi"; import { validateOrReject } from "class-validator"; -import { Role } from "le-coffre-resources/dist/Notary"; +import { Role } from "le-coffre-resources/dist/SuperAdmin"; import { Roles } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; diff --git a/src/app/api/super-admin/RulesController.ts b/src/app/api/super-admin/RulesController.ts index 6dd93840..9555cef8 100644 --- a/src/app/api/super-admin/RulesController.ts +++ b/src/app/api/super-admin/RulesController.ts @@ -4,7 +4,7 @@ import ApiController from "@Common/system/controller-pattern/ApiController"; import RulesService from "@Services/super-admin/RulesService/RulesService"; import { Service } from "typedi"; import { validateOrReject } from "class-validator"; -import { Rule } from "le-coffre-resources/dist/Notary"; +import { Rule } from "le-coffre-resources/dist/SuperAdmin"; import { Rules } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index ca058591..3a4e620e 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -4,7 +4,7 @@ import ApiController from "@Common/system/controller-pattern/ApiController"; import UsersService from "@Services/super-admin/UsersService/UsersService"; import { Service } from "typedi"; import { validateOrReject } from "class-validator"; -import User from "le-coffre-resources/dist/Notary"; +import User from "le-coffre-resources/dist/SuperAdmin"; import { Users } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; diff --git a/src/app/middlewares/CustomerHandler/DocumentHandler.ts b/src/app/middlewares/CustomerHandler/DocumentHandler.ts new file mode 100644 index 00000000..0f82fd35 --- /dev/null +++ b/src/app/middlewares/CustomerHandler/DocumentHandler.ts @@ -0,0 +1,23 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import DocumentsService from "@Services/customer/DocumentsService/DocumentsService"; +import { NextFunction, Request, Response } from "express"; +import Container from "typedi"; + +export default async function documentHandler(req: Request, response: Response, next: NextFunction) { + const customerId = req.body.user.customerId; + const uid = req.path && req.path.split("/")[5]; + + if(!uid) { + response.sendStatus(HttpCodes.BAD_REQUEST); + return; + } + + const documentService = Container.get(DocumentsService); + const document = await documentService.getByUid(uid); + + if(document?.depositor_uid != customerId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + +} diff --git a/src/app/middlewares/CustomerHandler/FileHandler.ts b/src/app/middlewares/CustomerHandler/FileHandler.ts new file mode 100644 index 00000000..aa245d70 --- /dev/null +++ b/src/app/middlewares/CustomerHandler/FileHandler.ts @@ -0,0 +1,37 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import FilesService from "@Services/common/FilesService/FilesService"; +import DocumentsService from "@Services/customer/DocumentsService/DocumentsService"; +import { NextFunction, Request, Response } from "express"; +import Container from "typedi"; + +export default async function fileHandler(req: Request, response: Response, next: NextFunction) { + const customerId = req.body.user.customerId; + const uid = req.path && req.path.split("/")[5]; + const document = req.body.document; + + if (uid) { + const fileService = Container.get(FilesService); + const file = await fileService.getByUidWithDocument(uid); + if (!file) { + response.sendStatus(HttpCodes.BAD_REQUEST); + return; + } + if (file.document.depositor_uid != customerId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + if (document) { + const documentService = Container.get(DocumentsService); + const documentFound = await documentService.getByUid(document.uid!); + if(!documentFound) { + response.sendStatus(HttpCodes.BAD_REQUEST); + return; + } + if (documentFound.depositor_uid != customerId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } +} diff --git a/src/common/repositories/ContactRepository.ts b/src/common/repositories/ContactRepository.ts new file mode 100644 index 00000000..8a3861ee --- /dev/null +++ b/src/common/repositories/ContactRepository.ts @@ -0,0 +1,29 @@ +import Database from "@Common/databases/database"; +import BaseRepository from "@Repositories/BaseRepository"; +import { Service } from "typedi"; +import { Contacts, Customers } from "@prisma/client"; + +@Service() +export default class ContactRepository extends BaseRepository { + constructor(private database: Database) { + super(); + } + protected get model() { + return this.database.getClient().contacts; + } + protected get instanceDb() { + return this.database.getClient(); + } + + /** + * @description : Find unique customer by email + */ + public async findOneByEmail(email: string): Promise<(Contacts & {customers: Customers | null}) | null> { + return this.model.findUnique({ + where: { + email: email, + }, + include: { customers: true } + }); + } +} diff --git a/src/common/repositories/CustomersRepository.ts b/src/common/repositories/CustomersRepository.ts index a4ebfe4a..8a27293a 100644 --- a/src/common/repositories/CustomersRepository.ts +++ b/src/common/repositories/CustomersRepository.ts @@ -1,7 +1,7 @@ import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; -import { Contacts, Customers, ECivility, ECustomerStatus, Prisma } from "@prisma/client"; +import { Customers, ECivility, ECustomerStatus, Prisma } from "@prisma/client"; import { Customer } from "le-coffre-resources/dist/SuperAdmin"; @Service() @@ -28,7 +28,7 @@ export default class CustomersRepository extends BaseRepository { /** * @description : Create a customer */ - public async create(customer: Customer): Promise { + public async create(customer: Customer): Promise { const createArgs: Prisma.CustomersCreateArgs = { data: { status: ECustomerStatus.PENDING, @@ -61,7 +61,7 @@ export default class CustomersRepository extends BaseRepository { /** * @description : Update data from a customer */ - public async update(uid: string, customer: Customer): Promise { + public async update(uid: string, customer: Customer): Promise { const updateArgs: Prisma.CustomersUpdateArgs = { where: { uid: uid, @@ -102,4 +102,15 @@ export default class CustomersRepository extends BaseRepository { include: query, }); } + + /** + * @description : Find unique customer + */ + public async findOneByContact(contactUid: string) { + return this.model.findUnique({ + where: { + contact_uid: contactUid, + }, + }); + } } diff --git a/src/common/repositories/DeedTypesRepository.ts b/src/common/repositories/DeedTypesRepository.ts index 62059131..be7b4194 100644 --- a/src/common/repositories/DeedTypesRepository.ts +++ b/src/common/repositories/DeedTypesRepository.ts @@ -1,7 +1,7 @@ import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; -import { DeedTypes, DocumentTypes, Prisma } from "@prisma/client"; +import { DeedTypes, Prisma } from "@prisma/client"; import { DeedType } from "le-coffre-resources/dist/SuperAdmin"; @Service() @@ -52,7 +52,7 @@ export default class DeedTypesRepository extends BaseRepository { /** * @description : Update data of a deed type */ - public async update(uid: string, deedType: DeedType): Promise { + public async update(uid: string, deedType: DeedType): Promise { const updateArgs: Prisma.DeedTypesUpdateArgs = { where: { uid: uid, diff --git a/src/common/repositories/DeedsRepository.ts b/src/common/repositories/DeedsRepository.ts index becc4d55..e9501210 100644 --- a/src/common/repositories/DeedsRepository.ts +++ b/src/common/repositories/DeedsRepository.ts @@ -1,7 +1,7 @@ import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; -import { Deeds, DocumentTypes, Prisma } from "@prisma/client"; +import { Deeds, Prisma } from "@prisma/client"; import { Deed } from "le-coffre-resources/dist/Notary"; @Service() @@ -27,7 +27,7 @@ export default class DeedsRepository extends BaseRepository { /** * @description : Create a deed based on a deed type */ - public async create(deed: Deed): Promise { + public async create(deed: Deed): Promise { const createArgs: Prisma.DeedsCreateArgs = { data: { deed_type: { @@ -59,7 +59,7 @@ export default class DeedsRepository extends BaseRepository { /** * @description : Update data of a deed type */ - public async update(uid: string, deed: Deed): Promise { + public async update(uid: string, deed: Deed): Promise { const updateArgs: Prisma.DeedsUpdateArgs = { where: { uid: uid, diff --git a/src/common/repositories/DocumentsRepository.ts b/src/common/repositories/DocumentsRepository.ts index 5a81d7ca..98b66e1b 100644 --- a/src/common/repositories/DocumentsRepository.ts +++ b/src/common/repositories/DocumentsRepository.ts @@ -1,7 +1,7 @@ import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; -import { DocumentTypes, Documents, EDocumentStatus, Prisma } from "@prisma/client"; +import { Documents, EDocumentStatus, Prisma } from "@prisma/client"; import { Document } from "le-coffre-resources/dist/SuperAdmin"; @Service() @@ -27,7 +27,7 @@ export default class DocumentsRepository extends BaseRepository { /** * @description : Create a document */ - public async create(document: Document): Promise { + public async create(document: Document): Promise { const createArgs: Prisma.DocumentsCreateArgs = { data: { folder: { @@ -125,7 +125,7 @@ export default class DocumentsRepository extends BaseRepository { /** * @description : Find unique document */ - public async findOneByUid(uid: string, query?: Prisma.DocumentsInclude) { + public async findOneByUid(uid: string, query?: Prisma.DocumentsInclude): Promise { return this.model.findUnique({ where: { uid: uid, diff --git a/src/common/repositories/FilesRepository.ts b/src/common/repositories/FilesRepository.ts index 100e10a2..02776bdf 100644 --- a/src/common/repositories/FilesRepository.ts +++ b/src/common/repositories/FilesRepository.ts @@ -1,7 +1,7 @@ import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; -import { Documents, Files, Prisma } from "@prisma/client"; +import { Files, Prisma } from "@prisma/client"; import { File } from "le-coffre-resources/dist/SuperAdmin"; @Service() @@ -27,7 +27,7 @@ export default class FilesRepository extends BaseRepository { /** * @description : Create a file linked to a document */ - public async create(file: File, key: string): Promise { + public async create(file: File, key: string): Promise { const createArgs: Prisma.FilesCreateArgs = { data: { document: { @@ -48,7 +48,7 @@ export default class FilesRepository extends BaseRepository { /** * @description : Update data of a file */ - public async update(uid: string, file: File, key: string): Promise { + public async update(uid: string, file: File, key: string): Promise { const updateArgs: Prisma.FilesUpdateArgs = { where: { uid: uid, @@ -67,7 +67,7 @@ export default class FilesRepository extends BaseRepository { /** * @description : Delete a file key and archive */ - public async deleteKeyAndArchive(uid: string): Promise { + public async deleteKeyAndArchive(uid: string): Promise { const updateArgs: Prisma.FilesUpdateArgs = { where: { uid: uid, @@ -103,4 +103,16 @@ export default class FilesRepository extends BaseRepository { include: { document: { include: { folder: { include: { office: true } } } } }, }); } + + /** + * @description : Find unique file with document + */ + public async findOneByUidWithDocument(uid: string) { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: { document: true }, + }); + } } diff --git a/src/common/repositories/OfficeFoldersRepository.ts b/src/common/repositories/OfficeFoldersRepository.ts index e36d2b36..43011a95 100644 --- a/src/common/repositories/OfficeFoldersRepository.ts +++ b/src/common/repositories/OfficeFoldersRepository.ts @@ -1,7 +1,7 @@ import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; -import { Customers, Documents, EFolderStatus, OfficeFolders, Prisma, Users } from "@prisma/client"; +import { EFolderStatus, OfficeFolders, Prisma } from "@prisma/client"; import { OfficeFolder } from "le-coffre-resources/dist/SuperAdmin"; @Service() @@ -27,7 +27,7 @@ export default class OfficeFoldersRepository extends BaseRepository { /** * @description : Create new office folder with stakeholders */ - public async create(officeFolder: OfficeFolder): Promise { + public async create(officeFolder: OfficeFolder): Promise { const createArgs: Prisma.OfficeFoldersCreateArgs = { data: { folder_number: officeFolder.folder_number, @@ -61,7 +61,7 @@ export default class OfficeFoldersRepository extends BaseRepository { public async update( officeFolderuid: string, officeFolder: OfficeFolder, - ): Promise { + ): Promise { const updateArgs: Prisma.OfficeFoldersUpdateArgs = { where: { uid: officeFolderuid, diff --git a/src/common/repositories/OfficeRolesRepository.ts b/src/common/repositories/OfficeRolesRepository.ts index 940c9bc4..f96a9926 100644 --- a/src/common/repositories/OfficeRolesRepository.ts +++ b/src/common/repositories/OfficeRolesRepository.ts @@ -1,7 +1,7 @@ import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; -import { OfficeRoles, Prisma, Rules } from "@prisma/client"; +import { OfficeRoles, Prisma } from "@prisma/client"; import { OfficeRole } from "le-coffre-resources/dist/SuperAdmin"; @Service() @@ -27,7 +27,7 @@ export default class OfficeRolesRepository extends BaseRepository { /** * @description : Create new officeRole with rules */ - public async create(officeRole: OfficeRole): Promise { + public async create(officeRole: OfficeRole): Promise { const createArgs: Prisma.OfficeRolesCreateArgs = { data: { name: officeRole.name, @@ -50,7 +50,7 @@ export default class OfficeRolesRepository extends BaseRepository { /** * @description : Update data of a officeRole with rules */ - public async update(officeRole: OfficeRole): Promise { + public async update(officeRole: OfficeRole): Promise { const updateArgs: Prisma.OfficeRolesUpdateArgs = { where: { uid: officeRole.uid, diff --git a/src/common/repositories/UsersRepository.ts b/src/common/repositories/UsersRepository.ts index 7f98728b..b43d0a8f 100644 --- a/src/common/repositories/UsersRepository.ts +++ b/src/common/repositories/UsersRepository.ts @@ -1,7 +1,7 @@ import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; -import { Addresses, Contacts, ECivility, Offices, Prisma, Users } from "@prisma/client"; +import { ECivility, Prisma, Users } from "@prisma/client"; import User from "le-coffre-resources/dist/SuperAdmin"; @Service() @@ -87,17 +87,7 @@ export default class UsersRepository extends BaseRepository { /** * @description : Update data from a user */ - public async update( - uid: string, - user: User, - ): Promise< - Users & { - contact: Contacts; - office_membership: Offices & { - address: Addresses; - }; - } - > { + public async update(uid: string, user: User): Promise { const updateArgs: Prisma.UsersUpdateArgs = { where: { uid: uid, diff --git a/src/services/admin/CustomersService/CustomersService.ts b/src/services/admin/CustomersService/CustomersService.ts new file mode 100644 index 00000000..7656bed2 --- /dev/null +++ b/src/services/admin/CustomersService/CustomersService.ts @@ -0,0 +1,52 @@ +import { Customers, Prisma } from "@prisma/client"; +import CustomersRepository from "@Repositories/CustomersRepository"; +import BaseService from "@Services/BaseService"; +import { Customer } from "le-coffre-resources/dist/Admin"; +import { Service } from "typedi"; + +@Service() +export default class CustomersService extends BaseService { + constructor(private customerRepository: CustomersRepository) { + super(); + } + + /** + * @description : Get all Customers + * @throws {Error} If Customers cannot be get + */ + public async get(query: Prisma.CustomersFindManyArgs): Promise { + return this.customerRepository.findMany(query); + } + + /** + * @description : Create a new customer + * @throws {Error} If customer cannot be created + */ + public async create(customerEntity: Customer): Promise { + return this.customerRepository.create(customerEntity); + } + + /** + * @description : Modify a customer + * @throws {Error} If customer cannot be modified + */ + public async update(uid: string, customerEntity: Customer): Promise { + return this.customerRepository.update(uid, customerEntity); + } + + /** + * @description : Get a customer by uid + * @throws {Error} If customer cannot be get by uid + */ + public async getByUid(uid: string, query?: Prisma.CustomersInclude): Promise { + return this.customerRepository.findOneByUid(uid, query); + } + + /** + * @description : Get a customer by contact uid + * @throws {Error} If customer cannot be get by contact uid + */ + public async getByContact(contactUid: string): Promise { + return this.customerRepository.findOneByContact(contactUid); + } +} diff --git a/src/services/admin/DeedTypesService/DeedTypesService.ts b/src/services/admin/DeedTypesService/DeedTypesService.ts new file mode 100644 index 00000000..35daf668 --- /dev/null +++ b/src/services/admin/DeedTypesService/DeedTypesService.ts @@ -0,0 +1,52 @@ +import { DeedTypes, Prisma } from "@prisma/client"; +import DeedTypesRepository from "@Repositories/DeedTypesRepository"; +import BaseService from "@Services/BaseService"; +import { DeedType } from "le-coffre-resources/dist/Admin"; +import { Service } from "typedi"; + +@Service() +export default class DeedTypesService extends BaseService { + constructor(private deedTypeRepository: DeedTypesRepository) { + super(); + } + + /** + * @description : Get all deed-types + * @throws {Error} If deed-types cannot be get + */ + public async get(query: Prisma.DeedTypesFindManyArgs) { + return this.deedTypeRepository.findMany(query); + } + + /** + * @description : Create a new deed-type + * @throws {Error} If deed-type cannot be created + */ + public async create(deedTypeEntity: DeedType): Promise { + return this.deedTypeRepository.create(deedTypeEntity); + } + + /** + * @description : Modify a deed-type + * @throws {Error} If deed-type cannot be modifified + */ + public async update(uid: string, deedTypeEntity: DeedType): Promise { + return this.deedTypeRepository.update(uid, deedTypeEntity); + } + + /** + * @description : Get a deedtype by uid + * @throws {Error} If deed-type cannot be get by uid + */ + public async getByUid(uid: string, query?: Prisma.DeedTypesInclude): Promise { + return this.deedTypeRepository.findOneByUid(uid, query); + } + + /** + * @description : Get a deedtype by uid + * @throws {Error} If deed-type cannot be get by uid + */ + public async getByUidWithOffice(uid: string) { + return this.deedTypeRepository.findOneByUidWithOffice(uid); + } +} diff --git a/src/services/admin/DeedsService/DeedsService.ts b/src/services/admin/DeedsService/DeedsService.ts new file mode 100644 index 00000000..56d88427 --- /dev/null +++ b/src/services/admin/DeedsService/DeedsService.ts @@ -0,0 +1,48 @@ +import { Deeds, Prisma } from "@prisma/client"; +import DeedsRepository from "@Repositories/DeedsRepository"; +import BaseService from "@Services/BaseService"; +import { Deed } from "le-coffre-resources/dist/Admin"; +import { Service } from "typedi"; + +@Service() +export default class DeedsService extends BaseService { + constructor(private deedRepository: DeedsRepository) { + super(); + } + + /** + * @description : Get all deeds + * @throws {Error} If deeds cannot be get + */ + public async get(query: Prisma.DeedsFindManyArgs) { + return this.deedRepository.findMany(query); + } + + /** + * @description : Create a new deed with document types + * @throws {Error} If deeds cannot be created + */ + public async create(deed: Deed): Promise { + return this.deedRepository.create(deed); + } + + /** + * @description : Update data of a deed with document types + * @throws {Error} If deeds cannot be updated with document types or one of them + */ + public async update(uid: string, deed: Deed): Promise { + return this.deedRepository.update(uid, deed); + } + + /** + * @description : Get a deed by uid + * @throws {Error} If deed-type cannot be get by uid + */ + public async getByUid(uid: string, query?: Prisma.DeedsInclude) { + return this.deedRepository.findOneByUid(uid, query); + } + + public async getOneByUidWithOffice(uid: string) { + return this.deedRepository.findOneByUidWithOffice(uid); + } +} diff --git a/src/services/admin/DocumentTypesService/DocumentTypesService.ts b/src/services/admin/DocumentTypesService/DocumentTypesService.ts new file mode 100644 index 00000000..30d56724 --- /dev/null +++ b/src/services/admin/DocumentTypesService/DocumentTypesService.ts @@ -0,0 +1,52 @@ +import { DocumentTypes, Prisma } from "@prisma/client"; +import DocumentTypesRepository from "@Repositories/DocumentTypesRepository"; +import BaseService from "@Services/BaseService"; +import { DocumentType } from "le-coffre-resources/dist/Admin"; +import { Service } from "typedi"; + +@Service() +export default class DocumentTypesService extends BaseService { + constructor(private documentTypeRepository: DocumentTypesRepository) { + super(); + } + + /** + * @description : Get all document-types + * @throws {Error} If document-types cannot be get + */ + public async get(query: Prisma.DocumentTypesFindManyArgs) { + return this.documentTypeRepository.findMany(query); + } + + /** + * @description : Create a new document-type + * @throws {Error} If document-types cannot be created + */ + public async create(documentTypeEntity: DocumentType): Promise { + return this.documentTypeRepository.create(documentTypeEntity); + } + + /** + * @description : Modify a document-type + * @throws {Error} If document-type cannot be modified + */ + public async update(uid: string, documentTypeEntity: DocumentType): Promise { + return this.documentTypeRepository.update(uid, documentTypeEntity); + } + + /** + * @description : Get a document-type by uid + * @throws {Error} If document-type is not found + */ + public async getByUid(uid: string, query?: Prisma.DocumentTypesInclude) { + return this.documentTypeRepository.findOneByUid(uid, query); + } + + /** + * @description : Get a document-type by uid with relations + * @throws {Error} If document-type is not found + */ + public async getByUidWithOffice(uid: string) { + return this.documentTypeRepository.findOneByUidWithOffice(uid); + } +} diff --git a/src/services/admin/DocumentsService/DocumentsService.ts b/src/services/admin/DocumentsService/DocumentsService.ts new file mode 100644 index 00000000..c8e7aa0b --- /dev/null +++ b/src/services/admin/DocumentsService/DocumentsService.ts @@ -0,0 +1,75 @@ +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"; + +@Service() +export default class DocumentsService extends BaseService { + constructor(private documentsRepository: DocumentsRepository) { + 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, refused_reason?: string): Promise { + return this.documentsRepository.update(uid, document, 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" }); + + if (document.files && document.files.length !== 0) { + 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); + } +} diff --git a/src/services/admin/OfficeFoldersService/OfficeFoldersService.ts b/src/services/admin/OfficeFoldersService/OfficeFoldersService.ts new file mode 100644 index 00000000..8d474aef --- /dev/null +++ b/src/services/admin/OfficeFoldersService/OfficeFoldersService.ts @@ -0,0 +1,79 @@ +import { OfficeFolders } from ".prisma/client"; +import OfficeFoldersRepository from "@Repositories/OfficeFoldersRepository"; +import BaseService from "@Services/BaseService"; +import { OfficeFolder } from "le-coffre-resources/dist/Admin"; +import { Service } from "typedi"; +import DeedTypesService from "../DeedTypesService/DeedTypesService"; +import DeedsRepository from "@Repositories/DeedsRepository"; +import { Prisma } from "@prisma/client"; + +@Service() +export default class OfficeFoldersService extends BaseService { + constructor( + private officeFoldersRepository: OfficeFoldersRepository, + private deedTypeService: DeedTypesService, + private deedRepository: DeedsRepository, + ) { + super(); + } + + /** + * @description : Get all folders + * @throws {Error} If folders cannot be get + */ + public async get(query: Prisma.OfficeFoldersFindManyArgs) { + return this.officeFoldersRepository.findMany(query); + } + + /** + * @description : Create a new folder + * @throws {Error} If folder cannot be created + */ + public async create(officeFolderEntity: OfficeFolder): Promise { + const deedType = await this.deedTypeService.getByUid(officeFolderEntity.deed!.deed_type!.uid!); + if (!deedType) throw new Error("deed type not found"); + if (deedType.archived_at) throw new Error("deed type is archived"); + const deed = await this.deedRepository.create(officeFolderEntity.deed!); + officeFolderEntity.deed!.uid = deed.uid; + return this.officeFoldersRepository.create(officeFolderEntity); + } + + /** + * @description : Modify a folder + * @throws {Error} If folder cannot be modified + */ + public async update(officeFolderuid: string, officeFolderEntity: OfficeFolder): Promise { + return this.officeFoldersRepository.update(officeFolderuid, officeFolderEntity); + } + + /** + * @description : Get a folder by uid + * @throws {Error} If folder cannot be get by uid + */ + public async getByUid(uid: string, query?: Prisma.OfficeFoldersInclude) { + return this.officeFoldersRepository.findOneByUid(uid, query); + } + + /** + * @description : Get a folder by uid + * @throws {Error} If folder cannot be get by uid + */ + public async getByUidWithOffice(uid: string) { + return this.officeFoldersRepository.findOneByUidWithOffice(uid); + } + + /** + * @description : Delete a folder + * @throws {Error} If document cannot be deleted + */ + public async delete(uid: string): Promise { + const officeFolderEntity = await this.officeFoldersRepository.findOneByUid(uid, { customers: true }); + if (!officeFolderEntity) throw new Error("office folder not found"); + const officeFolder = OfficeFolder.hydrate(officeFolderEntity, { strategy: "excludeAll" }); + + if (officeFolder.customers?.length) { + throw new Error("This folder is used by customers"); + } + return this.officeFoldersRepository.delete(uid); + } +} diff --git a/src/services/admin/OfficeRolesService/OfficeRolesService.ts b/src/services/admin/OfficeRolesService/OfficeRolesService.ts new file mode 100644 index 00000000..2fb82f48 --- /dev/null +++ b/src/services/admin/OfficeRolesService/OfficeRolesService.ts @@ -0,0 +1,52 @@ +import BaseService from "@Services/BaseService"; +import { Service } from "typedi"; +import OfficeRolesRepository from "@Repositories/OfficeRolesRepository"; +import { OfficeRole } from "le-coffre-resources/dist/Admin"; +import { Prisma, OfficeRoles } from "@prisma/client"; + +@Service() +export default class OfficeRolesService extends BaseService { + constructor(private officeRoleRepository: OfficeRolesRepository) { + super(); + } + + /** + * @description : Get all officeRoles + * @throws {Error} If officeRoles cannot be get + */ + public get(query: Prisma.OfficeRolesFindManyArgs) { + return this.officeRoleRepository.findMany(query); + } + + /** + * @description : Create a officeRole + * @throws {Error} If officeRole couldn't be created + */ + public create(officeRoleEntity: OfficeRole): Promise { + return this.officeRoleRepository.create(officeRoleEntity); + } + + /** + * @description : Modify a officeRole + * @throws {Error} If officeRole modification failed + */ + public update(officeRoleEntity: OfficeRole): Promise { + return this.officeRoleRepository.update(officeRoleEntity); + } + + /** + * @description : Get a officeRole by uid + * @throws {Error} If officeRole cannot be get by uid + */ + public getByUid(uid: string, query?: Prisma.OfficeRolesInclude) { + return this.officeRoleRepository.findOneByUid(uid, query); + } + + /** + * @description : Get a officeRole by uid + * @throws {Error} If officeRole cannot be get by uid + */ + public getByUidWithOffice(uid: string) { + return this.officeRoleRepository.findOneByUidWithOffice(uid); + } +} diff --git a/src/services/admin/OfficesService/OfficesService.ts b/src/services/admin/OfficesService/OfficesService.ts new file mode 100644 index 00000000..af25083b --- /dev/null +++ b/src/services/admin/OfficesService/OfficesService.ts @@ -0,0 +1,27 @@ +import { Prisma } from "@prisma/client"; +import OfficesRepository from "@Repositories/OfficesRepository"; +import BaseService from "@Services/BaseService"; +import { Service } from "typedi"; + +@Service() +export default class OfficesService extends BaseService { + constructor(private officeRepository: OfficesRepository) { + super(); + } + + /** + * @description : Get all offices + * @throws {Error} If offices cannot be get + */ + public async get(query: Prisma.OfficesFindManyArgs) { + return this.officeRepository.findMany(query); + } + + /** + * @description : Get a office by uid + * @throws {Error} If office cannot be get + */ + public async getByUid(uid: string, query?: Prisma.OfficesInclude) { + return this.officeRepository.findOneByUid(uid, query); + } +} diff --git a/src/services/admin/RolesService/RolesService.ts b/src/services/admin/RolesService/RolesService.ts new file mode 100644 index 00000000..2e4032d0 --- /dev/null +++ b/src/services/admin/RolesService/RolesService.ts @@ -0,0 +1,45 @@ +import BaseService from "@Services/BaseService"; +import "reflect-metadata"; +import { Service } from "typedi"; +import RolesRepository from "@Repositories/RolesRepository"; +import { Role } from "le-coffre-resources/dist/Admin"; +import { Prisma, Roles } from "@prisma/client"; + +@Service() +export default class RolesService extends BaseService { + constructor(private roleRepository: RolesRepository) { + super(); + } + + /** + * @description : Get all roles + * @throws {Error} If roles cannot be get + */ + public get(query: Prisma.RolesFindManyArgs) { + return this.roleRepository.findMany(query); + } + + /** + * @description : Create a role + * @throws {Error} If role couldn't be created + */ + public create(roleEntity: Role): Promise { + return this.roleRepository.create(roleEntity); + } + + /** + * @description : Modify a role + * @throws {Error} If role modification failed + */ + public update(roleEntity: Role): Promise { + return this.roleRepository.update(roleEntity); + } + + /** + * @description : Get a role by uid + * @throws {Error} If role cannot be get by uid + */ + public getByUid(uid: string, query?: Prisma.RolesInclude) { + return this.roleRepository.findOneByUid(uid, query); + } +} diff --git a/src/services/admin/RulesService/RulesService.ts b/src/services/admin/RulesService/RulesService.ts new file mode 100644 index 00000000..28c60784 --- /dev/null +++ b/src/services/admin/RulesService/RulesService.ts @@ -0,0 +1,45 @@ +import BaseService from "@Services/BaseService"; +import "reflect-metadata"; +import { Service } from "typedi"; +import RulesRepository from "@Repositories/RulesRepository"; +import { Rule } from "le-coffre-resources/dist/Admin"; +import { Prisma, Rules } from "@prisma/client"; + +@Service() +export default class RulesService extends BaseService { + constructor(private ruleRepository: RulesRepository) { + super(); + } + + /** + * @description : Get all rules + * @throws {Error} If rules cannot be get + */ + public get(query: Prisma.RulesFindManyArgs) { + return this.ruleRepository.findMany(query); + } + + /** + * @description : Create a rule + * @throws {Error} If rule couldn't be created + */ + public create(ruleEntity: Rule): Promise { + return this.ruleRepository.create(ruleEntity); + } + + /** + * @description : Modify a rule + * @throws {Error} If rule modification failed + */ + public update(ruleEntity: Rule): Promise { + return this.ruleRepository.update(ruleEntity); + } + + /** + * @description : Get a rule by uid + * @throws {Error} If rule cannot be get by uid + */ + public getByUid(uid: string, query?: Prisma.RulesInclude) { + return this.ruleRepository.findOneByUid(uid, query); + } +} diff --git a/src/services/admin/UsersService/UsersService.ts b/src/services/admin/UsersService/UsersService.ts new file mode 100644 index 00000000..d2216c3b --- /dev/null +++ b/src/services/admin/UsersService/UsersService.ts @@ -0,0 +1,61 @@ +import BaseService from "@Services/BaseService"; +import "reflect-metadata"; +import { Service } from "typedi"; +import UsersRepository from "@Repositories/UsersRepository"; +import User from "le-coffre-resources/dist/Admin"; +import { Prisma, Users } from "@prisma/client"; + +@Service() +export default class UsersService extends BaseService { + constructor(private userRepository: UsersRepository) { + super(); + } + + /** + * @description : Get all users + * @throws {Error} If users cannot be get + */ + public get(query: Prisma.UsersFindManyArgs) { + return this.userRepository.findMany(query); + } + + /** + * @description : Create a user + * @throws {Error} If user couldn't be created + */ + public create(userEntity: User): Promise { + return this.userRepository.create(userEntity); + } + + /** + * @description : Modify a user + * @throws {Error} If user modification failed + */ + public update(uid: string, userEntity: User): Promise { + return this.userRepository.update(uid, userEntity); + } + + /** + * @description : Get a user by uid + * @throws {Error} If user cannot be get by uid + */ + public getByUid(uid: string, query?: Prisma.UsersInclude) { + return this.userRepository.findOneByUid(uid, query); + } + + /** + * @description : Get a user by uid with office + * @throws {Error} If user cannot be get by uid + */ + public getByUidWithOffice(uid: string) { + return this.userRepository.findOneByUidWithOffice(uid); + } + + /** + * @description : Get a user by uid + * @throws {Error} If user cannot be get by uid + */ + public getByProvider(providerName: string, id: string) { + return this.userRepository.findOneByProvider(providerName, id); + } +} diff --git a/src/services/common/AuthService/AuthService.ts b/src/services/common/AuthService/AuthService.ts index 4c496cf0..278255fe 100644 --- a/src/services/common/AuthService/AuthService.ts +++ b/src/services/common/AuthService/AuthService.ts @@ -3,12 +3,21 @@ import BaseService from "@Services/BaseService"; import { BackendVariables } from "@Common/config/variables/Variables"; import { Service } from "typedi"; import UsersService from "@Services/super-admin/UsersService/UsersService"; +import CustomersService from "@Services/super-admin/CustomersService/CustomersService"; +import ContactService from "../ContactService"; +import { ECustomerStatus } from "@prisma/client"; enum PROVIDER_OPENID { idNot = "idNot", } -interface IJwtPayload { +interface ICustomerJwtPayload { + customerId: string; + email: string; +} + + +interface IUserJwtPayload { userId: string; openId: { providerName: PROVIDER_OPENID; @@ -21,11 +30,27 @@ interface IJwtPayload { @Service() export default class AuthService extends BaseService { - constructor(protected variables: BackendVariables, private userService: UsersService) { + constructor(protected variables: BackendVariables, private userService: UsersService, private customerService: CustomersService, private contactService: ContactService) { super(); } - public async getUserJwtPayload(id: string, providerName: PROVIDER_OPENID = PROVIDER_OPENID.idNot): Promise { + public async getCustomerJwtPayload(email:string): Promise { + const contact = await this.contactService.getByEmail(email); + + if (!contact) return null; + + if(contact.customers?.status === ECustomerStatus["PENDING"]) { + contact.customers.status = ECustomerStatus["VALIDATED"]; + this.customerService.update(contact.customers.uid, contact.customers); + } + + return { + customerId: contact.customers!.uid, + email: contact.email, + }; + } + + public async getUserJwtPayload(id: string, providerName: PROVIDER_OPENID = PROVIDER_OPENID.idNot): Promise { const user = await this.userService.getByProvider(providerName, id); if (!user) return null; diff --git a/src/services/common/ContactService.ts b/src/services/common/ContactService.ts new file mode 100644 index 00000000..e1cc6c19 --- /dev/null +++ b/src/services/common/ContactService.ts @@ -0,0 +1,19 @@ +import { Contacts, Customers } from "@prisma/client"; +import BaseService from "@Services/BaseService"; +import { Service } from "typedi"; +import ContactRepository from "@Repositories/ContactRepository"; + +@Service() +export default class DocumentsService extends BaseService { + constructor(private contactRepository: ContactRepository) { + super(); + } + + /** + * @description : Get a contact by email + * @throws {Error} If contact cannot be get by email + */ + public async getByEmail(email: string): Promise<(Contacts & {customers: Customers | null}) | null> { + return this.contactRepository.findOneByEmail(email); + } +} diff --git a/src/services/common/FilesService/FilesService.ts b/src/services/common/FilesService/FilesService.ts index 0f13bc9d..2ec4e6b5 100644 --- a/src/services/common/FilesService/FilesService.ts +++ b/src/services/common/FilesService/FilesService.ts @@ -45,6 +45,14 @@ export default class FilesService extends BaseService { return this.filesRepository.findOneByUidWithOffice(uid); } + /** + * @description : Get a file by uid with document + * @throws {Error} If project cannot be created + */ + public async getByUidWithDocument(uid: string) { + return this.filesRepository.findOneByUidWithDocument(uid); + } + /** * @description : view a file * @throws {Error} If file cannot be deleted diff --git a/src/services/notary/CustomersService/CustomersService.ts b/src/services/notary/CustomersService/CustomersService.ts new file mode 100644 index 00000000..72e6923d --- /dev/null +++ b/src/services/notary/CustomersService/CustomersService.ts @@ -0,0 +1,52 @@ +import { Customers, Prisma } from "@prisma/client"; +import CustomersRepository from "@Repositories/CustomersRepository"; +import BaseService from "@Services/BaseService"; +import { Customer } from "le-coffre-resources/dist/Notary"; +import { Service } from "typedi"; + +@Service() +export default class CustomersService extends BaseService { + constructor(private customerRepository: CustomersRepository) { + super(); + } + + /** + * @description : Get all Customers + * @throws {Error} If Customers cannot be get + */ + public async get(query: Prisma.CustomersFindManyArgs): Promise { + return this.customerRepository.findMany(query); + } + + /** + * @description : Create a new customer + * @throws {Error} If customer cannot be created + */ + public async create(customerEntity: Customer): Promise { + return this.customerRepository.create(customerEntity); + } + + /** + * @description : Modify a customer + * @throws {Error} If customer cannot be modified + */ + public async update(uid: string, customerEntity: Customer): Promise { + return this.customerRepository.update(uid, customerEntity); + } + + /** + * @description : Get a customer by uid + * @throws {Error} If customer cannot be get by uid + */ + public async getByUid(uid: string, query?: Prisma.CustomersInclude): Promise { + return this.customerRepository.findOneByUid(uid, query); + } + + /** + * @description : Get a customer by contact uid + * @throws {Error} If customer cannot be get by contact uid + */ + public async getByContact(contactUid: string): Promise { + return this.customerRepository.findOneByContact(contactUid); + } +} diff --git a/src/services/notary/DeedTypesService/DeedTypesService.ts b/src/services/notary/DeedTypesService/DeedTypesService.ts new file mode 100644 index 00000000..fa4a5551 --- /dev/null +++ b/src/services/notary/DeedTypesService/DeedTypesService.ts @@ -0,0 +1,52 @@ +import { DeedTypes, Prisma } from "@prisma/client"; +import DeedTypesRepository from "@Repositories/DeedTypesRepository"; +import BaseService from "@Services/BaseService"; +import { DeedType } from "le-coffre-resources/dist/Notary"; +import { Service } from "typedi"; + +@Service() +export default class DeedTypesService extends BaseService { + constructor(private deedTypeRepository: DeedTypesRepository) { + super(); + } + + /** + * @description : Get all deed-types + * @throws {Error} If deed-types cannot be get + */ + public async get(query: Prisma.DeedTypesFindManyArgs) { + return this.deedTypeRepository.findMany(query); + } + + /** + * @description : Create a new deed-type + * @throws {Error} If deed-type cannot be created + */ + public async create(deedTypeEntity: DeedType): Promise { + return this.deedTypeRepository.create(deedTypeEntity); + } + + /** + * @description : Modify a deed-type + * @throws {Error} If deed-type cannot be modifified + */ + public async update(uid: string, deedTypeEntity: DeedType): Promise { + return this.deedTypeRepository.update(uid, deedTypeEntity); + } + + /** + * @description : Get a deedtype by uid + * @throws {Error} If deed-type cannot be get by uid + */ + public async getByUid(uid: string, query?: Prisma.DeedTypesInclude): Promise { + return this.deedTypeRepository.findOneByUid(uid, query); + } + + /** + * @description : Get a deedtype by uid + * @throws {Error} If deed-type cannot be get by uid + */ + public async getByUidWithOffice(uid: string) { + return this.deedTypeRepository.findOneByUidWithOffice(uid); + } +} diff --git a/src/services/notary/DeedsService/DeedsService.ts b/src/services/notary/DeedsService/DeedsService.ts new file mode 100644 index 00000000..47f18cdd --- /dev/null +++ b/src/services/notary/DeedsService/DeedsService.ts @@ -0,0 +1,48 @@ +import { Deeds, Prisma } from "@prisma/client"; +import DeedsRepository from "@Repositories/DeedsRepository"; +import BaseService from "@Services/BaseService"; +import { Deed } from "le-coffre-resources/dist/Notary"; +import { Service } from "typedi"; + +@Service() +export default class DeedsService extends BaseService { + constructor(private deedRepository: DeedsRepository) { + super(); + } + + /** + * @description : Get all deeds + * @throws {Error} If deeds cannot be get + */ + public async get(query: Prisma.DeedsFindManyArgs) { + return this.deedRepository.findMany(query); + } + + /** + * @description : Create a new deed with document types + * @throws {Error} If deeds cannot be created + */ + public async create(deed: Deed): Promise { + return this.deedRepository.create(deed); + } + + /** + * @description : Update data of a deed with document types + * @throws {Error} If deeds cannot be updated with document types or one of them + */ + public async update(uid: string, deed: Deed): Promise { + return this.deedRepository.update(uid, deed); + } + + /** + * @description : Get a deed by uid + * @throws {Error} If deed-type cannot be get by uid + */ + public async getByUid(uid: string, query?: Prisma.DeedsInclude) { + return this.deedRepository.findOneByUid(uid, query); + } + + public async getOneByUidWithOffice(uid: string) { + return this.deedRepository.findOneByUidWithOffice(uid); + } +} diff --git a/src/services/notary/DocumentTypesService/DocumentTypesService.ts b/src/services/notary/DocumentTypesService/DocumentTypesService.ts new file mode 100644 index 00000000..fb55f818 --- /dev/null +++ b/src/services/notary/DocumentTypesService/DocumentTypesService.ts @@ -0,0 +1,52 @@ +import { DocumentTypes, Prisma } from "@prisma/client"; +import DocumentTypesRepository from "@Repositories/DocumentTypesRepository"; +import BaseService from "@Services/BaseService"; +import { DocumentType } from "le-coffre-resources/dist/Notary"; +import { Service } from "typedi"; + +@Service() +export default class DocumentTypesService extends BaseService { + constructor(private documentTypeRepository: DocumentTypesRepository) { + super(); + } + + /** + * @description : Get all document-types + * @throws {Error} If document-types cannot be get + */ + public async get(query: Prisma.DocumentTypesFindManyArgs) { + return this.documentTypeRepository.findMany(query); + } + + /** + * @description : Create a new document-type + * @throws {Error} If document-types cannot be created + */ + public async create(documentTypeEntity: DocumentType): Promise { + return this.documentTypeRepository.create(documentTypeEntity); + } + + /** + * @description : Modify a document-type + * @throws {Error} If document-type cannot be modified + */ + public async update(uid: string, documentTypeEntity: DocumentType): Promise { + return this.documentTypeRepository.update(uid, documentTypeEntity); + } + + /** + * @description : Get a document-type by uid + * @throws {Error} If document-type is not found + */ + public async getByUid(uid: string, query?: Prisma.DocumentTypesInclude) { + return this.documentTypeRepository.findOneByUid(uid, query); + } + + /** + * @description : Get a document-type by uid with relations + * @throws {Error} If document-type is not found + */ + public async getByUidWithOffice(uid: string) { + return this.documentTypeRepository.findOneByUidWithOffice(uid); + } +} diff --git a/src/services/notary/DocumentsService/DocumentsService.ts b/src/services/notary/DocumentsService/DocumentsService.ts new file mode 100644 index 00000000..649ad2bf --- /dev/null +++ b/src/services/notary/DocumentsService/DocumentsService.ts @@ -0,0 +1,75 @@ +import { Documents, Prisma } from "@prisma/client"; +import { Document } from "le-coffre-resources/dist/Notary"; +import DocumentsRepository from "@Repositories/DocumentsRepository"; +import BaseService from "@Services/BaseService"; +import { Service } from "typedi"; + +@Service() +export default class DocumentsService extends BaseService { + constructor(private documentsRepository: DocumentsRepository) { + 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, refused_reason?: string): Promise { + return this.documentsRepository.update(uid, document, 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" }); + + if (document.files && document.files.length !== 0) { + 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); + } +} diff --git a/src/services/notary/OfficeFoldersService/OfficeFoldersService.ts b/src/services/notary/OfficeFoldersService/OfficeFoldersService.ts new file mode 100644 index 00000000..97fa5680 --- /dev/null +++ b/src/services/notary/OfficeFoldersService/OfficeFoldersService.ts @@ -0,0 +1,79 @@ +import { OfficeFolders } from ".prisma/client"; +import OfficeFoldersRepository from "@Repositories/OfficeFoldersRepository"; +import BaseService from "@Services/BaseService"; +import { OfficeFolder } from "le-coffre-resources/dist/Notary"; +import { Service } from "typedi"; +import DeedTypesService from "../DeedTypesService/DeedTypesService"; +import DeedsRepository from "@Repositories/DeedsRepository"; +import { Prisma } from "@prisma/client"; + +@Service() +export default class OfficeFoldersService extends BaseService { + constructor( + private officeFoldersRepository: OfficeFoldersRepository, + private deedTypeService: DeedTypesService, + private deedRepository: DeedsRepository, + ) { + super(); + } + + /** + * @description : Get all folders + * @throws {Error} If folders cannot be get + */ + public async get(query: Prisma.OfficeFoldersFindManyArgs) { + return this.officeFoldersRepository.findMany(query); + } + + /** + * @description : Create a new folder + * @throws {Error} If folder cannot be created + */ + public async create(officeFolderEntity: OfficeFolder): Promise { + const deedType = await this.deedTypeService.getByUid(officeFolderEntity.deed!.deed_type!.uid!); + if (!deedType) throw new Error("deed type not found"); + if (deedType.archived_at) throw new Error("deed type is archived"); + const deed = await this.deedRepository.create(officeFolderEntity.deed!); + officeFolderEntity.deed!.uid = deed.uid; + return this.officeFoldersRepository.create(officeFolderEntity); + } + + /** + * @description : Modify a folder + * @throws {Error} If folder cannot be modified + */ + public async update(officeFolderuid: string, officeFolderEntity: OfficeFolder): Promise { + return this.officeFoldersRepository.update(officeFolderuid, officeFolderEntity); + } + + /** + * @description : Get a folder by uid + * @throws {Error} If folder cannot be get by uid + */ + public async getByUid(uid: string, query?: Prisma.OfficeFoldersInclude) { + return this.officeFoldersRepository.findOneByUid(uid, query); + } + + /** + * @description : Get a folder by uid + * @throws {Error} If folder cannot be get by uid + */ + public async getByUidWithOffice(uid: string) { + return this.officeFoldersRepository.findOneByUidWithOffice(uid); + } + + /** + * @description : Delete a folder + * @throws {Error} If document cannot be deleted + */ + public async delete(uid: string): Promise { + const officeFolderEntity = await this.officeFoldersRepository.findOneByUid(uid, { customers: true }); + if (!officeFolderEntity) throw new Error("office folder not found"); + const officeFolder = OfficeFolder.hydrate(officeFolderEntity, { strategy: "excludeAll" }); + + if (officeFolder.customers?.length) { + throw new Error("This folder is used by customers"); + } + return this.officeFoldersRepository.delete(uid); + } +} diff --git a/src/services/notary/OfficeRolesService/OfficeRolesService.ts b/src/services/notary/OfficeRolesService/OfficeRolesService.ts new file mode 100644 index 00000000..2c8f9f9e --- /dev/null +++ b/src/services/notary/OfficeRolesService/OfficeRolesService.ts @@ -0,0 +1,35 @@ +import BaseService from "@Services/BaseService"; +import { Service } from "typedi"; +import OfficeRolesRepository from "@Repositories/OfficeRolesRepository"; +import { Prisma } from "@prisma/client"; + +@Service() +export default class OfficeRolesService extends BaseService { + constructor(private officeRoleRepository: OfficeRolesRepository) { + super(); + } + + /** + * @description : Get all officeRoles + * @throws {Error} If officeRoles cannot be get + */ + public get(query: Prisma.OfficeRolesFindManyArgs) { + return this.officeRoleRepository.findMany(query); + } + + /** + * @description : Get a officeRole by uid + * @throws {Error} If officeRole cannot be get by uid + */ + public getByUid(uid: string, query?: Prisma.OfficeRolesInclude) { + return this.officeRoleRepository.findOneByUid(uid, query); + } + + /** + * @description : Get a officeRole by uid + * @throws {Error} If officeRole cannot be get by uid + */ + public getByUidWithOffice(uid: string) { + return this.officeRoleRepository.findOneByUidWithOffice(uid); + } +} diff --git a/src/services/notary/OfficesService/OfficesService.ts b/src/services/notary/OfficesService/OfficesService.ts new file mode 100644 index 00000000..af25083b --- /dev/null +++ b/src/services/notary/OfficesService/OfficesService.ts @@ -0,0 +1,27 @@ +import { Prisma } from "@prisma/client"; +import OfficesRepository from "@Repositories/OfficesRepository"; +import BaseService from "@Services/BaseService"; +import { Service } from "typedi"; + +@Service() +export default class OfficesService extends BaseService { + constructor(private officeRepository: OfficesRepository) { + super(); + } + + /** + * @description : Get all offices + * @throws {Error} If offices cannot be get + */ + public async get(query: Prisma.OfficesFindManyArgs) { + return this.officeRepository.findMany(query); + } + + /** + * @description : Get a office by uid + * @throws {Error} If office cannot be get + */ + public async getByUid(uid: string, query?: Prisma.OfficesInclude) { + return this.officeRepository.findOneByUid(uid, query); + } +} diff --git a/src/services/notary/RolesService/RolesService.ts b/src/services/notary/RolesService/RolesService.ts new file mode 100644 index 00000000..f59c26b1 --- /dev/null +++ b/src/services/notary/RolesService/RolesService.ts @@ -0,0 +1,28 @@ +import BaseService from "@Services/BaseService"; +import "reflect-metadata"; +import { Service } from "typedi"; +import RolesRepository from "@Repositories/RolesRepository"; +import { Prisma } from "@prisma/client"; + +@Service() +export default class RolesService extends BaseService { + constructor(private roleRepository: RolesRepository) { + super(); + } + + /** + * @description : Get all roles + * @throws {Error} If roles cannot be get + */ + public get(query: Prisma.RolesFindManyArgs) { + return this.roleRepository.findMany(query); + } + + /** + * @description : Get a role by uid + * @throws {Error} If role cannot be get by uid + */ + public getByUid(uid: string, query?: Prisma.RolesInclude) { + return this.roleRepository.findOneByUid(uid, query); + } +} diff --git a/src/services/notary/RulesService/RulesService.ts b/src/services/notary/RulesService/RulesService.ts new file mode 100644 index 00000000..e52ad9bf --- /dev/null +++ b/src/services/notary/RulesService/RulesService.ts @@ -0,0 +1,28 @@ +import BaseService from "@Services/BaseService"; +import "reflect-metadata"; +import { Service } from "typedi"; +import RulesRepository from "@Repositories/RulesRepository"; +import { Prisma } from "@prisma/client"; + +@Service() +export default class RulesService extends BaseService { + constructor(private ruleRepository: RulesRepository) { + super(); + } + + /** + * @description : Get all rules + * @throws {Error} If rules cannot be get + */ + public get(query: Prisma.RulesFindManyArgs) { + return this.ruleRepository.findMany(query); + } + + /** + * @description : Get a rule by uid + * @throws {Error} If rule cannot be get by uid + */ + public getByUid(uid: string, query?: Prisma.RulesInclude) { + return this.ruleRepository.findOneByUid(uid, query); + } +} diff --git a/src/services/notary/UsersService/UsersService.ts b/src/services/notary/UsersService/UsersService.ts new file mode 100644 index 00000000..f6927c87 --- /dev/null +++ b/src/services/notary/UsersService/UsersService.ts @@ -0,0 +1,61 @@ +import BaseService from "@Services/BaseService"; +import "reflect-metadata"; +import { Service } from "typedi"; +import UsersRepository from "@Repositories/UsersRepository"; +import User from "le-coffre-resources/dist/Notary"; +import { Prisma, Users } from "@prisma/client"; + +@Service() +export default class UsersService extends BaseService { + constructor(private userRepository: UsersRepository) { + super(); + } + + /** + * @description : Get all users + * @throws {Error} If users cannot be get + */ + public get(query: Prisma.UsersFindManyArgs) { + return this.userRepository.findMany(query); + } + + /** + * @description : Create a user + * @throws {Error} If user couldn't be created + */ + public create(userEntity: User): Promise { + return this.userRepository.create(userEntity); + } + + /** + * @description : Modify a user + * @throws {Error} If user modification failed + */ + public update(uid: string, userEntity: User): Promise { + return this.userRepository.update(uid, userEntity); + } + + /** + * @description : Get a user by uid + * @throws {Error} If user cannot be get by uid + */ + public getByUid(uid: string, query?: Prisma.UsersInclude) { + return this.userRepository.findOneByUid(uid, query); + } + + /** + * @description : Get a user by uid with office + * @throws {Error} If user cannot be get by uid + */ + public getByUidWithOffice(uid: string) { + return this.userRepository.findOneByUidWithOffice(uid); + } + + /** + * @description : Get a user by uid + * @throws {Error} If user cannot be get by uid + */ + public getByProvider(providerName: string, id: string) { + return this.userRepository.findOneByProvider(providerName, id); + } +} diff --git a/src/services/super-admin/CustomersService/CustomersService.ts b/src/services/super-admin/CustomersService/CustomersService.ts index 95c702ef..5501e1cb 100644 --- a/src/services/super-admin/CustomersService/CustomersService.ts +++ b/src/services/super-admin/CustomersService/CustomersService.ts @@ -38,7 +38,15 @@ export default class CustomersService extends BaseService { * @description : Get a customer by uid * @throws {Error} If customer cannot be get by uid */ - public async getByUid(uid: string, query?: any): Promise { + public async getByUid(uid: string, query?: Prisma.CustomersInclude): Promise { return this.customerRepository.findOneByUid(uid, query); } + + /** + * @description : Get a customer by contact uid + * @throws {Error} If customer cannot be get by contact uid + */ + public async getByContact(contactUid: string): Promise { + return this.customerRepository.findOneByContact(contactUid); + } } diff --git a/src/services/super-admin/DocumentsService/DocumentsService.ts b/src/services/super-admin/DocumentsService/DocumentsService.ts index c86fcb0f..e488b1be 100644 --- a/src/services/super-admin/DocumentsService/DocumentsService.ts +++ b/src/services/super-admin/DocumentsService/DocumentsService.ts @@ -61,7 +61,7 @@ export default class DocumentsService extends BaseService { * @description : Get a document by uid * @throws {Error} If document cannot be get by uid */ - public async getByUid(uid: string, query?: Prisma.DocumentsInclude) { + public async getByUid(uid: string, query?: Prisma.DocumentsInclude): Promise { return this.documentsRepository.findOneByUid(uid, query); } From 7d80f3e13688a5a5cac56cc7f35dd76fd9888073 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Thu, 6 Jul 2023 14:18:41 +0200 Subject: [PATCH 031/134] order services and controllers per namespace --- src/app/api/admin/CustomersController.ts | 17 ++++++++--------- src/app/api/admin/DeedTypesController.ts | 16 ++++++++-------- src/app/api/admin/DeedsController.ts | 16 ++++++++-------- src/app/api/admin/DocumentTypesController.ts | 16 ++++++++-------- src/app/api/admin/DocumentsController.ts | 16 ++++++++-------- src/app/api/admin/FilesController.ts | 12 ++++++++++-- src/app/api/admin/OfficeFoldersController.ts | 16 ++++++++-------- src/app/api/admin/OfficeRolesController.ts | 17 +++++++++-------- src/app/api/admin/OfficesController.ts | 15 ++++++++------- src/app/api/admin/RolesController.ts | 16 ++++++++-------- src/app/api/admin/RulesController.ts | 16 ++++++++-------- src/app/api/admin/UsersController.ts | 17 +++++++++-------- src/app/api/customer/DocumentsController.ts | 16 ++++++++-------- src/app/api/customer/FilesController.ts | 12 ++++++++++-- src/app/api/notary/CustomersController.ts | 16 ++++++++-------- src/app/api/notary/DeedTypesController.ts | 16 ++++++++-------- src/app/api/notary/DeedsController.ts | 16 +++++++--------- src/app/api/notary/DocumentTypesController.ts | 16 ++++++++-------- src/app/api/notary/DocumentsController.ts | 16 ++++++++-------- src/app/api/notary/FilesController.ts | 12 ++++++++++-- src/app/api/notary/OfficeFoldersController.ts | 16 ++++++++-------- src/app/api/notary/OfficeRolesController.ts | 17 +++++++++-------- src/app/api/notary/OfficesController.ts | 17 +++++++++-------- src/app/api/notary/RolesController.ts | 16 ++++++++-------- src/app/api/notary/RulesController.ts | 16 ++++++++-------- src/app/api/notary/UsersController.ts | 17 +++++++++-------- .../api/super-admin/CustomersController.ts | 17 ++++++++--------- .../api/super-admin/DeedTypesController.ts | 17 +++++++++-------- src/app/api/super-admin/DeedsController.ts | 16 ++++++++-------- .../super-admin/DocumentTypesController.ts | 16 ++++++++-------- .../api/super-admin/DocumentsController.ts | 16 ++++++++-------- src/app/api/super-admin/FilesController.ts | 12 ++++++++++-- .../super-admin/OfficeFoldersController.ts | 17 ++++++++++++++--- .../api/super-admin/OfficeRolesController.ts | 19 ++++++++++--------- src/app/api/super-admin/OfficesController.ts | 17 +++++++++-------- src/app/api/super-admin/RolesController.ts | 18 +++++++++--------- src/app/api/super-admin/RulesController.ts | 17 ++++++++--------- src/app/api/super-admin/UsersController.ts | 16 +++++++--------- src/common/repositories/DeedsRepository.ts | 2 +- src/common/repositories/UsersRepository.ts | 2 +- 40 files changed, 328 insertions(+), 283 deletions(-) diff --git a/src/app/api/admin/CustomersController.ts b/src/app/api/admin/CustomersController.ts index 01097a90..455a98a2 100644 --- a/src/app/api/admin/CustomersController.ts +++ b/src/app/api/admin/CustomersController.ts @@ -4,7 +4,6 @@ import ApiController from "@Common/system/controller-pattern/ApiController"; import CustomersService from "@Services/admin/CustomersService/CustomersService"; import { Service } from "typedi"; import { Customer } from "le-coffre-resources/dist/Admin"; -import { Customers } from "@prisma/client"; import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; @@ -23,7 +22,10 @@ export default class CustomersController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } //call service to get prisma entity const customersEntities = await this.customersService.get(query); @@ -117,17 +119,14 @@ export default class CustomersController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - - let customerEntity: Customers | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - customerEntity = await this.customersService.getByUid(uid, query); - } else { - //call service to get prisma entity - customerEntity = await this.customersService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const customerEntity = await this.customersService.getByUid(uid, query); + if (!customerEntity) { this.httpNotFoundRequest(response, "customer not found"); return; diff --git a/src/app/api/admin/DeedTypesController.ts b/src/app/api/admin/DeedTypesController.ts index 247dca8f..efa9d463 100644 --- a/src/app/api/admin/DeedTypesController.ts +++ b/src/app/api/admin/DeedTypesController.ts @@ -25,7 +25,10 @@ export default class DeedTypesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.DeedTypesFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.DeedTypesWhereInput = { office: { uid: officeId } }; query.where = officeWhereInput; @@ -127,17 +130,14 @@ export default class DeedTypesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - - let deedTypeEntity: DeedTypes | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - deedTypeEntity = await this.deedTypesService.getByUid(uid, query); - } else { - //call service to get prisma entity - deedTypeEntity = await this.deedTypesService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const deedTypeEntity = await this.deedTypesService.getByUid(uid, query); + if (!deedTypeEntity) { this.httpNotFoundRequest(response, "deed type not found"); return; diff --git a/src/app/api/admin/DeedsController.ts b/src/app/api/admin/DeedsController.ts index c811f309..10da15b8 100644 --- a/src/app/api/admin/DeedsController.ts +++ b/src/app/api/admin/DeedsController.ts @@ -25,7 +25,10 @@ export default class DeedsController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.DeedsFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.DeedsWhereInput = { deed_type: { office: { uid: officeId } } }; query.where = officeWhereInput; @@ -56,17 +59,14 @@ export default class DeedsController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - - let deedEntity: Deeds | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - deedEntity = await this.deedsService.getByUid(uid, query); - } else { - //call service to get prisma entity - deedEntity = await this.deedsService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const deedEntity = await this.deedsService.getByUid(uid, query); + if (!deedEntity) { this.httpNotFoundRequest(response, "deed not found"); return; diff --git a/src/app/api/admin/DocumentTypesController.ts b/src/app/api/admin/DocumentTypesController.ts index 1bb2e009..9d170efe 100644 --- a/src/app/api/admin/DocumentTypesController.ts +++ b/src/app/api/admin/DocumentTypesController.ts @@ -25,7 +25,10 @@ export default class DocumentTypesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.DocumentTypesFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.DocumentTypesWhereInput = { office: { uid: officeId } }; query.where = officeWhereInput; @@ -121,17 +124,14 @@ export default class DocumentTypesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - - let documentTypeEntity: DocumentTypes | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - documentTypeEntity = await this.documentTypesService.getByUid(uid, query); - } else { - //call service to get prisma entity - documentTypeEntity = await this.documentTypesService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const documentTypeEntity = await this.documentTypesService.getByUid(uid, query); + //Hydrate ressource with prisma entity const user = ObjectHydrate.hydrate(new DocumentType(), documentTypeEntity!, { strategy: "excludeAll" }); diff --git a/src/app/api/admin/DocumentsController.ts b/src/app/api/admin/DocumentsController.ts index 854d6ba5..61c45686 100644 --- a/src/app/api/admin/DocumentsController.ts +++ b/src/app/api/admin/DocumentsController.ts @@ -25,7 +25,10 @@ export default class DocumentsController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.DocumentsFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.DocumentsWhereInput = { document_type: { office: { uid: officeId } } }; query.where = officeWhereInput; @@ -156,17 +159,14 @@ export default class DocumentsController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - - let documentEntity: Documents | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - documentEntity = await this.documentsService.getByUid(uid, query); - } else { - //call service to get prisma entity - documentEntity = await this.documentsService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const documentEntity = await this.documentsService.getByUid(uid, query); + if (!documentEntity) { this.httpNotFoundRequest(response, "document not found"); return; diff --git a/src/app/api/admin/FilesController.ts b/src/app/api/admin/FilesController.ts index b6fe9050..c7dab853 100644 --- a/src/app/api/admin/FilesController.ts +++ b/src/app/api/admin/FilesController.ts @@ -24,7 +24,10 @@ export default class FilesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.FilesFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.FilesWhereInput = { document: { folder: { office: { uid: officeId } } } }; query.where = officeWhereInput; @@ -119,8 +122,13 @@ export default class FilesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } + //get query + let query = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } - const fileEntity = await this.filesService.getByUid(uid); + const fileEntity = await this.filesService.getByUid(uid, query); if (!fileEntity) { this.httpNotFoundRequest(response, "file not found"); diff --git a/src/app/api/admin/OfficeFoldersController.ts b/src/app/api/admin/OfficeFoldersController.ts index 95c79f2e..61130e69 100644 --- a/src/app/api/admin/OfficeFoldersController.ts +++ b/src/app/api/admin/OfficeFoldersController.ts @@ -24,7 +24,10 @@ export default class OfficeFoldersController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.OfficeFoldersFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.OfficeFoldersWhereInput = { office: { uid: officeId } }; query.where = officeWhereInput; @@ -120,16 +123,13 @@ export default class OfficeFoldersController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - - let officeFolderEntity: OfficeFolders | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - officeFolderEntity = await this.officeFoldersService.getByUid(uid, query); - } else { - //call service to get prisma entity - officeFolderEntity = await this.officeFoldersService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + + const officeFolderEntity = await this.officeFoldersService.getByUid(uid, query); if (!officeFolderEntity) { this.httpNotFoundRequest(response, "folder not found"); diff --git a/src/app/api/admin/OfficeRolesController.ts b/src/app/api/admin/OfficeRolesController.ts index afe5e15d..a8811e26 100644 --- a/src/app/api/admin/OfficeRolesController.ts +++ b/src/app/api/admin/OfficeRolesController.ts @@ -5,7 +5,7 @@ import OfficeRolesService from "@Services/admin/OfficeRolesService/OfficeRolesSe import { Service } from "typedi"; import { validateOrReject } from "class-validator"; import { OfficeRole } from "le-coffre-resources/dist/Admin"; -import { OfficeRoles, Prisma } from "@prisma/client"; +import { Prisma } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import officeRoleHandler from "@App/middlewares/OfficeMembershipHandlers/OfficeRoleHandler"; @@ -24,7 +24,10 @@ export default class OfficeRolesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.OfficeRolesFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.OfficeRolesWhereInput = { office: { uid: officeId } }; query.where = officeWhereInput; @@ -123,15 +126,13 @@ export default class OfficeRolesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - let officeRoleEntity: OfficeRoles | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - officeRoleEntity = await this.officeRolesService.getByUid(uid, query); - } else { - //call service to get prisma entity - officeRoleEntity = await this.officeRolesService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + + const officeRoleEntity = await this.officeRolesService.getByUid(uid, query); if (!officeRoleEntity) { this.httpNotFoundRequest(response, "officeRole not found"); diff --git a/src/app/api/admin/OfficesController.ts b/src/app/api/admin/OfficesController.ts index 76c98668..7b7d6df7 100644 --- a/src/app/api/admin/OfficesController.ts +++ b/src/app/api/admin/OfficesController.ts @@ -21,7 +21,10 @@ export default class OfficesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } //call service to get prisma entity const officesEntities: Offices[] = await this.officesService.get(query); //Hydrate ressource with prisma entity @@ -45,15 +48,13 @@ export default class OfficesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - let officeEntity: Offices | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - officeEntity = await this.officesService.getByUid(uid, query); - } else { - //call service to get prisma entity - officeEntity = await this.officesService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + + const officeEntity = await this.officesService.getByUid(uid, query); if (!officeEntity) { this.httpNotFoundRequest(response, "office not found"); diff --git a/src/app/api/admin/RolesController.ts b/src/app/api/admin/RolesController.ts index b587ce3d..e40eb0f5 100644 --- a/src/app/api/admin/RolesController.ts +++ b/src/app/api/admin/RolesController.ts @@ -4,7 +4,6 @@ import ApiController from "@Common/system/controller-pattern/ApiController"; import RolesService from "@Services/admin/RolesService/RolesService"; import { Service } from "typedi"; import { Role } from "le-coffre-resources/dist/Admin"; -import { Roles } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; @@ -22,7 +21,10 @@ export default class RolesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } //call service to get prisma entity const rolesEntities = await this.rolesService.get(query); @@ -49,16 +51,14 @@ export default class RolesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - let roleEntity: Roles | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - roleEntity = await this.rolesService.getByUid(uid, query); - } else { - //call service to get prisma entity - roleEntity = await this.rolesService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const roleEntity = await this.rolesService.getByUid(uid, query); + if (!roleEntity) { this.httpNotFoundRequest(response, "role not found"); return; diff --git a/src/app/api/admin/RulesController.ts b/src/app/api/admin/RulesController.ts index 49641e09..51bc900e 100644 --- a/src/app/api/admin/RulesController.ts +++ b/src/app/api/admin/RulesController.ts @@ -4,7 +4,6 @@ import ApiController from "@Common/system/controller-pattern/ApiController"; import RulesService from "@Services/admin/RulesService/RulesService"; import { Service } from "typedi"; import { Rule } from "le-coffre-resources/dist/Admin"; -import { Rules } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; @@ -22,7 +21,10 @@ export default class RulesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } //call service to get prisma entity const rulesEntities = await this.rulesService.get(query); @@ -49,16 +51,14 @@ export default class RulesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - let ruleEntity: Rules | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - ruleEntity = await this.rulesService.getByUid(uid, query); - } else { - //call service to get prisma entity - ruleEntity = await this.rulesService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const ruleEntity = await this.rulesService.getByUid(uid, query); + if (!ruleEntity) { this.httpNotFoundRequest(response, "rule not found"); return; diff --git a/src/app/api/admin/UsersController.ts b/src/app/api/admin/UsersController.ts index 941dc67f..282820d8 100644 --- a/src/app/api/admin/UsersController.ts +++ b/src/app/api/admin/UsersController.ts @@ -4,7 +4,7 @@ import ApiController from "@Common/system/controller-pattern/ApiController"; import UsersService from "@Services/admin/UsersService/UsersService"; import { Service } from "typedi"; import User from "le-coffre-resources/dist/Admin"; -import { Prisma, Users } from "@prisma/client"; +import { Prisma } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import userHandler from "@App/middlewares/OfficeMembershipHandlers/UserHandler"; @@ -23,7 +23,10 @@ export default class UsersController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.UsersFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.UsersWhereInput = { office_membership: { uid: officeId } }; query.where = officeWhereInput; @@ -53,16 +56,14 @@ export default class UsersController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - let userEntity: Users | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - userEntity = await this.usersService.getByUid(uid, query); - } else { - //call service to get prisma entity - userEntity = await this.usersService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const userEntity = await this.usersService.getByUid(uid, query); + if (!userEntity) { this.httpNotFoundRequest(response, "user not found"); return; diff --git a/src/app/api/customer/DocumentsController.ts b/src/app/api/customer/DocumentsController.ts index eca88301..018918be 100644 --- a/src/app/api/customer/DocumentsController.ts +++ b/src/app/api/customer/DocumentsController.ts @@ -23,7 +23,10 @@ export default class DocumentsController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.CustomersFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const customerId: string = req.body.user.customerId; const customerWhereInput: Prisma.DocumentsWhereInput ={ depositor: { uid: customerId } }; query.where = customerWhereInput; @@ -53,17 +56,14 @@ export default class DocumentsController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - - let documentEntity: Documents | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - documentEntity = await this.documentsService.getByUid(uid, query); - } else { - //call service to get prisma entity - documentEntity = await this.documentsService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const documentEntity = await this.documentsService.getByUid(uid, query); + if (!documentEntity) { this.httpNotFoundRequest(response, "document not found"); return; diff --git a/src/app/api/customer/FilesController.ts b/src/app/api/customer/FilesController.ts index ca3ee229..9993e8c7 100644 --- a/src/app/api/customer/FilesController.ts +++ b/src/app/api/customer/FilesController.ts @@ -26,7 +26,10 @@ export default class FilesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.FilesFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const customerId: string = req.body.user.customerId; const customerWhereInput: Prisma.FilesWhereInput = { document: { depositor: { uid: customerId } } }; query.where = customerWhereInput; @@ -198,8 +201,13 @@ export default class FilesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } + //get query + let query = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } - const fileEntity = await this.filesService.getByUid(uid); + const fileEntity = await this.filesService.getByUid(uid, query); if (!fileEntity) { this.httpNotFoundRequest(response, "file not found"); diff --git a/src/app/api/notary/CustomersController.ts b/src/app/api/notary/CustomersController.ts index f1372d8b..fcc50a29 100644 --- a/src/app/api/notary/CustomersController.ts +++ b/src/app/api/notary/CustomersController.ts @@ -4,7 +4,6 @@ import ApiController from "@Common/system/controller-pattern/ApiController"; import CustomersService from "@Services/notary/CustomersService/CustomersService"; import { Service } from "typedi"; import { Customer } from "le-coffre-resources/dist/Notary"; -import { Customers } from "@prisma/client"; import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; @@ -23,7 +22,10 @@ export default class CustomersController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } //call service to get prisma entity const customersEntities = await this.customersService.get(query); @@ -118,16 +120,14 @@ export default class CustomersController extends ApiController { return; } - let customerEntity: Customers | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - customerEntity = await this.customersService.getByUid(uid, query); - } else { - //call service to get prisma entity - customerEntity = await this.customersService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const customerEntity = await this.customersService.getByUid(uid, query); + if (!customerEntity) { this.httpNotFoundRequest(response, "customer not found"); return; diff --git a/src/app/api/notary/DeedTypesController.ts b/src/app/api/notary/DeedTypesController.ts index 0ea44863..549fb6c8 100644 --- a/src/app/api/notary/DeedTypesController.ts +++ b/src/app/api/notary/DeedTypesController.ts @@ -25,7 +25,10 @@ export default class DeedTypesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.DeedTypesFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.DeedTypesWhereInput = { office: { uid: officeId } }; query.where = officeWhereInput; @@ -127,17 +130,14 @@ export default class DeedTypesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - - let deedTypeEntity: DeedTypes | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - deedTypeEntity = await this.deedTypesService.getByUid(uid, query); - } else { - //call service to get prisma entity - deedTypeEntity = await this.deedTypesService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const deedTypeEntity = await this.deedTypesService.getByUid(uid, query); + if (!deedTypeEntity) { this.httpNotFoundRequest(response, "deed type not found"); return; diff --git a/src/app/api/notary/DeedsController.ts b/src/app/api/notary/DeedsController.ts index 8ac0d98b..45e08915 100644 --- a/src/app/api/notary/DeedsController.ts +++ b/src/app/api/notary/DeedsController.ts @@ -25,7 +25,10 @@ export default class DeedsController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.DeedsFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.DeedsWhereInput = { deed_type: { office: { uid: officeId } } }; query.where = officeWhereInput; @@ -56,16 +59,11 @@ export default class DeedsController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - - let deedEntity: Deeds | null; - //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - deedEntity = await this.deedsService.getByUid(uid, query); - } else { - //call service to get prisma entity - deedEntity = await this.deedsService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const deedEntity = await this.deedsService.getByUid(uid, query); if (!deedEntity) { this.httpNotFoundRequest(response, "deed not found"); diff --git a/src/app/api/notary/DocumentTypesController.ts b/src/app/api/notary/DocumentTypesController.ts index 4cc25b5a..6bdbe117 100644 --- a/src/app/api/notary/DocumentTypesController.ts +++ b/src/app/api/notary/DocumentTypesController.ts @@ -25,7 +25,10 @@ export default class DocumentTypesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.DocumentTypesFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.DocumentTypesWhereInput = { office: { uid: officeId } }; query.where = officeWhereInput; @@ -121,17 +124,14 @@ export default class DocumentTypesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - - let documentTypeEntity: DocumentTypes | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - documentTypeEntity = await this.documentTypesService.getByUid(uid, query); - } else { - //call service to get prisma entity - documentTypeEntity = await this.documentTypesService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const documentTypeEntity = await this.documentTypesService.getByUid(uid, query); + //Hydrate ressource with prisma entity const user = ObjectHydrate.hydrate(new DocumentType(), documentTypeEntity!, { strategy: "excludeAll" }); diff --git a/src/app/api/notary/DocumentsController.ts b/src/app/api/notary/DocumentsController.ts index b6b35314..41e53c10 100644 --- a/src/app/api/notary/DocumentsController.ts +++ b/src/app/api/notary/DocumentsController.ts @@ -25,7 +25,10 @@ export default class DocumentsController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.DocumentsFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.DocumentsWhereInput = { document_type: { office: { uid: officeId } } }; query.where = officeWhereInput; @@ -156,17 +159,14 @@ export default class DocumentsController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - - let documentEntity: Documents | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - documentEntity = await this.documentsService.getByUid(uid, query); - } else { - //call service to get prisma entity - documentEntity = await this.documentsService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const documentEntity = await this.documentsService.getByUid(uid, query); + if (!documentEntity) { this.httpNotFoundRequest(response, "document not found"); return; diff --git a/src/app/api/notary/FilesController.ts b/src/app/api/notary/FilesController.ts index 5e32a319..fcd15ccd 100644 --- a/src/app/api/notary/FilesController.ts +++ b/src/app/api/notary/FilesController.ts @@ -24,7 +24,10 @@ export default class FilesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.FilesFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.FilesWhereInput = { document: { folder: { office: { uid: officeId } } } }; query.where = officeWhereInput; @@ -119,8 +122,13 @@ export default class FilesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } + //get query + let query = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } - const fileEntity = await this.filesService.getByUid(uid); + const fileEntity = await this.filesService.getByUid(uid, query); if (!fileEntity) { this.httpNotFoundRequest(response, "file not found"); diff --git a/src/app/api/notary/OfficeFoldersController.ts b/src/app/api/notary/OfficeFoldersController.ts index 2468dcb8..255540d7 100644 --- a/src/app/api/notary/OfficeFoldersController.ts +++ b/src/app/api/notary/OfficeFoldersController.ts @@ -24,7 +24,10 @@ export default class OfficeFoldersController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.OfficeFoldersFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.OfficeFoldersWhereInput = { office: { uid: officeId } }; query.where = officeWhereInput; @@ -120,17 +123,14 @@ export default class OfficeFoldersController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - - let officeFolderEntity: OfficeFolders | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - officeFolderEntity = await this.officeFoldersService.getByUid(uid, query); - } else { - //call service to get prisma entity - officeFolderEntity = await this.officeFoldersService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const officeFolderEntity = await this.officeFoldersService.getByUid(uid, query); + if (!officeFolderEntity) { this.httpNotFoundRequest(response, "folder not found"); return; diff --git a/src/app/api/notary/OfficeRolesController.ts b/src/app/api/notary/OfficeRolesController.ts index c351741b..99c02cec 100644 --- a/src/app/api/notary/OfficeRolesController.ts +++ b/src/app/api/notary/OfficeRolesController.ts @@ -4,7 +4,7 @@ import ApiController from "@Common/system/controller-pattern/ApiController"; import OfficeRolesService from "@Services/notary/OfficeRolesService/OfficeRolesService"; import { Service } from "typedi"; import { OfficeRole } from "le-coffre-resources/dist/Notary"; -import { OfficeRoles, Prisma } from "@prisma/client"; +import { Prisma } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import officeRoleHandler from "@App/middlewares/OfficeMembershipHandlers/OfficeRoleHandler"; @@ -23,7 +23,10 @@ export default class OfficeRolesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.OfficeRolesFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.OfficeRolesWhereInput = { office: { uid: officeId } }; query.where = officeWhereInput; @@ -53,16 +56,14 @@ export default class OfficeRolesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - let officeRoleEntity: OfficeRoles | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - officeRoleEntity = await this.officeRolesService.getByUid(uid, query); - } else { - //call service to get prisma entity - officeRoleEntity = await this.officeRolesService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const officeRoleEntity = await this.officeRolesService.getByUid(uid, query); + if (!officeRoleEntity) { this.httpNotFoundRequest(response, "officeRole not found"); return; diff --git a/src/app/api/notary/OfficesController.ts b/src/app/api/notary/OfficesController.ts index eef0066a..84f31110 100644 --- a/src/app/api/notary/OfficesController.ts +++ b/src/app/api/notary/OfficesController.ts @@ -21,7 +21,10 @@ export default class OfficesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } //call service to get prisma entity const officesEntities: Offices[] = await this.officesService.get(query); //Hydrate ressource with prisma entity @@ -33,7 +36,7 @@ export default class OfficesController extends ApiController { return; } } - + /** * @description Get a specific office by uid */ @@ -45,16 +48,14 @@ export default class OfficesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - let officeEntity: Offices | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - officeEntity = await this.officesService.getByUid(uid, query); - } else { - //call service to get prisma entity - officeEntity = await this.officesService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const officeEntity = await this.officesService.getByUid(uid, query); + if (!officeEntity) { this.httpNotFoundRequest(response, "office not found"); return; diff --git a/src/app/api/notary/RolesController.ts b/src/app/api/notary/RolesController.ts index 15d3711c..dc74ced8 100644 --- a/src/app/api/notary/RolesController.ts +++ b/src/app/api/notary/RolesController.ts @@ -4,7 +4,6 @@ import ApiController from "@Common/system/controller-pattern/ApiController"; import RolesService from "@Services/notary/RolesService/RolesService"; import { Service } from "typedi"; import { Role } from "le-coffre-resources/dist/Notary"; -import { Roles } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; @@ -22,7 +21,10 @@ export default class RolesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } //call service to get prisma entity const rolesEntities = await this.rolesService.get(query); @@ -49,16 +51,14 @@ export default class RolesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - let roleEntity: Roles | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - roleEntity = await this.rolesService.getByUid(uid, query); - } else { - //call service to get prisma entity - roleEntity = await this.rolesService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const roleEntity = await this.rolesService.getByUid(uid, query); + if (!roleEntity) { this.httpNotFoundRequest(response, "role not found"); return; diff --git a/src/app/api/notary/RulesController.ts b/src/app/api/notary/RulesController.ts index 773ba05a..fd822e3b 100644 --- a/src/app/api/notary/RulesController.ts +++ b/src/app/api/notary/RulesController.ts @@ -4,7 +4,6 @@ import ApiController from "@Common/system/controller-pattern/ApiController"; import RulesService from "@Services/notary/RulesService/RulesService"; import { Service } from "typedi"; import { Rule } from "le-coffre-resources/dist/Notary"; -import { Rules } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; @@ -22,7 +21,10 @@ export default class RulesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } //call service to get prisma entity const rulesEntities = await this.rulesService.get(query); @@ -49,16 +51,14 @@ export default class RulesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - let ruleEntity: Rules | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - ruleEntity = await this.rulesService.getByUid(uid, query); - } else { - //call service to get prisma entity - ruleEntity = await this.rulesService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const ruleEntity = await this.rulesService.getByUid(uid, query); + if (!ruleEntity) { this.httpNotFoundRequest(response, "rule not found"); return; diff --git a/src/app/api/notary/UsersController.ts b/src/app/api/notary/UsersController.ts index c2836a60..a3d74952 100644 --- a/src/app/api/notary/UsersController.ts +++ b/src/app/api/notary/UsersController.ts @@ -4,7 +4,7 @@ import ApiController from "@Common/system/controller-pattern/ApiController"; import UsersService from "@Services/notary/UsersService/UsersService"; import { Service } from "typedi"; import User from "le-coffre-resources/dist/Notary"; -import { Prisma, Users } from "@prisma/client"; +import { Prisma } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import userHandler from "@App/middlewares/OfficeMembershipHandlers/UserHandler"; @@ -23,7 +23,10 @@ export default class UsersController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.UsersFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.UsersWhereInput = { office_membership: { uid: officeId } }; query.where = officeWhereInput; @@ -53,16 +56,14 @@ export default class UsersController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - let userEntity: Users | null; //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - userEntity = await this.usersService.getByUid(uid, query); - } else { - //call service to get prisma entity - userEntity = await this.usersService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const userEntity = await this.usersService.getByUid(uid, query); + if (!userEntity) { this.httpNotFoundRequest(response, "user not found"); return; diff --git a/src/app/api/super-admin/CustomersController.ts b/src/app/api/super-admin/CustomersController.ts index ca108b25..271988ea 100644 --- a/src/app/api/super-admin/CustomersController.ts +++ b/src/app/api/super-admin/CustomersController.ts @@ -4,7 +4,6 @@ import ApiController from "@Common/system/controller-pattern/ApiController"; import CustomersService from "@Services/super-admin/CustomersService/CustomersService"; import { Service } from "typedi"; import { Customer } from "le-coffre-resources/dist/SuperAdmin"; -import { Customers } from "@prisma/client"; import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; @@ -23,7 +22,10 @@ export default class CustomersController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } //call service to get prisma entity const customersEntities = await this.customersService.get(query); @@ -118,15 +120,12 @@ export default class CustomersController extends ApiController { return; } - let customerEntity: Customers | null; - //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - customerEntity = await this.customersService.getByUid(uid, query); - } else { - //call service to get prisma entity - customerEntity = await this.customersService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + + const customerEntity = await this.customersService.getByUid(uid, query); if (!customerEntity) { this.httpNotFoundRequest(response, "customer not found"); diff --git a/src/app/api/super-admin/DeedTypesController.ts b/src/app/api/super-admin/DeedTypesController.ts index 40de058e..7eee309f 100644 --- a/src/app/api/super-admin/DeedTypesController.ts +++ b/src/app/api/super-admin/DeedTypesController.ts @@ -25,7 +25,10 @@ export default class DeedTypesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.DeedTypesFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.DeedTypesWhereInput = { office: { uid: officeId } }; query.where = officeWhereInput; @@ -128,16 +131,14 @@ export default class DeedTypesController extends ApiController { return; } - let deedTypeEntity: DeedTypes | null; - //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - deedTypeEntity = await this.deedTypesService.getByUid(uid, query); - } else { - //call service to get prisma entity - deedTypeEntity = await this.deedTypesService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const deedTypeEntity = await this.deedTypesService.getByUid(uid, query); + + if (!deedTypeEntity) { this.httpNotFoundRequest(response, "deed type not found"); return; diff --git a/src/app/api/super-admin/DeedsController.ts b/src/app/api/super-admin/DeedsController.ts index a2d8eb2e..d563acea 100644 --- a/src/app/api/super-admin/DeedsController.ts +++ b/src/app/api/super-admin/DeedsController.ts @@ -25,7 +25,10 @@ export default class DeedsController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.DeedsFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.DeedsWhereInput = { deed_type: { office: { uid: officeId } } }; query.where = officeWhereInput; @@ -57,16 +60,13 @@ export default class DeedsController extends ApiController { return; } - let deedEntity: Deeds | null; - //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - deedEntity = await this.deedsService.getByUid(uid, query); - } else { - //call service to get prisma entity - deedEntity = await this.deedsService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const deedEntity = await this.deedsService.getByUid(uid, query); + if (!deedEntity) { this.httpNotFoundRequest(response, "deed not found"); return; diff --git a/src/app/api/super-admin/DocumentTypesController.ts b/src/app/api/super-admin/DocumentTypesController.ts index 5690a57a..353d6041 100644 --- a/src/app/api/super-admin/DocumentTypesController.ts +++ b/src/app/api/super-admin/DocumentTypesController.ts @@ -25,7 +25,10 @@ export default class DocumentTypesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.DocumentTypesFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.DocumentTypesWhereInput = { office: { uid: officeId } }; query.where = officeWhereInput; @@ -122,15 +125,12 @@ export default class DocumentTypesController extends ApiController { return; } - let documentTypeEntity: DocumentTypes | null; - //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - documentTypeEntity = await this.documentTypesService.getByUid(uid, query); - } else { - //call service to get prisma entity - documentTypeEntity = await this.documentTypesService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + + const documentTypeEntity = await this.documentTypesService.getByUid(uid, query); //Hydrate ressource with prisma entity const user = ObjectHydrate.hydrate(new DocumentType(), documentTypeEntity!, { strategy: "excludeAll" }); diff --git a/src/app/api/super-admin/DocumentsController.ts b/src/app/api/super-admin/DocumentsController.ts index e9644829..317500b2 100644 --- a/src/app/api/super-admin/DocumentsController.ts +++ b/src/app/api/super-admin/DocumentsController.ts @@ -25,7 +25,10 @@ export default class DocumentsController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.DocumentsFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.DocumentsWhereInput = { document_type: { office: { uid: officeId } } }; query.where = officeWhereInput; @@ -157,15 +160,12 @@ export default class DocumentsController extends ApiController { return; } - let documentEntity: Documents | null; - //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - documentEntity = await this.documentsService.getByUid(uid, query); - } else { - //call service to get prisma entity - documentEntity = await this.documentsService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + + const documentEntity = await this.documentsService.getByUid(uid, query); if (!documentEntity) { this.httpNotFoundRequest(response, "document not found"); diff --git a/src/app/api/super-admin/FilesController.ts b/src/app/api/super-admin/FilesController.ts index 78b99b4c..ed2572b2 100644 --- a/src/app/api/super-admin/FilesController.ts +++ b/src/app/api/super-admin/FilesController.ts @@ -24,7 +24,10 @@ export default class FilesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.FilesFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.FilesWhereInput = { document: { folder: { office: { uid: officeId } } } }; query.where = officeWhereInput; @@ -120,7 +123,12 @@ export default class FilesController extends ApiController { return; } - const fileEntity = await this.filesService.getByUid(uid); + let query = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } + + const fileEntity = await this.filesService.getByUid(uid, query); if (!fileEntity) { this.httpNotFoundRequest(response, "file not found"); diff --git a/src/app/api/super-admin/OfficeFoldersController.ts b/src/app/api/super-admin/OfficeFoldersController.ts index 259250a4..9013a741 100644 --- a/src/app/api/super-admin/OfficeFoldersController.ts +++ b/src/app/api/super-admin/OfficeFoldersController.ts @@ -24,7 +24,10 @@ export default class OfficeFoldersController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.OfficeFoldersFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.OfficeFoldersWhereInput = { office: { uid: officeId } }; query.where = officeWhereInput; @@ -79,7 +82,12 @@ export default class OfficeFoldersController extends ApiController { return; } - const officeFolderFound = await this.officeFoldersService.getByUid(uid); + let query = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } + + const officeFolderFound = await this.officeFoldersService.getByUid(uid, query); if (!officeFolderFound) { this.httpNotFoundRequest(response, "office folder not found"); @@ -124,7 +132,10 @@ export default class OfficeFoldersController extends ApiController { let officeFolderEntity: OfficeFolders | null; //get query if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); + let query = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } officeFolderEntity = await this.officeFoldersService.getByUid(uid, query); } else { //call service to get prisma entity diff --git a/src/app/api/super-admin/OfficeRolesController.ts b/src/app/api/super-admin/OfficeRolesController.ts index ae2702f7..e1e8cf58 100644 --- a/src/app/api/super-admin/OfficeRolesController.ts +++ b/src/app/api/super-admin/OfficeRolesController.ts @@ -5,7 +5,7 @@ import OfficeRolesService from "@Services/super-admin/OfficeRolesService/OfficeR import { Service } from "typedi"; import { validateOrReject } from "class-validator"; import { OfficeRole } from "le-coffre-resources/dist/SuperAdmin"; -import { OfficeRoles, Prisma } from "@prisma/client"; +import { Prisma } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import officeRoleHandler from "@App/middlewares/OfficeMembershipHandlers/OfficeRoleHandler"; @@ -24,7 +24,10 @@ export default class OfficeRolesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query: Prisma.OfficeRolesFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.OfficeRolesWhereInput = { office: { uid: officeId } }; query.where = officeWhereInput; @@ -123,16 +126,14 @@ export default class OfficeRolesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - let officeRoleEntity: OfficeRoles | null; - //get query + + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - officeRoleEntity = await this.officeRolesService.getByUid(uid, query); - } else { - //call service to get prisma entity - officeRoleEntity = await this.officeRolesService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const officeRoleEntity = await this.officeRolesService.getByUid(uid, query); + if (!officeRoleEntity) { this.httpNotFoundRequest(response, "officeRole not found"); return; diff --git a/src/app/api/super-admin/OfficesController.ts b/src/app/api/super-admin/OfficesController.ts index 9a282bfd..4803204c 100644 --- a/src/app/api/super-admin/OfficesController.ts +++ b/src/app/api/super-admin/OfficesController.ts @@ -22,7 +22,10 @@ export default class OfficesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } //call service to get prisma entity const officesEntities: Offices[] = await this.officesService.get(query); //Hydrate ressource with prisma entity @@ -103,16 +106,14 @@ export default class OfficesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - let officeEntity: Offices | null; - //get query + + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - officeEntity = await this.officesService.getByUid(uid, query); - } else { - //call service to get prisma entity - officeEntity = await this.officesService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const officeEntity = await this.officesService.getByUid(uid, query); + if (!officeEntity) { this.httpNotFoundRequest(response, "office not found"); return; diff --git a/src/app/api/super-admin/RolesController.ts b/src/app/api/super-admin/RolesController.ts index e5c774e5..f5f1924d 100644 --- a/src/app/api/super-admin/RolesController.ts +++ b/src/app/api/super-admin/RolesController.ts @@ -5,7 +5,6 @@ import RolesService from "@Services/super-admin/RolesService/RolesService"; import { Service } from "typedi"; import { validateOrReject } from "class-validator"; import { Role } from "le-coffre-resources/dist/SuperAdmin"; -import { Roles } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; @@ -23,7 +22,10 @@ export default class RolesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } //call service to get prisma entity const rolesEntities = await this.rolesService.get(query); @@ -119,16 +121,14 @@ export default class RolesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - let roleEntity: Roles | null; - //get query + + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - roleEntity = await this.rolesService.getByUid(uid, query); - } else { - //call service to get prisma entity - roleEntity = await this.rolesService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const roleEntity = await this.rolesService.getByUid(uid, query); + if (!roleEntity) { this.httpNotFoundRequest(response, "role not found"); return; diff --git a/src/app/api/super-admin/RulesController.ts b/src/app/api/super-admin/RulesController.ts index 9555cef8..09b0995d 100644 --- a/src/app/api/super-admin/RulesController.ts +++ b/src/app/api/super-admin/RulesController.ts @@ -5,7 +5,6 @@ import RulesService from "@Services/super-admin/RulesService/RulesService"; import { Service } from "typedi"; import { validateOrReject } from "class-validator"; import { Rule } from "le-coffre-resources/dist/SuperAdmin"; -import { Rules } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; @@ -23,7 +22,10 @@ export default class RulesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } //call service to get prisma entity const rulesEntities = await this.rulesService.get(query); @@ -119,16 +121,13 @@ export default class RulesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - let ruleEntity: Rules | null; - //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - ruleEntity = await this.rulesService.getByUid(uid, query); - } else { - //call service to get prisma entity - ruleEntity = await this.rulesService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const ruleEntity = await this.rulesService.getByUid(uid, query); + if (!ruleEntity) { this.httpNotFoundRequest(response, "rule not found"); return; diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index 3a4e620e..b4b84a47 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -5,7 +5,6 @@ import UsersService from "@Services/super-admin/UsersService/UsersService"; import { Service } from "typedi"; import { validateOrReject } from "class-validator"; import User from "le-coffre-resources/dist/SuperAdmin"; -import { Users } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; @@ -23,7 +22,10 @@ export default class UsersController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - const query = JSON.parse(req.query["q"] as string); + let query = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } //call service to get prisma entity const usersEntities = await this.usersService.get(query); @@ -119,15 +121,11 @@ export default class UsersController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - let userEntity: Users | null; - //get query + let query = {}; if (req.query["q"]) { - const query = JSON.parse(req.query["q"] as string); - userEntity = await this.usersService.getByUid(uid, query); - } else { - //call service to get prisma entity - userEntity = await this.usersService.getByUid(uid); + query = JSON.parse(req.query["q"] as string); } + const userEntity = await this.usersService.getByUid(uid, query); if (!userEntity) { this.httpNotFoundRequest(response, "user not found"); diff --git a/src/common/repositories/DeedsRepository.ts b/src/common/repositories/DeedsRepository.ts index e9501210..bc86c149 100644 --- a/src/common/repositories/DeedsRepository.ts +++ b/src/common/repositories/DeedsRepository.ts @@ -82,7 +82,7 @@ export default class DeedsRepository extends BaseRepository { /** * @description : Find unique deed */ - public async findOneByUid(uid: string, query?: Prisma.DeedsInclude) { + public async findOneByUid(uid: string, query?: Prisma.DeedsInclude): Promise { return this.model.findUnique({ where: { uid: uid, diff --git a/src/common/repositories/UsersRepository.ts b/src/common/repositories/UsersRepository.ts index b43d0a8f..99d36eb1 100644 --- a/src/common/repositories/UsersRepository.ts +++ b/src/common/repositories/UsersRepository.ts @@ -145,7 +145,7 @@ export default class UsersRepository extends BaseRepository { /** * @description : Find one user */ - public async findOneByUid(uid: string, query?: Prisma.UsersInclude) { + public async findOneByUid(uid: string, query?: Prisma.UsersInclude): Promise { return this.model.findUnique({ where: { uid: uid, From 21d08317ea1ec09d351e042ef516a2bf99fbbd2e Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Mon, 10 Jul 2023 14:59:45 +0200 Subject: [PATCH 032/134] :bug: Fixing package json --- package-lock.json | 838 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 424 insertions(+), 416 deletions(-) diff --git a/package-lock.json b/package-lock.json index 611ea677..b7add4cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "cors": "^2.8.5", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.54", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.55", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", @@ -77,35 +77,35 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", - "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", + "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", - "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.8.tgz", + "integrity": "sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^7.22.5", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", + "@babel/traverse": "^7.22.8", "@babel/types": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.2" }, "engines": { "node": ">=6.9.0" @@ -145,9 +145,9 @@ "dev": true }, "node_modules/@babel/generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", + "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", "dev": true, "dependencies": { "@babel/types": "^7.22.5", @@ -160,16 +160,16 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", - "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", + "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.5", + "@babel/compat-data": "^7.22.6", "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1" }, "engines": { "node": ">=6.9.0" @@ -265,9 +265,9 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", - "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { "@babel/types": "^7.22.5" @@ -304,13 +304,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", - "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dev": true, "dependencies": { "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", + "@babel/traverse": "^7.22.6", "@babel/types": "^7.22.5" }, "engines": { @@ -403,9 +403,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", - "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -606,18 +606,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", - "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", + "@babel/generator": "^7.22.7", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/parser": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" @@ -715,16 +715,16 @@ } }, "node_modules/@jest/console": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", - "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz", + "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", "slash": "^3.0.0" }, "engines": { @@ -732,16 +732,16 @@ } }, "node_modules/@jest/core": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", - "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz", + "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/reporters": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/reporters": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", @@ -749,20 +749,20 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.5.0", - "jest-config": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", + "jest-config": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-resolve-dependencies": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "jest-watcher": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-resolve-dependencies": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", + "jest-watcher": "^29.6.1", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -779,37 +779,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", - "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz", + "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^29.5.0" + "jest-mock": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==", "dev": true, "dependencies": { - "expect": "^29.5.0", - "jest-snapshot": "^29.5.0" + "expect": "^29.6.1", + "jest-snapshot": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", + "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", "dev": true, "dependencies": { "jest-get-type": "^29.4.3" @@ -819,49 +819,49 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", - "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz", + "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", - "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz", + "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/types": "^29.5.0", - "jest-mock": "^29.5.0" + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/types": "^29.6.1", + "jest-mock": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", - "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz", + "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/console": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -873,9 +873,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -894,24 +894,24 @@ } }, "node_modules/@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", "dev": true, "dependencies": { - "@sinclair/typebox": "^0.25.16" + "@sinclair/typebox": "^0.27.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", - "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz", + "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.15", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" }, @@ -920,13 +920,13 @@ } }, "node_modules/@jest/test-result": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", - "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz", + "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/types": "^29.6.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -935,14 +935,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", - "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz", + "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==", "dev": true, "dependencies": { - "@jest/test-result": "^29.5.0", + "@jest/test-result": "^29.6.1", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "slash": "^3.0.0" }, "engines": { @@ -950,22 +950,22 @@ } }, "node_modules/@jest/transform": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", - "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz", + "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/types": "^29.6.1", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -976,12 +976,12 @@ } }, "node_modules/@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -1045,14 +1045,14 @@ "dev": true }, "node_modules/@next/env": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.7.tgz", - "integrity": "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw==" + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.9.tgz", + "integrity": "sha512-vuDRK05BOKfmoBYLNi2cujG2jrYbEod/ubSSyqgmEx9n/W3eZaJQdRNhTfumO+qmq/QTzLurW487n/PM/fHOkw==" }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.7.tgz", - "integrity": "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w==", + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.9.tgz", + "integrity": "sha512-TVzGHpZoVBk3iDsTOQA/R6MGmFp0+17SWXMEWd6zG30AfuELmSSMe2SdPqxwXU0gbpWkJL1KgfLzy5ReN0crqQ==", "cpu": [ "arm64" ], @@ -1065,9 +1065,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.7.tgz", - "integrity": "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew==", + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.9.tgz", + "integrity": "sha512-aSfF1fhv28N2e7vrDZ6zOQ+IIthocfaxuMWGReB5GDriF0caTqtHttAvzOMgJgXQtQx6XhyaJMozLTSEXeNN+A==", "cpu": [ "x64" ], @@ -1080,9 +1080,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.7.tgz", - "integrity": "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q==", + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.9.tgz", + "integrity": "sha512-JhKoX5ECzYoTVyIy/7KykeO4Z2lVKq7HGQqvAH+Ip9UFn1MOJkOnkPRB7v4nmzqAoY+Je05Aj5wNABR1N18DMg==", "cpu": [ "arm64" ], @@ -1095,9 +1095,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.7.tgz", - "integrity": "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw==", + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.9.tgz", + "integrity": "sha512-OOn6zZBIVkm/4j5gkPdGn4yqQt+gmXaLaSjRSO434WplV8vo2YaBNbSHaTM9wJpZTHVDYyjzuIYVEzy9/5RVZw==", "cpu": [ "arm64" ], @@ -1110,9 +1110,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.7.tgz", - "integrity": "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg==", + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.9.tgz", + "integrity": "sha512-iA+fJXFPpW0SwGmx/pivVU+2t4zQHNOOAr5T378PfxPHY6JtjV6/0s1vlAJUdIHeVpX98CLp9k5VuKgxiRHUpg==", "cpu": [ "x64" ], @@ -1125,9 +1125,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.7.tgz", - "integrity": "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA==", + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.9.tgz", + "integrity": "sha512-rlNf2WUtMM+GAQrZ9gMNdSapkVi3koSW3a+dmBVp42lfugWVvnyzca/xJlN48/7AGx8qu62WyO0ya1ikgOxh6A==", "cpu": [ "x64" ], @@ -1140,9 +1140,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.7.tgz", - "integrity": "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw==", + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.9.tgz", + "integrity": "sha512-5T9ybSugXP77nw03vlgKZxD99AFTHaX8eT1ayKYYnGO9nmYhJjRPxcjU5FyYI+TdkQgEpIcH7p/guPLPR0EbKA==", "cpu": [ "arm64" ], @@ -1155,9 +1155,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.7.tgz", - "integrity": "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw==", + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.9.tgz", + "integrity": "sha512-ojZTCt1lP2ucgpoiFgrFj07uq4CZsq4crVXpLGgQfoFq00jPKRPgesuGPaz8lg1yLfvafkU3Jd1i8snKwYR3LA==", "cpu": [ "ia32" ], @@ -1170,9 +1170,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.7.tgz", - "integrity": "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA==", + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.9.tgz", + "integrity": "sha512-QbT03FXRNdpuL+e9pLnu+XajZdm/TtIXVYY4lA9t+9l0fLZbHXDYEKitAqxrOj37o3Vx5ufxiRAniaIebYDCgw==", "cpu": [ "x64" ], @@ -1184,6 +1184,15 @@ "node": ">= 10" } }, + "node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@pinata/sdk": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@pinata/sdk/-/sdk-2.1.0.tgz", @@ -1196,12 +1205,12 @@ } }, "node_modules/@prisma/client": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.11.0.tgz", - "integrity": "sha512-0INHYkQIqgAjrt7NzhYpeDQi8x3Nvylc2uDngKyFDDj1tTRQ4uV1HnVmd1sQEraeVAN63SOK0dgCKQHlvjL0KA==", + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-4.16.2.tgz", + "integrity": "sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==", "hasInstallScript": true, "dependencies": { - "@prisma/engines-version": "4.11.0-57.8fde8fef4033376662cad983758335009d522acb" + "@prisma/engines-version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81" }, "engines": { "node": ">=14.17" @@ -1216,21 +1225,21 @@ } }, "node_modules/@prisma/engines": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.11.0.tgz", - "integrity": "sha512-0AEBi2HXGV02cf6ASsBPhfsVIbVSDC9nbQed4iiY5eHttW9ZtMxHThuKZE1pnESbr8HRdgmFSa/Kn4OSNYuibg==", + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.16.2.tgz", + "integrity": "sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==", "devOptional": true, "hasInstallScript": true }, "node_modules/@prisma/engines-version": { - "version": "4.11.0-57.8fde8fef4033376662cad983758335009d522acb", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.11.0-57.8fde8fef4033376662cad983758335009d522acb.tgz", - "integrity": "sha512-3Vd8Qq06d5xD8Ch5WauWcUUrsVPdMC6Ge8ILji8RFfyhUpqon6qSyGM0apvr1O8n8qH8cKkEFqRPsYjuz5r83g==" + "version": "4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-4.16.1-1.4bc8b6e1b66cb932731fb1bdbbc550d1e010de81.tgz", + "integrity": "sha512-q617EUWfRIDTriWADZ4YiWRZXCa/WuhNgLTVd+HqWLffjMSPzyM5uOWoauX91wvQClSKZU4pzI4JJLQ9Kl62Qg==" }, "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "node_modules/@sinonjs/commons": { @@ -1446,9 +1455,9 @@ } }, "node_modules/@types/node": { - "version": "18.16.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.18.tgz", - "integrity": "sha512-/aNaQZD0+iSBAGnvvN2Cx92HqE5sZCPZtx2TsK+4nvV23fFe09jVDvpArXr2j9DnYlzuU9WuoykDDc6wqvpNcw==" + "version": "18.16.19", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.19.tgz", + "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==" }, "node_modules/@types/node-fetch": { "version": "2.6.4", @@ -1573,9 +1582,9 @@ } }, "node_modules/acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "bin": { "acorn": "bin/acorn" }, @@ -1681,12 +1690,12 @@ } }, "node_modules/babel-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", - "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz", + "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==", "dev": true, "dependencies": { - "@jest/transform": "^29.5.0", + "@jest/transform": "^29.6.1", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.5.0", @@ -2002,9 +2011,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001508", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001508.tgz", - "integrity": "sha512-sdQZOJdmt3GJs1UMNpCCCyeuS2IEGLXnHyAo9yIO5JJDjbjoVRij4M1qep6P6gFpptD1PqIYgzM+gwJbOi92mw==", + "version": "1.0.30001514", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz", + "integrity": "sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ==", "funding": [ { "type": "opencollective", @@ -2173,9 +2182,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "node_modules/color-convert": { @@ -2412,9 +2421,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.440", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.440.tgz", - "integrity": "sha512-r6dCgNpRhPwiWlxbHzZQ/d9swfPaEJGi8ekqRBwQYaR3WmA5VkqQfBWSDDjuJU1ntO+W9tHx8OHV/96Q8e0dVw==", + "version": "1.4.454", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz", + "integrity": "sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==", "dev": true }, "node_modules/emittery": { @@ -2529,16 +2538,17 @@ } }, "node_modules/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.5.0", + "@jest/expect-utils": "^29.6.1", + "@types/node": "*", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3201,15 +3211,15 @@ } }, "node_modules/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", + "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", "dev": true, "dependencies": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.6.1", + "@jest/types": "^29.6.1", "import-local": "^3.0.2", - "jest-cli": "^29.5.0" + "jest-cli": "^29.6.1" }, "bin": { "jest": "bin/jest.js" @@ -3240,28 +3250,28 @@ } }, "node_modules/jest-circus": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", - "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz", + "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.6.1", + "@jest/expect": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^0.7.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.5.0", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-each": "^29.6.1", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", "p-limit": "^3.1.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -3271,21 +3281,21 @@ } }, "node_modules/jest-cli": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", - "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz", + "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==", "dev": true, "dependencies": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-config": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "prompts": "^2.0.1", "yargs": "^17.3.1" }, @@ -3305,31 +3315,31 @@ } }, "node_modules/jest-config": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", - "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz", + "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", - "@jest/types": "^29.5.0", - "babel-jest": "^29.5.0", + "@jest/test-sequencer": "^29.6.1", + "@jest/types": "^29.6.1", + "babel-jest": "^29.6.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.5.0", - "jest-environment-node": "^29.5.0", + "jest-circus": "^29.6.1", + "jest-environment-node": "^29.6.1", "jest-get-type": "^29.4.3", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-runner": "^29.6.1", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -3350,15 +3360,15 @@ } }, "node_modules/jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3377,33 +3387,33 @@ } }, "node_modules/jest-each": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", - "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz", + "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", - "jest-util": "^29.5.0", - "pretty-format": "^29.5.0" + "jest-util": "^29.6.1", + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", - "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz", + "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-mock": "^29.6.1", + "jest-util": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3419,20 +3429,20 @@ } }, "node_modules/jest-haste-map": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", - "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", + "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-util": "^29.6.1", + "jest-worker": "^29.6.1", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -3444,46 +3454,46 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", - "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz", + "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==", "dev": true, "dependencies": { "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.5.0", + "jest-diff": "^29.6.1", "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", + "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.6.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -3492,14 +3502,14 @@ } }, "node_modules/jest-mock": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", - "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz", + "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", - "jest-util": "^29.5.0" + "jest-util": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3532,17 +3542,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", - "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", + "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.6.1", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-util": "^29.6.1", + "jest-validate": "^29.6.1", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -3552,43 +3562,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", - "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz", + "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==", "dev": true, "dependencies": { "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" + "jest-snapshot": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", - "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz", + "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.6.1", + "@jest/environment": "^29.6.1", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-leak-detector": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-resolve": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-util": "^29.5.0", - "jest-watcher": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-environment-node": "^29.6.1", + "jest-haste-map": "^29.6.1", + "jest-leak-detector": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-resolve": "^29.6.1", + "jest-runtime": "^29.6.1", + "jest-util": "^29.6.1", + "jest-watcher": "^29.6.1", + "jest-worker": "^29.6.1", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -3597,31 +3607,31 @@ } }, "node_modules/jest-runtime": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", - "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz", + "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/globals": "^29.5.0", - "@jest/source-map": "^29.4.3", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.6.1", + "@jest/fake-timers": "^29.6.1", + "@jest/globals": "^29.6.1", + "@jest/source-map": "^29.6.0", + "@jest/test-result": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", + "jest-haste-map": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-mock": "^29.6.1", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-resolve": "^29.6.1", + "jest-snapshot": "^29.6.1", + "jest-util": "^29.6.1", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -3630,34 +3640,32 @@ } }, "node_modules/jest-snapshot": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", - "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz", + "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/babel__traverse": "^7.0.6", + "@jest/expect-utils": "^29.6.1", + "@jest/transform": "^29.6.1", + "@jest/types": "^29.6.1", "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.5.0", + "expect": "^29.6.1", "graceful-fs": "^4.2.9", - "jest-diff": "^29.5.0", + "jest-diff": "^29.6.1", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1", "natural-compare": "^1.4.0", - "pretty-format": "^29.5.0", - "semver": "^7.3.5" + "pretty-format": "^29.6.1", + "semver": "^7.5.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3676,9 +3684,9 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -3697,12 +3705,12 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", + "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -3714,17 +3722,17 @@ } }, "node_modules/jest-validate": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", - "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", + "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.1", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", "leven": "^3.1.0", - "pretty-format": "^29.5.0" + "pretty-format": "^29.6.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3743,18 +3751,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", - "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz", + "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==", "dev": true, "dependencies": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/test-result": "^29.6.1", + "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "string-length": "^4.0.1" }, "engines": { @@ -3762,13 +3770,13 @@ } }, "node_modules/jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", + "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.5.0", + "jest-util": "^29.6.1", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -3840,9 +3848,9 @@ } }, "node_modules/jsonwebtoken": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz", - "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", + "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==", "dependencies": { "jws": "^3.2.2", "lodash": "^4.17.21", @@ -3871,9 +3879,9 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/jsonwebtoken/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3918,7 +3926,7 @@ } }, "node_modules/le-coffre-resources": { - "resolved": "git+ssh://git@github.com/smart-chain-fr/leCoffre-resources.git#16c30e06af8241bf6fef6ec8083da9bf434048df", + "resolved": "git+ssh://git@github.com/smart-chain-fr/leCoffre-resources.git#10eab2b6bde5cd085509b8510808477caff37a1e", "license": "MIT", "dependencies": { "class-transformer": "^0.5.1", @@ -3936,9 +3944,9 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.10.36", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.36.tgz", - "integrity": "sha512-NCPWES1poiS4NSzIS49mxHM5hCkSWov8wFICRKfL9narzimqAXlnAgNloHCt0BukZHbWt8TIStCdzLy7LXBYpQ==" + "version": "1.10.37", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.37.tgz", + "integrity": "sha512-Z10PCaOCiAxbUxLyR31DNeeNugSVP6iv/m7UrSKS5JHziEMApJtgku4e9Q69pzzSC9LnQiM09sqsGf2ticZnMw==" }, "node_modules/lines-and-columns": { "version": "1.2.4", @@ -4332,11 +4340,11 @@ } }, "node_modules/next": { - "version": "13.4.7", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.7.tgz", - "integrity": "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ==", + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.9.tgz", + "integrity": "sha512-vtefFm/BWIi/eWOqf1GsmKG3cjKw1k3LjuefKRcL3iiLl3zWzFdPG3as6xtxrGO6gwTzzaO1ktL4oiHt/uvTjA==", "dependencies": { - "@next/env": "13.4.7", + "@next/env": "13.4.9", "@swc/helpers": "0.5.1", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", @@ -4352,15 +4360,15 @@ "node": ">=16.8.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.7", - "@next/swc-darwin-x64": "13.4.7", - "@next/swc-linux-arm64-gnu": "13.4.7", - "@next/swc-linux-arm64-musl": "13.4.7", - "@next/swc-linux-x64-gnu": "13.4.7", - "@next/swc-linux-x64-musl": "13.4.7", - "@next/swc-win32-arm64-msvc": "13.4.7", - "@next/swc-win32-ia32-msvc": "13.4.7", - "@next/swc-win32-x64-msvc": "13.4.7" + "@next/swc-darwin-arm64": "13.4.9", + "@next/swc-darwin-x64": "13.4.9", + "@next/swc-linux-arm64-gnu": "13.4.9", + "@next/swc-linux-arm64-musl": "13.4.9", + "@next/swc-linux-x64-gnu": "13.4.9", + "@next/swc-linux-x64-musl": "13.4.9", + "@next/swc-win32-arm64-msvc": "13.4.9", + "@next/swc-win32-ia32-msvc": "13.4.9", + "@next/swc-win32-x64-msvc": "13.4.9" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -4393,9 +4401,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -4418,9 +4426,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/node-schedule": { @@ -4797,12 +4805,12 @@ } }, "node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.0", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -4823,13 +4831,13 @@ } }, "node_modules/prisma": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.11.0.tgz", - "integrity": "sha512-4zZmBXssPUEiX+GeL0MUq/Yyie4ltiKmGu7jCJFnYMamNrrulTBc+D+QwAQSJ01tyzeGHlD13kOnqPwRipnlNw==", + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.16.2.tgz", + "integrity": "sha512-SYCsBvDf0/7XSJyf2cHTLjLeTLVXYfqp7pG5eEVafFLeT0u/hLFz/9W196nDRGUOo1JfPatAEb+uEnTQImQC1g==", "devOptional": true, "hasInstallScript": true, "dependencies": { - "@prisma/engines": "4.11.0" + "@prisma/engines": "4.16.2" }, "bin": { "prisma": "build/index.js", @@ -5489,9 +5497,9 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/ts-jest": { - "version": "29.1.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.0.tgz", - "integrity": "sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==", + "version": "29.1.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", + "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==", "dev": true, "dependencies": { "bs-logger": "0.x", @@ -5500,7 +5508,7 @@ "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", - "semver": "7.x", + "semver": "^7.5.3", "yargs-parser": "^21.0.1" }, "bin": { @@ -5544,9 +5552,9 @@ } }, "node_modules/ts-jest/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -5607,9 +5615,9 @@ } }, "node_modules/tslib": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" }, "node_modules/type-detect": { "version": "4.0.8", diff --git a/package.json b/package.json index 02876930..69b3c587 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "docker:up:test": "docker-compose -f docker-compose-test.yml up -d", "docker:down:test": "docker-compose down", "test": "tsc && npm run docker:up:test && npm run migrate:test && dotenv -e .env.test -- jest -i --verbose ./dist/test/* && npm run docker:down:test", - "seed": "ts-node src/common/databases/seeders/seeder2.ts" + "seed": "ts-node src/common/databases/seeders/seeder.ts" }, "repository": { "type": "git", From 4dcc53f555beb221321f023f3378197632f407ac Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Mon, 10 Jul 2023 16:22:06 +0200 Subject: [PATCH 033/134] fix folders middleware --- .../middlewares/OfficeMembershipHandlers/FolderHandler.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts index 9f2f7f57..2c5a0dfe 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts @@ -9,16 +9,16 @@ export default async function folderHandler(req: Request, response: Response, ne const uid = req.path && req.path.split("/")[5]; const office = req.body.office; const officeFolderNumber = req.body.folder_number; - const deedType = req.body.deed.deed_type; + const deed = req.body.deed; if (office && office.uid != officeId) { response.sendStatus(HttpCodes.UNAUTHORIZED); return; } - if (deedType) { + if (deed) { const deedTypeService = Container.get(DeedTypesService); - const deedTypeWithOffice = await deedTypeService.getByUidWithOffice(deedType.uid!); + const deedTypeWithOffice = await deedTypeService.getByUidWithOffice(deed.deedType.uid!); if (!deedTypeWithOffice) { response.sendStatus(HttpCodes.NOT_FOUND); return; From d47b3759579c095b96e42fffb8de6e5f59a85647 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Tue, 11 Jul 2023 10:42:55 +0200 Subject: [PATCH 034/134] fix folder query controller --- src/app/api/customer/FilesController.ts | 2 +- .../super-admin/OfficeFoldersController.ts | 12 +++------- .../repositories/DocumentsRepository.ts | 3 ++- .../DocumentsService/DocumentsService.ts | 24 ------------------- src/test/config/MockedData.ts | 2 +- 5 files changed, 7 insertions(+), 36 deletions(-) diff --git a/src/app/api/customer/FilesController.ts b/src/app/api/customer/FilesController.ts index 9993e8c7..61cbddb3 100644 --- a/src/app/api/customer/FilesController.ts +++ b/src/app/api/customer/FilesController.ts @@ -7,7 +7,7 @@ import { Files, Prisma } from "@prisma/client"; import { File } from "le-coffre-resources/dist/Customer"; import { Document } from "le-coffre-resources/dist/Customer"; import { validateOrReject } from "class-validator"; -import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; +import DocumentsService from "@Services/customer/DocumentsService/DocumentsService"; import authHandler from "@App/middlewares/AuthHandler"; import fileHandler from "@App/middlewares/CustomerHandler/FileHandler"; diff --git a/src/app/api/super-admin/OfficeFoldersController.ts b/src/app/api/super-admin/OfficeFoldersController.ts index 9013a741..73b74ceb 100644 --- a/src/app/api/super-admin/OfficeFoldersController.ts +++ b/src/app/api/super-admin/OfficeFoldersController.ts @@ -129,18 +129,12 @@ export default class OfficeFoldersController extends ApiController { return; } - let officeFolderEntity: OfficeFolders | null; - //get query - if (req.query["q"]) { - let query = {}; + let query = {}; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } - officeFolderEntity = await this.officeFoldersService.getByUid(uid, query); - } else { - //call service to get prisma entity - officeFolderEntity = await this.officeFoldersService.getByUid(uid); - } + + const officeFolderEntity = await this.officeFoldersService.getByUid(uid, query); if (!officeFolderEntity) { this.httpNotFoundRequest(response, "folder not found"); diff --git a/src/common/repositories/DocumentsRepository.ts b/src/common/repositories/DocumentsRepository.ts index 98b66e1b..c5110e6d 100644 --- a/src/common/repositories/DocumentsRepository.ts +++ b/src/common/repositories/DocumentsRepository.ts @@ -3,6 +3,7 @@ import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; import { Documents, EDocumentStatus, Prisma } from "@prisma/client"; import { Document } from "le-coffre-resources/dist/SuperAdmin"; +import { Document as DocumentCustomer } from "le-coffre-resources/dist/Customer"; @Service() export default class DocumentsRepository extends BaseRepository { @@ -94,7 +95,7 @@ export default class DocumentsRepository extends BaseRepository { /** * @description : Update data of a document */ - public async update(uid: string, document: Partial, refusedReason?: string): Promise { + public async update(uid: string, document: Partial, refusedReason?: string): Promise { return this.model.update({ where: { uid: uid, diff --git a/src/services/customer/DocumentsService/DocumentsService.ts b/src/services/customer/DocumentsService/DocumentsService.ts index a3cc2e16..26c45c6a 100644 --- a/src/services/customer/DocumentsService/DocumentsService.ts +++ b/src/services/customer/DocumentsService/DocumentsService.ts @@ -18,22 +18,6 @@ export default class DocumentsService extends BaseService { 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 @@ -42,14 +26,6 @@ export default class DocumentsService extends BaseService { return this.documentsRepository.update(uid, document); } - /** - * @description : Delete a document - * @throws {Error} If document cannot be deleted - */ - public async delete(uid: string): Promise { - return this.documentsRepository.delete(uid); - } - /** * @description : Get a document by uid * @throws {Error} If document cannot be get by uid diff --git a/src/test/config/MockedData.ts b/src/test/config/MockedData.ts index 89292170..8496964a 100644 --- a/src/test/config/MockedData.ts +++ b/src/test/config/MockedData.ts @@ -1,4 +1,4 @@ -import { EOfficeStatus } from "le-coffre-resources/dist/Customer/Office"; +import { EOfficeStatus } from "le-coffre-resources/dist/Notary/Office"; import User, { Address, Contact, Office, DeedType, DocumentType, Customer, OfficeFolder, Deed } from "le-coffre-resources/dist/SuperAdmin"; export const userAddress: Address = { From 6168683cfe2648b341b16730b999a85e9f75007a Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Tue, 11 Jul 2023 11:05:01 +0200 Subject: [PATCH 035/134] fix deed middleware --- .../OfficeMembershipHandlers/FolderHandler.ts | 10 +++++----- src/services/super-admin/DeedsService/DeedsService.ts | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts index 2c5a0dfe..d7330a96 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts @@ -2,7 +2,7 @@ import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; import { NextFunction, Request, Response } from "express"; import Container from "typedi"; import OfficeFoldersService from "@Services/super-admin/OfficeFoldersService/OfficeFoldersService"; -import DeedTypesService from "@Services/super-admin/DeedTypesService/DeedTypesService"; +import DeedsService from "@Services/super-admin/DeedsService/DeedsService"; export default async function folderHandler(req: Request, response: Response, next: NextFunction) { const officeId = req.body.user.office_Id; @@ -17,13 +17,13 @@ export default async function folderHandler(req: Request, response: Response, ne } if (deed) { - const deedTypeService = Container.get(DeedTypesService); - const deedTypeWithOffice = await deedTypeService.getByUidWithOffice(deed.deedType.uid!); - if (!deedTypeWithOffice) { + const deedService = Container.get(DeedsService); + const deedWithOffice = await deedService.getByUidWithOffice(deed.uid!); + if (!deedWithOffice) { response.sendStatus(HttpCodes.NOT_FOUND); return; } - if (deedTypeWithOffice.office.uid != officeId) { + if (deedWithOffice.deed_type.office.uid != officeId) { response.sendStatus(HttpCodes.UNAUTHORIZED); return; } diff --git a/src/services/super-admin/DeedsService/DeedsService.ts b/src/services/super-admin/DeedsService/DeedsService.ts index cc7acfe4..82e01e05 100644 --- a/src/services/super-admin/DeedsService/DeedsService.ts +++ b/src/services/super-admin/DeedsService/DeedsService.ts @@ -42,7 +42,7 @@ export default class DeedsService extends BaseService { return this.deedRepository.findOneByUid(uid, query); } - public async getOneByUidWithOffice(uid: string) { + public async getByUidWithOffice(uid: string) { return this.deedRepository.findOneByUidWithOffice(uid); } } From 34e248a247d163583eb614de6647d92ff15a6a26 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Tue, 11 Jul 2023 11:08:51 +0200 Subject: [PATCH 036/134] fix deed middleware officeMembership --- src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts index a9f227ea..f931c3cb 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts @@ -12,7 +12,7 @@ export default async function deedHandler(req: Request, response: Response, next if (uid) { const deedService = Container.get(DeedsService); - const deed = await deedService.getOneByUidWithOffice(uid); + const deed = await deedService.getByUidWithOffice(uid); if (!deed) { response.sendStatus(HttpCodes.NOT_FOUND); From ecd9d80d58da9a436652bee82cd5df76d516966b Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Tue, 11 Jul 2023 11:31:42 +0200 Subject: [PATCH 037/134] refacto rules for seeder and jwt for test purposes --- src/common/databases/seeders/seeder.ts | 14 +++++++------- src/services/common/AuthService/AuthService.ts | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/common/databases/seeders/seeder.ts b/src/common/databases/seeders/seeder.ts index 25fb518c..c4ff80e3 100644 --- a/src/common/databases/seeders/seeder.ts +++ b/src/common/databases/seeders/seeder.ts @@ -554,7 +554,7 @@ export default async function main() { updated_at: new Date(), }, { - name: "GET documentTypes", + name: "GET document-types", created_at: new Date(), updated_at: new Date(), }, @@ -614,7 +614,7 @@ export default async function main() { updated_at: new Date(), }, { - name: "PUT documentTypes", + name: "PUT document-types", created_at: new Date(), updated_at: new Date(), }, @@ -674,7 +674,7 @@ export default async function main() { updated_at: new Date(), }, { - name: "POST documentTypes", + name: "POST document-types", created_at: new Date(), updated_at: new Date(), }, @@ -724,7 +724,7 @@ export default async function main() { updated_at: new Date(), }, { - name: "POST deedtypes", + name: "POST deed-types", created_at: new Date(), updated_at: new Date(), }, @@ -734,7 +734,7 @@ export default async function main() { updated_at: new Date(), }, { - name: "POST documentTypes", + name: "POST document-types", created_at: new Date(), updated_at: new Date(), }, @@ -784,7 +784,7 @@ export default async function main() { updated_at: new Date(), }, { - name: "DELETE deedtypes", + name: "DELETE deed-types", created_at: new Date(), updated_at: new Date(), }, @@ -794,7 +794,7 @@ export default async function main() { updated_at: new Date(), }, { - name: "DELETE documentTypes", + name: "DELETE document-types", created_at: new Date(), updated_at: new Date(), }, diff --git a/src/services/common/AuthService/AuthService.ts b/src/services/common/AuthService/AuthService.ts index 278255fe..b0628cf0 100644 --- a/src/services/common/AuthService/AuthService.ts +++ b/src/services/common/AuthService/AuthService.ts @@ -82,7 +82,7 @@ export default class AuthService extends BaseService { } public generateAccessToken(user: any): string { - return jwt.sign({ ...user }, this.variables.ACCESS_TOKEN_SECRET, { expiresIn: "15m" }); + return jwt.sign({ ...user }, this.variables.ACCESS_TOKEN_SECRET, { expiresIn: "1h" }); } public generateRefreshToken(user: any): string { From ae4812c0dc34cd9133db4ecc6e86fbed077fc34c Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Tue, 11 Jul 2023 14:21:16 +0200 Subject: [PATCH 038/134] add error messages for middlewares --- src/app/middlewares/AuthHandler.ts | 4 ++-- .../middlewares/CustomerHandler/DocumentHandler.ts | 4 ++-- src/app/middlewares/CustomerHandler/FileHandler.ts | 8 ++++---- .../OfficeMembershipHandlers/DeedHandler.ts | 8 ++++---- .../OfficeMembershipHandlers/DeedTypeHandler.ts | 10 +++++----- .../OfficeMembershipHandlers/DocumentHandler.ts | 8 ++++---- .../OfficeMembershipHandlers/DocumentTypeHandler.ts | 6 +++--- .../OfficeMembershipHandlers/FileHandler.ts | 8 ++++---- .../OfficeMembershipHandlers/FolderHandler.ts | 11 ++++++----- .../OfficeMembershipHandlers/OfficeRoleHandler.ts | 6 +++--- .../OfficeMembershipHandlers/UserHandler.ts | 6 +++--- src/app/middlewares/RulesHandler.ts | 4 ++-- 12 files changed, 42 insertions(+), 41 deletions(-) diff --git a/src/app/middlewares/AuthHandler.ts b/src/app/middlewares/AuthHandler.ts index 6d7116bc..4166834e 100644 --- a/src/app/middlewares/AuthHandler.ts +++ b/src/app/middlewares/AuthHandler.ts @@ -8,14 +8,14 @@ export default function authHandler(req: Request, response: Response, next: Next const token = authHeader && authHeader.split(" ")[1]; if (!token) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Missing token in authorization header"); return; } const authService = Container.get(AuthService); authService.verifyAccessToken(token, (err, userPayload) => { if (err) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Error while verifying token"); return; } req.body.user = userPayload; diff --git a/src/app/middlewares/CustomerHandler/DocumentHandler.ts b/src/app/middlewares/CustomerHandler/DocumentHandler.ts index 0f82fd35..8963aab8 100644 --- a/src/app/middlewares/CustomerHandler/DocumentHandler.ts +++ b/src/app/middlewares/CustomerHandler/DocumentHandler.ts @@ -8,7 +8,7 @@ export default async function documentHandler(req: Request, response: Response, const uid = req.path && req.path.split("/")[5]; if(!uid) { - response.sendStatus(HttpCodes.BAD_REQUEST); + response.status(HttpCodes.BAD_REQUEST).send("Missing document uid"); return; } @@ -16,7 +16,7 @@ export default async function documentHandler(req: Request, response: Response, const document = await documentService.getByUid(uid); if(document?.depositor_uid != customerId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this depositor"); return; } diff --git a/src/app/middlewares/CustomerHandler/FileHandler.ts b/src/app/middlewares/CustomerHandler/FileHandler.ts index aa245d70..3f86ccb9 100644 --- a/src/app/middlewares/CustomerHandler/FileHandler.ts +++ b/src/app/middlewares/CustomerHandler/FileHandler.ts @@ -13,11 +13,11 @@ export default async function fileHandler(req: Request, response: Response, next const fileService = Container.get(FilesService); const file = await fileService.getByUidWithDocument(uid); if (!file) { - response.sendStatus(HttpCodes.BAD_REQUEST); + response.status(HttpCodes.NOT_FOUND).send("File not found"); return; } if (file.document.depositor_uid != customerId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this depositor"); return; } } @@ -26,11 +26,11 @@ export default async function fileHandler(req: Request, response: Response, next const documentService = Container.get(DocumentsService); const documentFound = await documentService.getByUid(document.uid!); if(!documentFound) { - response.sendStatus(HttpCodes.BAD_REQUEST); + response.status(HttpCodes.NOT_FOUND).send("Document not found"); return; } if (documentFound.depositor_uid != customerId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this depositor"); return; } } diff --git a/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts index f931c3cb..a32c02d9 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts @@ -15,12 +15,12 @@ export default async function deedHandler(req: Request, response: Response, next const deed = await deedService.getByUidWithOffice(uid); if (!deed) { - response.sendStatus(HttpCodes.NOT_FOUND); + response.status(HttpCodes.NOT_FOUND).send("Deed not found"); return; } if (deed.deed_type.office.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); return; } } @@ -30,11 +30,11 @@ export default async function deedHandler(req: Request, response: Response, next documentTypes.forEach(async (documentType) => { const deedTypeWithOffice = await documentTypeService.getByUidWithOffice(documentType.uid!); if (!deedTypeWithOffice) { - response.sendStatus(HttpCodes.NOT_FOUND); + response.status(HttpCodes.NOT_FOUND).send("Deed type not found"); return; } if (deedTypeWithOffice.office?.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); return; } }); diff --git a/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts index e1513793..e00f8344 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts @@ -12,7 +12,7 @@ export default async function deedTypeHandler(req: Request, response: Response, const office = req.body.office; if (office && office.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); return; } @@ -21,12 +21,12 @@ export default async function deedTypeHandler(req: Request, response: Response, const deedType = await deedTypeService.getByUidWithOffice(uid!); if (!deedType) { - response.sendStatus(HttpCodes.NOT_FOUND); + response.status(HttpCodes.NOT_FOUND).send("Deed type not found"); return; } if (deedType.office.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); return; } } @@ -36,11 +36,11 @@ export default async function deedTypeHandler(req: Request, response: Response, documentTypes.forEach(async (documentType) => { const documentTypeWithOffice = await documentTypeService.getByUidWithOffice(documentType.uid!); if (!documentTypeWithOffice) { - response.sendStatus(HttpCodes.NOT_FOUND); + response.status(HttpCodes.NOT_FOUND).send("Document type not found"); return; } if (documentTypeWithOffice.office?.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); return; } }); diff --git a/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts index 163bf374..790b844e 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts @@ -17,11 +17,11 @@ export default async function documentHandler(req: Request, response: Response, const officeFolderService = Container.get(OfficeFoldersService); const officeFolderWithOffice = await officeFolderService.getByUidWithOffice(folder.uid!); if (!officeFolderWithOffice) { - response.sendStatus(HttpCodes.NOT_FOUND); + response.status(HttpCodes.NOT_FOUND).send("Folder not found"); return; } if (officeFolderWithOffice.office?.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); return; } } @@ -30,11 +30,11 @@ export default async function documentHandler(req: Request, response: Response, const documentTypeService = Container.get(DocumentTypesService); const documentTypeWithOffice = await documentTypeService.getByUidWithOffice(documentType.uid!); if (!documentTypeWithOffice) { - response.sendStatus(HttpCodes.NOT_FOUND); + response.status(HttpCodes.NOT_FOUND).send("Document type not found"); return; } if (documentTypeWithOffice.office?.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); return; } } diff --git a/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts index 991ea796..908df26e 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts @@ -9,7 +9,7 @@ export default async function documentTypeHandler(req: Request, response: Respon const office = req.body.office; if (office && office.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); return; } @@ -18,12 +18,12 @@ export default async function documentTypeHandler(req: Request, response: Respon const documentType = await documentTypeService.getByUidWithOffice(uid!); if (!documentType) { - response.sendStatus(HttpCodes.NOT_FOUND); + response.status(HttpCodes.NOT_FOUND).send("Document type not found"); return; } if (documentType.office.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); return; } } diff --git a/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts index 387c50bf..27ce2cd3 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts @@ -13,11 +13,11 @@ export default async function fileHandler(req: Request, response: Response, next const documentService = Container.get(DocumentsService); const documentWithOffice = await documentService.getByUidWithOffice(document.uid!); if (!documentWithOffice) { - response.sendStatus(HttpCodes.NOT_FOUND); + response.status(HttpCodes.NOT_FOUND).send("Document not found"); return; } if (documentWithOffice.folder.office?.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); return; } } @@ -29,11 +29,11 @@ export default async function fileHandler(req: Request, response: Response, next const file = await fileService.getByUidWithOffice(uid!); if (!file) { - response.sendStatus(HttpCodes.NOT_FOUND); + response.status(HttpCodes.NOT_FOUND).send("File not found"); return; } if (file.document.folder.office.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); return; } } diff --git a/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts index d7330a96..2450eea7 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts @@ -12,7 +12,8 @@ export default async function folderHandler(req: Request, response: Response, ne const deed = req.body.deed; if (office && office.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + console.log("wrong office"); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); return; } @@ -24,7 +25,7 @@ export default async function folderHandler(req: Request, response: Response, ne return; } if (deedWithOffice.deed_type.office.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this deed type"); return; } } @@ -36,7 +37,7 @@ export default async function folderHandler(req: Request, response: Response, ne where: { folder_number: officeFolderNumber, office: { uid: officeId } }, }); if (officeFoldersWithSameNumber.length) { - response.sendStatus(HttpCodes.BAD_REQUEST); + response.status(HttpCodes.BAD_REQUEST).send("Office number already used"); return; } } @@ -45,12 +46,12 @@ export default async function folderHandler(req: Request, response: Response, ne const officeFolder = await officeFolderService.getByUidWithOffice(uid!); if (!officeFolder) { - response.sendStatus(HttpCodes.NOT_FOUND); + response.status(HttpCodes.NOT_FOUND).send("Office folder not found"); return; } if (officeFolder.office.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); return; } } diff --git a/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts index 961c11f7..b1a33629 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts @@ -9,7 +9,7 @@ export default async function officeRoleHandler(req: Request, response: Response const office = req.body.office; if (office && office.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); return; } @@ -18,12 +18,12 @@ export default async function officeRoleHandler(req: Request, response: Response const officeRole = await officeRoleService.getByUidWithOffice(uid!); if (!officeRole) { - response.sendStatus(HttpCodes.NOT_FOUND); + response.status(HttpCodes.NOT_FOUND).send("Office role not found"); return; } if (officeRole.office.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); return; } } diff --git a/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts index 21b6c8eb..d66c88bf 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts @@ -9,7 +9,7 @@ export default async function userHandler(req: Request, response: Response, next const office = req.body.office_membership; if (office && office.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); return; } @@ -18,12 +18,12 @@ export default async function userHandler(req: Request, response: Response, next const user = await userService.getByUidWithOffice(uid!); if (!user) { - response.sendStatus(HttpCodes.NOT_FOUND); + response.status(HttpCodes.NOT_FOUND).send("User not found"); return; } if (user.office_membership.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); return; } } diff --git a/src/app/middlewares/RulesHandler.ts b/src/app/middlewares/RulesHandler.ts index 36e36099..08aff7e1 100644 --- a/src/app/middlewares/RulesHandler.ts +++ b/src/app/middlewares/RulesHandler.ts @@ -8,12 +8,12 @@ export default async function ruleHandler(req: Request, response: Response, next const role = req.body.user.role; if (namespace != "notary" && role != namespace) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this role"); return; } if (!rules.includes(req.method + " " + service)) { - response.sendStatus(HttpCodes.UNAUTHORIZED); + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with those rules"); return; } From 7022e41fcb4417ec6b51f1a640a390dd4a1e0391 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Tue, 11 Jul 2023 14:41:23 +0200 Subject: [PATCH 039/134] refacto error messages --- .../OfficeMembershipHandlers/DeedHandler.ts | 4 ++-- .../DeedTypeHandler.ts | 6 +++--- .../DocumentHandler.ts | 4 ++-- .../DocumentTypeHandler.ts | 4 ++-- .../OfficeMembershipHandlers/FileHandler.ts | 4 ++-- .../OfficeMembershipHandlers/FolderHandler.ts | 19 ++++++++++--------- .../OfficeRoleHandler.ts | 4 ++-- .../OfficeMembershipHandlers/UserHandler.ts | 4 ++-- src/app/middlewares/RulesHandler.ts | 4 ++-- 9 files changed, 27 insertions(+), 26 deletions(-) diff --git a/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts index a32c02d9..7ca6d7fc 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts @@ -20,7 +20,7 @@ export default async function deedHandler(req: Request, response: Response, next } if (deed.deed_type.office.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } } @@ -34,7 +34,7 @@ export default async function deedHandler(req: Request, response: Response, next return; } if (deedTypeWithOffice.office?.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } }); diff --git a/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts index e00f8344..2836b3d5 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts @@ -12,7 +12,7 @@ export default async function deedTypeHandler(req: Request, response: Response, const office = req.body.office; if (office && office.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } @@ -26,7 +26,7 @@ export default async function deedTypeHandler(req: Request, response: Response, } if (deedType.office.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } } @@ -40,7 +40,7 @@ export default async function deedTypeHandler(req: Request, response: Response, return; } if (documentTypeWithOffice.office?.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } }); diff --git a/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts index 790b844e..62470f16 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts @@ -21,7 +21,7 @@ export default async function documentHandler(req: Request, response: Response, return; } if (officeFolderWithOffice.office?.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } } @@ -34,7 +34,7 @@ export default async function documentHandler(req: Request, response: Response, return; } if (documentTypeWithOffice.office?.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } } diff --git a/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts index 908df26e..250487cd 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts @@ -9,7 +9,7 @@ export default async function documentTypeHandler(req: Request, response: Respon const office = req.body.office; if (office && office.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } @@ -23,7 +23,7 @@ export default async function documentTypeHandler(req: Request, response: Respon } if (documentType.office.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } } diff --git a/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts index 27ce2cd3..d91ad586 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts @@ -17,7 +17,7 @@ export default async function fileHandler(req: Request, response: Response, next return; } if (documentWithOffice.folder.office?.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } } @@ -33,7 +33,7 @@ export default async function fileHandler(req: Request, response: Response, next return; } if (file.document.folder.office.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } } diff --git a/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts index 2450eea7..e63d8782 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts @@ -2,7 +2,7 @@ import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; import { NextFunction, Request, Response } from "express"; import Container from "typedi"; import OfficeFoldersService from "@Services/super-admin/OfficeFoldersService/OfficeFoldersService"; -import DeedsService from "@Services/super-admin/DeedsService/DeedsService"; +import DeedTypesService from "@Services/super-admin/DeedTypesService/DeedTypesService"; export default async function folderHandler(req: Request, response: Response, next: NextFunction) { const officeId = req.body.user.office_Id; @@ -13,19 +13,20 @@ export default async function folderHandler(req: Request, response: Response, ne if (office && office.uid != officeId) { console.log("wrong office"); - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } if (deed) { - const deedService = Container.get(DeedsService); - const deedWithOffice = await deedService.getByUidWithOffice(deed.uid!); - if (!deedWithOffice) { - response.sendStatus(HttpCodes.NOT_FOUND); + const deedTypeService = Container.get(DeedTypesService); + console.log("deed : ",deed); + const deedTypeWithOffice = await deedTypeService.getByUidWithOffice(deed.deed_type.uid!); + if (!deedTypeWithOffice) { + response.status(HttpCodes.NOT_FOUND).send("Deed type not found"); return; } - if (deedWithOffice.deed_type.office.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this deed type"); + if (deedTypeWithOffice.office.uid != officeId) { + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this deed type"); return; } } @@ -51,7 +52,7 @@ export default async function folderHandler(req: Request, response: Response, ne } if (officeFolder.office.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } } diff --git a/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts index b1a33629..51716731 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts @@ -9,7 +9,7 @@ export default async function officeRoleHandler(req: Request, response: Response const office = req.body.office; if (office && office.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } @@ -23,7 +23,7 @@ export default async function officeRoleHandler(req: Request, response: Response } if (officeRole.office.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } } diff --git a/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts index d66c88bf..a0a82207 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts @@ -9,7 +9,7 @@ export default async function userHandler(req: Request, response: Response, next const office = req.body.office_membership; if (office && office.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } @@ -23,7 +23,7 @@ export default async function userHandler(req: Request, response: Response, next } if (user.office_membership.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this office"); + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } } diff --git a/src/app/middlewares/RulesHandler.ts b/src/app/middlewares/RulesHandler.ts index 08aff7e1..89df35a9 100644 --- a/src/app/middlewares/RulesHandler.ts +++ b/src/app/middlewares/RulesHandler.ts @@ -8,12 +8,12 @@ export default async function ruleHandler(req: Request, response: Response, next const role = req.body.user.role; if (namespace != "notary" && role != namespace) { - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this role"); + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this role"); return; } if (!rules.includes(req.method + " " + service)) { - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with those rules"); + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with those rules"); return; } From 2cbdc1db02925f2d063bdb9aaff82bec0b7e65f1 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Tue, 11 Jul 2023 18:05:29 +0200 Subject: [PATCH 040/134] refacto query for GET methods --- src/app/api/admin/DeedTypesController.ts | 5 +++-- src/app/api/admin/DeedsController.ts | 5 +++-- src/app/api/admin/DocumentTypesController.ts | 5 +++-- src/app/api/admin/DocumentsController.ts | 5 +++-- src/app/api/admin/FilesController.ts | 5 +++-- src/app/api/admin/OfficeFoldersController.ts | 6 ++++-- src/app/api/admin/OfficeRolesController.ts | 5 +++-- src/app/api/admin/UsersController.ts | 5 +++-- src/app/api/notary/DeedTypesController.ts | 5 +++-- src/app/api/notary/DeedsController.ts | 5 +++-- src/app/api/notary/DocumentTypesController.ts | 5 +++-- src/app/api/notary/DocumentsController.ts | 5 +++-- src/app/api/notary/FilesController.ts | 5 +++-- src/app/api/notary/OfficeFoldersController.ts | 5 +++-- src/app/api/notary/OfficeRolesController.ts | 5 +++-- src/app/api/notary/UsersController.ts | 5 +++-- src/app/api/super-admin/CustomersController.ts | 4 ++-- src/app/api/super-admin/DeedTypesController.ts | 7 ++++--- src/app/api/super-admin/DeedsController.ts | 7 ++++--- .../api/super-admin/DocumentTypesController.ts | 7 ++++--- src/app/api/super-admin/DocumentsController.ts | 7 ++++--- src/app/api/super-admin/FilesController.ts | 8 +++++--- .../api/super-admin/OfficeFoldersController.ts | 15 ++++++--------- src/app/api/super-admin/OfficeRolesController.ts | 7 ++++--- src/app/api/super-admin/OfficesController.ts | 4 ++-- src/app/api/super-admin/RolesController.ts | 4 ++-- src/app/api/super-admin/RulesController.ts | 4 ++-- src/app/api/super-admin/UsersController.ts | 4 ++-- .../OfficeMembershipHandlers/FolderHandler.ts | 2 +- 29 files changed, 91 insertions(+), 70 deletions(-) diff --git a/src/app/api/admin/DeedTypesController.ts b/src/app/api/admin/DeedTypesController.ts index efa9d463..742d55b4 100644 --- a/src/app/api/admin/DeedTypesController.ts +++ b/src/app/api/admin/DeedTypesController.ts @@ -30,8 +30,9 @@ export default class DeedTypesController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.DeedTypesWhereInput = { office: { uid: officeId } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { office: officeWhereInput}; + query.where.office = officeWhereInput; //call service to get prisma entity const deedTypeEntities: DeedTypes[] = await this.deedTypesService.get(query); diff --git a/src/app/api/admin/DeedsController.ts b/src/app/api/admin/DeedsController.ts index 10da15b8..200c230f 100644 --- a/src/app/api/admin/DeedsController.ts +++ b/src/app/api/admin/DeedsController.ts @@ -30,8 +30,9 @@ export default class DeedsController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.DeedsWhereInput = { deed_type: { office: { uid: officeId } } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { deed_type : {office: officeWhereInput}}; + query.where.deed_type!.office = officeWhereInput; //call service to get prisma entity const deedEntities: Deeds[] = await this.deedsService.get(query); diff --git a/src/app/api/admin/DocumentTypesController.ts b/src/app/api/admin/DocumentTypesController.ts index 9d170efe..caf2ad33 100644 --- a/src/app/api/admin/DocumentTypesController.ts +++ b/src/app/api/admin/DocumentTypesController.ts @@ -30,8 +30,9 @@ export default class DocumentTypesController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.DocumentTypesWhereInput = { office: { uid: officeId } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { office: officeWhereInput}; + query.where.office = officeWhereInput; //call service to get prisma entity const documentTypeEntities: DocumentTypes[] = await this.documentTypesService.get(query); diff --git a/src/app/api/admin/DocumentsController.ts b/src/app/api/admin/DocumentsController.ts index 61c45686..4befe3f4 100644 --- a/src/app/api/admin/DocumentsController.ts +++ b/src/app/api/admin/DocumentsController.ts @@ -30,8 +30,9 @@ export default class DocumentsController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.DocumentsWhereInput = { document_type: { office: { uid: officeId } } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { document_type : {office: officeWhereInput}}; + query.where.document_type!.office = officeWhereInput; //call service to get prisma entity const documentEntities = await this.documentsService.get(query); diff --git a/src/app/api/admin/FilesController.ts b/src/app/api/admin/FilesController.ts index c7dab853..27e881b2 100644 --- a/src/app/api/admin/FilesController.ts +++ b/src/app/api/admin/FilesController.ts @@ -29,8 +29,9 @@ export default class FilesController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.FilesWhereInput = { document: { folder: { office: { uid: officeId } } } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { document: { folder: {office: officeWhereInput}}}; + query.where.document!.folder!.office = officeWhereInput; //call service to get prisma entity const fileEntities = await this.filesService.get(query); diff --git a/src/app/api/admin/OfficeFoldersController.ts b/src/app/api/admin/OfficeFoldersController.ts index 61130e69..0311e1fd 100644 --- a/src/app/api/admin/OfficeFoldersController.ts +++ b/src/app/api/admin/OfficeFoldersController.ts @@ -29,8 +29,10 @@ export default class OfficeFoldersController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.OfficeFoldersWhereInput = { office: { uid: officeId } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { office: officeWhereInput}; + query.where.office = officeWhereInput; + //call service to get prisma entity const officeFolderEntities: OfficeFolders[] = await this.officeFoldersService.get(query); diff --git a/src/app/api/admin/OfficeRolesController.ts b/src/app/api/admin/OfficeRolesController.ts index a8811e26..eb267dca 100644 --- a/src/app/api/admin/OfficeRolesController.ts +++ b/src/app/api/admin/OfficeRolesController.ts @@ -29,8 +29,9 @@ export default class OfficeRolesController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.OfficeRolesWhereInput = { office: { uid: officeId } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { office: officeWhereInput}; + query.where.office = officeWhereInput; //call service to get prisma entity const officeRolesEntities = await this.officeRolesService.get(query); diff --git a/src/app/api/admin/UsersController.ts b/src/app/api/admin/UsersController.ts index 282820d8..707a8ccf 100644 --- a/src/app/api/admin/UsersController.ts +++ b/src/app/api/admin/UsersController.ts @@ -28,8 +28,9 @@ export default class UsersController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.UsersWhereInput = { office_membership: { uid: officeId } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { office_membership: officeWhereInput}; + query.where.office_membership = officeWhereInput; //call service to get prisma entity const usersEntities = await this.usersService.get(query); diff --git a/src/app/api/notary/DeedTypesController.ts b/src/app/api/notary/DeedTypesController.ts index 549fb6c8..8c87de2a 100644 --- a/src/app/api/notary/DeedTypesController.ts +++ b/src/app/api/notary/DeedTypesController.ts @@ -30,8 +30,9 @@ export default class DeedTypesController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.DeedTypesWhereInput = { office: { uid: officeId } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { office: officeWhereInput}; + query.where.office = officeWhereInput; //call service to get prisma entity const deedTypeEntities: DeedTypes[] = await this.deedTypesService.get(query); diff --git a/src/app/api/notary/DeedsController.ts b/src/app/api/notary/DeedsController.ts index 45e08915..746c476e 100644 --- a/src/app/api/notary/DeedsController.ts +++ b/src/app/api/notary/DeedsController.ts @@ -30,8 +30,9 @@ export default class DeedsController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.DeedsWhereInput = { deed_type: { office: { uid: officeId } } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { deed_type : {office: officeWhereInput}}; + query.where.deed_type!.office = officeWhereInput; //call service to get prisma entity const deedEntities: Deeds[] = await this.deedsService.get(query); diff --git a/src/app/api/notary/DocumentTypesController.ts b/src/app/api/notary/DocumentTypesController.ts index 6bdbe117..7f55f97c 100644 --- a/src/app/api/notary/DocumentTypesController.ts +++ b/src/app/api/notary/DocumentTypesController.ts @@ -30,8 +30,9 @@ export default class DocumentTypesController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.DocumentTypesWhereInput = { office: { uid: officeId } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { office: officeWhereInput}; + query.where.office = officeWhereInput; //call service to get prisma entity const documentTypeEntities: DocumentTypes[] = await this.documentTypesService.get(query); diff --git a/src/app/api/notary/DocumentsController.ts b/src/app/api/notary/DocumentsController.ts index 41e53c10..35147482 100644 --- a/src/app/api/notary/DocumentsController.ts +++ b/src/app/api/notary/DocumentsController.ts @@ -30,8 +30,9 @@ export default class DocumentsController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.DocumentsWhereInput = { document_type: { office: { uid: officeId } } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { document_type : {office: officeWhereInput}}; + query.where.document_type!.office = officeWhereInput; //call service to get prisma entity const documentEntities = await this.documentsService.get(query); diff --git a/src/app/api/notary/FilesController.ts b/src/app/api/notary/FilesController.ts index fcd15ccd..009de81c 100644 --- a/src/app/api/notary/FilesController.ts +++ b/src/app/api/notary/FilesController.ts @@ -29,8 +29,9 @@ export default class FilesController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.FilesWhereInput = { document: { folder: { office: { uid: officeId } } } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { document: { folder: {office: officeWhereInput}}}; + query.where.document!.folder!.office = officeWhereInput; //call service to get prisma entity const fileEntities = await this.filesService.get(query); diff --git a/src/app/api/notary/OfficeFoldersController.ts b/src/app/api/notary/OfficeFoldersController.ts index 255540d7..6ab29975 100644 --- a/src/app/api/notary/OfficeFoldersController.ts +++ b/src/app/api/notary/OfficeFoldersController.ts @@ -29,8 +29,9 @@ export default class OfficeFoldersController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.OfficeFoldersWhereInput = { office: { uid: officeId } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { office: officeWhereInput}; + query.where.office = officeWhereInput; //call service to get prisma entity const officeFolderEntities: OfficeFolders[] = await this.officeFoldersService.get(query); diff --git a/src/app/api/notary/OfficeRolesController.ts b/src/app/api/notary/OfficeRolesController.ts index 99c02cec..4d4128f0 100644 --- a/src/app/api/notary/OfficeRolesController.ts +++ b/src/app/api/notary/OfficeRolesController.ts @@ -28,8 +28,9 @@ export default class OfficeRolesController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.OfficeRolesWhereInput = { office: { uid: officeId } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { office: officeWhereInput}; + query.where.office = officeWhereInput; //call service to get prisma entity const officeRolesEntities = await this.officeRolesService.get(query); diff --git a/src/app/api/notary/UsersController.ts b/src/app/api/notary/UsersController.ts index a3d74952..46683666 100644 --- a/src/app/api/notary/UsersController.ts +++ b/src/app/api/notary/UsersController.ts @@ -28,8 +28,9 @@ export default class UsersController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.UsersWhereInput = { office_membership: { uid: officeId } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { office_membership: officeWhereInput}; + query.where.office_membership = officeWhereInput; //call service to get prisma entity const usersEntities = await this.usersService.get(query); diff --git a/src/app/api/super-admin/CustomersController.ts b/src/app/api/super-admin/CustomersController.ts index 271988ea..56c718b0 100644 --- a/src/app/api/super-admin/CustomersController.ts +++ b/src/app/api/super-admin/CustomersController.ts @@ -22,7 +22,7 @@ export default class CustomersController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } @@ -120,7 +120,7 @@ export default class CustomersController extends ApiController { return; } - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/super-admin/DeedTypesController.ts b/src/app/api/super-admin/DeedTypesController.ts index 7eee309f..e2c8acba 100644 --- a/src/app/api/super-admin/DeedTypesController.ts +++ b/src/app/api/super-admin/DeedTypesController.ts @@ -30,8 +30,9 @@ export default class DeedTypesController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.DeedTypesWhereInput = { office: { uid: officeId } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { office: officeWhereInput}; + query.where.office = officeWhereInput; //call service to get prisma entity const deedTypeEntities: DeedTypes[] = await this.deedTypesService.get(query); @@ -131,7 +132,7 @@ export default class DeedTypesController extends ApiController { return; } - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/super-admin/DeedsController.ts b/src/app/api/super-admin/DeedsController.ts index d563acea..06e20d9d 100644 --- a/src/app/api/super-admin/DeedsController.ts +++ b/src/app/api/super-admin/DeedsController.ts @@ -30,8 +30,9 @@ export default class DeedsController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.DeedsWhereInput = { deed_type: { office: { uid: officeId } } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { deed_type : {office: officeWhereInput}}; + query.where.deed_type!.office = officeWhereInput; //call service to get prisma entity const deedEntities: Deeds[] = await this.deedsService.get(query); @@ -60,7 +61,7 @@ export default class DeedsController extends ApiController { return; } - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/super-admin/DocumentTypesController.ts b/src/app/api/super-admin/DocumentTypesController.ts index 353d6041..baceb4db 100644 --- a/src/app/api/super-admin/DocumentTypesController.ts +++ b/src/app/api/super-admin/DocumentTypesController.ts @@ -30,8 +30,9 @@ export default class DocumentTypesController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.DocumentTypesWhereInput = { office: { uid: officeId } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { office: officeWhereInput}; + query.where.office = officeWhereInput; //call service to get prisma entity const documentTypeEntities: DocumentTypes[] = await this.documentTypesService.get(query); @@ -125,7 +126,7 @@ export default class DocumentTypesController extends ApiController { return; } - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/super-admin/DocumentsController.ts b/src/app/api/super-admin/DocumentsController.ts index 317500b2..7ccdb18c 100644 --- a/src/app/api/super-admin/DocumentsController.ts +++ b/src/app/api/super-admin/DocumentsController.ts @@ -30,8 +30,9 @@ export default class DocumentsController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.DocumentsWhereInput = { document_type: { office: { uid: officeId } } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { document_type : {office: officeWhereInput}}; + query.where.document_type!.office = officeWhereInput; //call service to get prisma entity const documentEntities = await this.documentsService.get(query); @@ -160,7 +161,7 @@ export default class DocumentsController extends ApiController { return; } - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/super-admin/FilesController.ts b/src/app/api/super-admin/FilesController.ts index ed2572b2..cf085d5f 100644 --- a/src/app/api/super-admin/FilesController.ts +++ b/src/app/api/super-admin/FilesController.ts @@ -29,8 +29,10 @@ export default class FilesController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.FilesWhereInput = { document: { folder: { office: { uid: officeId } } } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { document: { folder: {office: officeWhereInput}}}; + query.where.document!.folder!.office = officeWhereInput; + //call service to get prisma entity const fileEntities = await this.filesService.get(query); @@ -123,7 +125,7 @@ export default class FilesController extends ApiController { return; } - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/super-admin/OfficeFoldersController.ts b/src/app/api/super-admin/OfficeFoldersController.ts index 73b74ceb..9e8278fd 100644 --- a/src/app/api/super-admin/OfficeFoldersController.ts +++ b/src/app/api/super-admin/OfficeFoldersController.ts @@ -29,8 +29,10 @@ export default class OfficeFoldersController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.OfficeFoldersWhereInput = { office: { uid: officeId } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { office: officeWhereInput}; + query.where.office = officeWhereInput; + //call service to get prisma entity const officeFolderEntities: OfficeFolders[] = await this.officeFoldersService.get(query); @@ -82,12 +84,7 @@ export default class OfficeFoldersController extends ApiController { return; } - let query = {}; - if (req.query["q"]) { - query = JSON.parse(req.query["q"] as string); - } - - const officeFolderFound = await this.officeFoldersService.getByUid(uid, query); + const officeFolderFound = await this.officeFoldersService.getByUid(uid); if (!officeFolderFound) { this.httpNotFoundRequest(response, "office folder not found"); @@ -129,7 +126,7 @@ export default class OfficeFoldersController extends ApiController { return; } - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/super-admin/OfficeRolesController.ts b/src/app/api/super-admin/OfficeRolesController.ts index e1e8cf58..021f05da 100644 --- a/src/app/api/super-admin/OfficeRolesController.ts +++ b/src/app/api/super-admin/OfficeRolesController.ts @@ -29,8 +29,9 @@ export default class OfficeRolesController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.OfficeRolesWhereInput = { office: { uid: officeId } }; - query.where = officeWhereInput; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { office: officeWhereInput}; + query.where.office = officeWhereInput; //call service to get prisma entity const officeRolesEntities = await this.officeRolesService.get(query); @@ -127,7 +128,7 @@ export default class OfficeRolesController extends ApiController { return; } - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/super-admin/OfficesController.ts b/src/app/api/super-admin/OfficesController.ts index 4803204c..d2c034b8 100644 --- a/src/app/api/super-admin/OfficesController.ts +++ b/src/app/api/super-admin/OfficesController.ts @@ -22,7 +22,7 @@ export default class OfficesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } @@ -107,7 +107,7 @@ export default class OfficesController extends ApiController { return; } - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/super-admin/RolesController.ts b/src/app/api/super-admin/RolesController.ts index f5f1924d..ba0683ab 100644 --- a/src/app/api/super-admin/RolesController.ts +++ b/src/app/api/super-admin/RolesController.ts @@ -22,7 +22,7 @@ export default class RolesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } @@ -122,7 +122,7 @@ export default class RolesController extends ApiController { return; } - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/super-admin/RulesController.ts b/src/app/api/super-admin/RulesController.ts index 09b0995d..c0bc87c1 100644 --- a/src/app/api/super-admin/RulesController.ts +++ b/src/app/api/super-admin/RulesController.ts @@ -22,7 +22,7 @@ export default class RulesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } @@ -121,7 +121,7 @@ export default class RulesController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index b4b84a47..629add48 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -22,7 +22,7 @@ export default class UsersController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } @@ -121,7 +121,7 @@ export default class UsersController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts index e63d8782..6c1ef63c 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts @@ -33,7 +33,7 @@ export default async function folderHandler(req: Request, response: Response, ne const officeFolderService = Container.get(OfficeFoldersService); - if (officeFolderNumber) { + if (officeFolderNumber && req.method == "POST") { const officeFoldersWithSameNumber = await officeFolderService.get({ where: { folder_number: officeFolderNumber, office: { uid: officeId } }, }); From d6c87b390b25d1f1d6f12ce7f749f952071e0503 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Tue, 11 Jul 2023 18:08:30 +0200 Subject: [PATCH 041/134] update resources version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 69b3c587..8ed48ae5 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "cors": "^2.8.5", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.55", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.56", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", From 3ca6a0565df067bd1f2548ed8ba10cdb15fc5b76 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Wed, 12 Jul 2023 17:40:18 +0200 Subject: [PATCH 042/134] add all namespace controllers --- src/app/index.ts | 100 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 78 insertions(+), 22 deletions(-) diff --git a/src/app/index.ts b/src/app/index.ts index 94124553..22f4d1f3 100644 --- a/src/app/index.ts +++ b/src/app/index.ts @@ -1,18 +1,46 @@ import { Container } from "typedi"; import HomeController from "./HomeController"; -import UsersController from "./api/super-admin/UsersController"; -import FoldersController from "./api/super-admin/OfficeFoldersController"; -import CustomersController from "./api/super-admin/CustomersController"; -import OfficesController from "./api/super-admin/OfficesController"; -import DeedsController from "./api/super-admin/DeedsController"; -import DeedTypesController from "./api/super-admin/DeedTypesController"; -import DocumentsController from "./api/super-admin/DocumentsController"; -import DocumentTypesController from "./api/super-admin/DocumentTypesController"; +import UsersControllerSuperAdmin from "./api/super-admin/UsersController"; +import FoldersControllerSuperAdmin from "./api/super-admin/OfficeFoldersController"; +import CustomersControllerSuperAdmin from "./api/super-admin/CustomersController"; +import OfficesControllerSuperAdmin from "./api/super-admin/OfficesController"; +import DeedsControllerSuperAdmin from "./api/super-admin/DeedsController"; +import DeedTypesControllerSuperAdmin from "./api/super-admin/DeedTypesController"; +import DocumentsControllerSuperAdmin from "./api/super-admin/DocumentsController"; +import DocumentTypesControllerSuperAdmin from "./api/super-admin/DocumentTypesController"; import IdNotUserController from "./api/idnot/UserController"; +import FranceConnectCustomerController from "./api/franceConnect/CustomerController"; +import FilesControllerSuperAdmin from "./api/super-admin/FilesController"; +import RulesControllerSuperAdmin from "./api/super-admin/RulesController"; +import RolesControllerSuperAdmin from "./api/super-admin/RolesController"; +import OfficeRolesControllerSuperAdmin from "./api/super-admin/OfficeRolesController"; +import UsersControllerAdmin from "./api/admin/UsersController"; +import FoldersControllerAdmin from "./api/admin/OfficeFoldersController"; +import CustomersControllerAdmin from "./api/admin/CustomersController"; +import OfficesControllerAdmin from "./api/admin/OfficesController"; +import DeedsControllerAdmin from "./api/admin/DeedsController"; +import DeedTypesControllerAdmin from "./api/admin/DeedTypesController"; +import DocumentsControllerAdmin from "./api/admin/DocumentsController"; +import DocumentTypesControllerAdmin from "./api/admin/DocumentTypesController"; +import FilesControllerAdmin from "./api/admin/FilesController"; +import RulesControllerAdmin from "./api/admin/RulesController"; +import RolesControllerAdmin from "./api/admin/RolesController"; +import OfficeRolesControllerAdmin from "./api/admin/OfficeRolesController"; +import UsersControllerNotary from "./api/notary/UsersController"; +import FoldersControllerNotary from "./api/notary/OfficeFoldersController"; +import CustomersControllerNotary from "./api/notary/CustomersController"; +import OfficesControllerNotary from "./api/notary/OfficesController"; +import DeedsControllerNotary from "./api/notary/DeedsController"; +import DeedTypesControllerNotary from "./api/notary/DeedTypesController"; +import DocumentsControllerNotary from "./api/notary/DocumentsController"; +import DocumentTypesControllerNotary from "./api/notary/DocumentTypesController"; +import FilesControllerNotary from "./api/notary/FilesController"; +import RulesControllerNotary from "./api/notary/RulesController"; +import RolesControllerNotary from "./api/notary/RolesController"; +import OfficeRolesControllerNotary from "./api/notary/OfficeRolesController"; +import FilesControllerCustomer from "./api/customer/FilesController"; import DocumentsControllerCustomer from "./api/customer/DocumentsController"; -import FilesController from "./api/super-admin/FilesController"; -import RulesController from "./api/super-admin/RulesController"; -import RolesController from "./api/super-admin/RolesController"; + /** * @description This allow to declare all controllers used in the application @@ -20,18 +48,46 @@ import RolesController from "./api/super-admin/RolesController"; export default { start: () => { Container.get(HomeController); - Container.get(UsersController); - Container.get(FoldersController); - Container.get(CustomersController); - Container.get(OfficesController); - Container.get(DeedsController); - Container.get(DeedTypesController); - Container.get(DocumentsController); - Container.get(DocumentTypesController); + Container.get(UsersControllerSuperAdmin); + Container.get(FoldersControllerSuperAdmin); + Container.get(CustomersControllerSuperAdmin); + Container.get(OfficesControllerSuperAdmin); + Container.get(DeedsControllerSuperAdmin); + Container.get(DeedTypesControllerSuperAdmin); + Container.get(DocumentsControllerSuperAdmin); + Container.get(DocumentTypesControllerSuperAdmin); Container.get(IdNotUserController); - Container.get(FilesController); + Container.get(FranceConnectCustomerController); + Container.get(FilesControllerSuperAdmin); + Container.get(DocumentsControllerSuperAdmin); + Container.get(RulesControllerSuperAdmin); + Container.get(RolesControllerSuperAdmin); + Container.get(OfficeRolesControllerSuperAdmin); + Container.get(UsersControllerAdmin); + Container.get(FoldersControllerAdmin); + Container.get(CustomersControllerAdmin); + Container.get(OfficesControllerAdmin); + Container.get(DeedsControllerAdmin); + Container.get(DeedTypesControllerAdmin); + Container.get(DocumentsControllerAdmin); + Container.get(DocumentTypesControllerAdmin); + Container.get(FilesControllerAdmin); + Container.get(RulesControllerAdmin); + Container.get(RolesControllerAdmin); + Container.get(OfficeRolesControllerAdmin); + Container.get(UsersControllerNotary); + Container.get(FoldersControllerNotary); + Container.get(CustomersControllerNotary); + Container.get(OfficesControllerNotary); + Container.get(DeedsControllerNotary); + Container.get(DeedTypesControllerNotary); + Container.get(DocumentsControllerNotary); + Container.get(DocumentTypesControllerNotary); + Container.get(FilesControllerNotary); + Container.get(RulesControllerNotary); + Container.get(RolesControllerNotary); + Container.get(OfficeRolesControllerNotary); + Container.get(FilesControllerCustomer); Container.get(DocumentsControllerCustomer); - Container.get(RulesController); - Container.get(RolesController); }, }; From 0bfe80b9a0b6e747eb35fd62c2a11c8edb060d31 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Wed, 12 Jul 2023 16:24:11 +0200 Subject: [PATCH 043/134] refacto GET method with search params for users --- src/app/api/admin/UsersController.ts | 19 +++++++++++++++++-- src/app/api/super-admin/UsersController.ts | 14 ++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/app/api/admin/UsersController.ts b/src/app/api/admin/UsersController.ts index 707a8ccf..8c2beb0e 100644 --- a/src/app/api/admin/UsersController.ts +++ b/src/app/api/admin/UsersController.ts @@ -27,9 +27,24 @@ export default class UsersController extends ApiController { if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } + + if (req.query["search"] && typeof req.query["search"] === "string") { + const filter = req.query["search"]; + query = { + where: { + contact: { + OR: [ + { first_name: { contains: filter, mode: "insensitive" } }, + { last_name: { contains: filter, mode: "insensitive" } }, + ], + }, + }, + }; + } + const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; - if(!query.where) query.where = { office_membership: officeWhereInput}; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId }; + if (!query.where) query.where = { office_membership: officeWhereInput }; query.where.office_membership = officeWhereInput; //call service to get prisma entity diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index 629add48..695725dd 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -27,6 +27,20 @@ export default class UsersController extends ApiController { query = JSON.parse(req.query["q"] as string); } + if (req.query["search"] && typeof req.query["search"] === "string") { + const filter = req.query["search"]; + query = { + where: { + contact: { + OR: [ + { first_name: { contains: filter, mode: "insensitive" } }, + { last_name: { contains: filter, mode: "insensitive" } }, + ], + }, + }, + }; + } + //call service to get prisma entity const usersEntities = await this.usersService.get(query); From 129cb6ad86913c22643c2e79fa185d327560a8db Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Wed, 12 Jul 2023 12:39:58 +0200 Subject: [PATCH 044/134] refacto GET method with search param for folders --- src/app/api/admin/OfficeFoldersController.ts | 29 ++++++++++++++++ src/app/api/notary/OfficeFoldersController.ts | 29 ++++++++++++++++ .../super-admin/OfficeFoldersController.ts | 34 +++++++++++++++++-- .../OfficeMembershipHandlers/FolderHandler.ts | 2 -- .../repositories/OfficeFoldersRepository.ts | 5 +-- 5 files changed, 90 insertions(+), 9 deletions(-) diff --git a/src/app/api/admin/OfficeFoldersController.ts b/src/app/api/admin/OfficeFoldersController.ts index 0311e1fd..0e225ce3 100644 --- a/src/app/api/admin/OfficeFoldersController.ts +++ b/src/app/api/admin/OfficeFoldersController.ts @@ -28,6 +28,35 @@ export default class OfficeFoldersController extends ApiController { if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } + + if (req.query["search"] && typeof req.query["search"] === "string") { + const filter = req.query["search"]; + query = { + where: { + OR: [ + { + name: { contains: filter, mode: "insensitive" }, + }, + { + folder_number: { contains: filter, mode: "insensitive" }, + }, + { + customers: { + some: { + contact: { + OR: [ + { first_name: { contains: filter, mode: "insensitive" } }, + { last_name: { contains: filter, mode: "insensitive" } }, + ], + }, + }, + }, + }, + ], + }, + }; + } + const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; if(!query.where) query.where = { office: officeWhereInput}; diff --git a/src/app/api/notary/OfficeFoldersController.ts b/src/app/api/notary/OfficeFoldersController.ts index 6ab29975..d4e0f6ff 100644 --- a/src/app/api/notary/OfficeFoldersController.ts +++ b/src/app/api/notary/OfficeFoldersController.ts @@ -28,6 +28,35 @@ export default class OfficeFoldersController extends ApiController { if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } + + if (req.query["search"] && typeof req.query["search"] === "string") { + const filter = req.query["search"]; + query = { + where: { + OR: [ + { + name: { contains: filter, mode: "insensitive" }, + }, + { + folder_number: { contains: filter, mode: "insensitive" }, + }, + { + customers: { + some: { + contact: { + OR: [ + { first_name: { contains: filter, mode: "insensitive" } }, + { last_name: { contains: filter, mode: "insensitive" } }, + ], + }, + }, + }, + }, + ], + }, + }; + } + const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; if(!query.where) query.where = { office: officeWhereInput}; diff --git a/src/app/api/super-admin/OfficeFoldersController.ts b/src/app/api/super-admin/OfficeFoldersController.ts index 9e8278fd..dcd1b29c 100644 --- a/src/app/api/super-admin/OfficeFoldersController.ts +++ b/src/app/api/super-admin/OfficeFoldersController.ts @@ -28,11 +28,39 @@ export default class OfficeFoldersController extends ApiController { if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } + + if (req.query["search"] && typeof req.query["search"] === "string") { + const filter = req.query["search"]; + query = { + where: { + OR: [ + { + name: { contains: filter, mode: "insensitive" }, + }, + { + folder_number: { contains: filter, mode: "insensitive" }, + }, + { + customers: { + some: { + contact: { + OR: [ + { first_name: { contains: filter, mode: "insensitive" } }, + { last_name: { contains: filter, mode: "insensitive" } }, + ], + }, + }, + }, + }, + ], + }, + }; + } const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; - if(!query.where) query.where = { office: officeWhereInput}; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId }; + if (!query.where) query.where = { office: officeWhereInput }; query.where.office = officeWhereInput; - + //call service to get prisma entity const officeFolderEntities: OfficeFolders[] = await this.officeFoldersService.get(query); diff --git a/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts index 6c1ef63c..1b3de999 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts @@ -12,14 +12,12 @@ export default async function folderHandler(req: Request, response: Response, ne const deed = req.body.deed; if (office && office.uid != officeId) { - console.log("wrong office"); response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } if (deed) { const deedTypeService = Container.get(DeedTypesService); - console.log("deed : ",deed); const deedTypeWithOffice = await deedTypeService.getByUidWithOffice(deed.deed_type.uid!); if (!deedTypeWithOffice) { response.status(HttpCodes.NOT_FOUND).send("Deed type not found"); diff --git a/src/common/repositories/OfficeFoldersRepository.ts b/src/common/repositories/OfficeFoldersRepository.ts index 43011a95..d391ef92 100644 --- a/src/common/repositories/OfficeFoldersRepository.ts +++ b/src/common/repositories/OfficeFoldersRepository.ts @@ -58,10 +58,7 @@ export default class OfficeFoldersRepository extends BaseRepository { /** * @description : Update data of an office folder */ - public async update( - officeFolderuid: string, - officeFolder: OfficeFolder, - ): Promise { + public async update(officeFolderuid: string, officeFolder: OfficeFolder): Promise { const updateArgs: Prisma.OfficeFoldersUpdateArgs = { where: { uid: officeFolderuid, From b1396c713bd76e7e2afeb3b652e01f9a7eecf50b Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Wed, 12 Jul 2023 17:37:23 +0200 Subject: [PATCH 045/134] refacto GET methods with search param for office roles --- package-lock.json | 34 +++++++++---------- src/app/api/admin/OfficeRolesController.ts | 21 +++++++++--- src/app/api/notary/OfficeRolesController.ts | 2 +- .../api/super-admin/OfficeRolesController.ts | 14 +++++++- .../OfficeRolesService/OfficeRolesService.ts | 4 +-- .../OfficeRolesService/OfficeRolesService.ts | 4 +-- .../OfficeRolesService/OfficeRolesService.ts | 4 +-- 7 files changed, 54 insertions(+), 29 deletions(-) diff --git a/package-lock.json b/package-lock.json index b7add4cc..de89f69f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "cors": "^2.8.5", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.55", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.56", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", @@ -1421,9 +1421,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.2.tgz", - "integrity": "sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==", + "version": "29.5.3", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.3.tgz", + "integrity": "sha512-1Nq7YrO/vJE/FYnqYyw0FS8LdrjExSgIiHyKg7xPpn+yi8Q4huZryKnkJatN1ZRH89Kw2v33/8ZMB7DuZeSLlA==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -2011,9 +2011,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001514", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001514.tgz", - "integrity": "sha512-ENcIpYBmwAAOm/V2cXgM7rZUrKKaqisZl4ZAI520FIkqGXUxJjmaIssbRW5HVVR5tyV6ygTLIm15aU8LUmQSaQ==", + "version": "1.0.30001515", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz", + "integrity": "sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA==", "funding": [ { "type": "opencollective", @@ -2421,9 +2421,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.454", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.454.tgz", - "integrity": "sha512-pmf1rbAStw8UEQ0sr2cdJtWl48ZMuPD9Sto8HVQOq9vx9j2WgDEN6lYoaqFvqEHYOmGA9oRGn7LqWI9ta0YugQ==", + "version": "1.4.457", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.457.tgz", + "integrity": "sha512-/g3UyNDmDd6ebeWapmAoiyy+Sy2HyJ+/X8KyvNeHfKRFfHaA2W8oF5fxD5F3tjBDcjpwo0iek6YNgxNXDBoEtA==", "dev": true }, "node_modules/emittery": { @@ -3926,7 +3926,7 @@ } }, "node_modules/le-coffre-resources": { - "resolved": "git+ssh://git@github.com/smart-chain-fr/leCoffre-resources.git#10eab2b6bde5cd085509b8510808477caff37a1e", + "resolved": "git+ssh://git@github.com/smart-chain-fr/leCoffre-resources.git#7768906229ee080d84687a6bad832b8c04adb355", "license": "MIT", "dependencies": { "class-transformer": "^0.5.1", @@ -4497,9 +4497,9 @@ "dev": true }, "node_modules/nodemon/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -5105,9 +5105,9 @@ } }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" diff --git a/src/app/api/admin/OfficeRolesController.ts b/src/app/api/admin/OfficeRolesController.ts index eb267dca..bd0029bd 100644 --- a/src/app/api/admin/OfficeRolesController.ts +++ b/src/app/api/admin/OfficeRolesController.ts @@ -20,7 +20,7 @@ export default class OfficeRolesController extends ApiController { /** * @description Get all officeRoles */ - @Get("/api/v1/admin/officeRoles", [authHandler, ruleHandler]) + @Get("/api/v1/admin/office-roles", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -28,9 +28,22 @@ export default class OfficeRolesController extends ApiController { if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } + + if(req.query["search"] && typeof req.query["search"] === "string") { + const filter = req.query["search"]; + query = { + where: { + name: { + contains: filter, + mode: "insensitive", + }, + }, + } + } + const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; - if(!query.where) query.where = { office: officeWhereInput}; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId }; + if (!query.where) query.where = { office: officeWhereInput }; query.where.office = officeWhereInput; //call service to get prisma entity @@ -132,7 +145,7 @@ export default class OfficeRolesController extends ApiController { if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } - + const officeRoleEntity = await this.officeRolesService.getByUid(uid, query); if (!officeRoleEntity) { diff --git a/src/app/api/notary/OfficeRolesController.ts b/src/app/api/notary/OfficeRolesController.ts index 4d4128f0..4794336b 100644 --- a/src/app/api/notary/OfficeRolesController.ts +++ b/src/app/api/notary/OfficeRolesController.ts @@ -19,7 +19,7 @@ export default class OfficeRolesController extends ApiController { /** * @description Get all officeRoles */ - @Get("/api/v1/notary/officeRoles", [authHandler, ruleHandler]) + @Get("/api/v1/notary/office-roles", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query diff --git a/src/app/api/super-admin/OfficeRolesController.ts b/src/app/api/super-admin/OfficeRolesController.ts index 021f05da..80d54d7e 100644 --- a/src/app/api/super-admin/OfficeRolesController.ts +++ b/src/app/api/super-admin/OfficeRolesController.ts @@ -20,7 +20,7 @@ export default class OfficeRolesController extends ApiController { /** * @description Get all officeRoles */ - @Get("/api/v1/super-admin/officeRoles", [authHandler, ruleHandler]) + @Get("/api/v1/super-admin/office-roles", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -28,6 +28,18 @@ export default class OfficeRolesController extends ApiController { if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } + + if(req.query["search"] && typeof req.query["search"] === "string") { + const filter = req.query["search"]; + query = { + where: { + name: { + contains: filter, + mode: "insensitive", + }, + }, + } + } const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; if(!query.where) query.where = { office: officeWhereInput}; diff --git a/src/services/admin/OfficeRolesService/OfficeRolesService.ts b/src/services/admin/OfficeRolesService/OfficeRolesService.ts index 2fb82f48..6ddbf1e5 100644 --- a/src/services/admin/OfficeRolesService/OfficeRolesService.ts +++ b/src/services/admin/OfficeRolesService/OfficeRolesService.ts @@ -11,8 +11,8 @@ export default class OfficeRolesService extends BaseService { } /** - * @description : Get all officeRoles - * @throws {Error} If officeRoles cannot be get + * @description : Get all office roles + * @throws {Error} If office roles cannot be get */ public get(query: Prisma.OfficeRolesFindManyArgs) { return this.officeRoleRepository.findMany(query); diff --git a/src/services/notary/OfficeRolesService/OfficeRolesService.ts b/src/services/notary/OfficeRolesService/OfficeRolesService.ts index 2c8f9f9e..242f92ab 100644 --- a/src/services/notary/OfficeRolesService/OfficeRolesService.ts +++ b/src/services/notary/OfficeRolesService/OfficeRolesService.ts @@ -10,8 +10,8 @@ export default class OfficeRolesService extends BaseService { } /** - * @description : Get all officeRoles - * @throws {Error} If officeRoles cannot be get + * @description : Get all office roles + * @throws {Error} If office roles cannot be get */ public get(query: Prisma.OfficeRolesFindManyArgs) { return this.officeRoleRepository.findMany(query); diff --git a/src/services/super-admin/OfficeRolesService/OfficeRolesService.ts b/src/services/super-admin/OfficeRolesService/OfficeRolesService.ts index b352b412..1dac2ba3 100644 --- a/src/services/super-admin/OfficeRolesService/OfficeRolesService.ts +++ b/src/services/super-admin/OfficeRolesService/OfficeRolesService.ts @@ -11,8 +11,8 @@ export default class OfficeRolesService extends BaseService { } /** - * @description : Get all officeRoles - * @throws {Error} If officeRoles cannot be get + * @description : Get all office roles + * @throws {Error} If office roles cannot be get */ public get(query: Prisma.OfficeRolesFindManyArgs) { return this.officeRoleRepository.findMany(query); From f3beea6c8c5e39bc9c30401300a8b4a495211fb5 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Thu, 13 Jul 2023 15:28:02 +0200 Subject: [PATCH 046/134] refacto GET method with search param for offices --- src/app/api/super-admin/OfficesController.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/app/api/super-admin/OfficesController.ts b/src/app/api/super-admin/OfficesController.ts index d2c034b8..32f7aa34 100644 --- a/src/app/api/super-admin/OfficesController.ts +++ b/src/app/api/super-admin/OfficesController.ts @@ -26,6 +26,19 @@ export default class OfficesController extends ApiController { if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } + + if(req.query["search"] && typeof req.query["search"] === "string") { + const filter = req.query["search"]; + query = { + where : { + name: { + contains: filter, + mode: "insensitive", + } + } + } + } + //call service to get prisma entity const officesEntities: Offices[] = await this.officesService.get(query); //Hydrate ressource with prisma entity From 8f40bd24641adae523661cf231f8dc7a305b142f Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Thu, 13 Jul 2023 15:32:47 +0200 Subject: [PATCH 047/134] refacto GET method with search param for deed types --- src/app/api/admin/DeedTypesController.ts | 13 +++++++++++++ src/app/api/super-admin/DeedTypesController.ts | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/app/api/admin/DeedTypesController.ts b/src/app/api/admin/DeedTypesController.ts index 742d55b4..dcdbb8cb 100644 --- a/src/app/api/admin/DeedTypesController.ts +++ b/src/app/api/admin/DeedTypesController.ts @@ -29,6 +29,19 @@ export default class DeedTypesController extends ApiController { if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } + + if (req.query["search"] && typeof req.query["search"] === "string") { + const filter = req.query["search"]; + query = { + where: { + name: { + contains: filter, + mode: "insensitive", + } + } + }; + } + const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; if(!query.where) query.where = { office: officeWhereInput}; diff --git a/src/app/api/super-admin/DeedTypesController.ts b/src/app/api/super-admin/DeedTypesController.ts index e2c8acba..0a499a8f 100644 --- a/src/app/api/super-admin/DeedTypesController.ts +++ b/src/app/api/super-admin/DeedTypesController.ts @@ -29,6 +29,19 @@ export default class DeedTypesController extends ApiController { if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } + + if (req.query["search"] && typeof req.query["search"] === "string") { + const filter = req.query["search"]; + query = { + where: { + name: { + contains: filter, + mode: "insensitive", + } + } + }; + } + const officeId: string = req.body.user.office_Id; const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; if(!query.where) query.where = { office: officeWhereInput}; From 47885ddbe152bc88284b056caed99047f454b338 Mon Sep 17 00:00:00 2001 From: Vins Date: Mon, 17 Jul 2023 15:20:01 +0200 Subject: [PATCH 048/134] Copied put roles into admin namespace --- src/app/api/admin/RolesController.ts | 44 +++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/src/app/api/admin/RolesController.ts b/src/app/api/admin/RolesController.ts index e40eb0f5..9445175b 100644 --- a/src/app/api/admin/RolesController.ts +++ b/src/app/api/admin/RolesController.ts @@ -1,11 +1,12 @@ import { Response, Request } from "express"; -import { Controller, Get } from "@ControllerPattern/index"; +import { Controller, Get, Put } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import RolesService from "@Services/admin/RolesService/RolesService"; import { Service } from "typedi"; import { Role } from "le-coffre-resources/dist/Admin"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import { validateOrReject } from "class-validator"; @Controller() @Service() @@ -74,4 +75,45 @@ export default class RolesController extends ApiController { return; } } + + /** + * @description Modify a specific role by uid + */ + @Put("/api/v1/super-admin/roles/:uid", [authHandler, ruleHandler]) + protected async put(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const roleFound = await this.rolesService.getByUid(uid); + + if (!roleFound) { + this.httpNotFoundRequest(response, "role not found"); + return; + } + + //init IRole resource with request body values + const roleEntity = Role.hydrate(req.body); + + //validate role + await validateOrReject(roleEntity, { groups: ["updateRole"] }); + + //call service to get prisma entity + const roleEntityUpdated = await this.rolesService.update(roleEntity); + + //Hydrate ressource with prisma entity + const role = Role.hydrate(roleEntityUpdated, { + strategy: "excludeAll", + }); + + //success + this.httpSuccess(response, role); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } } From d9f2c267f71272445353a836c50608b733017c81 Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 18 Jul 2023 11:13:42 +0200 Subject: [PATCH 049/134] Edited admin PUT OfficesRole, removed validation for demo --- package-lock.json | 167 ++++++++++----------- package.json | 2 +- src/app/api/admin/OfficeRolesController.ts | 2 +- src/app/api/admin/RolesController.ts | 46 +----- src/app/middlewares/RulesHandler.ts | 12 +- 5 files changed, 89 insertions(+), 140 deletions(-) diff --git a/package-lock.json b/package-lock.json index de89f69f..36602f19 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "cors": "^2.8.5", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.56", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.57", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", @@ -77,35 +77,35 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", - "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.8.tgz", - "integrity": "sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.7", - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-module-transforms": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", "@babel/helpers": "^7.22.6", "@babel/parser": "^7.22.7", "@babel/template": "^7.22.5", "@babel/traverse": "^7.22.8", "@babel/types": "^7.22.5", - "@nicolo-ribaudo/semver-v6": "^6.3.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2" + "json5": "^2.2.2", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -145,9 +145,9 @@ "dev": true }, "node_modules/@babel/generator": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", - "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", "dev": true, "dependencies": { "@babel/types": "^7.22.5", @@ -160,16 +160,16 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", - "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.6", + "@babel/compat-data": "^7.22.9", "@babel/helper-validator-option": "^7.22.5", - "@nicolo-ribaudo/semver-v6": "^6.3.3", "browserslist": "^4.21.9", - "lru-cache": "^5.1.1" + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -225,22 +225,22 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-module-imports": "^7.22.5", "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { @@ -1045,14 +1045,14 @@ "dev": true }, "node_modules/@next/env": { - "version": "13.4.9", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.9.tgz", - "integrity": "sha512-vuDRK05BOKfmoBYLNi2cujG2jrYbEod/ubSSyqgmEx9n/W3eZaJQdRNhTfumO+qmq/QTzLurW487n/PM/fHOkw==" + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.10.tgz", + "integrity": "sha512-3G1yD/XKTSLdihyDSa8JEsaWOELY+OWe08o0LUYzfuHp1zHDA8SObQlzKt+v+wrkkPcnPweoLH1ImZeUa0A1NQ==" }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.9", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.9.tgz", - "integrity": "sha512-TVzGHpZoVBk3iDsTOQA/R6MGmFp0+17SWXMEWd6zG30AfuELmSSMe2SdPqxwXU0gbpWkJL1KgfLzy5ReN0crqQ==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.10.tgz", + "integrity": "sha512-4bsdfKmmg7mgFGph0UorD1xWfZ5jZEw4kKRHYEeTK9bT1QnMbPVPlVXQRIiFPrhoDQnZUoa6duuPUJIEGLV1Jg==", "cpu": [ "arm64" ], @@ -1065,9 +1065,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.9", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.9.tgz", - "integrity": "sha512-aSfF1fhv28N2e7vrDZ6zOQ+IIthocfaxuMWGReB5GDriF0caTqtHttAvzOMgJgXQtQx6XhyaJMozLTSEXeNN+A==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.10.tgz", + "integrity": "sha512-ngXhUBbcZIWZWqNbQSNxQrB9T1V+wgfCzAor2olYuo/YpaL6mUYNUEgeBMhr8qwV0ARSgKaOp35lRvB7EmCRBg==", "cpu": [ "x64" ], @@ -1080,9 +1080,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.9", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.9.tgz", - "integrity": "sha512-JhKoX5ECzYoTVyIy/7KykeO4Z2lVKq7HGQqvAH+Ip9UFn1MOJkOnkPRB7v4nmzqAoY+Je05Aj5wNABR1N18DMg==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.10.tgz", + "integrity": "sha512-SjCZZCOmHD4uyM75MVArSAmF5Y+IJSGroPRj2v9/jnBT36SYFTORN8Ag/lhw81W9EeexKY/CUg2e9mdebZOwsg==", "cpu": [ "arm64" ], @@ -1095,9 +1095,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.9", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.9.tgz", - "integrity": "sha512-OOn6zZBIVkm/4j5gkPdGn4yqQt+gmXaLaSjRSO434WplV8vo2YaBNbSHaTM9wJpZTHVDYyjzuIYVEzy9/5RVZw==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.10.tgz", + "integrity": "sha512-F+VlcWijX5qteoYIOxNiBbNE8ruaWuRlcYyIRK10CugqI/BIeCDzEDyrHIHY8AWwbkTwe6GRHabMdE688Rqq4Q==", "cpu": [ "arm64" ], @@ -1110,9 +1110,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.9", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.9.tgz", - "integrity": "sha512-iA+fJXFPpW0SwGmx/pivVU+2t4zQHNOOAr5T378PfxPHY6JtjV6/0s1vlAJUdIHeVpX98CLp9k5VuKgxiRHUpg==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.10.tgz", + "integrity": "sha512-WDv1YtAV07nhfy3i1visr5p/tjiH6CeXp4wX78lzP1jI07t4PnHHG1WEDFOduXh3WT4hG6yN82EQBQHDi7hBrQ==", "cpu": [ "x64" ], @@ -1125,9 +1125,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.9", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.9.tgz", - "integrity": "sha512-rlNf2WUtMM+GAQrZ9gMNdSapkVi3koSW3a+dmBVp42lfugWVvnyzca/xJlN48/7AGx8qu62WyO0ya1ikgOxh6A==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.10.tgz", + "integrity": "sha512-zFkzqc737xr6qoBgDa3AwC7jPQzGLjDlkNmt/ljvQJ/Veri5ECdHjZCUuiTUfVjshNIIpki6FuP0RaQYK9iCRg==", "cpu": [ "x64" ], @@ -1140,9 +1140,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.9", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.9.tgz", - "integrity": "sha512-5T9ybSugXP77nw03vlgKZxD99AFTHaX8eT1ayKYYnGO9nmYhJjRPxcjU5FyYI+TdkQgEpIcH7p/guPLPR0EbKA==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.10.tgz", + "integrity": "sha512-IboRS8IWz5mWfnjAdCekkl8s0B7ijpWeDwK2O8CdgZkoCDY0ZQHBSGiJ2KViAG6+BJVfLvcP+a2fh6cdyBr9QQ==", "cpu": [ "arm64" ], @@ -1155,9 +1155,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.9", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.9.tgz", - "integrity": "sha512-ojZTCt1lP2ucgpoiFgrFj07uq4CZsq4crVXpLGgQfoFq00jPKRPgesuGPaz8lg1yLfvafkU3Jd1i8snKwYR3LA==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.10.tgz", + "integrity": "sha512-bSA+4j8jY4EEiwD/M2bol4uVEu1lBlgsGdvM+mmBm/BbqofNBfaZ2qwSbwE2OwbAmzNdVJRFRXQZ0dkjopTRaQ==", "cpu": [ "ia32" ], @@ -1170,9 +1170,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.9", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.9.tgz", - "integrity": "sha512-QbT03FXRNdpuL+e9pLnu+XajZdm/TtIXVYY4lA9t+9l0fLZbHXDYEKitAqxrOj37o3Vx5ufxiRAniaIebYDCgw==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.10.tgz", + "integrity": "sha512-g2+tU63yTWmcVQKDGY0MV1PjjqgZtwM4rB1oVVi/v0brdZAcrcTV+04agKzWtvWroyFz6IqtT0MoZJA7PNyLVw==", "cpu": [ "x64" ], @@ -1184,15 +1184,6 @@ "node": ">= 10" } }, - "node_modules/@nicolo-ribaudo/semver-v6": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", - "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@pinata/sdk": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@pinata/sdk/-/sdk-2.1.0.tgz", @@ -2011,9 +2002,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001515", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz", - "integrity": "sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA==", + "version": "1.0.30001516", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz", + "integrity": "sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==", "funding": [ { "type": "opencollective", @@ -2421,9 +2412,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.457", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.457.tgz", - "integrity": "sha512-/g3UyNDmDd6ebeWapmAoiyy+Sy2HyJ+/X8KyvNeHfKRFfHaA2W8oF5fxD5F3tjBDcjpwo0iek6YNgxNXDBoEtA==", + "version": "1.4.461", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.461.tgz", + "integrity": "sha512-1JkvV2sgEGTDXjdsaQCeSwYYuhLRphRpc+g6EHTFELJXEiznLt3/0pZ9JuAOQ5p2rI3YxKTbivtvajirIfhrEQ==", "dev": true }, "node_modules/emittery": { @@ -3926,7 +3917,7 @@ } }, "node_modules/le-coffre-resources": { - "resolved": "git+ssh://git@github.com/smart-chain-fr/leCoffre-resources.git#7768906229ee080d84687a6bad832b8c04adb355", + "resolved": "git+ssh://git@github.com/smart-chain-fr/leCoffre-resources.git#dffc2429ba6ceb4129deb56e308962799b9b572c", "license": "MIT", "dependencies": { "class-transformer": "^0.5.1", @@ -4340,11 +4331,11 @@ } }, "node_modules/next": { - "version": "13.4.9", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.9.tgz", - "integrity": "sha512-vtefFm/BWIi/eWOqf1GsmKG3cjKw1k3LjuefKRcL3iiLl3zWzFdPG3as6xtxrGO6gwTzzaO1ktL4oiHt/uvTjA==", + "version": "13.4.10", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.10.tgz", + "integrity": "sha512-4ep6aKxVTQ7rkUW2fBLhpBr/5oceCuf4KmlUpvG/aXuDTIf9mexNSpabUD6RWPspu6wiJJvozZREhXhueYO36A==", "dependencies": { - "@next/env": "13.4.9", + "@next/env": "13.4.10", "@swc/helpers": "0.5.1", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", @@ -4360,15 +4351,15 @@ "node": ">=16.8.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.9", - "@next/swc-darwin-x64": "13.4.9", - "@next/swc-linux-arm64-gnu": "13.4.9", - "@next/swc-linux-arm64-musl": "13.4.9", - "@next/swc-linux-x64-gnu": "13.4.9", - "@next/swc-linux-x64-musl": "13.4.9", - "@next/swc-win32-arm64-msvc": "13.4.9", - "@next/swc-win32-ia32-msvc": "13.4.9", - "@next/swc-win32-x64-msvc": "13.4.9" + "@next/swc-darwin-arm64": "13.4.10", + "@next/swc-darwin-x64": "13.4.10", + "@next/swc-linux-arm64-gnu": "13.4.10", + "@next/swc-linux-arm64-musl": "13.4.10", + "@next/swc-linux-x64-gnu": "13.4.10", + "@next/swc-linux-x64-musl": "13.4.10", + "@next/swc-win32-arm64-msvc": "13.4.10", + "@next/swc-win32-ia32-msvc": "13.4.10", + "@next/swc-win32-x64-msvc": "13.4.10" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", diff --git a/package.json b/package.json index 8ed48ae5..ec4e5eee 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "cors": "^2.8.5", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.56", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.57", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", diff --git a/src/app/api/admin/OfficeRolesController.ts b/src/app/api/admin/OfficeRolesController.ts index bd0029bd..282bd4dc 100644 --- a/src/app/api/admin/OfficeRolesController.ts +++ b/src/app/api/admin/OfficeRolesController.ts @@ -111,7 +111,7 @@ export default class OfficeRolesController extends ApiController { const officeRoleEntity = OfficeRole.hydrate(req.body); //validate officeRole - await validateOrReject(officeRoleEntity, { groups: ["updateOfficeRole"] }); + // await validateOrReject(officeRoleEntity, { groups: ["updateOfficeRole"] }); //call service to get prisma entity const officeRoleEntityUpdated = await this.officeRolesService.update(officeRoleEntity); diff --git a/src/app/api/admin/RolesController.ts b/src/app/api/admin/RolesController.ts index 9445175b..35a9da80 100644 --- a/src/app/api/admin/RolesController.ts +++ b/src/app/api/admin/RolesController.ts @@ -1,12 +1,11 @@ import { Response, Request } from "express"; -import { Controller, Get, Put } from "@ControllerPattern/index"; +import { Controller, Get } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import RolesService from "@Services/admin/RolesService/RolesService"; import { Service } from "typedi"; import { Role } from "le-coffre-resources/dist/Admin"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; -import { validateOrReject } from "class-validator"; @Controller() @Service() @@ -31,7 +30,7 @@ export default class RolesController extends ApiController { const rolesEntities = await this.rolesService.get(query); //Hydrate ressource with prisma entity - const roles = Role.hydrateArray(rolesEntities, { strategy: "excludeAll" }); + const roles = Role.hydrateArray(rolesEntities, { strategy: "excludeAll" }); //success this.httpSuccess(response, roles); @@ -75,45 +74,4 @@ export default class RolesController extends ApiController { return; } } - - /** - * @description Modify a specific role by uid - */ - @Put("/api/v1/super-admin/roles/:uid", [authHandler, ruleHandler]) - protected async put(req: Request, response: Response) { - try { - const uid = req.params["uid"]; - if (!uid) { - this.httpBadRequest(response, "No uid provided"); - return; - } - - const roleFound = await this.rolesService.getByUid(uid); - - if (!roleFound) { - this.httpNotFoundRequest(response, "role not found"); - return; - } - - //init IRole resource with request body values - const roleEntity = Role.hydrate(req.body); - - //validate role - await validateOrReject(roleEntity, { groups: ["updateRole"] }); - - //call service to get prisma entity - const roleEntityUpdated = await this.rolesService.update(roleEntity); - - //Hydrate ressource with prisma entity - const role = Role.hydrate(roleEntityUpdated, { - strategy: "excludeAll", - }); - - //success - this.httpSuccess(response, role); - } catch (error) { - this.httpInternalError(response, error); - return; - } - } } diff --git a/src/app/middlewares/RulesHandler.ts b/src/app/middlewares/RulesHandler.ts index 89df35a9..bf24fc55 100644 --- a/src/app/middlewares/RulesHandler.ts +++ b/src/app/middlewares/RulesHandler.ts @@ -4,13 +4,13 @@ import { NextFunction, Request, Response } from "express"; export default async function ruleHandler(req: Request, response: Response, next: NextFunction) { const rules = req.body.user.rules; const service = req.path && req.path.split("/")[4]; - const namespace = req.path && req.path.split("/")[3]; - const role = req.body.user.role; + // const namespace = req.path && req.path.split("/")[3]; + // const role = req.body.user.role; - if (namespace != "notary" && role != namespace) { - response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this role"); - return; - } + // if (namespace != "notary" && role != namespace) { + // response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this role"); + // return; + // } if (!rules.includes(req.method + " " + service)) { response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with those rules"); From bf0dfaf2e60c499381e23738107eabc6892ac35f Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Tue, 18 Jul 2023 14:11:30 +0200 Subject: [PATCH 050/134] :bug: Fixing crash when no rules in JWT --- src/app/middlewares/RulesHandler.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/app/middlewares/RulesHandler.ts b/src/app/middlewares/RulesHandler.ts index bf24fc55..33bd1c07 100644 --- a/src/app/middlewares/RulesHandler.ts +++ b/src/app/middlewares/RulesHandler.ts @@ -4,6 +4,11 @@ import { NextFunction, Request, Response } from "express"; export default async function ruleHandler(req: Request, response: Response, next: NextFunction) { const rules = req.body.user.rules; const service = req.path && req.path.split("/")[4]; + + if(!rules){ + response.status(HttpCodes.UNAUTHORIZED).send("Missing rules in JWT"); + return; + } // const namespace = req.path && req.path.split("/")[3]; // const role = req.body.user.role; From 4276ca0404f92a326cfa8c800bb8f100261f724e Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Tue, 18 Jul 2023 14:48:17 +0200 Subject: [PATCH 051/134] :bug: fix empty query in offices --- src/common/repositories/OfficesRepository.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/common/repositories/OfficesRepository.ts b/src/common/repositories/OfficesRepository.ts index f1b72517..cdc85202 100644 --- a/src/common/repositories/OfficesRepository.ts +++ b/src/common/repositories/OfficesRepository.ts @@ -20,7 +20,9 @@ export default class OfficesRepository extends BaseRepository { * @description : Find many users */ public async findMany(query: Prisma.OfficesFindManyArgs) { - query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); + if(query){ + query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); + } return this.model.findMany(query); } From 2f5720f2b3a52ec18ca94f5e7e17259137f3462c Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Mon, 24 Jul 2023 11:15:45 +0200 Subject: [PATCH 052/134] fix rule validator --- package.json | 2 +- src/app/api/admin/OfficeRolesController.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ec4e5eee..ad2b49f4 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "cors": "^2.8.5", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.57", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.58", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", diff --git a/src/app/api/admin/OfficeRolesController.ts b/src/app/api/admin/OfficeRolesController.ts index 282bd4dc..ffa402e7 100644 --- a/src/app/api/admin/OfficeRolesController.ts +++ b/src/app/api/admin/OfficeRolesController.ts @@ -111,7 +111,7 @@ export default class OfficeRolesController extends ApiController { const officeRoleEntity = OfficeRole.hydrate(req.body); //validate officeRole - // await validateOrReject(officeRoleEntity, { groups: ["updateOfficeRole"] }); + await validateOrReject(officeRoleEntity, { groups: ["updateOfficeRole"] }); //call service to get prisma entity const officeRoleEntityUpdated = await this.officeRolesService.update(officeRoleEntity); From ad4b43e56e8b0710ecaeca359e43b39aca114ecd Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Mon, 24 Jul 2023 13:59:47 +0200 Subject: [PATCH 053/134] feat(middlewares): add access to admin services for super-admin --- src/app/middlewares/RulesHandler.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/app/middlewares/RulesHandler.ts b/src/app/middlewares/RulesHandler.ts index 33bd1c07..001cb4cd 100644 --- a/src/app/middlewares/RulesHandler.ts +++ b/src/app/middlewares/RulesHandler.ts @@ -9,13 +9,13 @@ export default async function ruleHandler(req: Request, response: Response, next response.status(HttpCodes.UNAUTHORIZED).send("Missing rules in JWT"); return; } - // const namespace = req.path && req.path.split("/")[3]; - // const role = req.body.user.role; + const namespace = req.path && req.path.split("/")[3]; + const role = req.body.user.role; - // if (namespace != "notary" && role != namespace) { - // response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this role"); - // return; - // } + if (namespace != "notary" && role != namespace && role != "super-admin") { + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this role"); + return; + } if (!rules.includes(req.method + " " + service)) { response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with those rules"); From 399ed9ac3c39fa544f7169dbf2f4789e0273dbc9 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Mon, 24 Jul 2023 15:14:59 +0200 Subject: [PATCH 054/134] fix(controllers): include in GET queries --- src/app/api/admin/CustomersController.ts | 4 ++-- src/app/api/admin/DeedTypesController.ts | 2 +- src/app/api/admin/DeedsController.ts | 2 +- src/app/api/admin/DocumentTypesController.ts | 2 +- src/app/api/admin/DocumentsController.ts | 2 +- src/app/api/admin/FilesController.ts | 2 +- src/app/api/admin/OfficeFoldersController.ts | 2 +- src/app/api/admin/OfficeRolesController.ts | 2 +- src/app/api/admin/OfficesController.ts | 4 ++-- src/app/api/admin/RolesController.ts | 4 ++-- src/app/api/admin/RulesController.ts | 4 ++-- src/app/api/admin/UsersController.ts | 2 +- src/app/api/customer/DocumentsController.ts | 2 +- src/app/api/customer/FilesController.ts | 2 +- src/app/api/notary/CustomersController.ts | 4 ++-- src/app/api/notary/DeedTypesController.ts | 2 +- src/app/api/notary/DeedsController.ts | 2 +- src/app/api/notary/DocumentTypesController.ts | 2 +- src/app/api/notary/DocumentsController.ts | 2 +- src/app/api/notary/FilesController.ts | 2 +- src/app/api/notary/OfficeFoldersController.ts | 2 +- src/app/api/notary/OfficeRolesController.ts | 2 +- src/app/api/notary/OfficesController.ts | 4 ++-- src/app/api/notary/RolesController.ts | 4 ++-- src/app/api/notary/RulesController.ts | 4 ++-- src/app/api/notary/UsersController.ts | 2 +- 26 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/app/api/admin/CustomersController.ts b/src/app/api/admin/CustomersController.ts index 455a98a2..3b7ea244 100644 --- a/src/app/api/admin/CustomersController.ts +++ b/src/app/api/admin/CustomersController.ts @@ -22,7 +22,7 @@ export default class CustomersController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } @@ -120,7 +120,7 @@ export default class CustomersController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/admin/DeedTypesController.ts b/src/app/api/admin/DeedTypesController.ts index dcdbb8cb..bb42d6de 100644 --- a/src/app/api/admin/DeedTypesController.ts +++ b/src/app/api/admin/DeedTypesController.ts @@ -145,7 +145,7 @@ export default class DeedTypesController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/admin/DeedsController.ts b/src/app/api/admin/DeedsController.ts index 200c230f..ae35aa4b 100644 --- a/src/app/api/admin/DeedsController.ts +++ b/src/app/api/admin/DeedsController.ts @@ -61,7 +61,7 @@ export default class DeedsController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/admin/DocumentTypesController.ts b/src/app/api/admin/DocumentTypesController.ts index caf2ad33..9089bd6a 100644 --- a/src/app/api/admin/DocumentTypesController.ts +++ b/src/app/api/admin/DocumentTypesController.ts @@ -126,7 +126,7 @@ export default class DocumentTypesController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/admin/DocumentsController.ts b/src/app/api/admin/DocumentsController.ts index 4befe3f4..5696450c 100644 --- a/src/app/api/admin/DocumentsController.ts +++ b/src/app/api/admin/DocumentsController.ts @@ -161,7 +161,7 @@ export default class DocumentsController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/admin/FilesController.ts b/src/app/api/admin/FilesController.ts index 27e881b2..0317d12f 100644 --- a/src/app/api/admin/FilesController.ts +++ b/src/app/api/admin/FilesController.ts @@ -124,7 +124,7 @@ export default class FilesController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/admin/OfficeFoldersController.ts b/src/app/api/admin/OfficeFoldersController.ts index 0e225ce3..b5906906 100644 --- a/src/app/api/admin/OfficeFoldersController.ts +++ b/src/app/api/admin/OfficeFoldersController.ts @@ -155,7 +155,7 @@ export default class OfficeFoldersController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/admin/OfficeRolesController.ts b/src/app/api/admin/OfficeRolesController.ts index ffa402e7..9dfb2022 100644 --- a/src/app/api/admin/OfficeRolesController.ts +++ b/src/app/api/admin/OfficeRolesController.ts @@ -141,7 +141,7 @@ export default class OfficeRolesController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/admin/OfficesController.ts b/src/app/api/admin/OfficesController.ts index 7b7d6df7..99433c13 100644 --- a/src/app/api/admin/OfficesController.ts +++ b/src/app/api/admin/OfficesController.ts @@ -21,7 +21,7 @@ export default class OfficesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } @@ -49,7 +49,7 @@ export default class OfficesController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/admin/RolesController.ts b/src/app/api/admin/RolesController.ts index 35a9da80..32ab6440 100644 --- a/src/app/api/admin/RolesController.ts +++ b/src/app/api/admin/RolesController.ts @@ -21,7 +21,7 @@ export default class RolesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } @@ -52,7 +52,7 @@ export default class RolesController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/admin/RulesController.ts b/src/app/api/admin/RulesController.ts index 51bc900e..de343769 100644 --- a/src/app/api/admin/RulesController.ts +++ b/src/app/api/admin/RulesController.ts @@ -21,7 +21,7 @@ export default class RulesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } @@ -52,7 +52,7 @@ export default class RulesController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/admin/UsersController.ts b/src/app/api/admin/UsersController.ts index 8c2beb0e..365e05f8 100644 --- a/src/app/api/admin/UsersController.ts +++ b/src/app/api/admin/UsersController.ts @@ -73,7 +73,7 @@ export default class UsersController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/customer/DocumentsController.ts b/src/app/api/customer/DocumentsController.ts index 018918be..7b7784c9 100644 --- a/src/app/api/customer/DocumentsController.ts +++ b/src/app/api/customer/DocumentsController.ts @@ -57,7 +57,7 @@ export default class DocumentsController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/customer/FilesController.ts b/src/app/api/customer/FilesController.ts index 61cbddb3..76dd93ee 100644 --- a/src/app/api/customer/FilesController.ts +++ b/src/app/api/customer/FilesController.ts @@ -202,7 +202,7 @@ export default class FilesController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/notary/CustomersController.ts b/src/app/api/notary/CustomersController.ts index fcc50a29..59d070c7 100644 --- a/src/app/api/notary/CustomersController.ts +++ b/src/app/api/notary/CustomersController.ts @@ -22,7 +22,7 @@ export default class CustomersController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } @@ -121,7 +121,7 @@ export default class CustomersController extends ApiController { } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/notary/DeedTypesController.ts b/src/app/api/notary/DeedTypesController.ts index 8c87de2a..a1f44f4a 100644 --- a/src/app/api/notary/DeedTypesController.ts +++ b/src/app/api/notary/DeedTypesController.ts @@ -132,7 +132,7 @@ export default class DeedTypesController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/notary/DeedsController.ts b/src/app/api/notary/DeedsController.ts index 746c476e..52c664da 100644 --- a/src/app/api/notary/DeedsController.ts +++ b/src/app/api/notary/DeedsController.ts @@ -60,7 +60,7 @@ export default class DeedsController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/notary/DocumentTypesController.ts b/src/app/api/notary/DocumentTypesController.ts index 7f55f97c..6a1a81bd 100644 --- a/src/app/api/notary/DocumentTypesController.ts +++ b/src/app/api/notary/DocumentTypesController.ts @@ -126,7 +126,7 @@ export default class DocumentTypesController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/notary/DocumentsController.ts b/src/app/api/notary/DocumentsController.ts index 35147482..f676367d 100644 --- a/src/app/api/notary/DocumentsController.ts +++ b/src/app/api/notary/DocumentsController.ts @@ -161,7 +161,7 @@ export default class DocumentsController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/notary/FilesController.ts b/src/app/api/notary/FilesController.ts index 009de81c..26334d08 100644 --- a/src/app/api/notary/FilesController.ts +++ b/src/app/api/notary/FilesController.ts @@ -124,7 +124,7 @@ export default class FilesController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/notary/OfficeFoldersController.ts b/src/app/api/notary/OfficeFoldersController.ts index d4e0f6ff..af46d774 100644 --- a/src/app/api/notary/OfficeFoldersController.ts +++ b/src/app/api/notary/OfficeFoldersController.ts @@ -154,7 +154,7 @@ export default class OfficeFoldersController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/notary/OfficeRolesController.ts b/src/app/api/notary/OfficeRolesController.ts index 4794336b..55aea36a 100644 --- a/src/app/api/notary/OfficeRolesController.ts +++ b/src/app/api/notary/OfficeRolesController.ts @@ -58,7 +58,7 @@ export default class OfficeRolesController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/notary/OfficesController.ts b/src/app/api/notary/OfficesController.ts index 84f31110..52b8fede 100644 --- a/src/app/api/notary/OfficesController.ts +++ b/src/app/api/notary/OfficesController.ts @@ -21,7 +21,7 @@ export default class OfficesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } @@ -49,7 +49,7 @@ export default class OfficesController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/notary/RolesController.ts b/src/app/api/notary/RolesController.ts index dc74ced8..29da8bbd 100644 --- a/src/app/api/notary/RolesController.ts +++ b/src/app/api/notary/RolesController.ts @@ -21,7 +21,7 @@ export default class RolesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } @@ -52,7 +52,7 @@ export default class RolesController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/notary/RulesController.ts b/src/app/api/notary/RulesController.ts index fd822e3b..63d29165 100644 --- a/src/app/api/notary/RulesController.ts +++ b/src/app/api/notary/RulesController.ts @@ -21,7 +21,7 @@ export default class RulesController extends ApiController { protected async get(req: Request, response: Response) { try { //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } @@ -52,7 +52,7 @@ export default class RulesController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } diff --git a/src/app/api/notary/UsersController.ts b/src/app/api/notary/UsersController.ts index 46683666..49807103 100644 --- a/src/app/api/notary/UsersController.ts +++ b/src/app/api/notary/UsersController.ts @@ -58,7 +58,7 @@ export default class UsersController extends ApiController { return; } //get query - let query = {}; + let query; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } From 8fd59a13d8eee156e8819345659de572904dd0fd Mon Sep 17 00:00:00 2001 From: Vins Date: Mon, 17 Jul 2023 15:14:35 +0200 Subject: [PATCH 055/134] Added mailchimp feature + cron services --- Dockerfile-Cron | 46 +++++++ package-lock.json | 61 ++++++++- package.json | 8 +- src/app/api/notary/DocumentsController.ts | 9 +- .../migrations/20230711134012_/migration.sql | 43 +++++++ src/common/databases/schema.prisma | 16 +++ src/common/emails/EmailBuilder.ts | 50 ++++++++ src/common/emails/Templates/EmailTemplates.ts | 4 + src/common/repositories/EmailRepository.ts | 75 +++++++++++ src/entries/Cron.ts | 14 +++ .../common/CronService/CronService.ts | 24 ++++ .../MailchimpService/MailchimpService.ts | 116 ++++++++++++++++++ tsconfig.json | 4 +- 13 files changed, 463 insertions(+), 7 deletions(-) create mode 100644 Dockerfile-Cron create mode 100644 src/common/databases/migrations/20230711134012_/migration.sql create mode 100644 src/common/emails/EmailBuilder.ts create mode 100644 src/common/emails/Templates/EmailTemplates.ts create mode 100644 src/common/repositories/EmailRepository.ts create mode 100644 src/entries/Cron.ts create mode 100644 src/services/common/CronService/CronService.ts create mode 100644 src/services/common/MailchimpService/MailchimpService.ts diff --git a/Dockerfile-Cron b/Dockerfile-Cron new file mode 100644 index 00000000..3dbfefe4 --- /dev/null +++ b/Dockerfile-Cron @@ -0,0 +1,46 @@ +# Install dependencies only when needed +FROM node:19-alpine AS deps + +WORKDIR leCoffre + +RUN npm install -D prisma@4.11.0 +COPY package.json ./ + +RUN apk update && apk add openssh-client git + +COPY id_rsa /root/.ssh/id_rsa +RUN chmod 600 ~/.ssh/id_rsa +RUN eval "$(ssh-agent -s)" && ssh-add /root/.ssh/id_rsa +RUN ssh-keyscan github.com smart-chain-fr/leCoffre-resources.git >> /root/.ssh/known_hosts + +RUN npm install --frozen-lockfile + +# Rebuild the source code only when needed +FROM node:19-alpine AS builder + +WORKDIR leCoffre + +COPY --from=deps leCoffre/node_modules ./node_modules +COPY --from=deps leCoffre/package.json package.json +COPY tsconfig.json tsconfig.json +COPY src src + +RUN npx prisma generate +RUN npm run build + +# Production image, copy all the files and run next +FROM node:19-alpine AS production + +WORKDIR leCoffre + +RUN adduser -D lecoffreuser --uid 10000 && chown -R lecoffreuser . + +COPY --from=builder --chown=lecoffreuser leCoffre/node_modules ./node_modules +COPY --from=builder --chown=lecoffreuser leCoffre/dist dist +COPY --from=builder --chown=lecoffreuser leCoffre/package.json ./package.json +COPY --from=builder --chown=lecoffreuser leCoffre/src/common/databases ./src/common/databases + +USER lecoffreuser + +CMD ["npm", "run", "cron"] +EXPOSE 3001 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 36602f19..a6b784ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,12 +9,14 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "@mailchimp/mailchimp_transactional": "^1.0.50", "@pinata/sdk": "^2.1.0", "@prisma/client": "^4.11.0", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "classnames": "^2.3.2", "cors": "^2.8.5", + "cron": "^2.3.1", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.57", @@ -35,9 +37,12 @@ }, "devDependencies": { "@types/cors": "^2.8.13", + "@types/cron": "^2.0.1", "@types/express": "^4.17.16", "@types/jest": "^29.5.0", "@types/jsonwebtoken": "^9.0.1", + "@types/mailchimp__mailchimp_transactional": "^1.0.5", + "@types/module-alias": "^2.0.1", "@types/multer": "^1.4.7", "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.3", @@ -1044,6 +1049,17 @@ "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", "dev": true }, + "node_modules/@mailchimp/mailchimp_transactional": { + "version": "1.0.50", + "resolved": "https://registry.npmjs.org/@mailchimp/mailchimp_transactional/-/mailchimp_transactional-1.0.50.tgz", + "integrity": "sha512-SaNFseFPSDQlOYM9JTyYY6wauMu6qJ8eExo+jssFyb20ZaVvxKX1eTb3Gm5aW/4aWuxn6nofU+02sCk51//wdw==", + "dependencies": { + "axios": "^0.21.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@next/env": { "version": "13.4.10", "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.10.tgz", @@ -1348,6 +1364,16 @@ "@types/node": "*" } }, + "node_modules/@types/cron": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/cron/-/cron-2.0.1.tgz", + "integrity": "sha512-WHa/1rtNtD2Q/H0+YTTZoty+/5rcE66iAFX2IY+JuUoOACsevYyFkSYu/2vdw+G5LrmO7Lxowrqm0av4k3qWNQ==", + "dev": true, + "dependencies": { + "@types/luxon": "*", + "@types/node": "*" + } + }, "node_modules/@types/express": { "version": "4.17.17", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", @@ -1430,12 +1456,33 @@ "@types/node": "*" } }, + "node_modules/@types/luxon": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.1.tgz", + "integrity": "sha512-XOS5nBcgEeP2PpcqJHjCWhUCAzGfXIU8ILOSLpx2FhxqMW9KdxgCGXNOEKGVBfveKtIpztHzKK5vSRVLyW/NqA==", + "dev": true + }, + "node_modules/@types/mailchimp__mailchimp_transactional": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/mailchimp__mailchimp_transactional/-/mailchimp__mailchimp_transactional-1.0.5.tgz", + "integrity": "sha512-5LYI3dZcyVBtg+lNxhKBHrHnNeAVvlpPM0kO6FZcjrrMALK7wistwvqI8PAns2mnveC67OSN43y6wQkK6KeTNQ==", + "dev": true, + "dependencies": { + "axios": "^0.21.1" + } + }, "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", "dev": true }, + "node_modules/@types/module-alias": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/module-alias/-/module-alias-2.0.1.tgz", + "integrity": "sha512-DN/CCT1HQG6HquBNJdLkvV+4v5l/oEuwOHUPLxI+Eub0NED+lk0YUfba04WGH90EINiUrNgClkNnwGmbICeWMQ==", + "dev": true + }, "node_modules/@types/multer": { "version": "1.4.7", "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", @@ -1446,9 +1493,9 @@ } }, "node_modules/@types/node": { - "version": "18.16.19", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.19.tgz", - "integrity": "sha512-IXl7o+R9iti9eBW4Wg2hx1xQDig183jj7YLn8F7udNceyfkbn1ZxmzZXuak20gR40D7pIkIY1kYGx5VIGbaHKA==" + "version": "18.17.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.0.tgz", + "integrity": "sha512-GXZxEtOxYGFchyUzxvKI14iff9KZ2DI+A6a37o6EQevtg6uO9t+aUZKcaC1Te5Ng1OnLM7K9NVVj+FbecD9cJg==" }, "node_modules/@types/node-fetch": { "version": "2.6.4", @@ -2287,6 +2334,14 @@ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, + "node_modules/cron": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/cron/-/cron-2.3.1.tgz", + "integrity": "sha512-1eRRlIT0UfIqauwbG9pkg3J6CX9A6My2ytJWqAXoK0T9oJnUZTzGBNPxao0zjodIbPgf8UQWjE62BMb9eVllSQ==", + "dependencies": { + "luxon": "^3.2.1" + } + }, "node_modules/cron-parser": { "version": "4.8.1", "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.8.1.tgz", diff --git a/package.json b/package.json index ad2b49f4..9acb0afe 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "build-db": "npx prisma migrate dev", "build": "tsc", "start": "node ./dist/entries/App.js", + "cron": "node ./dist/entries/Cron.js", "api:start": "npm run migrate && npm run start", "dev": "nodemon -V", "format": "prettier --write src", @@ -41,12 +42,14 @@ }, "homepage": "https://github.com/smart-chain-fr/leCoffre-back#readme", "dependencies": { + "@mailchimp/mailchimp_transactional": "^1.0.50", "@pinata/sdk": "^2.1.0", "@prisma/client": "^4.11.0", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "classnames": "^2.3.2", "cors": "^2.8.5", + "cron": "^2.3.1", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.58", @@ -67,9 +70,12 @@ }, "devDependencies": { "@types/cors": "^2.8.13", + "@types/cron": "^2.0.1", "@types/express": "^4.17.16", "@types/jest": "^29.5.0", "@types/jsonwebtoken": "^9.0.1", + "@types/mailchimp__mailchimp_transactional": "^1.0.5", + "@types/module-alias": "^2.0.1", "@types/multer": "^1.4.7", "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.3", @@ -84,6 +90,6 @@ }, "prisma": { "schema": "src/common/databases/schema.prisma", - "seed": "ts-node src/common/databases/seeders/seeder2.ts" + "seed": "ts-node src/common/databases/seeders/seeder.ts" } } diff --git a/src/app/api/notary/DocumentsController.ts b/src/app/api/notary/DocumentsController.ts index f676367d..29fa5492 100644 --- a/src/app/api/notary/DocumentsController.ts +++ b/src/app/api/notary/DocumentsController.ts @@ -9,11 +9,12 @@ import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import documentHandler from "@App/middlewares/OfficeMembershipHandlers/DocumentHandler"; +import EmailBuilder from "@Common/emails/EmailBuilder"; @Controller() @Service() export default class DocumentsController extends ApiController { - constructor(private documentsService: DocumentsService) { + constructor(private documentsService: DocumentsService, private emailBuilder: EmailBuilder) { super(); } @@ -64,6 +65,9 @@ export default class DocumentsController extends ApiController { //call service to get prisma entity const documentEntityCreated = await this.documentsService.create(documentEntity); + //create email for asked document + this.emailBuilder.sendDocumentEmails(documentEntityCreated); + //Hydrate ressource with prisma entity const document = Document.hydrate(documentEntityCreated, { strategy: "excludeAll", @@ -105,6 +109,9 @@ export default class DocumentsController extends ApiController { //call service to get prisma entity const documentEntityUpdated: Documents = await this.documentsService.update(uid, documentEntity, req.body.refused_reason); + //create email for asked document + this.emailBuilder.sendDocumentEmails(documentEntityUpdated); + //Hydrate ressource with prisma entity const document = Document.hydrate(documentEntityUpdated, { strategy: "excludeAll" }); diff --git a/src/common/databases/migrations/20230711134012_/migration.sql b/src/common/databases/migrations/20230711134012_/migration.sql new file mode 100644 index 00000000..205eb444 --- /dev/null +++ b/src/common/databases/migrations/20230711134012_/migration.sql @@ -0,0 +1,43 @@ +-- DropForeignKey +ALTER TABLE "users" DROP CONSTRAINT "users_contact_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "users" DROP CONSTRAINT "users_office_role_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "users" DROP CONSTRAINT "users_office_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "users" DROP CONSTRAINT "users_roles_uid_fkey"; + +-- CreateTable +CREATE TABLE "email" ( + "uid" TEXT NOT NULL, + "templateName" VARCHAR(255) NOT NULL, + "from" VARCHAR(255), + "to" VARCHAR(255) NOT NULL, + "subject" VARCHAR(255) NOT NULL, + "templateVariables" JSON NOT NULL DEFAULT '{}', + "cc" VARCHAR(255)[], + "cci" VARCHAR(255)[], + "sentAt" TIMESTAMP(3), + "nbTrySend" INTEGER DEFAULT 0, + "lastTrySendDate" TIMESTAMP(3), + + CONSTRAINT "email_pkey" PRIMARY KEY ("uid") +); + +-- CreateIndex +CREATE UNIQUE INDEX "email_uid_key" ON "email"("uid"); + +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_contact_uid_fkey" FOREIGN KEY ("contact_uid") REFERENCES "contacts"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_roles_uid_fkey" FOREIGN KEY ("roles_uid") REFERENCES "roles"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_office_role_uid_fkey" FOREIGN KEY ("office_role_uid") REFERENCES "office_roles"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_office_uid_fkey" FOREIGN KEY ("office_uid") REFERENCES "offices"("uid") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/src/common/databases/schema.prisma b/src/common/databases/schema.prisma index 35e7d73c..26a6ecc3 100644 --- a/src/common/databases/schema.prisma +++ b/src/common/databases/schema.prisma @@ -270,6 +270,22 @@ model Rules { @@map("rules") } +model Emails { + uid String @id @unique @default(uuid()) + templateName String @db.VarChar(255) + from String? @db.VarChar(255) + to String @db.VarChar(255) + subject String @db.VarChar(255) + templateVariables Json @default("{}") @db.Json + cc String[] @db.VarChar(255) + cci String[] @db.VarChar(255) + sentAt DateTime? + nbTrySend Int? @default(0) + lastTrySendDate DateTime? + + @@map("email") +} + enum ECivility { MALE FEMALE diff --git a/src/common/emails/EmailBuilder.ts b/src/common/emails/EmailBuilder.ts new file mode 100644 index 00000000..b66c8238 --- /dev/null +++ b/src/common/emails/EmailBuilder.ts @@ -0,0 +1,50 @@ + +import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; +import { Documents } from "@prisma/client"; +import { Document } from "le-coffre-resources/dist/SuperAdmin"; +import { Service } from "typedi"; +import { ETemplates } from "./Templates/EmailTemplates"; +import MailchimpService from "@Services/common/MailchimpService/MailchimpService"; + +@Service() +export default class EmailBuilder { + public constructor(private mailchimpService: MailchimpService ,private documentsService: DocumentsService){} + + public async sendDocumentEmails(documentEntity: Documents){ + if(documentEntity.document_status !== "ASKED" && documentEntity.document_status !== "REFUSED") return; + + const documentPrisma = await this.documentsService.getByUid(documentEntity.uid, { depositor: {include: {contact: true}}, folder:{include:{ office: true}} }); + if(!documentPrisma) throw new Error("Document not found"); + const document = Document.hydrate(documentPrisma); + const to = document.depositor!.contact!.email; + + const templateVariables = { + civility: document.depositor!.contact!.civility, + last_name: document.depositor!.contact!.last_name, + office_name: document.folder!.office!.name, + link: "http://localhost:3000" + }; + + let templateName = ETemplates.DOCUMENT_ASKED; + let subject = "Document Asked"; + if(documentEntity.document_status === "REFUSED"){ + templateName = ETemplates.DOCUMENT_REFUSED; + subject = "Document Refused"; + } + + this.mailchimpService.create({ + templateName, + to, + subject, + templateVariables, + uid: "", + from: null, + cc: [], + cci: [], + sentAt: null, + nbTrySend: null, + lastTrySendDate: null, + }); + + } +} diff --git a/src/common/emails/Templates/EmailTemplates.ts b/src/common/emails/Templates/EmailTemplates.ts new file mode 100644 index 00000000..28f7f6fc --- /dev/null +++ b/src/common/emails/Templates/EmailTemplates.ts @@ -0,0 +1,4 @@ +export const ETemplates = { + DOCUMENT_ASKED: "DOCUMENT_ASKED", + DOCUMENT_REFUSED: "DOCUMENT_REFUSED", +}; \ No newline at end of file diff --git a/src/common/repositories/EmailRepository.ts b/src/common/repositories/EmailRepository.ts new file mode 100644 index 00000000..82c9fa0f --- /dev/null +++ b/src/common/repositories/EmailRepository.ts @@ -0,0 +1,75 @@ +import Database from "@Common/databases/database"; +import BaseRepository from "@Repositories/BaseRepository"; +import { Service } from "typedi"; +import { Emails, Prisma } from "prisma/prisma-client"; + +@Service() +export default class EmailRepository extends BaseRepository { + constructor(private database: Database) { + super(); + } + protected get model() { + return this.database.getClient().emails; + } + protected get instanceDb() { + return this.database.getClient(); + } + + /** + * @description : Find many emails + */ + public async findMany(query: Prisma.EmailsFindManyArgs) { + query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); + return this.model.findMany(query); + } + + /** + * @description : Create an email + */ + public async create(email: Emails): Promise { + const createArgs: Prisma.EmailsCreateArgs = { + data: { + templateName: email.templateName, + from: email.from, + to: email.to, + subject: email.subject, + templateVariables: email.templateVariables!, + cc: email.cc, + cci: email.cci, + }, + }; + return this.model.create(createArgs); + } + + /** + * @description : update given email + */ + public async update(uid: string, email: Emails): Promise { + const updateArgs: Prisma.EmailsUpdateArgs = { + where: { + uid: uid, + }, + data: { + sentAt: email.sentAt, + nbTrySend: email.nbTrySend, + lastTrySendDate: email.lastTrySendDate, + }, + }; + + return this.model.update(updateArgs); + } + + /** + * @description : find unique email + */ + public async findOneByUid(uid: string) { + return this.model.findUnique({ + where: { + uid: uid, + }, + }); + } + + + +} diff --git a/src/entries/Cron.ts b/src/entries/Cron.ts new file mode 100644 index 00000000..5baa198f --- /dev/null +++ b/src/entries/Cron.ts @@ -0,0 +1,14 @@ +import "module-alias/register"; +import "reflect-metadata"; +import { Container } from "typedi"; +import CronService from "@Services/common/CronService/CronService"; + +(async () => { + try { + if(process.env["MAILCHIMP_API_KEY"] === "ppd"){ + Container.get(CronService).sendMails(); + } + } catch (e) { + console.error(e); + } +})(); diff --git a/src/services/common/CronService/CronService.ts b/src/services/common/CronService/CronService.ts new file mode 100644 index 00000000..321e0a91 --- /dev/null +++ b/src/services/common/CronService/CronService.ts @@ -0,0 +1,24 @@ +import { Service } from "typedi"; +import { CronJob } from "cron"; +import MailchimpService from "../MailchimpService/MailchimpService"; + + +@Service() +export default class CronService { + constructor(private mailchimpService: MailchimpService) {} + + public async sendMails() { + const cronJob = new CronJob("*/15 * * * * *", async () => { + try { + await this.mailchimpService.sendEmails(); + } catch (e) { + console.error(e); + } + }); + + // Start job + if (!cronJob.running) { + cronJob.start(); + } + } +} diff --git a/src/services/common/MailchimpService/MailchimpService.ts b/src/services/common/MailchimpService/MailchimpService.ts new file mode 100644 index 00000000..f3a8e11b --- /dev/null +++ b/src/services/common/MailchimpService/MailchimpService.ts @@ -0,0 +1,116 @@ +import EmailRepository from "@Repositories/EmailRepository"; +import BaseService from "@Services/BaseService"; +import { Emails } from "@prisma/client"; +import { Service } from "typedi"; +import MailchimpClient from "@mailchimp/mailchimp_transactional"; + +@Service() +export default class MailchimpService extends BaseService { + // private static readonly mailchimp = new Mailchimp(process.env.MAILCHIMP_API_KEY); + private static readonly from = "vincent.alamelle@smart-chain.fr"; + + constructor(private emailRepository: EmailRepository) { + super(); + } + + /** + * @description : Get all emails + * @throws {Error} If emails cannot be get + */ + public async get(query: any): Promise { + return this.emailRepository.findMany(query); + } + + /** + * @description : Create a new email + * @throws {Error} If email cannot be created + */ + public async create(emailEntity: Emails): Promise { + emailEntity.from = MailchimpService.from; + return this.emailRepository.create(emailEntity); + } + + /** + * @description : Modify an email + * @throws {Error} If email cannot be modified + */ + public async update(uid: string, emailEntity: Emails): Promise { + return this.emailRepository.update(uid, emailEntity); + } + + /** + * @description : Get a email by uid + * @throws {Error} If email cannot be get + */ + public async getByUid(uid: string, query?: any): Promise { + return this.emailRepository.findOneByUid(uid); + } + + /** + * @description : Function called by cron to send emails + * @throws {Error} If email cannot be sent + */ + public async sendEmails() { + const emailsToSend = await this.get({ where: { sentAt: null } }); + const currentDate = new Date(); + let nextTrySendDate = null; + + for (const email of emailsToSend) { + //If tries exceed 10, we stop trying to send the email + if (email.nbTrySend && email.nbTrySend > 9) continue; + + //If email has never been sent, we send it + if (email.nbTrySend == 0) { + nextTrySendDate = currentDate; + } + //If email has already been sent, we send it again every nbTrySend^2 minutes + else { + nextTrySendDate = new Date(email.lastTrySendDate!); + nextTrySendDate.setMinutes(nextTrySendDate.getMinutes() + Math.pow(email.nbTrySend!, 2)); + } + + //If the next try send date is passed, we send the email + if (currentDate >= nextTrySendDate) { + try { + await this.sendEmail(email); + email.sentAt = currentDate; + } catch (error) { + email.lastTrySendDate = currentDate; + email.nbTrySend = email.nbTrySend! + 1; + } + await this.update(email.uid, email); + } + } + } + + private async sendEmail(email: Emails) { + const apiKey = process.env["MAILCHIMP_API_KEY"]; + const mailchimpApiClient = MailchimpClient(apiKey!); + + await mailchimpApiClient.messages.sendTemplate({ + template_name: email.templateName, + template_content: [], + message: { + global_merge_vars: this.buildVariables(email.templateVariables), + from_email: email.from!, + from_name: "LeCoffre.io", + subject: email.subject, + to: [ + { + email: email.to, + type: "to", + }, + ], + }, + }); + } + + private buildVariables(templateVariables: any) { + return Object.keys(templateVariables).map((key) => { + return { + name: key, + content: templateVariables[key], + }; + }); + } +} diff --git a/tsconfig.json b/tsconfig.json index 88257ffd..bd89006e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -90,11 +90,11 @@ "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "allowJs": true, - "isolatedModules": true + "isolatedModules": true, }, "include": [ "**/*.ts", - "**/*.tsx", + "**/*.tsx", "src/services/common/TestService", ], "exclude": [ "node_modules" From ffa9f63c057179abeda0a82d504645b7fc522e05 Mon Sep 17 00:00:00 2001 From: Vins Date: Mon, 24 Jul 2023 16:33:57 +0200 Subject: [PATCH 056/134] Removed connect office on PUT documentType --- src/common/repositories/DocumentTypesRepository.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/common/repositories/DocumentTypesRepository.ts b/src/common/repositories/DocumentTypesRepository.ts index f395bc91..a8b3ad3f 100644 --- a/src/common/repositories/DocumentTypesRepository.ts +++ b/src/common/repositories/DocumentTypesRepository.ts @@ -56,11 +56,6 @@ export default class DocumentTypesRepository extends BaseRepository { public_description: documentType.public_description, private_description: documentType.private_description, archived_at: documentType.archived_at, - office: { - connect: { - uid: documentType.office!.uid, - }, - }, }, }; From e659db364282ac3639633e762c02785391d27d3a Mon Sep 17 00:00:00 2001 From: Vins Date: Mon, 24 Jul 2023 16:56:17 +0200 Subject: [PATCH 057/134] Edited user idNot --- src/common/databases/seeders/seeder.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/common/databases/seeders/seeder.ts b/src/common/databases/seeders/seeder.ts index c4ff80e3..324b9e68 100644 --- a/src/common/databases/seeders/seeder.ts +++ b/src/common/databases/seeders/seeder.ts @@ -24,12 +24,12 @@ export default async function main() { return result; }; - const idNot1 = randomString(); - const idNot2 = randomString(); - const idNot3 = randomString(); - const idNot4 = randomString(); - const idNot5 = randomString(); - const idNot6 = randomString(); + const idNot1 = "dlefvlef"; + const idNot2 = "jelkvelknvlkn"; + const idNot3 = "rleenrenlnr"; + const idNot4 = "ljfeflecnmd"; + const idNot5 = "rflrefrjf"; + const idNot6 = "er3ojfdlfnd"; const addresses: Address[] = [ { From 9d70c36b135f0b8fe7e8575dc712063a5e45ef37 Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 09:25:50 +0200 Subject: [PATCH 058/134] Seeder done --- src/common/databases/seeders/seeder.ts | 28 +++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/common/databases/seeders/seeder.ts b/src/common/databases/seeders/seeder.ts index 324b9e68..fe7f6bb5 100644 --- a/src/common/databases/seeders/seeder.ts +++ b/src/common/databases/seeders/seeder.ts @@ -177,21 +177,21 @@ export default async function main() { const contacts: Contact[] = [ { address: addresses[0], - first_name: "Manon", - last_name: "Simon", - email: "manon.simon@gmail.com", + first_name: "Arnaud", + last_name: "Daubernatali", + email: "arnaud.daubernatali@smart-chain.fr", phone_number: "06 12 34 56 78", cell_phone_number: "06 12 34 56 78", birthdate: null, created_at: new Date(), updated_at: new Date(), - civility: ECivility.FEMALE, + civility: ECivility.MALE, }, { address: addresses[1], - first_name: "Kevin", - last_name: "Hautefaye", - email: "kevin.hautefaye@gmail.com", + first_name: "Maxime", + last_name: "Lalo", + email: "maxime.lalo@smart-chain.fr", phone_number: "06 23 45 67 89", cell_phone_number: "06 23 45 67 89", birthdate: null, @@ -201,9 +201,9 @@ export default async function main() { }, { address: addresses[2], - first_name: "Maxime", - last_name: "Lalo", - email: "maxime.lalo@gmail.com", + first_name: "Vincent", + last_name: "Alamelle", + email: "vincent.alamelle@smart-chain.fr", phone_number: "06 34 56 78 90", cell_phone_number: "06 34 56 78 90", birthdate: null, @@ -213,15 +213,15 @@ export default async function main() { }, { address: addresses[3], - first_name: "Vincent", - last_name: "Brognard", - email: "vincent.brognard@gmail.com", + first_name: "Melissa", + last_name: "Desde", + email: "melissa.desde@smart-chain.fr", phone_number: "06 45 67 89 01", cell_phone_number: "06 45 67 89 01", birthdate: null, created_at: new Date(), updated_at: new Date(), - civility: ECivility.MALE, + civility: ECivility.FEMALE, }, { address: addresses[4], From b35b41259a2a45d9ae1cc0f98ed9a65e0ce1cbf6 Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 09:50:55 +0200 Subject: [PATCH 059/134] Run cron stg --- src/entries/Cron.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/entries/Cron.ts b/src/entries/Cron.ts index 5baa198f..6a8aea78 100644 --- a/src/entries/Cron.ts +++ b/src/entries/Cron.ts @@ -5,7 +5,7 @@ import CronService from "@Services/common/CronService/CronService"; (async () => { try { - if(process.env["MAILCHIMP_API_KEY"] === "ppd"){ + if(process.env["MAILCHIMP_API_KEY"] === "stg"){ Container.get(CronService).sendMails(); } } catch (e) { From bd2518bb3825cd70d2f47c3810970e6f9a671e04 Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 10:04:26 +0200 Subject: [PATCH 060/134] Set mailchimp api key correctly --- src/common/config/variables/Variables.ts | 4 ++++ src/services/common/MailchimpService/MailchimpService.ts | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/common/config/variables/Variables.ts b/src/common/config/variables/Variables.ts index 41ee2912..d391818e 100644 --- a/src/common/config/variables/Variables.ts +++ b/src/common/config/variables/Variables.ts @@ -60,6 +60,9 @@ export class BackendVariables { @IsNotEmpty() public readonly REFRESH_TOKEN_SECRET!: string; + @IsNotEmpty() + public readonly MAILCHIMP_API_KEY!: string; + public constructor() { dotenv.config(); this.DATABASE_PORT = process.env["DATABASE_PORT"]!; @@ -80,6 +83,7 @@ export class BackendVariables { this.PINATA_GATEWAY = process.env["PINATA_GATEWAY"]!; this.ACCESS_TOKEN_SECRET = process.env["ACCESS_TOKEN_SECRET"]!; this.REFRESH_TOKEN_SECRET = process.env["REFRESH_TOKEN_SECRET"]!; + this.MAILCHIMP_API_KEY = process.env["MAILCHIMP_API_KEY"]!; } public async validate(groups?: string[]) { const validationOptions = groups ? { groups } : undefined; diff --git a/src/services/common/MailchimpService/MailchimpService.ts b/src/services/common/MailchimpService/MailchimpService.ts index f3a8e11b..a14b0b9b 100644 --- a/src/services/common/MailchimpService/MailchimpService.ts +++ b/src/services/common/MailchimpService/MailchimpService.ts @@ -3,13 +3,13 @@ import BaseService from "@Services/BaseService"; import { Emails } from "@prisma/client"; import { Service } from "typedi"; import MailchimpClient from "@mailchimp/mailchimp_transactional"; +import { BackendVariables } from "@Common/config/variables/Variables"; @Service() export default class MailchimpService extends BaseService { - // private static readonly mailchimp = new Mailchimp(process.env.MAILCHIMP_API_KEY); private static readonly from = "vincent.alamelle@smart-chain.fr"; - constructor(private emailRepository: EmailRepository) { + constructor(private emailRepository: EmailRepository, protected variables: BackendVariables) { super(); } @@ -84,7 +84,7 @@ export default class MailchimpService extends BaseService { } private async sendEmail(email: Emails) { - const apiKey = process.env["MAILCHIMP_API_KEY"]; + const apiKey = this.variables.MAILCHIMP_API_KEY; const mailchimpApiClient = MailchimpClient(apiKey!); await mailchimpApiClient.messages.sendTemplate({ From 18497903a3d50e1a4a214739b1775b256170e08c Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 10:07:24 +0200 Subject: [PATCH 061/134] Added env variable --- src/common/config/variables/Variables.ts | 4 ++++ src/entries/Cron.ts | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/common/config/variables/Variables.ts b/src/common/config/variables/Variables.ts index d391818e..2db58fb1 100644 --- a/src/common/config/variables/Variables.ts +++ b/src/common/config/variables/Variables.ts @@ -63,6 +63,9 @@ export class BackendVariables { @IsNotEmpty() public readonly MAILCHIMP_API_KEY!: string; + @IsNotEmpty() + public readonly ENV!: string; + public constructor() { dotenv.config(); this.DATABASE_PORT = process.env["DATABASE_PORT"]!; @@ -84,6 +87,7 @@ export class BackendVariables { this.ACCESS_TOKEN_SECRET = process.env["ACCESS_TOKEN_SECRET"]!; this.REFRESH_TOKEN_SECRET = process.env["REFRESH_TOKEN_SECRET"]!; this.MAILCHIMP_API_KEY = process.env["MAILCHIMP_API_KEY"]!; + this.ENV = process.env["ENV"]!; } public async validate(groups?: string[]) { const validationOptions = groups ? { groups } : undefined; diff --git a/src/entries/Cron.ts b/src/entries/Cron.ts index 6a8aea78..a6ab8381 100644 --- a/src/entries/Cron.ts +++ b/src/entries/Cron.ts @@ -2,10 +2,12 @@ import "module-alias/register"; import "reflect-metadata"; import { Container } from "typedi"; import CronService from "@Services/common/CronService/CronService"; +import { BackendVariables } from "@Common/config/variables/Variables"; (async () => { try { - if(process.env["MAILCHIMP_API_KEY"] === "stg"){ + const variables = await Container.get(BackendVariables).validate(); + if(variables.ENV === "stg"){ Container.get(CronService).sendMails(); } } catch (e) { From df176847c0197f58b279c60577a06de9f0a6650c Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 10:20:01 +0200 Subject: [PATCH 062/134] Log variables error --- src/common/config/variables/Variables.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/config/variables/Variables.ts b/src/common/config/variables/Variables.ts index 2db58fb1..8778b561 100644 --- a/src/common/config/variables/Variables.ts +++ b/src/common/config/variables/Variables.ts @@ -94,11 +94,11 @@ export class BackendVariables { try { await validateOrReject(this, validationOptions); - } catch (error) { + } catch (error: any) { if (process.env["NODE_ENV"] === "development") { throw error; } - throw new Error("Some env variables are required!"); + throw new Error("Some env variables are required!", error); } return this; } From 4668fcb88fe74a2b59fd879eb91441b37c868e2a Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 10:50:09 +0200 Subject: [PATCH 063/134] Edit variables error --- src/common/config/variables/Variables.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/common/config/variables/Variables.ts b/src/common/config/variables/Variables.ts index 8778b561..3de8232d 100644 --- a/src/common/config/variables/Variables.ts +++ b/src/common/config/variables/Variables.ts @@ -90,6 +90,8 @@ export class BackendVariables { this.ENV = process.env["ENV"]!; } public async validate(groups?: string[]) { + console.log(this); + const validationOptions = groups ? { groups } : undefined; try { @@ -98,7 +100,9 @@ export class BackendVariables { if (process.env["NODE_ENV"] === "development") { throw error; } - throw new Error("Some env variables are required!", error); + console.error(error); + console.error(this); + throw new Error("Some env variables are required!"); } return this; } From 69585af4dbc14f75aca113d1bda42537adcc2021 Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 11:02:08 +0200 Subject: [PATCH 064/134] Fixed env vars --- src/common/config/variables/Variables.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/common/config/variables/Variables.ts b/src/common/config/variables/Variables.ts index 3de8232d..cffedcf9 100644 --- a/src/common/config/variables/Variables.ts +++ b/src/common/config/variables/Variables.ts @@ -31,8 +31,6 @@ export class BackendVariables { @IsNotEmpty() public readonly APP_ROOT_URL!: string; - public readonly NODE_ENV = process.env.NODE_ENV; - @IsNotEmpty() public readonly IDNOT_CONNEXION_URL!: string; @@ -97,7 +95,7 @@ export class BackendVariables { try { await validateOrReject(this, validationOptions); } catch (error: any) { - if (process.env["NODE_ENV"] === "development") { + if (process.env["ENV"] === "dev") { throw error; } console.error(error); From ed0a41acaf6bde703675923068496f792ca84d91 Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 11:14:18 +0200 Subject: [PATCH 065/134] Fix cron service --- src/common/config/variables/Variables.ts | 4 +-- src/entries/Cron.ts | 31 ++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/src/common/config/variables/Variables.ts b/src/common/config/variables/Variables.ts index cffedcf9..18898180 100644 --- a/src/common/config/variables/Variables.ts +++ b/src/common/config/variables/Variables.ts @@ -87,9 +87,7 @@ export class BackendVariables { this.MAILCHIMP_API_KEY = process.env["MAILCHIMP_API_KEY"]!; this.ENV = process.env["ENV"]!; } - public async validate(groups?: string[]) { - console.log(this); - + public async validate(groups?: string[]) { const validationOptions = groups ? { groups } : undefined; try { diff --git a/src/entries/Cron.ts b/src/entries/Cron.ts index a6ab8381..62a2bb93 100644 --- a/src/entries/Cron.ts +++ b/src/entries/Cron.ts @@ -1,16 +1,43 @@ import "module-alias/register"; import "reflect-metadata"; import { Container } from "typedi"; -import CronService from "@Services/common/CronService/CronService"; +import ExpressServer from "@Common/system/ExpressServer"; +import routes from "@App/index"; +import cors from "cors"; +import bodyParser from "body-parser"; +import errorHandler from "@App/middlewares/ErrorHandler"; import { BackendVariables } from "@Common/config/variables/Variables"; +import multer from "multer"; +import CronService from "@Services/common/CronService/CronService"; + +const storage = multer.memoryStorage(); (async () => { try { const variables = await Container.get(BackendVariables).validate(); + if(variables.ENV === "stg"){ Container.get(CronService).sendMails(); } + const port = variables.APP_PORT; + const rootUrl = variables.APP_ROOT_URL; + const label = variables.APP_LABEL ?? "Unknown Service"; + + Container.get(ExpressServer).init({ + label, + port: parseInt(port), + rootUrl, + middlwares: [ + cors({ origin: "*" }), + multer({ storage: storage }).single("file"), + bodyParser.urlencoded({ extended: true }), + bodyParser.json(), + ], + errorHandler, + }); + + routes.start(); } catch (e) { console.error(e); } -})(); +})(); \ No newline at end of file From b6ce63cfa977f72c8261dbda70dd98a3cf9b6600 Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 11:16:17 +0200 Subject: [PATCH 066/134] fix --- src/entries/Cron.ts | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/src/entries/Cron.ts b/src/entries/Cron.ts index 62a2bb93..c6331797 100644 --- a/src/entries/Cron.ts +++ b/src/entries/Cron.ts @@ -1,17 +1,9 @@ import "module-alias/register"; import "reflect-metadata"; import { Container } from "typedi"; -import ExpressServer from "@Common/system/ExpressServer"; -import routes from "@App/index"; -import cors from "cors"; -import bodyParser from "body-parser"; -import errorHandler from "@App/middlewares/ErrorHandler"; import { BackendVariables } from "@Common/config/variables/Variables"; -import multer from "multer"; import CronService from "@Services/common/CronService/CronService"; -const storage = multer.memoryStorage(); - (async () => { try { const variables = await Container.get(BackendVariables).validate(); @@ -19,24 +11,6 @@ const storage = multer.memoryStorage(); if(variables.ENV === "stg"){ Container.get(CronService).sendMails(); } - const port = variables.APP_PORT; - const rootUrl = variables.APP_ROOT_URL; - const label = variables.APP_LABEL ?? "Unknown Service"; - - Container.get(ExpressServer).init({ - label, - port: parseInt(port), - rootUrl, - middlwares: [ - cors({ origin: "*" }), - multer({ storage: storage }).single("file"), - bodyParser.urlencoded({ extended: true }), - bodyParser.json(), - ], - errorHandler, - }); - - routes.start(); } catch (e) { console.error(e); } From 3049dfcd75c5cd66b3fdb12d1e3767cba55134e3 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Tue, 25 Jul 2023 11:34:38 +0200 Subject: [PATCH 067/134] fix(middlewares): add error catcher --- src/app/middlewares/AuthHandler.ts | 35 +++--- .../CustomerHandler/DocumentHandler.ts | 34 +++--- .../CustomerHandler/FileHandler.ts | 2 + .../OfficeMembershipHandlers/DeedHandler.ts | 61 ++++++----- .../DeedTypeHandler.ts | 67 ++++++------ .../DocumentHandler.ts | 93 ++++++++-------- .../DocumentTypeHandler.ts | 47 ++++---- .../OfficeMembershipHandlers/FileHandler.ts | 68 ++++++------ .../OfficeMembershipHandlers/FolderHandler.ts | 101 ++++++++++-------- .../OfficeRoleHandler.ts | 47 ++++---- .../OfficeMembershipHandlers/UserHandler.ts | 46 ++++---- src/app/middlewares/RulesHandler.ts | 43 ++++---- src/common/config/variables/Variables.ts | 5 +- 13 files changed, 362 insertions(+), 287 deletions(-) diff --git a/src/app/middlewares/AuthHandler.ts b/src/app/middlewares/AuthHandler.ts index 4166834e..bd3f1293 100644 --- a/src/app/middlewares/AuthHandler.ts +++ b/src/app/middlewares/AuthHandler.ts @@ -4,21 +4,28 @@ import { NextFunction, Request, Response } from "express"; import Container from "typedi"; export default function authHandler(req: Request, response: Response, next: NextFunction) { - const authHeader = req.headers["authorization"]; - const token = authHeader && authHeader.split(" ")[1]; + try { + const authHeader = req.headers["authorization"]; + const token = authHeader && authHeader.split(" ")[1]; - if (!token) { - response.status(HttpCodes.UNAUTHORIZED).send("Missing token in authorization header"); - return; - } - - const authService = Container.get(AuthService); - authService.verifyAccessToken(token, (err, userPayload) => { - if (err) { - response.status(HttpCodes.UNAUTHORIZED).send("Error while verifying token"); + if (!token) { + response.status(HttpCodes.UNAUTHORIZED).send("Missing token in authorization header"); return; } - req.body.user = userPayload; - next(); - }); + + const authService = Container.get(AuthService); + authService.verifyAccessToken(token, (err, userPayload) => { + if (err) { + response.status(HttpCodes.UNAUTHORIZED).send("Error while verifying token"); + return; + } + req.body.user = userPayload; + next(); + }); + + } catch (error) { + console.log(error); + response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); + return; + } } diff --git a/src/app/middlewares/CustomerHandler/DocumentHandler.ts b/src/app/middlewares/CustomerHandler/DocumentHandler.ts index 8963aab8..f263f7dd 100644 --- a/src/app/middlewares/CustomerHandler/DocumentHandler.ts +++ b/src/app/middlewares/CustomerHandler/DocumentHandler.ts @@ -4,20 +4,28 @@ import { NextFunction, Request, Response } from "express"; import Container from "typedi"; export default async function documentHandler(req: Request, response: Response, next: NextFunction) { - const customerId = req.body.user.customerId; - const uid = req.path && req.path.split("/")[5]; + try { + const customerId = req.body.user.customerId; + const uid = req.path && req.path.split("/")[5]; - if(!uid) { - response.status(HttpCodes.BAD_REQUEST).send("Missing document uid"); + if (!uid) { + response.status(HttpCodes.BAD_REQUEST).send("Missing document uid"); + return; + } + + const documentService = Container.get(DocumentsService); + const document = await documentService.getByUid(uid); + + if (document?.depositor_uid != customerId) { + response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this depositor"); + return; + } + + next(); + + } catch (error) { + console.log(error); + response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); return; } - - const documentService = Container.get(DocumentsService); - const document = await documentService.getByUid(uid); - - if(document?.depositor_uid != customerId) { - response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this depositor"); - return; - } - } diff --git a/src/app/middlewares/CustomerHandler/FileHandler.ts b/src/app/middlewares/CustomerHandler/FileHandler.ts index 3f86ccb9..0c9d82a1 100644 --- a/src/app/middlewares/CustomerHandler/FileHandler.ts +++ b/src/app/middlewares/CustomerHandler/FileHandler.ts @@ -34,4 +34,6 @@ export default async function fileHandler(req: Request, response: Response, next return; } } + + next(); } diff --git a/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts index 7ca6d7fc..f4986dc7 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts @@ -6,39 +6,46 @@ import Container from "typedi"; import DocumentTypesService from "@Services/super-admin/DocumentTypesService/DocumentTypesService"; export default async function deedHandler(req: Request, response: Response, next: NextFunction) { - const officeId = req.body.user.office_Id; - const uid = req.path && req.path.split("/")[5]; - const documentTypes: DocumentType[] = req.body.document_types; + try { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const documentTypes: DocumentType[] = req.body.document_types; - if (uid) { - const deedService = Container.get(DeedsService); - const deed = await deedService.getByUidWithOffice(uid); + if (uid) { + const deedService = Container.get(DeedsService); + const deed = await deedService.getByUidWithOffice(uid); - if (!deed) { - response.status(HttpCodes.NOT_FOUND).send("Deed not found"); - return; - } - - if (deed.deed_type.office.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); - return; - } - } - - if (documentTypes) { - const documentTypeService = Container.get(DocumentTypesService); - documentTypes.forEach(async (documentType) => { - const deedTypeWithOffice = await documentTypeService.getByUidWithOffice(documentType.uid!); - if (!deedTypeWithOffice) { - response.status(HttpCodes.NOT_FOUND).send("Deed type not found"); + if (!deed) { + response.status(HttpCodes.NOT_FOUND).send("Deed not found"); return; } - if (deedTypeWithOffice.office?.uid != officeId) { + + if (deed.deed_type.office.uid != officeId) { response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } - }); - } + } - next(); + if (documentTypes) { + const documentTypeService = Container.get(DocumentTypesService); + documentTypes.forEach(async (documentType) => { + const deedTypeWithOffice = await documentTypeService.getByUidWithOffice(documentType.uid!); + if (!deedTypeWithOffice) { + response.status(HttpCodes.NOT_FOUND).send("Deed type not found"); + return; + } + if (deedTypeWithOffice.office?.uid != officeId) { + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); + return; + } + }); + } + + next(); + + } catch (error) { + console.log(error); + response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); + return; + } } diff --git a/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts index 2836b3d5..d3e04e43 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts @@ -6,45 +6,52 @@ import Container from "typedi"; import DocumentTypesService from "@Services/super-admin/DocumentTypesService/DocumentTypesService"; export default async function deedTypeHandler(req: Request, response: Response, next: NextFunction) { - const officeId = req.body.user.office_Id; - const uid = req.path && req.path.split("/")[5]; - const documentTypes: DocumentType[] = req.body.document_types; - const office = req.body.office; + try { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const documentTypes: DocumentType[] = req.body.document_types; + const office = req.body.office; - if (office && office.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); - return; - } - - if (uid) { - const deedTypeService = Container.get(DeedTypesService); - const deedType = await deedTypeService.getByUidWithOffice(uid!); - - if (!deedType) { - response.status(HttpCodes.NOT_FOUND).send("Deed type not found"); - return; - } - - if (deedType.office.uid != officeId) { + if (office && office.uid != officeId) { response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } - } - if (documentTypes) { - const documentTypeService = Container.get(DocumentTypesService); - documentTypes.forEach(async (documentType) => { - const documentTypeWithOffice = await documentTypeService.getByUidWithOffice(documentType.uid!); - if (!documentTypeWithOffice) { - response.status(HttpCodes.NOT_FOUND).send("Document type not found"); + if (uid) { + const deedTypeService = Container.get(DeedTypesService); + const deedType = await deedTypeService.getByUidWithOffice(uid!); + + if (!deedType) { + response.status(HttpCodes.NOT_FOUND).send("Deed type not found"); return; } - if (documentTypeWithOffice.office?.uid != officeId) { + + if (deedType.office.uid != officeId) { response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } - }); - } + } - next(); + if (documentTypes) { + const documentTypeService = Container.get(DocumentTypesService); + documentTypes.forEach(async (documentType) => { + const documentTypeWithOffice = await documentTypeService.getByUidWithOffice(documentType.uid!); + if (!documentTypeWithOffice) { + response.status(HttpCodes.NOT_FOUND).send("Document type not found"); + return; + } + if (documentTypeWithOffice.office?.uid != officeId) { + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); + return; + } + }); + } + + next(); + + } catch (error) { + console.log(error); + response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); + return; + } } diff --git a/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts index 62470f16..9d684de0 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts @@ -8,51 +8,58 @@ import DocumentTypesService from "@Services/super-admin/DocumentTypesService/Doc import OfficeFoldersService from "@Services/super-admin/OfficeFoldersService/OfficeFoldersService"; export default async function documentHandler(req: Request, response: Response, next: NextFunction) { - const officeId = req.body.user.office_Id; - const uid = req.path && req.path.split("/")[5]; - const documentType: DocumentType = req.body.document_type; - const folder: OfficeFolder = req.body.folder; + try { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const documentType: DocumentType = req.body.document_type; + const folder: OfficeFolder = req.body.folder; - if (folder) { - const officeFolderService = Container.get(OfficeFoldersService); - const officeFolderWithOffice = await officeFolderService.getByUidWithOffice(folder.uid!); - if (!officeFolderWithOffice) { - response.status(HttpCodes.NOT_FOUND).send("Folder not found"); - return; + if (folder) { + const officeFolderService = Container.get(OfficeFoldersService); + const officeFolderWithOffice = await officeFolderService.getByUidWithOffice(folder.uid!); + if (!officeFolderWithOffice) { + response.status(HttpCodes.NOT_FOUND).send("Folder not found"); + return; + } + if (officeFolderWithOffice.office?.uid != officeId) { + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); + return; + } } - if (officeFolderWithOffice.office?.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); - return; + + if (documentType) { + const documentTypeService = Container.get(DocumentTypesService); + const documentTypeWithOffice = await documentTypeService.getByUidWithOffice(documentType.uid!); + if (!documentTypeWithOffice) { + response.status(HttpCodes.NOT_FOUND).send("Document type not found"); + return; + } + if (documentTypeWithOffice.office?.uid != officeId) { + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); + return; + } } + + if (uid) { + const documentService = Container.get(DocumentsService); + const document = await documentService.getByUidWithOffice(uid!); + + if (!document) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + + if (document.document_type.office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + next(); + + } catch (error) { + console.log(error); + response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); + return; } - - if (documentType) { - const documentTypeService = Container.get(DocumentTypesService); - const documentTypeWithOffice = await documentTypeService.getByUidWithOffice(documentType.uid!); - if (!documentTypeWithOffice) { - response.status(HttpCodes.NOT_FOUND).send("Document type not found"); - return; - } - if (documentTypeWithOffice.office?.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); - return; - } - } - - if (uid) { - const documentService = Container.get(DocumentsService); - const document = await documentService.getByUidWithOffice(uid!); - - if (!document) { - response.sendStatus(HttpCodes.NOT_FOUND); - return; - } - - if (document.document_type.office.uid != officeId) { - response.sendStatus(HttpCodes.UNAUTHORIZED); - return; - } - } - - next(); } diff --git a/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts index 250487cd..9c8c8071 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts @@ -4,29 +4,36 @@ import Container from "typedi"; import DocumentTypesService from "@Services/super-admin/DocumentTypesService/DocumentTypesService"; export default async function documentTypeHandler(req: Request, response: Response, next: NextFunction) { - const officeId = req.body.user.office_Id; - const uid = req.path && req.path.split("/")[5]; - const office = req.body.office; + try { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const office = req.body.office; - if (office && office.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); - return; - } - - if (uid) { - const documentTypeService = Container.get(DocumentTypesService); - const documentType = await documentTypeService.getByUidWithOffice(uid!); - - if (!documentType) { - response.status(HttpCodes.NOT_FOUND).send("Document type not found"); - return; - } - - if (documentType.office.uid != officeId) { + if (office && office.uid != officeId) { response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } - } - next(); + if (uid) { + const documentTypeService = Container.get(DocumentTypesService); + const documentType = await documentTypeService.getByUidWithOffice(uid!); + + if (!documentType) { + response.status(HttpCodes.NOT_FOUND).send("Document type not found"); + return; + } + + if (documentType.office.uid != officeId) { + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); + return; + } + } + + next(); + + } catch (error) { + console.log(error); + response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); + return; + } } diff --git a/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts index d91ad586..64556871 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts @@ -5,38 +5,44 @@ import FilesService from "@Services/common/FilesService/FilesService"; import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; export default async function fileHandler(req: Request, response: Response, next: NextFunction) { - const officeId = req.body.user.office_Id; - let uid = req.path && req.path.split("/")[5]; - const document = req.body.document; - - if (document) { - const documentService = Container.get(DocumentsService); - const documentWithOffice = await documentService.getByUidWithOffice(document.uid!); - if (!documentWithOffice) { - response.status(HttpCodes.NOT_FOUND).send("Document not found"); - return; + try { + const officeId = req.body.user.office_Id; + let uid = req.path && req.path.split("/")[5]; + const document = req.body.document; + + if (document) { + const documentService = Container.get(DocumentsService); + const documentWithOffice = await documentService.getByUidWithOffice(document.uid!); + if (!documentWithOffice) { + response.status(HttpCodes.NOT_FOUND).send("Document not found"); + return; + } + if (documentWithOffice.folder.office?.uid != officeId) { + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); + return; + } } - if (documentWithOffice.folder.office?.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); - return; + + if (uid === "download") uid = req.path && req.path.split("/")[6]; + + if (uid) { + const fileService = Container.get(FilesService); + const file = await fileService.getByUidWithOffice(uid!); + + if (!file) { + response.status(HttpCodes.NOT_FOUND).send("File not found"); + return; + } + if (file.document.folder.office.uid != officeId) { + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); + return; + } } + + next(); + } catch (error) { + console.log(error); + response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); + return; } - - if (uid === "download") uid = req.path && req.path.split("/")[6]; - - if (uid) { - const fileService = Container.get(FilesService); - const file = await fileService.getByUidWithOffice(uid!); - - if (!file) { - response.status(HttpCodes.NOT_FOUND).send("File not found"); - return; - } - if (file.document.folder.office.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); - return; - } - } - - next(); } diff --git a/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts index 1b3de999..5993fa7b 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts @@ -5,55 +5,62 @@ import OfficeFoldersService from "@Services/super-admin/OfficeFoldersService/Off import DeedTypesService from "@Services/super-admin/DeedTypesService/DeedTypesService"; export default async function folderHandler(req: Request, response: Response, next: NextFunction) { - const officeId = req.body.user.office_Id; - const uid = req.path && req.path.split("/")[5]; - const office = req.body.office; - const officeFolderNumber = req.body.folder_number; - const deed = req.body.deed; - - if (office && office.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); - return; - } - - if (deed) { - const deedTypeService = Container.get(DeedTypesService); - const deedTypeWithOffice = await deedTypeService.getByUidWithOffice(deed.deed_type.uid!); - if (!deedTypeWithOffice) { - response.status(HttpCodes.NOT_FOUND).send("Deed type not found"); - return; - } - if (deedTypeWithOffice.office.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this deed type"); - return; - } - } - - const officeFolderService = Container.get(OfficeFoldersService); - - if (officeFolderNumber && req.method == "POST") { - const officeFoldersWithSameNumber = await officeFolderService.get({ - where: { folder_number: officeFolderNumber, office: { uid: officeId } }, - }); - if (officeFoldersWithSameNumber.length) { - response.status(HttpCodes.BAD_REQUEST).send("Office number already used"); - return; - } - } - - if (uid) { - const officeFolder = await officeFolderService.getByUidWithOffice(uid!); - - if (!officeFolder) { - response.status(HttpCodes.NOT_FOUND).send("Office folder not found"); - return; - } - - if (officeFolder.office.uid != officeId) { + try { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const office = req.body.office; + const officeFolderNumber = req.body.folder_number; + const deed = req.body.deed; + + if (office && office.uid != officeId) { response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } - } + + if (deed && deed.deed_type) { + const deedTypeService = Container.get(DeedTypesService); + const deedTypeWithOffice = await deedTypeService.getByUidWithOffice(deed.deed_type.uid!); + if (!deedTypeWithOffice) { + response.status(HttpCodes.NOT_FOUND).send("Deed type not found"); + return; + } + if (deedTypeWithOffice.office.uid != officeId) { + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this deed type"); + return; + } + } + + const officeFolderService = Container.get(OfficeFoldersService); + + if (officeFolderNumber && req.method == "POST") { + const officeFoldersWithSameNumber = await officeFolderService.get({ + where: { folder_number: officeFolderNumber, office: { uid: officeId } }, + }); + if (officeFoldersWithSameNumber.length) { + response.status(HttpCodes.BAD_REQUEST).send("Office number already used"); + return; + } + } + + if (uid) { + const officeFolder = await officeFolderService.getByUidWithOffice(uid!); + + if (!officeFolder) { + response.status(HttpCodes.NOT_FOUND).send("Office folder not found"); + return; + } + + if (officeFolder.office.uid != officeId) { + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); + return; + } + } + + next(); - next(); + } catch (error) { + console.log(error); + response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); + return; + } } diff --git a/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts index 51716731..c0e9f53f 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts @@ -4,29 +4,36 @@ import Container from "typedi"; import OfficeRolesService from "@Services/super-admin/OfficeRolesService/OfficeRolesService"; export default async function officeRoleHandler(req: Request, response: Response, next: NextFunction) { - const officeId = req.body.user.office_Id; - const uid = req.path && req.path.split("/")[5]; - const office = req.body.office; + try { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const office = req.body.office; - if (office && office.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); - return; - } - - if (uid) { - const officeRoleService = Container.get(OfficeRolesService); - const officeRole = await officeRoleService.getByUidWithOffice(uid!); - - if (!officeRole) { - response.status(HttpCodes.NOT_FOUND).send("Office role not found"); - return; - } - - if (officeRole.office.uid != officeId) { + if (office && office.uid != officeId) { response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } - } - next(); + if (uid) { + const officeRoleService = Container.get(OfficeRolesService); + const officeRole = await officeRoleService.getByUidWithOffice(uid!); + + if (!officeRole) { + response.status(HttpCodes.NOT_FOUND).send("Office role not found"); + return; + } + + if (officeRole.office.uid != officeId) { + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); + return; + } + } + + next(); + + } catch (error) { + console.log(error); + response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); + return; + } } diff --git a/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts index a0a82207..ea05b60d 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts @@ -4,29 +4,35 @@ import Container from "typedi"; import UsersService from "@Services/super-admin/UsersService/UsersService"; export default async function userHandler(req: Request, response: Response, next: NextFunction) { - const officeId = req.body.user.office_Id; - const uid = req.path && req.path.split("/")[5]; - const office = req.body.office_membership; + try { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const office = req.body.office_membership; - if (office && office.uid != officeId) { - response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); - return; - } - - if (uid) { - const userService = Container.get(UsersService); - const user = await userService.getByUidWithOffice(uid!); - - if (!user) { - response.status(HttpCodes.NOT_FOUND).send("User not found"); - return; - } - - if (user.office_membership.uid != officeId) { + if (office && office.uid != officeId) { response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } - } - next(); + if (uid) { + const userService = Container.get(UsersService); + const user = await userService.getByUidWithOffice(uid!); + + if (!user) { + response.status(HttpCodes.NOT_FOUND).send("User not found"); + return; + } + + if (user.office_membership.uid != officeId) { + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); + return; + } + } + + next(); + } catch (error) { + console.log(error); + response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); + return; + } } diff --git a/src/app/middlewares/RulesHandler.ts b/src/app/middlewares/RulesHandler.ts index 001cb4cd..83baab87 100644 --- a/src/app/middlewares/RulesHandler.ts +++ b/src/app/middlewares/RulesHandler.ts @@ -2,25 +2,32 @@ import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; import { NextFunction, Request, Response } from "express"; export default async function ruleHandler(req: Request, response: Response, next: NextFunction) { - const rules = req.body.user.rules; - const service = req.path && req.path.split("/")[4]; + try { + const rules = req.body.user.rules; + const service = req.path && req.path.split("/")[4]; - if(!rules){ - response.status(HttpCodes.UNAUTHORIZED).send("Missing rules in JWT"); + if (!rules) { + response.status(HttpCodes.UNAUTHORIZED).send("Missing rules in JWT"); + return; + } + const namespace = req.path && req.path.split("/")[3]; + const role = req.body.user.role; + + if (namespace != "notary" && role != namespace && role != "super-admin") { + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this role"); + return; + } + + if (!rules.includes(req.method + " " + service)) { + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with those rules"); + return; + } + + next(); + + } catch (error) { + console.log(error); + response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); return; } - const namespace = req.path && req.path.split("/")[3]; - const role = req.body.user.role; - - if (namespace != "notary" && role != namespace && role != "super-admin") { - response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this role"); - return; - } - - if (!rules.includes(req.method + " " + service)) { - response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with those rules"); - return; - } - - next(); } diff --git a/src/common/config/variables/Variables.ts b/src/common/config/variables/Variables.ts index cffedcf9..46e9affd 100644 --- a/src/common/config/variables/Variables.ts +++ b/src/common/config/variables/Variables.ts @@ -88,8 +88,7 @@ export class BackendVariables { this.ENV = process.env["ENV"]!; } public async validate(groups?: string[]) { - console.log(this); - + const validationOptions = groups ? { groups } : undefined; try { @@ -98,8 +97,6 @@ export class BackendVariables { if (process.env["ENV"] === "dev") { throw error; } - console.error(error); - console.error(this); throw new Error("Some env variables are required!"); } return this; From 4fc12c82ada6d1ca3315acf5df0351aa354d94ff Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Tue, 25 Jul 2023 12:01:33 +0200 Subject: [PATCH 068/134] fix(seeder): refacto deed-type rule name --- src/common/databases/seeders/seeder.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/databases/seeders/seeder.ts b/src/common/databases/seeders/seeder.ts index fe7f6bb5..b90c2046 100644 --- a/src/common/databases/seeders/seeder.ts +++ b/src/common/databases/seeders/seeder.ts @@ -544,7 +544,7 @@ export default async function main() { updated_at: new Date(), }, { - name: "GET deedtypes", + name: "GET deed-types", created_at: new Date(), updated_at: new Date(), }, From fbcca56b8f7b50e331fc17abaa6c9d10c3764628 Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 12:02:46 +0200 Subject: [PATCH 069/134] Edit Api Dockerfile to migrate prisma on deploy --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 178e062e..85e1458c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,5 +42,5 @@ COPY --from=builder --chown=lecoffreuser leCoffre/src/common/databases ./src/com USER lecoffreuser -CMD ["npm", "run", "start"] +CMD ["npm", "run", "api:start"] EXPOSE 3001 \ No newline at end of file From 399eb9ac20753bc589d2daeb717fe6a2bb814347 Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 13:32:57 +0200 Subject: [PATCH 070/134] redeploy back --- src/services/common/CronService/CronService.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/services/common/CronService/CronService.ts b/src/services/common/CronService/CronService.ts index 321e0a91..aef10e4f 100644 --- a/src/services/common/CronService/CronService.ts +++ b/src/services/common/CronService/CronService.ts @@ -8,6 +8,7 @@ export default class CronService { constructor(private mailchimpService: MailchimpService) {} public async sendMails() { + const cronJob = new CronJob("*/15 * * * * *", async () => { try { await this.mailchimpService.sendEmails(); From 29d0051bf9deebf54806620152462520e4e2c0b4 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Tue, 25 Jul 2023 14:14:27 +0200 Subject: [PATCH 071/134] fix(resources): add updateDeedType group --- package.json | 2 +- .../middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts | 1 - src/common/repositories/DeedTypesRepository.ts | 5 ----- 3 files changed, 1 insertion(+), 7 deletions(-) diff --git a/package.json b/package.json index 9acb0afe..e020373f 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "cron": "^2.3.1", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.58", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.59", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", diff --git a/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts index d3e04e43..f8b8e104 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts @@ -48,7 +48,6 @@ export default async function deedTypeHandler(req: Request, response: Response, } next(); - } catch (error) { console.log(error); response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); diff --git a/src/common/repositories/DeedTypesRepository.ts b/src/common/repositories/DeedTypesRepository.ts index be7b4194..43495cbe 100644 --- a/src/common/repositories/DeedTypesRepository.ts +++ b/src/common/repositories/DeedTypesRepository.ts @@ -61,11 +61,6 @@ export default class DeedTypesRepository extends BaseRepository { name: deedType.name, description: deedType.description, archived_at: deedType.archived_at, - office: { - connect: { - uid: deedType.office!.uid, - }, - }, document_types: { set: deedType.document_types?.map((documentType) => ({ uid: documentType.uid!, From c108798ba6d3c7c460ba1d776e033ebea6dff429 Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 14:15:24 +0200 Subject: [PATCH 072/134] redeploy back --- src/services/common/CronService/CronService.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/services/common/CronService/CronService.ts b/src/services/common/CronService/CronService.ts index aef10e4f..321e0a91 100644 --- a/src/services/common/CronService/CronService.ts +++ b/src/services/common/CronService/CronService.ts @@ -8,7 +8,6 @@ export default class CronService { constructor(private mailchimpService: MailchimpService) {} public async sendMails() { - const cronJob = new CronJob("*/15 * * * * *", async () => { try { await this.mailchimpService.sendEmails(); From 387d4c2769a9d1a817fc40d8084d0e551436c154 Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 14:34:06 +0200 Subject: [PATCH 073/134] Added prisma url to variables --- src/common/config/variables/Variables.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/common/config/variables/Variables.ts b/src/common/config/variables/Variables.ts index e2c2169f..81315166 100644 --- a/src/common/config/variables/Variables.ts +++ b/src/common/config/variables/Variables.ts @@ -64,6 +64,9 @@ export class BackendVariables { @IsNotEmpty() public readonly ENV!: string; + @IsNotEmpty() + public readonly DEV_PRISMA_STUDIO_DB_URL!: string; + public constructor() { dotenv.config(); this.DATABASE_PORT = process.env["DATABASE_PORT"]!; @@ -86,8 +89,11 @@ export class BackendVariables { this.REFRESH_TOKEN_SECRET = process.env["REFRESH_TOKEN_SECRET"]!; this.MAILCHIMP_API_KEY = process.env["MAILCHIMP_API_KEY"]!; this.ENV = process.env["ENV"]!; + this.DEV_PRISMA_STUDIO_DB_URL = "postgresql://" + this.DATABASE_USERNAME + ":" + this.DATABASE_PASSWORD + "@" + this.DATABASE_HOST + ":" + this.DATABASE_PORT + "/" + this.DATABASE_NAME; } public async validate(groups?: string[]) { + console.log(this.DEV_PRISMA_STUDIO_DB_URL); + const validationOptions = groups ? { groups } : undefined; try { From 49ed76b40d135c7a145fc20936762b894fc0578b Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 14:34:19 +0200 Subject: [PATCH 074/134] fix --- src/common/config/variables/Variables.ts | 6 +++--- src/entries/App.ts | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/common/config/variables/Variables.ts b/src/common/config/variables/Variables.ts index 81315166..81510eea 100644 --- a/src/common/config/variables/Variables.ts +++ b/src/common/config/variables/Variables.ts @@ -89,11 +89,11 @@ export class BackendVariables { this.REFRESH_TOKEN_SECRET = process.env["REFRESH_TOKEN_SECRET"]!; this.MAILCHIMP_API_KEY = process.env["MAILCHIMP_API_KEY"]!; this.ENV = process.env["ENV"]!; - this.DEV_PRISMA_STUDIO_DB_URL = "postgresql://" + this.DATABASE_USERNAME + ":" + this.DATABASE_PASSWORD + "@" + this.DATABASE_HOST + ":" + this.DATABASE_PORT + "/" + this.DATABASE_NAME; + this.DEV_PRISMA_STUDIO_DB_URL = process.env["DEV_PRISMA_STUDIO_DB_URL"]!; } - public async validate(groups?: string[]) { + public async validate(groups?: string[]) { console.log(this.DEV_PRISMA_STUDIO_DB_URL); - + const validationOptions = groups ? { groups } : undefined; try { diff --git a/src/entries/App.ts b/src/entries/App.ts index 85468296..ab68ded6 100644 --- a/src/entries/App.ts +++ b/src/entries/App.ts @@ -14,7 +14,6 @@ const storage = multer.memoryStorage(); (async () => { try { const variables = await Container.get(BackendVariables).validate(); - const port = variables.APP_PORT; const rootUrl = variables.APP_ROOT_URL; const label = variables.APP_LABEL ?? "Unknown Service"; From 109c8438c090d00750d202e244e0fd7b0e20df81 Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 14:36:22 +0200 Subject: [PATCH 075/134] redeploy back --- src/common/config/variables/Variables.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/config/variables/Variables.ts b/src/common/config/variables/Variables.ts index 81510eea..c1755528 100644 --- a/src/common/config/variables/Variables.ts +++ b/src/common/config/variables/Variables.ts @@ -68,6 +68,7 @@ export class BackendVariables { public readonly DEV_PRISMA_STUDIO_DB_URL!: string; public constructor() { + dotenv.config(); this.DATABASE_PORT = process.env["DATABASE_PORT"]!; this.DATABASE_HOST = process.env["DATABASE_HOST"]!; From fe1c22bc144a37f36cf74cbd09e7f2d3a4a9f06d Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 14:52:16 +0200 Subject: [PATCH 076/134] Removed useless vars --- src/common/config/variables/Variables.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/common/config/variables/Variables.ts b/src/common/config/variables/Variables.ts index c1755528..07d209fa 100644 --- a/src/common/config/variables/Variables.ts +++ b/src/common/config/variables/Variables.ts @@ -90,11 +90,8 @@ export class BackendVariables { this.REFRESH_TOKEN_SECRET = process.env["REFRESH_TOKEN_SECRET"]!; this.MAILCHIMP_API_KEY = process.env["MAILCHIMP_API_KEY"]!; this.ENV = process.env["ENV"]!; - this.DEV_PRISMA_STUDIO_DB_URL = process.env["DEV_PRISMA_STUDIO_DB_URL"]!; } - public async validate(groups?: string[]) { - console.log(this.DEV_PRISMA_STUDIO_DB_URL); - + public async validate(groups?: string[]) { const validationOptions = groups ? { groups } : undefined; try { From f7bc4e58d611d513129203a112bc8ddc4bfa6f0c Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Tue, 25 Jul 2023 15:24:21 +0200 Subject: [PATCH 077/134] fix(user): add user role update --- src/app/api/admin/UsersController.ts | 44 ++++++++++- src/app/api/super-admin/UsersController.ts | 2 +- src/common/repositories/UsersRepository.ts | 76 +++++++++++++------ .../admin/UsersService/UsersService.ts | 2 +- 4 files changed, 98 insertions(+), 26 deletions(-) diff --git a/src/app/api/admin/UsersController.ts b/src/app/api/admin/UsersController.ts index 365e05f8..2d6d3465 100644 --- a/src/app/api/admin/UsersController.ts +++ b/src/app/api/admin/UsersController.ts @@ -1,5 +1,5 @@ import { Response, Request } from "express"; -import { Controller, Get } from "@ControllerPattern/index"; +import { Controller, Get, Put } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import UsersService from "@Services/admin/UsersService/UsersService"; import { Service } from "typedi"; @@ -8,6 +8,7 @@ import { Prisma } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import userHandler from "@App/middlewares/OfficeMembershipHandlers/UserHandler"; +import { validateOrReject } from "class-validator"; @Controller() @Service() @@ -61,6 +62,47 @@ export default class UsersController extends ApiController { } } + /** + * @description Modify a specific user by uid + */ + @Put("/api/v1/admin/users/:uid", [authHandler, ruleHandler]) + protected async put(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const userFound = await this.usersService.getByUid(uid); + + if (!userFound) { + this.httpNotFoundRequest(response, "user not found"); + return; + } + + //init IUser resource with request body values + const userEntity = User.hydrate(req.body); + + //validate user + await validateOrReject(userEntity, { groups: ["updateUser"] }); + + //call service to get prisma entity + const userEntityUpdated = await this.usersService.update(uid, userEntity); + + //Hydrate ressource with prisma entity + const user = User.hydrate(userEntityUpdated, { + strategy: "excludeAll", + }); + + //success + this.httpSuccess(response, user); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + /** * @description Get a specific user by uid */ diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index 695725dd..a96b3f5a 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -106,7 +106,7 @@ export default class UsersController extends ApiController { const userEntity = User.hydrate(req.body); //validate user - await validateOrReject(userEntity, { groups: ["update"] }); + await validateOrReject(userEntity, { groups: ["updateUser"] }); //call service to get prisma entity const userEntityUpdated = await this.usersService.update(uid, userEntity); diff --git a/src/common/repositories/UsersRepository.ts b/src/common/repositories/UsersRepository.ts index 99d36eb1..b472a8ec 100644 --- a/src/common/repositories/UsersRepository.ts +++ b/src/common/repositories/UsersRepository.ts @@ -94,30 +94,11 @@ export default class UsersRepository extends BaseRepository { }, data: { idNot: user.idNot, - office_membership: { - connectOrCreate: { - where: { - idNot: user.office_membership!.idNot, - }, - create: { - idNot: user.office_membership!.idNot, - name: user.office_membership!.name, - crpcen: user.office_membership!.crpcen, - address: { - create: { - address: user.office_membership!.address!.address, - zip_code: user.office_membership!.address!.zip_code, - city: user.office_membership!.address!.city, - }, - }, - }, - }, - }, contact: { update: { - first_name: user.contact!.first_name, - last_name: user.contact!.last_name, - email: user.contact!.email, + first_name: user.contact?.first_name, + last_name: user.contact?.last_name, + email: user.contact?.email, phone_number: user.contact?.phone_number, cell_phone_number: user.contact?.cell_phone_number, civility: ECivility[user.contact?.civility as keyof typeof ECivility], @@ -125,6 +106,15 @@ export default class UsersRepository extends BaseRepository { }, }, }; + + if(user.office_membership) { + updateArgs.data.office_membership = { + connect: { + idNot: user.office_membership?.idNot, + }, + }; + } + if (user.contact?.address) { updateArgs.data.contact!.update!.address!.update = { address: user.contact?.address?.address, @@ -132,13 +122,53 @@ export default class UsersRepository extends BaseRepository { city: user.contact?.address?.city, }; } - if (user.office_role) { + + if(user.office_role) { updateArgs.data.office_role = { connect: { uid: user.office_role.uid, }, }; } + + if(user.role) { + updateArgs.data.role = { + connect: { + uid: user.role.uid, + }, + }; + } + + return this.model.update({ ...updateArgs, include: { contact: true, office_membership: { include: { address: true } } } }); + } + + /** + * @description : Update role from a user + */ + public async updateRole(uid: string, user: User): Promise { + const updateArgs: Prisma.UsersUpdateArgs = { + where: { + uid: uid, + }, + data: {} + }; + + if(user.office_role) { + updateArgs.data.office_role = { + connect: { + uid: user.office_role.uid, + }, + }; + } + + if(user.role) { + updateArgs.data.role = { + connect: { + uid: user.role.uid, + }, + }; + } + return this.model.update({ ...updateArgs, include: { contact: true, office_membership: { include: { address: true } } } }); } diff --git a/src/services/admin/UsersService/UsersService.ts b/src/services/admin/UsersService/UsersService.ts index d2216c3b..f23c09d7 100644 --- a/src/services/admin/UsersService/UsersService.ts +++ b/src/services/admin/UsersService/UsersService.ts @@ -32,7 +32,7 @@ export default class UsersService extends BaseService { * @throws {Error} If user modification failed */ public update(uid: string, userEntity: User): Promise { - return this.userRepository.update(uid, userEntity); + return this.userRepository.updateRole(uid, userEntity); } /** From fb387672a9ff7cf9ab2b0b1cab636ac24e801d87 Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 15:25:26 +0200 Subject: [PATCH 078/134] Removed prisma url --- src/common/config/variables/Variables.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/common/config/variables/Variables.ts b/src/common/config/variables/Variables.ts index 07d209fa..e798462d 100644 --- a/src/common/config/variables/Variables.ts +++ b/src/common/config/variables/Variables.ts @@ -64,9 +64,6 @@ export class BackendVariables { @IsNotEmpty() public readonly ENV!: string; - @IsNotEmpty() - public readonly DEV_PRISMA_STUDIO_DB_URL!: string; - public constructor() { dotenv.config(); From bd9cb578257dd9403d86030e8abd416b4046e1f6 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Tue, 25 Jul 2023 15:29:04 +0200 Subject: [PATCH 079/134] update resources version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e020373f..49ebb452 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "cron": "^2.3.1", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.59", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.60", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", From 39b2b27348a64b308ce129d477b55a467760ce03 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Tue, 25 Jul 2023 15:39:53 +0200 Subject: [PATCH 080/134] fix(resources): add updateOffice group --- src/app/api/super-admin/OfficesController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/api/super-admin/OfficesController.ts b/src/app/api/super-admin/OfficesController.ts index 32f7aa34..e6702675 100644 --- a/src/app/api/super-admin/OfficesController.ts +++ b/src/app/api/super-admin/OfficesController.ts @@ -94,7 +94,7 @@ export default class OfficesController extends ApiController { //init IUser resource with request body values const officeEntity = OfficeResource.hydrate(req.body); //validate user - await validateOrReject(officeEntity, { groups: ["update"] }); + await validateOrReject(officeEntity, { groups: ["updateOffice"] }); //call service to get prisma entity const officeEntityUpdated = await this.officesService.update(uid, officeEntity); //Hydrate ressource with prisma entity From 38be56e1793d62185d3da9de802c1f1d4ff19a0f Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 15:41:53 +0200 Subject: [PATCH 081/134] Edited api:start script --- package.json | 2 +- src/common/databases/seeders/seeder.ts | 3162 ++++++++++++------------ 2 files changed, 1585 insertions(+), 1579 deletions(-) diff --git a/package.json b/package.json index 49ebb452..1f08ab36 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "build": "tsc", "start": "node ./dist/entries/App.js", "cron": "node ./dist/entries/Cron.js", - "api:start": "npm run migrate && npm run start", + "api:start": "npm run build-db && npm run migrate && npm run seed && npm run start", "dev": "nodemon -V", "format": "prettier --write src", "migrate:test": "dotenv -e .env.test -- npx prisma migrate deploy", diff --git a/src/common/databases/seeders/seeder.ts b/src/common/databases/seeders/seeder.ts index b90c2046..cf0129f4 100644 --- a/src/common/databases/seeders/seeder.ts +++ b/src/common/databases/seeders/seeder.ts @@ -15,1602 +15,1608 @@ import User, { } from "le-coffre-resources/dist/SuperAdmin"; export default async function main() { - const prisma = new PrismaClient(); + try{ + const prisma = new PrismaClient(); - const randomString = () => { - const chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - let result = ""; - for (let i = 10; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)]; - return result; - }; - - const idNot1 = "dlefvlef"; - const idNot2 = "jelkvelknvlkn"; - const idNot3 = "rleenrenlnr"; - const idNot4 = "ljfeflecnmd"; - const idNot5 = "rflrefrjf"; - const idNot6 = "er3ojfdlfnd"; - - const addresses: Address[] = [ - { - address: "148 Avenue du bac", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - address: "Rue Pierre Emillion", - city: "Pacé", - zip_code: 35740, - created_at: new Date(), - updated_at: new Date(), - }, - { - address: "Rue Pierre Charles", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - address: "Rue Pierre Pologne", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - address: "Rue Pierre Marcel", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - address: "Rue Pierre Jacques", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - address: "Rue Pierre Pascal", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - address: "Rue Maxime Henry", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - address: "Rue Maxime Francis", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - address: "Avenue Paul Roger", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - address: "Avenue Paul Franck", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - address: "Avenue Paul Maréchal", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - address: "Avenue Marcel Denis", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - address: "Place Alexandre", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - address: "Place Alexandre Jacques", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - address: "Place Alexandre 2", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - address: "Rue du livre", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - address: "Place de la joie", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - address: "Rue Paul Henry", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - { - address: "Rue Marcelin", - city: "Rennes", - zip_code: 35000, - created_at: new Date(), - updated_at: new Date(), - }, - ]; - - const contacts: Contact[] = [ - { - address: addresses[0], - first_name: "Arnaud", - last_name: "Daubernatali", - email: "arnaud.daubernatali@smart-chain.fr", - phone_number: "06 12 34 56 78", - cell_phone_number: "06 12 34 56 78", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - address: addresses[1], - first_name: "Maxime", - last_name: "Lalo", - email: "maxime.lalo@smart-chain.fr", - phone_number: "06 23 45 67 89", - cell_phone_number: "06 23 45 67 89", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - address: addresses[2], - first_name: "Vincent", - last_name: "Alamelle", - email: "vincent.alamelle@smart-chain.fr", - phone_number: "06 34 56 78 90", - cell_phone_number: "06 34 56 78 90", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - address: addresses[3], - first_name: "Melissa", - last_name: "Desde", - email: "melissa.desde@smart-chain.fr", - phone_number: "06 45 67 89 01", - cell_phone_number: "06 45 67 89 01", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.FEMALE, - }, - { - address: addresses[4], - first_name: "Maxime", - last_name: "Leroy", - email: "maxime.leroy@hotmail.fr", - phone_number: "06 56 78 90 12", - cell_phone_number: "06 56 78 90 12", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - address: addresses[5], - first_name: "Thibault", - last_name: "Dubois", - email: "thibault.dubois@outlook.com", - phone_number: "06 67 89 01 23", - cell_phone_number: "06 67 89 01 23", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - address: addresses[6], - first_name: "Léa", - last_name: "Fontaine", - email: "lea.fontaine@gmail.com", - phone_number: "06 78 90 12 34", - cell_phone_number: "06 78 90 12 34", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.FEMALE, - }, - { - address: addresses[7], - first_name: "Guillaume", - last_name: "Renaud", - email: "guillaume.renaud@gmail.com", - phone_number: "06 89 01 23 45", - cell_phone_number: "06 89 01 23 45", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - address: addresses[8], - first_name: "Lucie", - last_name: "Chevalier", - email: "lucie.chevalier@outlook.com", - phone_number: "07 12 34 56 78", - cell_phone_number: "07 12 34 56 78", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.FEMALE, - }, - { - address: addresses[9], - first_name: "Sébastien", - last_name: "Dubois", - email: "sebastien.dubois@gmail.com", - phone_number: "07 23 45 67 89", - cell_phone_number: "07 23 45 67 89", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - address: addresses[10], - first_name: "Mathilde", - last_name: "Durand", - email: "mathilde.durand@gmail.com", - phone_number: "07 34 56 78 90", - cell_phone_number: "07 34 56 78 90", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.FEMALE, - }, - { - address: addresses[11], - first_name: "Antoine", - last_name: "Bernard", - email: "antoine.bernard@outlook.com", - phone_number: "07 45 67 89 01", - cell_phone_number: "07 45 67 89 01", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - address: addresses[12], - first_name: "Camille", - last_name: "Laurent", - email: "camille.laurent@gmail.com", - phone_number: "07 56 78 90 12", - cell_phone_number: "07 56 78 90 12", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.FEMALE, - }, - { - address: addresses[13], - first_name: "Julien", - last_name: "Mercier", - email: "julien.mercier@hotmail.fr", - phone_number: "07 67 89 01 23", - cell_phone_number: "07 67 89 01 23", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - address: addresses[14], - first_name: "Charlotte", - last_name: "Lefebvre", - email: "charlotte.lefebvre@gmail.com", - phone_number: "07 78 90 12 34", - cell_phone_number: "07 78 90 12 34", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.FEMALE, - }, - { - address: addresses[15], - first_name: "Caroline", - last_name: "Pallut", - email: "caroline.pallut@gmail.com", - phone_number: "07 89 01 23 45", - cell_phone_number: "07 89 01 23 45", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.FEMALE, - }, - { - address: addresses[16], - first_name: "Nadège", - last_name: "Gauchet", - email: "nedege.gauchet@outlook.com", - phone_number: "06 11 22 33 44", - cell_phone_number: "06 11 22 33 44", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.FEMALE, - }, - { - address: addresses[17], - first_name: "Matthieu", - last_name: "Bougeard", - email: "matthieu.bougeard@gmail.com", - phone_number: "07 22 33 44 55", - cell_phone_number: "07 22 33 44 55", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - { - address: addresses[18], - first_name: "Cécile", - last_name: "Celton", - email: "cecile.celton@outlook.com", - phone_number: "06 55 66 77 88", - cell_phone_number: "06 55 66 77 88", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.FEMALE, - }, - { - address: addresses[19], - first_name: "Gwendal", - last_name: "Texier", - email: "gwendal.texier@gmail.com", - phone_number: "07 88 99 00 11", - cell_phone_number: "07 88 99 00 11", - birthdate: null, - created_at: new Date(), - updated_at: new Date(), - civility: ECivility.MALE, - }, - ]; - - const offices: Office[] = [ - { - idNot: idNot1, - name: "Office Rennes", - crpcen: randomString(), - address: addresses[0], - created_at: new Date(), - updated_at: new Date(), - office_status: EOfficeStatus.ACTIVATED, - }, - ]; - - const customers: Customer[] = [ - { - contact: contacts[5], - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - contact: contacts[6], - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - contact: contacts[7], - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - contact: contacts[8], - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - contact: contacts[9], - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - contact: contacts[10], - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - contact: contacts[11], - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - contact: contacts[12], - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - contact: contacts[13], - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - contact: contacts[14], - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - contact: contacts[15], - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - contact: contacts[16], - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - contact: contacts[17], - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - contact: contacts[18], - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - { - contact: contacts[19], - created_at: new Date(), - updated_at: new Date(), - status: ECustomerStatus.PENDING, - }, - ]; - - const rules: Rule[] = [ - { - name: "GET users", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "GET offices", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "GET customers", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "GET deeds", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "GET deed-types", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "GET documents", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "GET document-types", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "GET files", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "GET folders", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "GET roles", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "GET rules", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "GET office-roles", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "PUT users", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "PUT offices", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "PUT customers", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "PUT deeds", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "PUT deedtypes", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "PUT documents", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "PUT document-types", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "PUT files", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "PUT folders", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "PUT roles", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "PUT rules", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "PUT office-roles", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST users", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST offices", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST customers", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST deeds", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST deedtypes", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST documents", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST document-types", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST files", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST folders", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST roles", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST rules", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST office-roles", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST users", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST offices", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST customers", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST deeds", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST deed-types", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST documents", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST document-types", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST files", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST folders", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST roles", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST rules", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST office-roles", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "DELETE users", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "DELETE offices", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "DELETE customers", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "DELETE deeds", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "DELETE deed-types", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "DELETE documents", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "DELETE document-types", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "DELETE files", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "DELETE folders", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "DELETE roles", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "DELETE rules", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "DELETE office-roles", - created_at: new Date(), - updated_at: new Date(), - }, - ]; - - const roles: Role[] = [ - { - name: "super-admin", - created_at: new Date(), - updated_at: new Date(), - rules: rules, - }, - { - name: "admin", - created_at: new Date(), - updated_at: new Date(), - rules: rules.slice(0, 33), - }, - { - name: "notary", - created_at: new Date(), - updated_at: new Date(), - rules: rules.slice(0, 22), - }, - { - name: "default", - created_at: new Date(), - updated_at: new Date(), - rules: rules.slice(0, 11), - }, - ]; - - const officeRoles: OfficeRole[] = [ - { - name: "admin", - created_at: new Date(), - updated_at: new Date(), - office: offices[0]!, - rules: rules.slice(0, 40), - }, - { - name: "notary", - created_at: new Date(), - updated_at: new Date(), - office: offices[0]!, - rules: rules.slice(0, 33), - }, - { - name: "deputy", - created_at: new Date(), - updated_at: new Date(), - office: offices[0]!, - rules: rules.slice(0, 22), - }, - { - name: "listener", - created_at: new Date(), - updated_at: new Date(), - office: offices[0]!, - rules: rules.slice(0, 11), - }, - ]; - - const users: User[] = [ - { - created_at: new Date(), - updated_at: new Date(), - idNot: idNot2, - contact: contacts[0], - office_membership: offices[0], - role: roles[0], - }, - { - created_at: new Date(), - updated_at: new Date(), - idNot: idNot3, - contact: contacts[1], - office_membership: offices[0], - role: roles[1], - }, - { - created_at: new Date(), - updated_at: new Date(), - idNot: idNot4, - contact: contacts[2], - office_membership: offices[0], - role: roles[2], - office_role: officeRoles[2], - }, - { - created_at: new Date(), - updated_at: new Date(), - idNot: idNot5, - contact: contacts[3], - office_membership: offices[0], - role: roles[1], - office_role: officeRoles[3], - }, - { - created_at: new Date(), - updated_at: new Date(), - idNot: idNot6, - contact: contacts[4], - office_membership: offices[0], - role: roles[3], - }, - ]; - - const deedTypes: DeedType[] = [ - { - name: "Acte de donation", - archived_at: null, - description: "Acte de donation", - office: offices[0], - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "Acte de vente", - archived_at: null, - description: "Acte de vente", - office: offices[0], - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "Acte de succession", - archived_at: null, - description: "Acte de succession", - office: offices[0], - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "Acte de vente de maison individuelle", - archived_at: null, - description: "Acte de vente de maison individuelle", - office: offices[0], - created_at: new Date(), - updated_at: new Date(), - }, - ]; - - const deeds: Deed[] = [ - { - deed_type: deedTypes[0], - created_at: new Date(), - updated_at: new Date(), - }, - { - deed_type: deedTypes[0], - created_at: new Date(), - updated_at: new Date(), - }, - { - deed_type: deedTypes[0], - created_at: new Date(), - updated_at: new Date(), - }, - { - deed_type: deedTypes[0], - created_at: new Date(), - updated_at: new Date(), - }, - { - deed_type: deedTypes[0], - created_at: new Date(), - updated_at: new Date(), - }, - { - deed_type: deedTypes[0], - created_at: new Date(), - updated_at: new Date(), - }, - { - deed_type: deedTypes[0], - created_at: new Date(), - updated_at: new Date(), - }, - { - deed_type: deedTypes[1], - created_at: new Date(), - updated_at: new Date(), - }, - { - deed_type: deedTypes[1], - created_at: new Date(), - updated_at: new Date(), - }, - { - deed_type: deedTypes[1], - created_at: new Date(), - updated_at: new Date(), - }, - { - deed_type: deedTypes[1], - created_at: new Date(), - updated_at: new Date(), - }, - { - deed_type: deedTypes[1], - created_at: new Date(), - updated_at: new Date(), - }, - { - deed_type: deedTypes[1], - created_at: new Date(), - updated_at: new Date(), - }, - { - deed_type: deedTypes[1], - created_at: new Date(), - updated_at: new Date(), - }, - { - deed_type: deedTypes[2], - created_at: new Date(), - updated_at: new Date(), - }, - { - deed_type: deedTypes[2], - created_at: new Date(), - updated_at: new Date(), - }, - { - deed_type: deedTypes[2], - created_at: new Date(), - updated_at: new Date(), - }, - { - deed_type: deedTypes[2], - created_at: new Date(), - updated_at: new Date(), - }, - { - deed_type: deedTypes[2], - created_at: new Date(), - updated_at: new Date(), - }, - { - deed_type: deedTypes[2], - created_at: new Date(), - updated_at: new Date(), - }, - { - deed_type: deedTypes[2], - created_at: new Date(), - updated_at: new Date(), - }, - ]; - - const documentTypes: DocumentType[] = [ - { - archived_at: null, - name: "Document d'identité", - office: offices[0], - private_description: - "Document officiel d'identification utilisé par plusieurs personnes pour prouver leur identité et leur nationalité (CNI, passeport)", - public_description: - "Document officiel d'identification utilisé par plusieurs personnes pour prouver leur identité et leur nationalité (CNI, passeport)", - created_at: new Date(), - updated_at: new Date(), - }, - { - archived_at: null, - name: "Taxe Foncière", - office: offices[0], - private_description: "Impôt annuel imposé sur les propriétés foncières et utilisé pour financer les services publics locaux.", - public_description: "Impôt annuel imposé sur les propriétés foncières et utilisé pour financer les services publics locaux.", - created_at: new Date(), - updated_at: new Date(), - }, - - { - archived_at: null, - name: "Contrat Mariage", - office: offices[0], - private_description: "Accord légal qui établit les droits et les obligations entre deux personnes s'unissant en mariage.", - public_description: "Accord légal qui établit les droits et les obligations entre deux personnes s'unissant en mariage.", - created_at: new Date(), - updated_at: new Date(), - }, - { - archived_at: null, - name: "Livret de famille", - office: offices[0], - private_description: - "Document officiel qui enregistre les détails et les événements familiaux tels que les mariages, les naissances et les décès d'un couple et de leurs enfants.", - public_description: - "Document officiel qui enregistre les détails et les événements familiaux tels que les mariages, les naissances et les décès d'un couple et de leurs enfants.", - created_at: new Date(), - updated_at: new Date(), - }, - { - archived_at: null, - name: "Bail commercial", - office: offices[0], - private_description: - "Contrat légal entre un propriétaire et un locataire pour la location d'un bien immobilier utilisé à des fins commerciales ou professionnelles.", - public_description: - "Contrat légal entre un propriétaire et un locataire pour la location d'un bien immobilier utilisé à des fins commerciales ou professionnelles.", - created_at: new Date(), - updated_at: new Date(), - }, - { - archived_at: null, - name: "Statuts SCI", - office: offices[0], - private_description: "Document légal qui définit les règles et les dispositions régissant la Société Civile Immobilière (SCI).", - public_description: "Document légal qui définit les règles et les dispositions régissant la Société Civile Immobilière (SCI).", - created_at: new Date(), - updated_at: new Date(), - }, - { - archived_at: null, - name: "Avis de taxe foncière", - office: offices[0], - private_description: "Notification officielle indiquant le montant de l'impôt foncier dû sur une propriété.", - public_description: "Notification officielle indiquant le montant de l'impôt foncier dû sur une propriété.", - created_at: new Date(), - updated_at: new Date(), - }, - { - archived_at: null, - name: "Appel de charge de copropriété", - office: offices[0], - private_description: - "Document envoyé aux copropriétaires pour les informer des dépenses et des charges communes liées à la gestion et à l'entretien de l'immeuble.", - public_description: - "Document envoyé aux copropriétaires pour les informer des dépenses et des charges communes liées à la gestion et à l'entretien de l'immeuble.", - created_at: new Date(), - updated_at: new Date(), - }, - { - archived_at: null, - name: "PVAG", - office: offices[0], - private_description: - "Compte rendu écrit des discussions, décisions et résolutions prises lors d'une réunion d'assemblée générale de copropriété.", - public_description: - "Compte rendu écrit des discussions, décisions et résolutions prises lors d'une réunion d'assemblée générale de copropriété.", - created_at: new Date(), - updated_at: new Date(), - }, - { - archived_at: null, - name: "Règlement de copropriété", - office: offices[0], - private_description: - "Document juridique qui établit les règles et les droits des copropriétaires d'un immeuble en copropriété.", - public_description: "Document juridique qui établit les règles et les droits des copropriétaires d'un immeuble en copropriété.", - created_at: new Date(), - updated_at: new Date(), - }, - { - archived_at: null, - name: "Titre de propriété", - office: offices[0], - private_description: "Document légal qui atteste de la propriété d'un bien immobilier et en identifie le propriétaire.", - public_description: "Document légal qui atteste de la propriété d'un bien immobilier et en identifie le propriétaire.", - created_at: new Date(), - updated_at: new Date(), - }, - { - archived_at: null, - name: "Plan et loi carrez", - office: offices[0], - private_description: - "Document officiel qui mesure la superficie d'un lot ou d'un bien immobilier, conformément à la loi Carrez qui encadre les transactions immobilières.", - public_description: - "Document officiel qui mesure la superficie d'un lot ou d'un bien immobilier, conformément à la loi Carrez qui encadre les transactions immobilières.", - created_at: new Date(), - updated_at: new Date(), - }, - { - archived_at: null, - name: "CNI", - office: offices[0], - private_description: - "Document officiel d'identification délivré par l'État pour prouver l'identité et la nationalité d'une personne.", - public_description: - "Document officiel d'identification délivré par l'État pour prouver l'identité et la nationalité d'une personne.", - created_at: new Date(), - updated_at: new Date(), - }, - { - archived_at: null, - name: "Modifications règlement copropriété (plusieurs)", - office: offices[0], - private_description: - "Documents légaux qui apportent des changements ou des ajustements aux règles et dispositions du règlement de copropriété initial.", - public_description: - "Documents légaux qui apportent des changements ou des ajustements aux règles et dispositions du règlement de copropriété initial.", - created_at: new Date(), - updated_at: new Date(), - }, - { - archived_at: null, - name: "Avis de décès", - office: offices[0], - private_description: "Notification officielle délivrée par les autorités compétentes pour informer du décès d'une personne.", - public_description: "Notification officielle délivrée par les autorités compétentes pour informer du décès d'une personne.", - created_at: new Date(), - updated_at: new Date(), - }, - { - archived_at: null, - name: "Lettre de mission", - office: offices[0], - private_description: - "Document contractuel qui définit les termes et les objectifs d'une mission confiée à une personne ou à une entreprise.", - public_description: - "Document contractuel qui définit les termes et les objectifs d'une mission confiée à une personne ou à une entreprise.", - created_at: new Date(), - updated_at: new Date(), - }, - { - archived_at: null, - name: "DPE", - office: offices[0], - private_description: "Diagnostic de Performance Energétique.", - public_description: "Diagnostic de Performance Energétique.", - created_at: new Date(), - updated_at: new Date(), - }, - { - archived_at: null, - name: "RIB", - office: offices[0], - private_description: "Relevé d'identité bancaire ou IBAN.", - public_description: "Relevé d'identité bancaire ou IBAN.", - created_at: new Date(), - updated_at: new Date(), - }, - { - archived_at: null, - name: "Acte d'achat par la SCI", - office: offices[0], - private_description: "Acte d'achat par la SCI.", - public_description: "Acte d'achat par la SCI.", - created_at: new Date(), - updated_at: new Date(), - }, - ]; - - const officeFolders: OfficeFolder[] = [ - { - folder_number: "0001", - name: "Vente par Mme. Simon au profit de Mme. Lextrait", - deed: deeds[0], - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office: offices[0], - description: null, - archived_description: null, - }, - { - folder_number: "0002", - name: "Donation des parts sociales de la société SARL FLORE", - deed: deeds[1], - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office: offices[0], - description: null, - archived_description: null, - }, - { - folder_number: "0003", - name: "Vente par Mme. Lefebvre au profit de Mme. Mathieu", - deed: deeds[2], - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office: offices[0], - description: null, - archived_description: null, - }, - { - folder_number: "0004", - name: "Vente par Mme. Chevalier au profit de M. Daveau", - deed: deeds[3], - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office: offices[0], - description: null, - archived_description: null, - }, - { - folder_number: "0005", - name: "Vente par M. Lalo au profit de Mme. Pigale", - deed: deeds[4], - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office: offices[0], - description: null, - archived_description: null, - }, - { - folder_number: "0006", - name: "Donation des parts sociales de la société SMART-TALENT", - deed: deeds[5], - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office: offices[0], - description: null, - archived_description: null, - }, - { - folder_number: "0007", - name: "Vente par M. Girard au profit de M. Louis", - deed: deeds[6], - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office: offices[0], - description: null, - archived_description: null, - }, - { - folder_number: "0008", - name: "Vente par Mme. Leclerc au profit de M. Louis", - deed: deeds[7], - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office: offices[0], - description: null, - archived_description: null, - }, - { - folder_number: "0009", - name: "Vente par M. Lambert au profit de M. Holmes", - deed: deeds[8], - status: EFolderStatus.LIVE, - created_at: new Date(), - updated_at: new Date(), - office: offices[0], - description: null, - archived_description: null, - }, - ]; - - for (const office of offices) { - const officeCreated = await prisma.offices.create({ - data: { - idNot: office.idNot, - name: office.name, - crpcen: office.crpcen, - address: { - create: { - address: office.address!.address, - zip_code: office.address!.zip_code, - city: office.address!.city, - }, - }, - office_status: EOfficeStatus.DESACTIVATED, + const randomString = () => { + const chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + let result = ""; + for (let i = 10; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)]; + return result; + }; + + const idNot1 = "dlefvlef"; + const idNot2 = "jelkvelknvlkn"; + const idNot3 = "rleenrenlnr"; + const idNot4 = "ljfeflecnmd"; + const idNot5 = "rflrefrjf"; + const idNot6 = "er3ojfdlfnd"; + + const addresses: Address[] = [ + { + address: "148 Avenue du bac", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), }, - }); - office.uid = officeCreated.uid; - } - for (const rule of rules) { - const ruleCreated = await prisma.rules.create({ - data: { - name: rule.name, + { + address: "Rue Pierre Emillion", + city: "Pacé", + zip_code: 35740, + created_at: new Date(), + updated_at: new Date(), }, - }); - rule.uid = ruleCreated.uid; - } - - for (const role of roles) { - const roleCreated = await prisma.roles.create({ - data: { - name: role.name, - rules: { - connect: role.rules?.map((rule) => ({ - uid: rule.uid!, - })), - }, + { + address: "Rue Pierre Charles", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), }, - }); - role.uid = roleCreated.uid; - } - - for (const officeRole of officeRoles) { - const officeRoleCreated = await prisma.officeRoles.create({ - data: { - name: officeRole.name, - office: { - connect: { - uid: officeRole.office.uid, - }, - }, - rules: { - connect: officeRole.rules?.map((rule) => ({ - uid: rule.uid!, - })), - }, + { + address: "Rue Pierre Pologne", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), }, - }); - officeRole.uid = officeRoleCreated.uid; - } - - for (const user of users) { - const createArgs: Prisma.UsersCreateArgs = { - data: { - idNot: user.idNot, - office_membership: { - connectOrCreate: { - where: { - idNot: user.office_membership!.idNot, - }, + { + address: "Rue Pierre Marcel", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Rue Pierre Jacques", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Rue Pierre Pascal", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Rue Maxime Henry", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Rue Maxime Francis", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Avenue Paul Roger", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Avenue Paul Franck", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Avenue Paul Maréchal", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Avenue Marcel Denis", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Place Alexandre", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Place Alexandre Jacques", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Place Alexandre 2", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Rue du livre", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Place de la joie", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Rue Paul Henry", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + { + address: "Rue Marcelin", + city: "Rennes", + zip_code: 35000, + created_at: new Date(), + updated_at: new Date(), + }, + ]; + + const contacts: Contact[] = [ + { + address: addresses[0], + first_name: "Arnaud", + last_name: "Daubernatali", + email: "arnaud.daubernatali@smart-chain.fr", + phone_number: "06 12 34 56 78", + cell_phone_number: "06 12 34 56 78", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + { + address: addresses[1], + first_name: "Maxime", + last_name: "Lalo", + email: "maxime.lalo@smart-chain.fr", + phone_number: "06 23 45 67 89", + cell_phone_number: "06 23 45 67 89", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + { + address: addresses[2], + first_name: "Vincent", + last_name: "Alamelle", + email: "vincent.alamelle@smart-chain.fr", + phone_number: "06 34 56 78 90", + cell_phone_number: "06 34 56 78 90", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + { + address: addresses[3], + first_name: "Melissa", + last_name: "Desde", + email: "melissa.desde@smart-chain.fr", + phone_number: "06 45 67 89 01", + cell_phone_number: "06 45 67 89 01", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.FEMALE, + }, + { + address: addresses[4], + first_name: "Maxime", + last_name: "Leroy", + email: "maxime.leroy@hotmail.fr", + phone_number: "06 56 78 90 12", + cell_phone_number: "06 56 78 90 12", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + { + address: addresses[5], + first_name: "Thibault", + last_name: "Dubois", + email: "thibault.dubois@outlook.com", + phone_number: "06 67 89 01 23", + cell_phone_number: "06 67 89 01 23", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + { + address: addresses[6], + first_name: "Léa", + last_name: "Fontaine", + email: "lea.fontaine@gmail.com", + phone_number: "06 78 90 12 34", + cell_phone_number: "06 78 90 12 34", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.FEMALE, + }, + { + address: addresses[7], + first_name: "Guillaume", + last_name: "Renaud", + email: "guillaume.renaud@gmail.com", + phone_number: "06 89 01 23 45", + cell_phone_number: "06 89 01 23 45", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + { + address: addresses[8], + first_name: "Lucie", + last_name: "Chevalier", + email: "lucie.chevalier@outlook.com", + phone_number: "07 12 34 56 78", + cell_phone_number: "07 12 34 56 78", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.FEMALE, + }, + { + address: addresses[9], + first_name: "Sébastien", + last_name: "Dubois", + email: "sebastien.dubois@gmail.com", + phone_number: "07 23 45 67 89", + cell_phone_number: "07 23 45 67 89", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + { + address: addresses[10], + first_name: "Mathilde", + last_name: "Durand", + email: "mathilde.durand@gmail.com", + phone_number: "07 34 56 78 90", + cell_phone_number: "07 34 56 78 90", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.FEMALE, + }, + { + address: addresses[11], + first_name: "Antoine", + last_name: "Bernard", + email: "antoine.bernard@outlook.com", + phone_number: "07 45 67 89 01", + cell_phone_number: "07 45 67 89 01", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + { + address: addresses[12], + first_name: "Camille", + last_name: "Laurent", + email: "camille.laurent@gmail.com", + phone_number: "07 56 78 90 12", + cell_phone_number: "07 56 78 90 12", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.FEMALE, + }, + { + address: addresses[13], + first_name: "Julien", + last_name: "Mercier", + email: "julien.mercier@hotmail.fr", + phone_number: "07 67 89 01 23", + cell_phone_number: "07 67 89 01 23", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + { + address: addresses[14], + first_name: "Charlotte", + last_name: "Lefebvre", + email: "charlotte.lefebvre@gmail.com", + phone_number: "07 78 90 12 34", + cell_phone_number: "07 78 90 12 34", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.FEMALE, + }, + { + address: addresses[15], + first_name: "Caroline", + last_name: "Pallut", + email: "caroline.pallut@gmail.com", + phone_number: "07 89 01 23 45", + cell_phone_number: "07 89 01 23 45", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.FEMALE, + }, + { + address: addresses[16], + first_name: "Nadège", + last_name: "Gauchet", + email: "nedege.gauchet@outlook.com", + phone_number: "06 11 22 33 44", + cell_phone_number: "06 11 22 33 44", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.FEMALE, + }, + { + address: addresses[17], + first_name: "Matthieu", + last_name: "Bougeard", + email: "matthieu.bougeard@gmail.com", + phone_number: "07 22 33 44 55", + cell_phone_number: "07 22 33 44 55", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + { + address: addresses[18], + first_name: "Cécile", + last_name: "Celton", + email: "cecile.celton@outlook.com", + phone_number: "06 55 66 77 88", + cell_phone_number: "06 55 66 77 88", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.FEMALE, + }, + { + address: addresses[19], + first_name: "Gwendal", + last_name: "Texier", + email: "gwendal.texier@gmail.com", + phone_number: "07 88 99 00 11", + cell_phone_number: "07 88 99 00 11", + birthdate: null, + created_at: new Date(), + updated_at: new Date(), + civility: ECivility.MALE, + }, + ]; + + const offices: Office[] = [ + { + idNot: idNot1, + name: "Office Rennes", + crpcen: randomString(), + address: addresses[0], + created_at: new Date(), + updated_at: new Date(), + office_status: EOfficeStatus.ACTIVATED, + }, + ]; + + const customers: Customer[] = [ + { + contact: contacts[5], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[6], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[7], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[8], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[9], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[10], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[11], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[12], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[13], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[14], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[15], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[16], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[17], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[18], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + { + contact: contacts[19], + created_at: new Date(), + updated_at: new Date(), + status: ECustomerStatus.PENDING, + }, + ]; + + const rules: Rule[] = [ + { + name: "GET users", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET offices", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET customers", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET deeds", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET deed-types", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET documents", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET document-types", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET files", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET folders", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET roles", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET rules", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "GET office-roles", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT users", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT offices", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT customers", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT deeds", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT deedtypes", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT documents", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT document-types", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT files", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT folders", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT roles", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT rules", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "PUT office-roles", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST users", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST offices", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST customers", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST deeds", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST deedtypes", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST documents", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST document-types", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST files", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST folders", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST roles", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST rules", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST office-roles", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST users", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST offices", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST customers", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST deeds", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST deed-types", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST documents", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST document-types", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST files", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST folders", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST roles", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST rules", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "POST office-roles", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE users", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE offices", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE customers", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE deeds", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE deed-types", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE documents", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE document-types", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE files", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE folders", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE roles", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE rules", + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "DELETE office-roles", + created_at: new Date(), + updated_at: new Date(), + }, + ]; + + const roles: Role[] = [ + { + name: "super-admin", + created_at: new Date(), + updated_at: new Date(), + rules: rules, + }, + { + name: "admin", + created_at: new Date(), + updated_at: new Date(), + rules: rules.slice(0, 33), + }, + { + name: "notary", + created_at: new Date(), + updated_at: new Date(), + rules: rules.slice(0, 22), + }, + { + name: "default", + created_at: new Date(), + updated_at: new Date(), + rules: rules.slice(0, 11), + }, + ]; + + const officeRoles: OfficeRole[] = [ + { + name: "admin", + created_at: new Date(), + updated_at: new Date(), + office: offices[0]!, + rules: rules.slice(0, 40), + }, + { + name: "notary", + created_at: new Date(), + updated_at: new Date(), + office: offices[0]!, + rules: rules.slice(0, 33), + }, + { + name: "deputy", + created_at: new Date(), + updated_at: new Date(), + office: offices[0]!, + rules: rules.slice(0, 22), + }, + { + name: "listener", + created_at: new Date(), + updated_at: new Date(), + office: offices[0]!, + rules: rules.slice(0, 11), + }, + ]; + + const users: User[] = [ + { + created_at: new Date(), + updated_at: new Date(), + idNot: idNot2, + contact: contacts[0], + office_membership: offices[0], + role: roles[0], + }, + { + created_at: new Date(), + updated_at: new Date(), + idNot: idNot3, + contact: contacts[1], + office_membership: offices[0], + role: roles[1], + }, + { + created_at: new Date(), + updated_at: new Date(), + idNot: idNot4, + contact: contacts[2], + office_membership: offices[0], + role: roles[2], + office_role: officeRoles[2], + }, + { + created_at: new Date(), + updated_at: new Date(), + idNot: idNot5, + contact: contacts[3], + office_membership: offices[0], + role: roles[1], + office_role: officeRoles[3], + }, + { + created_at: new Date(), + updated_at: new Date(), + idNot: idNot6, + contact: contacts[4], + office_membership: offices[0], + role: roles[3], + }, + ]; + + const deedTypes: DeedType[] = [ + { + name: "Acte de donation", + archived_at: null, + description: "Acte de donation", + office: offices[0], + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "Acte de vente", + archived_at: null, + description: "Acte de vente", + office: offices[0], + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "Acte de succession", + archived_at: null, + description: "Acte de succession", + office: offices[0], + created_at: new Date(), + updated_at: new Date(), + }, + { + name: "Acte de vente de maison individuelle", + archived_at: null, + description: "Acte de vente de maison individuelle", + office: offices[0], + created_at: new Date(), + updated_at: new Date(), + }, + ]; + + const deeds: Deed[] = [ + { + deed_type: deedTypes[0], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[0], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[0], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[0], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[0], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[0], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[0], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[1], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[1], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[1], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[1], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[1], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[1], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[1], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[2], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[2], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[2], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[2], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[2], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[2], + created_at: new Date(), + updated_at: new Date(), + }, + { + deed_type: deedTypes[2], + created_at: new Date(), + updated_at: new Date(), + }, + ]; + + const documentTypes: DocumentType[] = [ + { + archived_at: null, + name: "Document d'identité", + office: offices[0], + private_description: + "Document officiel d'identification utilisé par plusieurs personnes pour prouver leur identité et leur nationalité (CNI, passeport)", + public_description: + "Document officiel d'identification utilisé par plusieurs personnes pour prouver leur identité et leur nationalité (CNI, passeport)", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Taxe Foncière", + office: offices[0], + private_description: "Impôt annuel imposé sur les propriétés foncières et utilisé pour financer les services publics locaux.", + public_description: "Impôt annuel imposé sur les propriétés foncières et utilisé pour financer les services publics locaux.", + created_at: new Date(), + updated_at: new Date(), + }, + + { + archived_at: null, + name: "Contrat Mariage", + office: offices[0], + private_description: "Accord légal qui établit les droits et les obligations entre deux personnes s'unissant en mariage.", + public_description: "Accord légal qui établit les droits et les obligations entre deux personnes s'unissant en mariage.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Livret de famille", + office: offices[0], + private_description: + "Document officiel qui enregistre les détails et les événements familiaux tels que les mariages, les naissances et les décès d'un couple et de leurs enfants.", + public_description: + "Document officiel qui enregistre les détails et les événements familiaux tels que les mariages, les naissances et les décès d'un couple et de leurs enfants.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Bail commercial", + office: offices[0], + private_description: + "Contrat légal entre un propriétaire et un locataire pour la location d'un bien immobilier utilisé à des fins commerciales ou professionnelles.", + public_description: + "Contrat légal entre un propriétaire et un locataire pour la location d'un bien immobilier utilisé à des fins commerciales ou professionnelles.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Statuts SCI", + office: offices[0], + private_description: "Document légal qui définit les règles et les dispositions régissant la Société Civile Immobilière (SCI).", + public_description: "Document légal qui définit les règles et les dispositions régissant la Société Civile Immobilière (SCI).", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Avis de taxe foncière", + office: offices[0], + private_description: "Notification officielle indiquant le montant de l'impôt foncier dû sur une propriété.", + public_description: "Notification officielle indiquant le montant de l'impôt foncier dû sur une propriété.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Appel de charge de copropriété", + office: offices[0], + private_description: + "Document envoyé aux copropriétaires pour les informer des dépenses et des charges communes liées à la gestion et à l'entretien de l'immeuble.", + public_description: + "Document envoyé aux copropriétaires pour les informer des dépenses et des charges communes liées à la gestion et à l'entretien de l'immeuble.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "PVAG", + office: offices[0], + private_description: + "Compte rendu écrit des discussions, décisions et résolutions prises lors d'une réunion d'assemblée générale de copropriété.", + public_description: + "Compte rendu écrit des discussions, décisions et résolutions prises lors d'une réunion d'assemblée générale de copropriété.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Règlement de copropriété", + office: offices[0], + private_description: + "Document juridique qui établit les règles et les droits des copropriétaires d'un immeuble en copropriété.", + public_description: "Document juridique qui établit les règles et les droits des copropriétaires d'un immeuble en copropriété.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Titre de propriété", + office: offices[0], + private_description: "Document légal qui atteste de la propriété d'un bien immobilier et en identifie le propriétaire.", + public_description: "Document légal qui atteste de la propriété d'un bien immobilier et en identifie le propriétaire.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Plan et loi carrez", + office: offices[0], + private_description: + "Document officiel qui mesure la superficie d'un lot ou d'un bien immobilier, conformément à la loi Carrez qui encadre les transactions immobilières.", + public_description: + "Document officiel qui mesure la superficie d'un lot ou d'un bien immobilier, conformément à la loi Carrez qui encadre les transactions immobilières.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "CNI", + office: offices[0], + private_description: + "Document officiel d'identification délivré par l'État pour prouver l'identité et la nationalité d'une personne.", + public_description: + "Document officiel d'identification délivré par l'État pour prouver l'identité et la nationalité d'une personne.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Modifications règlement copropriété (plusieurs)", + office: offices[0], + private_description: + "Documents légaux qui apportent des changements ou des ajustements aux règles et dispositions du règlement de copropriété initial.", + public_description: + "Documents légaux qui apportent des changements ou des ajustements aux règles et dispositions du règlement de copropriété initial.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Avis de décès", + office: offices[0], + private_description: "Notification officielle délivrée par les autorités compétentes pour informer du décès d'une personne.", + public_description: "Notification officielle délivrée par les autorités compétentes pour informer du décès d'une personne.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Lettre de mission", + office: offices[0], + private_description: + "Document contractuel qui définit les termes et les objectifs d'une mission confiée à une personne ou à une entreprise.", + public_description: + "Document contractuel qui définit les termes et les objectifs d'une mission confiée à une personne ou à une entreprise.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "DPE", + office: offices[0], + private_description: "Diagnostic de Performance Energétique.", + public_description: "Diagnostic de Performance Energétique.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "RIB", + office: offices[0], + private_description: "Relevé d'identité bancaire ou IBAN.", + public_description: "Relevé d'identité bancaire ou IBAN.", + created_at: new Date(), + updated_at: new Date(), + }, + { + archived_at: null, + name: "Acte d'achat par la SCI", + office: offices[0], + private_description: "Acte d'achat par la SCI.", + public_description: "Acte d'achat par la SCI.", + created_at: new Date(), + updated_at: new Date(), + }, + ]; + + const officeFolders: OfficeFolder[] = [ + { + folder_number: "0001", + name: "Vente par Mme. Simon au profit de Mme. Lextrait", + deed: deeds[0], + status: EFolderStatus.LIVE, + created_at: new Date(), + updated_at: new Date(), + office: offices[0], + description: null, + archived_description: null, + }, + { + folder_number: "0002", + name: "Donation des parts sociales de la société SARL FLORE", + deed: deeds[1], + status: EFolderStatus.LIVE, + created_at: new Date(), + updated_at: new Date(), + office: offices[0], + description: null, + archived_description: null, + }, + { + folder_number: "0003", + name: "Vente par Mme. Lefebvre au profit de Mme. Mathieu", + deed: deeds[2], + status: EFolderStatus.LIVE, + created_at: new Date(), + updated_at: new Date(), + office: offices[0], + description: null, + archived_description: null, + }, + { + folder_number: "0004", + name: "Vente par Mme. Chevalier au profit de M. Daveau", + deed: deeds[3], + status: EFolderStatus.LIVE, + created_at: new Date(), + updated_at: new Date(), + office: offices[0], + description: null, + archived_description: null, + }, + { + folder_number: "0005", + name: "Vente par M. Lalo au profit de Mme. Pigale", + deed: deeds[4], + status: EFolderStatus.LIVE, + created_at: new Date(), + updated_at: new Date(), + office: offices[0], + description: null, + archived_description: null, + }, + { + folder_number: "0006", + name: "Donation des parts sociales de la société SMART-TALENT", + deed: deeds[5], + status: EFolderStatus.LIVE, + created_at: new Date(), + updated_at: new Date(), + office: offices[0], + description: null, + archived_description: null, + }, + { + folder_number: "0007", + name: "Vente par M. Girard au profit de M. Louis", + deed: deeds[6], + status: EFolderStatus.LIVE, + created_at: new Date(), + updated_at: new Date(), + office: offices[0], + description: null, + archived_description: null, + }, + { + folder_number: "0008", + name: "Vente par Mme. Leclerc au profit de M. Louis", + deed: deeds[7], + status: EFolderStatus.LIVE, + created_at: new Date(), + updated_at: new Date(), + office: offices[0], + description: null, + archived_description: null, + }, + { + folder_number: "0009", + name: "Vente par M. Lambert au profit de M. Holmes", + deed: deeds[8], + status: EFolderStatus.LIVE, + created_at: new Date(), + updated_at: new Date(), + office: offices[0], + description: null, + archived_description: null, + }, + ]; + + for (const office of offices) { + const officeCreated = await prisma.offices.create({ + data: { + idNot: office.idNot, + name: office.name, + crpcen: office.crpcen, + address: { create: { - idNot: user.office_membership!.idNot, - name: user.office_membership!.name, - crpcen: user.office_membership!.crpcen, - address: { - create: { - address: user.office_membership!.address!.address, - zip_code: user.office_membership!.address!.zip_code, - city: user.office_membership!.address!.city, + address: office.address!.address, + zip_code: office.address!.zip_code, + city: office.address!.city, + }, + }, + office_status: EOfficeStatus.DESACTIVATED, + }, + }); + office.uid = officeCreated.uid; + } + for (const rule of rules) { + const ruleCreated = await prisma.rules.create({ + data: { + name: rule.name, + }, + }); + rule.uid = ruleCreated.uid; + } + + for (const role of roles) { + const roleCreated = await prisma.roles.create({ + data: { + name: role.name, + rules: { + connect: role.rules?.map((rule) => ({ + uid: rule.uid!, + })), + }, + }, + }); + role.uid = roleCreated.uid; + } + + for (const officeRole of officeRoles) { + const officeRoleCreated = await prisma.officeRoles.create({ + data: { + name: officeRole.name, + office: { + connect: { + uid: officeRole.office.uid, + }, + }, + rules: { + connect: officeRole.rules?.map((rule) => ({ + uid: rule.uid!, + })), + }, + }, + }); + officeRole.uid = officeRoleCreated.uid; + } + + for (const user of users) { + const createArgs: Prisma.UsersCreateArgs = { + data: { + idNot: user.idNot, + office_membership: { + connectOrCreate: { + where: { + idNot: user.office_membership!.idNot, + }, + create: { + idNot: user.office_membership!.idNot, + name: user.office_membership!.name, + crpcen: user.office_membership!.crpcen, + address: { + create: { + address: user.office_membership!.address!.address, + zip_code: user.office_membership!.address!.zip_code, + city: user.office_membership!.address!.city, + }, }, }, }, }, + contact: { + create: { + first_name: user.contact!.first_name, + last_name: user.contact!.last_name, + email: user.contact!.email, + phone_number: user.contact!.phone_number, + cell_phone_number: user.contact!.cell_phone_number, + civility: ECivility[user.contact!.civility as keyof typeof ECivility], + address: {}, + }, + }, + role: { + connect: { + uid: user.role!.uid, + }, + }, }, - contact: { + }; + if (user.contact!.address) { + createArgs.data.contact!.create!.address!.create = { + address: user.contact!.address.address, + zip_code: user.contact!.address.zip_code, + city: user.contact!.address.city, + }; + } + if (user.office_role) { + createArgs.data.office_role = { + connect: { + uid: user.office_role.uid, + }, + }; + } + const userCreated = await prisma.users.create(createArgs); + user.uid = userCreated.uid; + } + + for (const customer of customers) { + const createArgs: Prisma.CustomersCreateArgs = { + data: { + status: ECustomerStatus.PENDING, + contact: { + create: { + first_name: customer.contact!.first_name, + last_name: customer.contact!.last_name, + email: customer.contact!.email, + phone_number: customer.contact!.phone_number, + cell_phone_number: customer.contact!.cell_phone_number, + civility: ECivility[customer.contact!.civility as keyof typeof ECivility], + address: {}, + }, + }, + }, + }; + + if (customer.contact?.address) { + createArgs.data.contact!.create!.address = { create: { - first_name: user.contact!.first_name, - last_name: user.contact!.last_name, - email: user.contact!.email, - phone_number: user.contact!.phone_number, - cell_phone_number: user.contact!.cell_phone_number, - civility: ECivility[user.contact!.civility as keyof typeof ECivility], - address: {}, + address: customer.contact?.address?.address, + zip_code: customer.contact?.address?.zip_code, + city: customer.contact?.address?.city, }, - }, - role: { - connect: { - uid: user.role!.uid, - }, - }, - }, - }; - if (user.contact!.address) { - createArgs.data.contact!.create!.address!.create = { - address: user.contact!.address.address, - zip_code: user.contact!.address.zip_code, - city: user.contact!.address.city, - }; + }; + } + const customersCreated = await prisma.customers.create(createArgs); + customer.uid = customersCreated.uid; } - if (user.office_role) { - createArgs.data.office_role = { - connect: { - uid: user.office_role.uid, + + for (const deedType of deedTypes) { + const createArgs: Prisma.DeedTypesCreateArgs = { + data: { + name: deedType.name, + description: deedType.description, + office: { + connect: { + uid: deedType.office!.uid, + }, + }, }, }; - } - const userCreated = await prisma.users.create(createArgs); - user.uid = userCreated.uid; - } - - for (const customer of customers) { - const createArgs: Prisma.CustomersCreateArgs = { - data: { - status: ECustomerStatus.PENDING, - contact: { - create: { - first_name: customer.contact!.first_name, - last_name: customer.contact!.last_name, - email: customer.contact!.email, - phone_number: customer.contact!.phone_number, - cell_phone_number: customer.contact!.cell_phone_number, - civility: ECivility[customer.contact!.civility as keyof typeof ECivility], - address: {}, - }, - }, - }, - }; - - if (customer.contact?.address) { - createArgs.data.contact!.create!.address = { - create: { - address: customer.contact?.address?.address, - zip_code: customer.contact?.address?.zip_code, - city: customer.contact?.address?.city, - }, - }; - } - const customersCreated = await prisma.customers.create(createArgs); - customer.uid = customersCreated.uid; - } - - for (const deedType of deedTypes) { - const createArgs: Prisma.DeedTypesCreateArgs = { - data: { - name: deedType.name, - description: deedType.description, - office: { - connect: { - uid: deedType.office!.uid, - }, - }, - }, - }; - if (deedType.document_types) { - createArgs.data.document_types = { - connect: deedType.document_types.map((documentType) => ({ - uid: documentType.uid, - })), - }; - } - const deedTypeCreated = await prisma.deedTypes.create(createArgs); - deedType.uid = deedTypeCreated.uid; - } - - for (const deed of deeds) { - const createArgs: Prisma.DeedsCreateArgs = { - data: { - deed_type: { - connect: { - uid: deed.deed_type!.uid, - }, - }, - }, - }; - const deedTypeWithDocumentTypes = await prisma.deedTypes.findUniqueOrThrow({ - where: { - uid: deed.deed_type!.uid, - }, - include: { document_types: true }, - }); - - if (deedTypeWithDocumentTypes.document_types) { - createArgs.data.document_types = { - connect: deedTypeWithDocumentTypes.document_types.map((documentType) => ({ - uid: documentType.uid, - })), - }; - } - const deedCreated = await prisma.deeds.create(createArgs); - deed.uid = deedCreated.uid; - } - - for (const documentType of documentTypes) { - const documentTypeCreated = await prisma.documentTypes.create({ - data: { - name: documentType.name, - public_description: documentType.public_description, - private_description: documentType.private_description, - office: { - connect: { - uid: documentType.office!.uid, - }, - }, - }, - }); - documentType.uid = documentTypeCreated.uid; - } - - for (const officeFolder of officeFolders) { - const officeFolderCreated = await prisma.officeFolders.create({ - data: { - folder_number: officeFolder.folder_number, - name: officeFolder.name, - description: officeFolder.description, - status: EFolderStatus.LIVE, - deed: { - connect: { - uid: officeFolder.deed?.uid, - }, - }, - office: { - connect: { - uid: officeFolder.office!.uid, - }, - }, - stakeholders: { - connect: officeFolder.stakeholders?.map((stakeholder) => ({ - uid: stakeholder.uid!, + if (deedType.document_types) { + createArgs.data.document_types = { + connect: deedType.document_types.map((documentType) => ({ + uid: documentType.uid, })), + }; + } + const deedTypeCreated = await prisma.deedTypes.create(createArgs); + deedType.uid = deedTypeCreated.uid; + } + + for (const deed of deeds) { + const createArgs: Prisma.DeedsCreateArgs = { + data: { + deed_type: { + connect: { + uid: deed.deed_type!.uid, + }, + }, }, - }, - }); - officeFolder.uid = officeFolderCreated.uid; + }; + const deedTypeWithDocumentTypes = await prisma.deedTypes.findUniqueOrThrow({ + where: { + uid: deed.deed_type!.uid, + }, + include: { document_types: true }, + }); + + if (deedTypeWithDocumentTypes.document_types) { + createArgs.data.document_types = { + connect: deedTypeWithDocumentTypes.document_types.map((documentType) => ({ + uid: documentType.uid, + })), + }; + } + const deedCreated = await prisma.deeds.create(createArgs); + deed.uid = deedCreated.uid; + } + + for (const documentType of documentTypes) { + const documentTypeCreated = await prisma.documentTypes.create({ + data: { + name: documentType.name, + public_description: documentType.public_description, + private_description: documentType.private_description, + office: { + connect: { + uid: documentType.office!.uid, + }, + }, + }, + }); + documentType.uid = documentTypeCreated.uid; + } + + for (const officeFolder of officeFolders) { + const officeFolderCreated = await prisma.officeFolders.create({ + data: { + folder_number: officeFolder.folder_number, + name: officeFolder.name, + description: officeFolder.description, + status: EFolderStatus.LIVE, + deed: { + connect: { + uid: officeFolder.deed?.uid, + }, + }, + office: { + connect: { + uid: officeFolder.office!.uid, + }, + }, + stakeholders: { + connect: officeFolder.stakeholders?.map((stakeholder) => ({ + uid: stakeholder.uid!, + })), + }, + }, + }); + officeFolder.uid = officeFolderCreated.uid; + } + + console.log(">MOCK DATA - Seeding completed!"); } - - console.log(">MOCK DATA - Seeding completed!"); + catch(error){ + console.log("Data already seeded, skiping"); + } + } main(); From 3065ebc6109658e0cbe06357e48d6caeb94b215d Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Tue, 25 Jul 2023 15:42:47 +0200 Subject: [PATCH 082/134] update validation groups --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 49ebb452..7467bbf0 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "cron": "^2.3.1", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.60", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.63", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", From 80244d6d2b7c2f92b8296a1f0b1612ed65452641 Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 16:21:20 +0200 Subject: [PATCH 083/134] added shadow db --- src/common/databases/schema.prisma | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/databases/schema.prisma b/src/common/databases/schema.prisma index 26a6ecc3..53eae7d8 100644 --- a/src/common/databases/schema.prisma +++ b/src/common/databases/schema.prisma @@ -8,6 +8,7 @@ generator client { datasource db { provider = "postgresql" url = env("DEV_PRISMA_STUDIO_DB_URL") + shadowDatabaseUrl = env("DEV_PRISMA_STUDIO_SHADOW_URL") } // Entités -> snake_case From c46b4057d1115057ab564c374b2b5b723570bc9f Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 16:46:35 +0200 Subject: [PATCH 084/134] REdeploy back --- src/common/config/variables/Variables.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/common/config/variables/Variables.ts b/src/common/config/variables/Variables.ts index e798462d..3747545e 100644 --- a/src/common/config/variables/Variables.ts +++ b/src/common/config/variables/Variables.ts @@ -87,6 +87,7 @@ export class BackendVariables { this.REFRESH_TOKEN_SECRET = process.env["REFRESH_TOKEN_SECRET"]!; this.MAILCHIMP_API_KEY = process.env["MAILCHIMP_API_KEY"]!; this.ENV = process.env["ENV"]!; + } public async validate(groups?: string[]) { const validationOptions = groups ? { groups } : undefined; From 14f07b4475df65f69ea858a6243c25d0b14c20af Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 25 Jul 2023 16:53:36 +0200 Subject: [PATCH 085/134] redeploy back --- src/entries/Cron.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/entries/Cron.ts b/src/entries/Cron.ts index c6331797..3ca7e3df 100644 --- a/src/entries/Cron.ts +++ b/src/entries/Cron.ts @@ -7,7 +7,6 @@ import CronService from "@Services/common/CronService/CronService"; (async () => { try { const variables = await Container.get(BackendVariables).validate(); - if(variables.ENV === "stg"){ Container.get(CronService).sendMails(); } From 59f1fe275839c569327347c0694794d7d3ae19d0 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Thu, 13 Jul 2023 13:31:15 +0200 Subject: [PATCH 086/134] add vote service --- package.json | 2 +- .../api/super-admin/AppointmentsController.ts | 103 ++++++++++++ src/app/api/super-admin/UsersController.ts | 8 +- src/app/api/super-admin/VotesController.ts | 147 ++++++++++++++++++ src/app/index.ts | 4 + .../20230713145026_v12/migration.sql | 38 +++++ .../20230725084826_v12/migration.sql | 45 ++++++ .../20230725151748_v13/migration.sql | 11 ++ src/common/databases/schema.prisma | 33 ++++ .../repositories/AppointmentsRepository.ts | 95 +++++++++++ src/common/repositories/UsersRepository.ts | 12 ++ src/common/repositories/VotesRepository.ts | 71 +++++++++ .../AppointmentsService.ts | 67 ++++++++ .../super-admin/UsersService/UsersService.ts | 8 + .../super-admin/VotesService/VotesService.ts | 73 +++++++++ 15 files changed, 714 insertions(+), 3 deletions(-) create mode 100644 src/app/api/super-admin/AppointmentsController.ts create mode 100644 src/app/api/super-admin/VotesController.ts create mode 100644 src/common/databases/migrations/20230713145026_v12/migration.sql create mode 100644 src/common/databases/migrations/20230725084826_v12/migration.sql create mode 100644 src/common/databases/migrations/20230725151748_v13/migration.sql create mode 100644 src/common/repositories/AppointmentsRepository.ts create mode 100644 src/common/repositories/VotesRepository.ts create mode 100644 src/services/super-admin/AppointmentsService/AppointmentsService.ts create mode 100644 src/services/super-admin/VotesService/VotesService.ts diff --git a/package.json b/package.json index fe9c92be..7372ff24 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "cron": "^2.3.1", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.63", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.64", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", diff --git a/src/app/api/super-admin/AppointmentsController.ts b/src/app/api/super-admin/AppointmentsController.ts new file mode 100644 index 00000000..936774c2 --- /dev/null +++ b/src/app/api/super-admin/AppointmentsController.ts @@ -0,0 +1,103 @@ +import { Response, Request } from "express"; +import { Controller, Get, Post } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import AppointmentsService from "@Services/super-admin/AppointmentsService/AppointmentsService"; +import { Service } from "typedi"; +import { Appointment } from "le-coffre-resources/dist/SuperAdmin"; +import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; + +@Controller() +@Service() +export default class AppointmentsController extends ApiController { + constructor(private appointmentsService: AppointmentsService) { + super(); + } + + /** + * @description Get all appointments + */ + @Get("/api/v1/super-admin/appointments", [authHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + let query; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } + + //call service to get prisma entity + const appointmentsEntities = await this.appointmentsService.get(query); + + //Hydrate ressource with prisma entity + const appointments = Appointment.hydrateArray(appointmentsEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, appointments); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Create a new appointment + */ + @Post("/api/v1/super-admin/appointments", [authHandler]) + protected async post(req: Request, response: Response) { + try { + //init IUser resource with request body values + const appointmentEntity = Appointment.hydrate(req.body); + //validate user + await validateOrReject(appointmentEntity, { groups: ["createAppointment"]}); + + //call service to get prisma entity + const appointmentEntityCreated = await this.appointmentsService.create(appointmentEntity); + //Hydrate ressource with prisma entity + const appointment = Appointment.hydrate(appointmentEntityCreated, { + strategy: "excludeAll", + }); + + //success + this.httpCreated(response, appointment); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific appointment by uid + */ + @Get("/api/v1/super-admin/appointments/:uid", [authHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + let query; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } + + const appointmentEntity = await this.appointmentsService.getByUid(uid, query); + + if (!appointmentEntity) { + this.httpNotFoundRequest(response, "appointment not found"); + return; + } + + //Hydrate ressource with prisma entity + const appointment = Appointment.hydrate(appointmentEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, appointment); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index a96b3f5a..87d46cad 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -90,12 +90,13 @@ export default class UsersController extends ApiController { protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; + if (!uid) { this.httpBadRequest(response, "No uid provided"); return; } - const userFound = await this.usersService.getByUid(uid); + const userFound = await this.usersService.getByUid(uid, {role: true, votes: true}); if (!userFound) { this.httpNotFoundRequest(response, "user not found"); @@ -104,12 +105,15 @@ export default class UsersController extends ApiController { //init IUser resource with request body values const userEntity = User.hydrate(req.body); + const userFoundEntity = User.hydrate(userFound, { strategy: "excludeAll" }); //validate user await validateOrReject(userEntity, { groups: ["updateUser"] }); + const userEntityToUpdate = this.voteService.vote(userEntity, userFoundEntity, userId); + //call service to get prisma entity - const userEntityUpdated = await this.usersService.update(uid, userEntity); + const userEntityUpdated = await this.usersService.update(uid, userFoundEntity); //Hydrate ressource with prisma entity const user = User.hydrate(userEntityUpdated, { diff --git a/src/app/api/super-admin/VotesController.ts b/src/app/api/super-admin/VotesController.ts new file mode 100644 index 00000000..eac8b6a9 --- /dev/null +++ b/src/app/api/super-admin/VotesController.ts @@ -0,0 +1,147 @@ +import { Response, Request } from "express"; +import { Controller, Delete, Get, Post } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import VotesService from "@Services/super-admin/VotesService/VotesService"; +import { Service } from "typedi"; +import { Vote } from "le-coffre-resources/dist/SuperAdmin"; +import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import UsersService from "@Services/super-admin/UsersService/UsersService"; +import { Votes } from "@prisma/client"; + +@Controller() +@Service() +export default class VotesController extends ApiController { + constructor(private votesService: VotesService, private usersService: UsersService) { + super(); + } + + /** + * @description Get all votes + */ + @Get("/api/v1/super-admin/votes", [authHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + let query; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } + + //call service to get prisma entity + const votesEntities = await this.votesService.get(query); + + //Hydrate ressource with prisma entity + const votes = Vote.hydrateArray(votesEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, votes); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Create a new vote + */ + @Post("/api/v1/super-admin/votes", [authHandler]) + protected async post(req: Request, response: Response) { + try { + const userId = req.body.user.userId; + //init IUser resource with request body values + const voteEntity = Vote.hydrate(req.body); + //validate user + await validateOrReject(voteEntity, { groups: ["createVote"]}); + + const votes = await this.votesService.get({ where: { AND: [{ appointment: {uid: voteEntity.uid } }, {voter: {uid: userId}}]}}); + console.log(votes) + if (votes.length) throw new Error("Voter already voted for this appointment"); + + const voter = await this.usersService.getByUid(userId); + + voteEntity.voter = voter!; + //call service to get prisma entity + const voteEntityCreated = await this.votesService.create(voteEntity); + //Hydrate ressource with prisma entity + const vote = Vote.hydrate(voteEntityCreated, { + strategy: "excludeAll", + }); + + //success + this.httpCreated(response, vote); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific vote by uid + */ + @Get("/api/v1/super-admin/votes/:uid", [authHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + let query; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } + + const voteEntity = await this.votesService.getByUid(uid, query); + + if (!voteEntity) { + this.httpNotFoundRequest(response, "vote not found"); + return; + } + + //Hydrate ressource with prisma entity + const vote = Vote.hydrate(voteEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, vote); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Delete a specific folder + */ + @Delete("/api/v1/super-admin/votes/:uid", [authHandler]) + protected async delete(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + const voteFound = await this.votesService.getByUid(uid); + + if (!voteFound) { + this.httpNotFoundRequest(response, "vote not found"); + return; + } + + //call service to get prisma entity + const votetEntity: Votes = await this.votesService.delete(uid); + + //Hydrate ressource with prisma entity + const vote = Vote.hydrate(votetEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, vote); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + +} diff --git a/src/app/index.ts b/src/app/index.ts index 22f4d1f3..a4b4d9a2 100644 --- a/src/app/index.ts +++ b/src/app/index.ts @@ -40,6 +40,8 @@ import RolesControllerNotary from "./api/notary/RolesController"; import OfficeRolesControllerNotary from "./api/notary/OfficeRolesController"; import FilesControllerCustomer from "./api/customer/FilesController"; import DocumentsControllerCustomer from "./api/customer/DocumentsController"; +import AppointmentsController from "./api/super-admin/AppointmentsController"; +import VotesController from "./api/super-admin/VotesController"; /** @@ -56,6 +58,8 @@ export default { Container.get(DeedTypesControllerSuperAdmin); Container.get(DocumentsControllerSuperAdmin); Container.get(DocumentTypesControllerSuperAdmin); + Container.get(AppointmentsController); + Container.get(VotesController); Container.get(IdNotUserController); Container.get(FranceConnectCustomerController); Container.get(FilesControllerSuperAdmin); diff --git a/src/common/databases/migrations/20230713145026_v12/migration.sql b/src/common/databases/migrations/20230713145026_v12/migration.sql new file mode 100644 index 00000000..c5dac8d4 --- /dev/null +++ b/src/common/databases/migrations/20230713145026_v12/migration.sql @@ -0,0 +1,38 @@ +-- DropForeignKey +ALTER TABLE "users" DROP CONSTRAINT "users_contact_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "users" DROP CONSTRAINT "users_office_role_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "users" DROP CONSTRAINT "users_office_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "users" DROP CONSTRAINT "users_roles_uid_fkey"; + +-- CreateTable +CREATE TABLE "votes" ( + "uid" TEXT NOT NULL, + "user_uid" VARCHAR(255) NOT NULL, + "voters" TEXT[], + + CONSTRAINT "votes_pkey" PRIMARY KEY ("uid") +); + +-- CreateIndex +CREATE UNIQUE INDEX "votes_uid_key" ON "votes"("uid"); + +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_contact_uid_fkey" FOREIGN KEY ("contact_uid") REFERENCES "contacts"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_roles_uid_fkey" FOREIGN KEY ("roles_uid") REFERENCES "roles"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_office_role_uid_fkey" FOREIGN KEY ("office_role_uid") REFERENCES "office_roles"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_office_uid_fkey" FOREIGN KEY ("office_uid") REFERENCES "offices"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "votes" ADD CONSTRAINT "votes_user_uid_fkey" FOREIGN KEY ("user_uid") REFERENCES "users"("uid") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/src/common/databases/migrations/20230725084826_v12/migration.sql b/src/common/databases/migrations/20230725084826_v12/migration.sql new file mode 100644 index 00000000..0b7f1455 --- /dev/null +++ b/src/common/databases/migrations/20230725084826_v12/migration.sql @@ -0,0 +1,45 @@ +/* + Warnings: + + - You are about to drop the column `user_uid` on the `votes` table. All the data in the column will be lost. + - You are about to drop the column `voters` on the `votes` table. All the data in the column will be lost. + - Added the required column `appointment_uid` to the `votes` table without a default value. This is not possible if the table is not empty. + - Added the required column `voter_uid` to the `votes` table without a default value. This is not possible if the table is not empty. + +*/ +-- CreateEnum +CREATE TYPE "EVote" AS ENUM ('NOMINATE', 'DISMISS'); + +-- CreateEnum +CREATE TYPE "EAppointmentStatus" AS ENUM ('OPEN', 'CLOSED'); + +-- DropForeignKey +ALTER TABLE "votes" DROP CONSTRAINT "votes_user_uid_fkey"; + +-- AlterTable +ALTER TABLE "votes" DROP COLUMN "user_uid", +DROP COLUMN "voters", +ADD COLUMN "appointment_uid" VARCHAR(255) NOT NULL, +ADD COLUMN "choice" "EVote" NOT NULL DEFAULT 'NOMINATE', +ADD COLUMN "voter_uid" VARCHAR(255) NOT NULL; + +-- CreateTable +CREATE TABLE "appointments" ( + "uid" TEXT NOT NULL, + "user_uid" VARCHAR(255) NOT NULL, + "status" "EAppointmentStatus" NOT NULL DEFAULT 'OPEN', + + CONSTRAINT "appointments_pkey" PRIMARY KEY ("uid") +); + +-- CreateIndex +CREATE UNIQUE INDEX "appointments_uid_key" ON "appointments"("uid"); + +-- AddForeignKey +ALTER TABLE "appointments" ADD CONSTRAINT "appointments_user_uid_fkey" FOREIGN KEY ("user_uid") REFERENCES "users"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "votes" ADD CONSTRAINT "votes_appointment_uid_fkey" FOREIGN KEY ("appointment_uid") REFERENCES "appointments"("uid") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "votes" ADD CONSTRAINT "votes_voter_uid_fkey" FOREIGN KEY ("voter_uid") REFERENCES "users"("uid") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/src/common/databases/migrations/20230725151748_v13/migration.sql b/src/common/databases/migrations/20230725151748_v13/migration.sql new file mode 100644 index 00000000..b8c667d7 --- /dev/null +++ b/src/common/databases/migrations/20230725151748_v13/migration.sql @@ -0,0 +1,11 @@ +/* + Warnings: + + - You are about to drop the column `choice` on the `votes` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE "appointments" ADD COLUMN "choice" "EVote" NOT NULL DEFAULT 'NOMINATE'; + +-- AlterTable +ALTER TABLE "votes" DROP COLUMN "choice"; diff --git a/src/common/databases/schema.prisma b/src/common/databases/schema.prisma index 53eae7d8..ae182a9d 100644 --- a/src/common/databases/schema.prisma +++ b/src/common/databases/schema.prisma @@ -65,6 +65,8 @@ model Users { office_uid String @db.VarChar(255) notifications Notifications[] @relation("UserHasNotifications") office_folders OfficeFolders[] @relation("OfficeFolderHasStakeholders") + appointment Appointments[] + votes Votes[] @@map("users") } @@ -287,6 +289,27 @@ model Emails { @@map("email") } +model Appointments { + uid String @id @unique @default(uuid()) + user Users @relation(fields: [user_uid], references: [uid], onDelete: Cascade) + user_uid String @db.VarChar(255) + choice EVote @default(NOMINATE) + status EAppointmentStatus @default(OPEN) + votes Votes[] + + @@map("appointments") +} + +model Votes { + uid String @id @unique @default(uuid()) + appointment Appointments @relation(fields: [appointment_uid], references: [uid], onDelete: Cascade) + appointment_uid String @db.VarChar(255) + voter Users @relation(fields: [voter_uid], references: [uid]) + voter_uid String @db.VarChar(255) + + @@map("votes") +} + enum ECivility { MALE FEMALE @@ -321,3 +344,13 @@ enum EDocumentStatus { ANCHORED REFUSED } + +enum EVote { + NOMINATE + DISMISS +} + +enum EAppointmentStatus { + OPEN + CLOSED +} diff --git a/src/common/repositories/AppointmentsRepository.ts b/src/common/repositories/AppointmentsRepository.ts new file mode 100644 index 00000000..9d5102bc --- /dev/null +++ b/src/common/repositories/AppointmentsRepository.ts @@ -0,0 +1,95 @@ +import Database from "@Common/databases/database"; +import BaseRepository from "@Repositories/BaseRepository"; +import { Service } from "typedi"; +import { Appointments, EAppointmentStatus, EVote, Prisma } from "@prisma/client"; +import { Appointment } from "le-coffre-resources/dist/SuperAdmin"; + +@Service() +export default class AppointmentsRepository extends BaseRepository { + constructor(private database: Database) { + super(); + } + protected get model() { + return this.database.getClient().appointments; + } + protected get instanceDb() { + return this.database.getClient(); + } + + /** + * @description : Find many appointments + */ + public async findMany(query: Prisma.AppointmentsFindManyArgs) { + query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); + return this.model.findMany(query); + } + + /** + * @description : Create new appointment + */ + public async create(appointment: Appointment): Promise { + const createArgs: Prisma.AppointmentsCreateArgs = { + data: { + user: { + connect: { + uid: appointment.targeted_user!.uid, + }, + }, + choice: EVote[appointment.choice as keyof typeof EVote], + }, + }; + + return this.model.create(createArgs); + } + + /** + * @description : Update data of a appointment + */ + public async update(uid: string, status: EAppointmentStatus): Promise { + const updateArgs: Prisma.AppointmentsUpdateArgs = { + where: { + uid: uid, + }, + data: { + status: status, + }, + }; + + return this.model.update(updateArgs); + } + + /** + * @description : Find one appointment + */ + public async findOneByUid(uid: string, query?: Prisma.AppointmentsInclude) { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: query, + }); + } + + /** + * @description : Find one appointment with votes + */ + public async findOneByUidWithVotes(uid: string) { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: {votes: true}, + }); + } + + /** + * @description : delete a appointment + */ + public async delete(uid: string): Promise { + return this.model.delete({ + where: { + uid: uid, + }, + }); + } +} diff --git a/src/common/repositories/UsersRepository.ts b/src/common/repositories/UsersRepository.ts index b472a8ec..8545627c 100644 --- a/src/common/repositories/UsersRepository.ts +++ b/src/common/repositories/UsersRepository.ts @@ -196,6 +196,18 @@ export default class UsersRepository extends BaseRepository { }); } + /** + * @description : Find one user with office + */ + public async findOneByUidWithRole(uid: string) { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: { role: true }, + }); + } + /** * @description : Find one user */ diff --git a/src/common/repositories/VotesRepository.ts b/src/common/repositories/VotesRepository.ts new file mode 100644 index 00000000..2283ca94 --- /dev/null +++ b/src/common/repositories/VotesRepository.ts @@ -0,0 +1,71 @@ +import Database from "@Common/databases/database"; +import BaseRepository from "@Repositories/BaseRepository"; +import { Service } from "typedi"; +import { Votes, Prisma } from "@prisma/client"; +import { Vote } from "le-coffre-resources/dist/SuperAdmin"; + +@Service() +export default class VotesRepository extends BaseRepository { + constructor(private database: Database) { + super(); + } + protected get model() { + return this.database.getClient().votes; + } + protected get instanceDb() { + return this.database.getClient(); + } + + /** + * @description : Find many votes + */ + public async findMany(query: Prisma.VotesFindManyArgs) { + query.take = Math.min(query.take || this.defaultFetchRows, this.maxFetchRows); + return this.model.findMany(query); + } + + /** + * @description : Create new vote + */ + public async create(vote: Vote): Promise { + const createArgs: Prisma.VotesCreateArgs = { + data: { + appointment: { + connect: { + uid: vote.appointment.uid, + }, + }, + voter: { + connect: { + uid: vote.voter.uid, + }, + }, + }, + }; + + return this.model.create(createArgs); + } + + /** + * @description : Find one vote + */ + public async findOneByUid(uid: string, query?: Prisma.VotesInclude): Promise { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: query, + }); + } + + /** + * @description : delete a vote + */ + public async delete(uid: string): Promise { + return this.model.delete({ + where: { + uid: uid, + }, + }); + } +} diff --git a/src/services/super-admin/AppointmentsService/AppointmentsService.ts b/src/services/super-admin/AppointmentsService/AppointmentsService.ts new file mode 100644 index 00000000..9a47953e --- /dev/null +++ b/src/services/super-admin/AppointmentsService/AppointmentsService.ts @@ -0,0 +1,67 @@ +import BaseService from "@Services/BaseService"; +import { Service } from "typedi"; +import { Appointment } from "le-coffre-resources/dist/SuperAdmin"; +import AppointmentsRepository from "@Repositories/AppointmentsRepository"; +import { Prisma, Appointments, EAppointmentStatus } from "@prisma/client"; +import UsersService from "../UsersService/UsersService"; +import { EVote } from "le-coffre-resources/dist/SuperAdmin/Appointment"; + +@Service() +export default class AppointmentService extends BaseService { + constructor(private appointmentRepository: AppointmentsRepository, private userService: UsersService) { + super(); + } + + /** + * @description : Get all appointments + * @throws {Error} If appointments cannot be get + */ + public get(query: Prisma.AppointmentsFindManyArgs) { + return this.appointmentRepository.findMany(query); + } + + /** + * @description : Create a appointment + * @throws {Error} If appointment couldn't be created + */ + public async create(appointment: Appointment): Promise { + const user = await this.userService.getByUidWithRole(appointment.targeted_user!.uid!) + if(!user) throw new Error("User not found"); + user.role.name === "super-admin" ? appointment.choice = EVote.DISMISS : appointment.choice = EVote.NOMINATE; + return this.appointmentRepository.create(appointment); + } + + /** + * @description : Modify a appointment + * @throws {Error} If appointment cannot be modified + */ + public async update(uid: string, status: EAppointmentStatus): Promise { + return this.appointmentRepository.update(uid, status); + } + + /** + * @description : Get a appointment by uid + * @throws {Error} If appointment cannot be get by uid + */ + public getByUid(uid: string, query?: Prisma.AppointmentsInclude): Promise { + return this.appointmentRepository.findOneByUid(uid, query); + } + + /** + * @description : Get a appointment by uid + * @throws {Error} If appointment cannot be get by uid + */ + public getByUidWithVotes(uid: string) { + return this.appointmentRepository.findOneByUidWithVotes(uid); + } + + /** + * @description : delete a appointment by uid + * @throws {Error} If appointment cannot be get by uid + */ + public delete(uid: string) { + return this.appointmentRepository.delete(uid); + } + + +} diff --git a/src/services/super-admin/UsersService/UsersService.ts b/src/services/super-admin/UsersService/UsersService.ts index da350fea..241cb1e4 100644 --- a/src/services/super-admin/UsersService/UsersService.ts +++ b/src/services/super-admin/UsersService/UsersService.ts @@ -51,6 +51,14 @@ export default class UsersService extends BaseService { return this.userRepository.findOneByUidWithOffice(uid); } + /** + * @description : Get a user by uid with role + * @throws {Error} If user cannot be get by uid + */ + public getByUidWithRole(uid: string) { + return this.userRepository.findOneByUidWithRole(uid); + } + /** * @description : Get a user by uid * @throws {Error} If user cannot be get by uid diff --git a/src/services/super-admin/VotesService/VotesService.ts b/src/services/super-admin/VotesService/VotesService.ts new file mode 100644 index 00000000..bdd95fe4 --- /dev/null +++ b/src/services/super-admin/VotesService/VotesService.ts @@ -0,0 +1,73 @@ +import BaseService from "@Services/BaseService"; +import { Service } from "typedi"; +import { Vote } from "le-coffre-resources/dist/SuperAdmin"; +import VotesRepository from "@Repositories/VotesRepository"; +import { EAppointmentStatus, EVote, Prisma, Votes } from "@prisma/client"; +import AppointmentService from "../AppointmentsService/AppointmentsService"; +import UsersService from "../UsersService/UsersService"; +import RolesService from "../RolesService/RolesService"; + +@Service() +export default class VoteService extends BaseService { + constructor( + private voteRepository: VotesRepository, + private appointmentService: AppointmentService, + private userService: UsersService, + private roleService: RolesService, + ) { + super(); + } + + /** + * @description : Get all votes + * @throws {Error} If votes cannot be get + */ + public get(query: Prisma.VotesFindManyArgs) { + return this.voteRepository.findMany(query); + } + + /** + * @description : Create a vote + * @throws {Error} If vote couldn't be created + */ + public async create(vote: Vote): Promise { + const appointment = await this.appointmentService.getByUidWithVotes(vote.appointment.uid!); + if (!appointment) throw new Error("Appointment not found"); + if (appointment.status === EAppointmentStatus.CLOSED) throw new Error("Appointment is closed"); + + if (appointment.votes.length >= 2) { + const voteCreated = await this.voteRepository.create(vote); + await this.appointmentService.update(appointment.uid!, EAppointmentStatus.CLOSED); + const user = await this.userService.getByUid(appointment.user_uid); + + if (appointment.choice === EVote.DISMISS) { + const roles = await this.roleService.get({ where: { name: "default" } }); + user!.roles_uid = roles[0]!.uid; + await this.userService.update(appointment.user_uid, user!); + return voteCreated; + } else if (appointment.choice === EVote.NOMINATE) { + const roles = await this.roleService.get({ where: { name: "super-admin" } }); + user!.roles_uid = roles[0]!.uid; + await this.userService.update(appointment.user_uid, user!); + return voteCreated; + } + } + return this.voteRepository.create(vote); + } + + /** + * @description : Get a vote by uid + * @throws {Error} If vote cannot be get by uid + */ + public getByUid(uid: string, query?: Prisma.VotesInclude) { + return this.voteRepository.findOneByUid(uid, query); + } + + /** + * @description : delete a vote by uid + * @throws {Error} If vote cannot be get by uid + */ + public delete(uid: string) { + return this.voteRepository.delete(uid); + } +} From 0a675027ca03b749419dfa31e7a90a067e755bf0 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Tue, 25 Jul 2023 18:56:47 +0200 Subject: [PATCH 087/134] fix merge issue --- src/app/api/super-admin/UsersController.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index 87d46cad..71d97022 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -109,8 +109,6 @@ export default class UsersController extends ApiController { //validate user await validateOrReject(userEntity, { groups: ["updateUser"] }); - - const userEntityToUpdate = this.voteService.vote(userEntity, userFoundEntity, userId); //call service to get prisma entity const userEntityUpdated = await this.usersService.update(uid, userFoundEntity); From e9f3fb7e9c475ae216ff4843e775640ad57b4bac Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Wed, 26 Jul 2023 11:49:32 +0200 Subject: [PATCH 088/134] add error handling --- .../api/super-admin/AppointmentsController.ts | 9 ++++- src/app/api/super-admin/VotesController.ts | 35 +++++++++++++------ .../super-admin/VotesService/VotesService.ts | 25 ++++++------- 3 files changed, 46 insertions(+), 23 deletions(-) diff --git a/src/app/api/super-admin/AppointmentsController.ts b/src/app/api/super-admin/AppointmentsController.ts index 936774c2..fa143534 100644 --- a/src/app/api/super-admin/AppointmentsController.ts +++ b/src/app/api/super-admin/AppointmentsController.ts @@ -6,11 +6,12 @@ import { Service } from "typedi"; import { Appointment } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; +import UsersService from "@Services/super-admin/UsersService/UsersService"; @Controller() @Service() export default class AppointmentsController extends ApiController { - constructor(private appointmentsService: AppointmentsService) { + constructor(private appointmentsService: AppointmentsService, private usersService: UsersService) { super(); } @@ -51,6 +52,12 @@ export default class AppointmentsController extends ApiController { //validate user await validateOrReject(appointmentEntity, { groups: ["createAppointment"]}); + const targetedUser = await this.usersService.getByUid(appointmentEntity.targeted_user.uid!); + if(!targetedUser) { + this.httpNotFoundRequest(response, "targeted user not found"); + return; + } + //call service to get prisma entity const appointmentEntityCreated = await this.appointmentsService.create(appointmentEntity); //Hydrate ressource with prisma entity diff --git a/src/app/api/super-admin/VotesController.ts b/src/app/api/super-admin/VotesController.ts index eac8b6a9..71057e82 100644 --- a/src/app/api/super-admin/VotesController.ts +++ b/src/app/api/super-admin/VotesController.ts @@ -7,12 +7,13 @@ import { Vote } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import UsersService from "@Services/super-admin/UsersService/UsersService"; -import { Votes } from "@prisma/client"; +import { EAppointmentStatus, Votes } from "@prisma/client"; +import AppointmentService from "@Services/super-admin/AppointmentsService/AppointmentsService"; @Controller() @Service() export default class VotesController extends ApiController { - constructor(private votesService: VotesService, private usersService: UsersService) { + constructor(private votesService: VotesService, private usersService: UsersService, private appointmentService: AppointmentService) { super(); } @@ -52,14 +53,29 @@ export default class VotesController extends ApiController { //init IUser resource with request body values const voteEntity = Vote.hydrate(req.body); //validate user - await validateOrReject(voteEntity, { groups: ["createVote"]}); + await validateOrReject(voteEntity, { groups: ["createVote"] }); + + const appointment = await this.appointmentService.getByUid(voteEntity.appointment.uid!); + if (!appointment) { + this.httpNotFoundRequest(response, "Appointment not found"); + return; + } + if (appointment.status === EAppointmentStatus.CLOSED) { + this.httpBadRequest(response, "Appointment is closed"); + return; + } + + const votes = await this.votesService.get({ + where: { AND: [{ appointment: { uid: voteEntity.appointment.uid } }, { voter: { uid: userId } }] }, + }); + console.log(votes); + if (votes.length) { + this.httpBadRequest(response, "Voter already voted for this appointment"); + return; + } - const votes = await this.votesService.get({ where: { AND: [{ appointment: {uid: voteEntity.uid } }, {voter: {uid: userId}}]}}); - console.log(votes) - if (votes.length) throw new Error("Voter already voted for this appointment"); - const voter = await this.usersService.getByUid(userId); - + voteEntity.voter = voter!; //call service to get prisma entity const voteEntityCreated = await this.votesService.create(voteEntity); @@ -92,7 +108,7 @@ export default class VotesController extends ApiController { if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } - + const voteEntity = await this.votesService.getByUid(uid, query); if (!voteEntity) { @@ -143,5 +159,4 @@ export default class VotesController extends ApiController { return; } } - } diff --git a/src/services/super-admin/VotesService/VotesService.ts b/src/services/super-admin/VotesService/VotesService.ts index bdd95fe4..663058ef 100644 --- a/src/services/super-admin/VotesService/VotesService.ts +++ b/src/services/super-admin/VotesService/VotesService.ts @@ -1,6 +1,6 @@ import BaseService from "@Services/BaseService"; import { Service } from "typedi"; -import { Vote } from "le-coffre-resources/dist/SuperAdmin"; +import User, { Role, Vote } from "le-coffre-resources/dist/SuperAdmin"; import VotesRepository from "@Repositories/VotesRepository"; import { EAppointmentStatus, EVote, Prisma, Votes } from "@prisma/client"; import AppointmentService from "../AppointmentsService/AppointmentsService"; @@ -32,23 +32,24 @@ export default class VoteService extends BaseService { */ public async create(vote: Vote): Promise { const appointment = await this.appointmentService.getByUidWithVotes(vote.appointment.uid!); - if (!appointment) throw new Error("Appointment not found"); - if (appointment.status === EAppointmentStatus.CLOSED) throw new Error("Appointment is closed"); - if (appointment.votes.length >= 2) { + if (appointment!.votes.length >= 2) { const voteCreated = await this.voteRepository.create(vote); - await this.appointmentService.update(appointment.uid!, EAppointmentStatus.CLOSED); - const user = await this.userService.getByUid(appointment.user_uid); + await this.appointmentService.update(appointment!.uid!, EAppointmentStatus.CLOSED); + const user = await this.userService.getByUid(appointment!.user_uid, { role: true }); + const userEntity = User.hydrate(user!, { strategy: "excludeAll" }); - if (appointment.choice === EVote.DISMISS) { + if (appointment!.choice === EVote.DISMISS) { const roles = await this.roleService.get({ where: { name: "default" } }); - user!.roles_uid = roles[0]!.uid; - await this.userService.update(appointment.user_uid, user!); + const roleEntity = Role.hydrate(roles[0]!, { strategy: "excludeAll" }); + userEntity.role = roleEntity; + await this.userService.update(appointment!.user_uid, userEntity); return voteCreated; - } else if (appointment.choice === EVote.NOMINATE) { + } else if (appointment!.choice === EVote.NOMINATE) { const roles = await this.roleService.get({ where: { name: "super-admin" } }); - user!.roles_uid = roles[0]!.uid; - await this.userService.update(appointment.user_uid, user!); + const roleEntity = Role.hydrate(roles[0]!, { strategy: "excludeAll" }); + userEntity!.role = roleEntity; + await this.userService.update(appointment!.user_uid, userEntity); return voteCreated; } } From d244158c4ec31a3bae9ea6b10dbf7ff60a3b5683 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Wed, 26 Jul 2023 11:53:20 +0200 Subject: [PATCH 089/134] add unique constraint on appointments --- .../databases/migrations/20230726095252_v25/migration.sql | 8 ++++++++ src/common/databases/schema.prisma | 1 + 2 files changed, 9 insertions(+) create mode 100644 src/common/databases/migrations/20230726095252_v25/migration.sql diff --git a/src/common/databases/migrations/20230726095252_v25/migration.sql b/src/common/databases/migrations/20230726095252_v25/migration.sql new file mode 100644 index 00000000..389c4749 --- /dev/null +++ b/src/common/databases/migrations/20230726095252_v25/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - A unique constraint covering the columns `[user_uid,choice,status]` on the table `appointments` will be added. If there are existing duplicate values, this will fail. + +*/ +-- CreateIndex +CREATE UNIQUE INDEX "appointments_user_uid_choice_status_key" ON "appointments"("user_uid", "choice", "status"); diff --git a/src/common/databases/schema.prisma b/src/common/databases/schema.prisma index ae182a9d..98ff92ea 100644 --- a/src/common/databases/schema.prisma +++ b/src/common/databases/schema.prisma @@ -297,6 +297,7 @@ model Appointments { status EAppointmentStatus @default(OPEN) votes Votes[] + @@unique([user_uid, choice, status]) @@map("appointments") } From fffcd17944892fd89dde3098c0a0dab130477239 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Wed, 26 Jul 2023 17:11:32 +0200 Subject: [PATCH 090/134] refacto vote creation in live-votes --- package.json | 2 +- .../api/super-admin/AppointmentsController.ts | 38 +------- src/app/api/super-admin/LiveVoteController.ts | 90 +++++++++++++++++ src/app/api/super-admin/VotesController.ts | 58 +---------- src/app/index.ts | 2 + .../repositories/AppointmentsRepository.ts | 21 +--- src/common/repositories/UsersRepository.ts | 4 +- src/common/repositories/VotesRepository.ts | 29 ++++-- .../AppointmentsService.ts | 16 +-- .../LiveVoteService/LiveVoteService.ts | 97 +++++++++++++++++++ .../super-admin/VotesService/VotesService.ts | 43 +------- 11 files changed, 224 insertions(+), 176 deletions(-) create mode 100644 src/app/api/super-admin/LiveVoteController.ts create mode 100644 src/services/super-admin/LiveVoteService/LiveVoteService.ts diff --git a/package.json b/package.json index 7372ff24..31b23e12 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "cron": "^2.3.1", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.64", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.65", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", diff --git a/src/app/api/super-admin/AppointmentsController.ts b/src/app/api/super-admin/AppointmentsController.ts index fa143534..f2790755 100644 --- a/src/app/api/super-admin/AppointmentsController.ts +++ b/src/app/api/super-admin/AppointmentsController.ts @@ -1,17 +1,15 @@ import { Response, Request } from "express"; -import { Controller, Get, Post } from "@ControllerPattern/index"; +import { Controller, Get } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import AppointmentsService from "@Services/super-admin/AppointmentsService/AppointmentsService"; import { Service } from "typedi"; import { Appointment } from "le-coffre-resources/dist/SuperAdmin"; -import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; -import UsersService from "@Services/super-admin/UsersService/UsersService"; @Controller() @Service() export default class AppointmentsController extends ApiController { - constructor(private appointmentsService: AppointmentsService, private usersService: UsersService) { + constructor(private appointmentsService: AppointmentsService) { super(); } @@ -41,38 +39,6 @@ export default class AppointmentsController extends ApiController { } } - /** - * @description Create a new appointment - */ - @Post("/api/v1/super-admin/appointments", [authHandler]) - protected async post(req: Request, response: Response) { - try { - //init IUser resource with request body values - const appointmentEntity = Appointment.hydrate(req.body); - //validate user - await validateOrReject(appointmentEntity, { groups: ["createAppointment"]}); - - const targetedUser = await this.usersService.getByUid(appointmentEntity.targeted_user.uid!); - if(!targetedUser) { - this.httpNotFoundRequest(response, "targeted user not found"); - return; - } - - //call service to get prisma entity - const appointmentEntityCreated = await this.appointmentsService.create(appointmentEntity); - //Hydrate ressource with prisma entity - const appointment = Appointment.hydrate(appointmentEntityCreated, { - strategy: "excludeAll", - }); - - //success - this.httpCreated(response, appointment); - } catch (error) { - this.httpInternalError(response, error); - return; - } - } - /** * @description Get a specific appointment by uid */ diff --git a/src/app/api/super-admin/LiveVoteController.ts b/src/app/api/super-admin/LiveVoteController.ts new file mode 100644 index 00000000..e07b6eab --- /dev/null +++ b/src/app/api/super-admin/LiveVoteController.ts @@ -0,0 +1,90 @@ +import { Response, Request } from "express"; +import { Controller, Post } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import VotesService from "@Services/super-admin/VotesService/VotesService"; +import { Service } from "typedi"; +import { Vote } from "le-coffre-resources/dist/SuperAdmin"; +import { validateOrReject } from "class-validator"; +import authHandler from "@App/middlewares/AuthHandler"; +import UsersService from "@Services/super-admin/UsersService/UsersService"; +import { EAppointmentStatus } from "@prisma/client"; +import AppointmentService from "@Services/super-admin/AppointmentsService/AppointmentsService"; +import LiveVoteService from "@Services/super-admin/LiveVoteService/LiveVoteService"; + +@Controller() +@Service() +export default class LiveVoteController extends ApiController { + constructor(private liveVoteService: LiveVoteService, private votesService: VotesService, private usersService: UsersService, private appointmentService: AppointmentService) { + super(); + } + + /** + * @description Create a new vote + */ + @Post("/api/v1/super-admin/live-votes", [authHandler]) + protected async post(req: Request, response: Response) { + try { + const userId = req.body.user.userId; + //init IUser resource with request body values + const voteEntity = Vote.hydrate(req.body); + //validate user + await validateOrReject(voteEntity, { groups: ["createVote"] }); + + if (voteEntity.appointment.uid) { + const appointment = await this.appointmentService.getByUid(voteEntity.appointment.uid); + if (!appointment) { + this.httpNotFoundRequest(response, "Appointment not found"); + return; + } + if (appointment.status === EAppointmentStatus.CLOSED) { + this.httpBadRequest(response, "Appointment is closed"); + return; + } + } + + const votes = await this.votesService.get({ + where: { + OR: [ + { AND: [{ appointment: { uid: voteEntity.appointment.uid } }, { voter: { uid: userId } }] }, + { + AND: [ + { + appointment: { + AND: [{ user_uid: voteEntity.appointment.targeted_user.uid }, { status: EAppointmentStatus.OPEN }], + }, + }, + { voter: { uid: userId } }, + ], + }, + ], + }, + }); + + if (votes.length) { + this.httpBadRequest(response, "Voter already voted for this appointment"); + return; + } + + const voter = await this.usersService.getByUid(userId); + + voteEntity.voter = voter!; + //call service to get prisma entity + const voteEntityCreated = await this.liveVoteService.create(voteEntity); + + if(!voteEntityCreated) { + this.httpBadRequest(response, "Appointment choice is not valid"); + return; + } + //Hydrate ressource with prisma entity + const vote = Vote.hydrate(voteEntityCreated, { + strategy: "excludeAll", + }); + + //success + this.httpCreated(response, vote); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/super-admin/VotesController.ts b/src/app/api/super-admin/VotesController.ts index 71057e82..4f08ccf8 100644 --- a/src/app/api/super-admin/VotesController.ts +++ b/src/app/api/super-admin/VotesController.ts @@ -1,19 +1,16 @@ import { Response, Request } from "express"; -import { Controller, Delete, Get, Post } from "@ControllerPattern/index"; +import { Controller, Delete, Get } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import VotesService from "@Services/super-admin/VotesService/VotesService"; import { Service } from "typedi"; import { Vote } from "le-coffre-resources/dist/SuperAdmin"; -import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; -import UsersService from "@Services/super-admin/UsersService/UsersService"; -import { EAppointmentStatus, Votes } from "@prisma/client"; -import AppointmentService from "@Services/super-admin/AppointmentsService/AppointmentsService"; +import { Votes } from "@prisma/client"; @Controller() @Service() export default class VotesController extends ApiController { - constructor(private votesService: VotesService, private usersService: UsersService, private appointmentService: AppointmentService) { + constructor(private votesService: VotesService) { super(); } @@ -43,55 +40,6 @@ export default class VotesController extends ApiController { } } - /** - * @description Create a new vote - */ - @Post("/api/v1/super-admin/votes", [authHandler]) - protected async post(req: Request, response: Response) { - try { - const userId = req.body.user.userId; - //init IUser resource with request body values - const voteEntity = Vote.hydrate(req.body); - //validate user - await validateOrReject(voteEntity, { groups: ["createVote"] }); - - const appointment = await this.appointmentService.getByUid(voteEntity.appointment.uid!); - if (!appointment) { - this.httpNotFoundRequest(response, "Appointment not found"); - return; - } - if (appointment.status === EAppointmentStatus.CLOSED) { - this.httpBadRequest(response, "Appointment is closed"); - return; - } - - const votes = await this.votesService.get({ - where: { AND: [{ appointment: { uid: voteEntity.appointment.uid } }, { voter: { uid: userId } }] }, - }); - console.log(votes); - if (votes.length) { - this.httpBadRequest(response, "Voter already voted for this appointment"); - return; - } - - const voter = await this.usersService.getByUid(userId); - - voteEntity.voter = voter!; - //call service to get prisma entity - const voteEntityCreated = await this.votesService.create(voteEntity); - //Hydrate ressource with prisma entity - const vote = Vote.hydrate(voteEntityCreated, { - strategy: "excludeAll", - }); - - //success - this.httpCreated(response, vote); - } catch (error) { - this.httpInternalError(response, error); - return; - } - } - /** * @description Get a specific vote by uid */ diff --git a/src/app/index.ts b/src/app/index.ts index a4b4d9a2..f550461c 100644 --- a/src/app/index.ts +++ b/src/app/index.ts @@ -42,6 +42,7 @@ import FilesControllerCustomer from "./api/customer/FilesController"; import DocumentsControllerCustomer from "./api/customer/DocumentsController"; import AppointmentsController from "./api/super-admin/AppointmentsController"; import VotesController from "./api/super-admin/VotesController"; +import LiveVoteController from "./api/super-admin/LiveVoteController"; /** @@ -60,6 +61,7 @@ export default { Container.get(DocumentTypesControllerSuperAdmin); Container.get(AppointmentsController); Container.get(VotesController); + Container.get(LiveVoteController); Container.get(IdNotUserController); Container.get(FranceConnectCustomerController); Container.get(FilesControllerSuperAdmin); diff --git a/src/common/repositories/AppointmentsRepository.ts b/src/common/repositories/AppointmentsRepository.ts index 9d5102bc..62b74d34 100644 --- a/src/common/repositories/AppointmentsRepository.ts +++ b/src/common/repositories/AppointmentsRepository.ts @@ -1,8 +1,7 @@ import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; -import { Appointments, EAppointmentStatus, EVote, Prisma } from "@prisma/client"; -import { Appointment } from "le-coffre-resources/dist/SuperAdmin"; +import { Appointments, EAppointmentStatus, Prisma } from "@prisma/client"; @Service() export default class AppointmentsRepository extends BaseRepository { @@ -24,24 +23,6 @@ export default class AppointmentsRepository extends BaseRepository { return this.model.findMany(query); } - /** - * @description : Create new appointment - */ - public async create(appointment: Appointment): Promise { - const createArgs: Prisma.AppointmentsCreateArgs = { - data: { - user: { - connect: { - uid: appointment.targeted_user!.uid, - }, - }, - choice: EVote[appointment.choice as keyof typeof EVote], - }, - }; - - return this.model.create(createArgs); - } - /** * @description : Update data of a appointment */ diff --git a/src/common/repositories/UsersRepository.ts b/src/common/repositories/UsersRepository.ts index 8545627c..49673146 100644 --- a/src/common/repositories/UsersRepository.ts +++ b/src/common/repositories/UsersRepository.ts @@ -2,7 +2,7 @@ import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; import { ECivility, Prisma, Users } from "@prisma/client"; -import User from "le-coffre-resources/dist/SuperAdmin"; +import User, { Role } from "le-coffre-resources/dist/SuperAdmin"; @Service() export default class UsersRepository extends BaseRepository { @@ -199,7 +199,7 @@ export default class UsersRepository extends BaseRepository { /** * @description : Find one user with office */ - public async findOneByUidWithRole(uid: string) { + public async findOneByUidWithRole(uid: string): Promise<((Users & {role: Role} )| null)> { return this.model.findUnique({ where: { uid: uid, diff --git a/src/common/repositories/VotesRepository.ts b/src/common/repositories/VotesRepository.ts index 2283ca94..0450760a 100644 --- a/src/common/repositories/VotesRepository.ts +++ b/src/common/repositories/VotesRepository.ts @@ -1,7 +1,7 @@ import Database from "@Common/databases/database"; import BaseRepository from "@Repositories/BaseRepository"; import { Service } from "typedi"; -import { Votes, Prisma } from "@prisma/client"; +import { Votes, Prisma, EVote, EAppointmentStatus } from "@prisma/client"; import { Vote } from "le-coffre-resources/dist/SuperAdmin"; @Service() @@ -27,12 +27,29 @@ export default class VotesRepository extends BaseRepository { /** * @description : Create new vote */ - public async create(vote: Vote): Promise { + public async create(vote: Vote): Promise { + let whereArg: Prisma.AppointmentsWhereUniqueInput; + if(vote.appointment.targeted_user.uid) { + whereArg = { + user_uid_choice_status: { + user_uid: vote.appointment.targeted_user.uid, + choice: EVote[vote.appointment.choice as keyof typeof EVote], + status: EAppointmentStatus.OPEN, + } + }; + } else { + whereArg = { + uid: vote.appointment.uid, + }; + } const createArgs: Prisma.VotesCreateArgs = { data: { appointment: { - connect: { - uid: vote.appointment.uid, + connectOrCreate: { + where: whereArg, + create: { + user_uid: vote.appointment.targeted_user.uid!, + } }, }, voter: { @@ -40,10 +57,10 @@ export default class VotesRepository extends BaseRepository { uid: vote.voter.uid, }, }, - }, + } }; - return this.model.create(createArgs); + return this.model.create({...createArgs, include: {appointment: {include: {votes: true}}}}); } /** diff --git a/src/services/super-admin/AppointmentsService/AppointmentsService.ts b/src/services/super-admin/AppointmentsService/AppointmentsService.ts index 9a47953e..45d8b481 100644 --- a/src/services/super-admin/AppointmentsService/AppointmentsService.ts +++ b/src/services/super-admin/AppointmentsService/AppointmentsService.ts @@ -1,14 +1,11 @@ import BaseService from "@Services/BaseService"; import { Service } from "typedi"; -import { Appointment } from "le-coffre-resources/dist/SuperAdmin"; import AppointmentsRepository from "@Repositories/AppointmentsRepository"; import { Prisma, Appointments, EAppointmentStatus } from "@prisma/client"; -import UsersService from "../UsersService/UsersService"; -import { EVote } from "le-coffre-resources/dist/SuperAdmin/Appointment"; @Service() export default class AppointmentService extends BaseService { - constructor(private appointmentRepository: AppointmentsRepository, private userService: UsersService) { + constructor(private appointmentRepository: AppointmentsRepository) { super(); } @@ -20,17 +17,6 @@ export default class AppointmentService extends BaseService { return this.appointmentRepository.findMany(query); } - /** - * @description : Create a appointment - * @throws {Error} If appointment couldn't be created - */ - public async create(appointment: Appointment): Promise { - const user = await this.userService.getByUidWithRole(appointment.targeted_user!.uid!) - if(!user) throw new Error("User not found"); - user.role.name === "super-admin" ? appointment.choice = EVote.DISMISS : appointment.choice = EVote.NOMINATE; - return this.appointmentRepository.create(appointment); - } - /** * @description : Modify a appointment * @throws {Error} If appointment cannot be modified diff --git a/src/services/super-admin/LiveVoteService/LiveVoteService.ts b/src/services/super-admin/LiveVoteService/LiveVoteService.ts new file mode 100644 index 00000000..5576bb28 --- /dev/null +++ b/src/services/super-admin/LiveVoteService/LiveVoteService.ts @@ -0,0 +1,97 @@ +import BaseService from "@Services/BaseService"; +import { Service } from "typedi"; +import User, { Appointment, Role, Vote } from "le-coffre-resources/dist/SuperAdmin"; +import VotesRepository from "@Repositories/VotesRepository"; +import { Appointments, EAppointmentStatus, EVote, Votes } from "@prisma/client"; +import AppointmentService from "../AppointmentsService/AppointmentsService"; +import UsersService from "../UsersService/UsersService"; +import RolesService from "../RolesService/RolesService"; + +@Service() +export default class LiveVoteService extends BaseService { + constructor( + private voteRepository: VotesRepository, + private appointmentService: AppointmentService, + private userService: UsersService, + private roleService: RolesService, + ) { + super(); + } + + public async verifyVoterChoice(vote: Vote): Promise { + const userWithRole = await this.userService.getByUidWithRole(vote.appointment.targeted_user.uid!); + if (userWithRole!.role.name === "super-admin" && vote.appointment.choice === EVote.DISMISS) { + return true; + } + if (userWithRole!.role.name !== "super-admin" && vote.appointment.choice === EVote.NOMINATE) { + return true; + } + return false; + } + + public async getAppointmentWithVotes(vote: Vote): Promise { + if (vote.appointment.uid) { + return this.appointmentService.getByUidWithVotes(vote.appointment.uid); + } + const appointmentByUser = await this.appointmentService.get({ + where: { + AND: [ + { user_uid: vote.appointment.targeted_user.uid }, + { status: EAppointmentStatus.OPEN }, + { choice: EVote[vote.appointment.choice as keyof typeof EVote] }, + ], + }, + include: { votes: true }, + }); + if (appointmentByUser.length >= 1) { + return this.appointmentService.getByUidWithVotes(appointmentByUser[0]!.uid); + } + return null; + } + + private async closeVote(appointment: Appointments, vote: Votes) { + await this.appointmentService.update(vote.appointment_uid, EAppointmentStatus.CLOSED); + const user = await this.userService.getByUid(appointment.user_uid, { role: true }); + const userEntity = User.hydrate(user!, { strategy: "excludeAll" }); + + return await this.updateRole(appointment, userEntity, vote); + } + + private async updateRole(appointment: Appointments, userEntity: User, vote: Votes) { + if (appointment.choice === EVote.DISMISS) { + const roles = await this.roleService.get({ where: { name: "default" } }); + const roleEntity = Role.hydrate(roles[0]!, { strategy: "excludeAll" }); + userEntity.role = roleEntity; + await this.userService.update(appointment!.user_uid, userEntity); + return vote; + } else if (appointment.choice === EVote.NOMINATE) { + const roles = await this.roleService.get({ where: { name: "super-admin" } }); + const roleEntity = Role.hydrate(roles[0]!, { strategy: "excludeAll" }); + userEntity!.role = roleEntity; + await this.userService.update(appointment!.user_uid, userEntity); + return vote; + } + return vote; + } + + /** + * @description : Create a vote + * @throws {Error} If vote couldn't be created + */ + public async create(vote: Vote): Promise { + const appointment = await this.getAppointmentWithVotes(vote); + + if (appointment) { + const appointmentEntity = Appointment.hydrate(appointment, { strategy: "excludeAll" }); + if (appointmentEntity?.votes && appointmentEntity.votes.length >= 2) { + const voteCreated = await this.voteRepository.create(vote); + return this.closeVote(appointment, voteCreated); + } + } + + const approvedChoice = await this.verifyVoterChoice(vote); + if(!approvedChoice) return null; + + return this.voteRepository.create(vote); + } +} diff --git a/src/services/super-admin/VotesService/VotesService.ts b/src/services/super-admin/VotesService/VotesService.ts index 663058ef..fa32fb4d 100644 --- a/src/services/super-admin/VotesService/VotesService.ts +++ b/src/services/super-admin/VotesService/VotesService.ts @@ -1,20 +1,11 @@ import BaseService from "@Services/BaseService"; import { Service } from "typedi"; -import User, { Role, Vote } from "le-coffre-resources/dist/SuperAdmin"; import VotesRepository from "@Repositories/VotesRepository"; -import { EAppointmentStatus, EVote, Prisma, Votes } from "@prisma/client"; -import AppointmentService from "../AppointmentsService/AppointmentsService"; -import UsersService from "../UsersService/UsersService"; -import RolesService from "../RolesService/RolesService"; +import { Prisma } from "@prisma/client"; @Service() export default class VoteService extends BaseService { - constructor( - private voteRepository: VotesRepository, - private appointmentService: AppointmentService, - private userService: UsersService, - private roleService: RolesService, - ) { + constructor(private voteRepository: VotesRepository) { super(); } @@ -26,36 +17,6 @@ export default class VoteService extends BaseService { return this.voteRepository.findMany(query); } - /** - * @description : Create a vote - * @throws {Error} If vote couldn't be created - */ - public async create(vote: Vote): Promise { - const appointment = await this.appointmentService.getByUidWithVotes(vote.appointment.uid!); - - if (appointment!.votes.length >= 2) { - const voteCreated = await this.voteRepository.create(vote); - await this.appointmentService.update(appointment!.uid!, EAppointmentStatus.CLOSED); - const user = await this.userService.getByUid(appointment!.user_uid, { role: true }); - const userEntity = User.hydrate(user!, { strategy: "excludeAll" }); - - if (appointment!.choice === EVote.DISMISS) { - const roles = await this.roleService.get({ where: { name: "default" } }); - const roleEntity = Role.hydrate(roles[0]!, { strategy: "excludeAll" }); - userEntity.role = roleEntity; - await this.userService.update(appointment!.user_uid, userEntity); - return voteCreated; - } else if (appointment!.choice === EVote.NOMINATE) { - const roles = await this.roleService.get({ where: { name: "super-admin" } }); - const roleEntity = Role.hydrate(roles[0]!, { strategy: "excludeAll" }); - userEntity!.role = roleEntity; - await this.userService.update(appointment!.user_uid, userEntity); - return voteCreated; - } - } - return this.voteRepository.create(vote); - } - /** * @description : Get a vote by uid * @throws {Error} If vote cannot be get by uid From 3b7b9288bc6c285458bc748d30a8511406eba03a Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Thu, 27 Jul 2023 13:20:13 +0200 Subject: [PATCH 091/134] :bug: Fixing you already voted for this appointment --- package-lock.json | 185 +++++++++++------- package.json | 2 +- src/app/api/super-admin/LiveVoteController.ts | 62 +++--- src/common/repositories/VotesRepository.ts | 5 +- 4 files changed, 146 insertions(+), 108 deletions(-) diff --git a/package-lock.json b/package-lock.json index a6b784ab..0290f4ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "cron": "^2.3.1", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.57", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.66", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", @@ -1061,14 +1061,14 @@ } }, "node_modules/@next/env": { - "version": "13.4.10", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.10.tgz", - "integrity": "sha512-3G1yD/XKTSLdihyDSa8JEsaWOELY+OWe08o0LUYzfuHp1zHDA8SObQlzKt+v+wrkkPcnPweoLH1ImZeUa0A1NQ==" + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.12.tgz", + "integrity": "sha512-RmHanbV21saP/6OEPBJ7yJMuys68cIf8OBBWd7+uj40LdpmswVAwe1uzeuFyUsd6SfeITWT3XnQfn6wULeKwDQ==" }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.10", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.10.tgz", - "integrity": "sha512-4bsdfKmmg7mgFGph0UorD1xWfZ5jZEw4kKRHYEeTK9bT1QnMbPVPlVXQRIiFPrhoDQnZUoa6duuPUJIEGLV1Jg==", + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.12.tgz", + "integrity": "sha512-deUrbCXTMZ6ZhbOoloqecnUeNpUOupi8SE2tx4jPfNS9uyUR9zK4iXBvH65opVcA/9F5I/p8vDXSYbUlbmBjZg==", "cpu": [ "arm64" ], @@ -1081,9 +1081,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.10", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.10.tgz", - "integrity": "sha512-ngXhUBbcZIWZWqNbQSNxQrB9T1V+wgfCzAor2olYuo/YpaL6mUYNUEgeBMhr8qwV0ARSgKaOp35lRvB7EmCRBg==", + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.12.tgz", + "integrity": "sha512-WRvH7RxgRHlC1yb5oG0ZLx8F7uci9AivM5/HGGv9ZyG2Als8Ij64GC3d+mQ5sJhWjusyU6T6V1WKTUoTmOB0zQ==", "cpu": [ "x64" ], @@ -1096,9 +1096,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.10", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.10.tgz", - "integrity": "sha512-SjCZZCOmHD4uyM75MVArSAmF5Y+IJSGroPRj2v9/jnBT36SYFTORN8Ag/lhw81W9EeexKY/CUg2e9mdebZOwsg==", + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.12.tgz", + "integrity": "sha512-YEKracAWuxp54tKiAvvq73PUs9lok57cc8meYRibTWe/VdPB2vLgkTVWFcw31YDuRXdEhdX0fWS6Q+ESBhnEig==", "cpu": [ "arm64" ], @@ -1111,9 +1111,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.10", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.10.tgz", - "integrity": "sha512-F+VlcWijX5qteoYIOxNiBbNE8ruaWuRlcYyIRK10CugqI/BIeCDzEDyrHIHY8AWwbkTwe6GRHabMdE688Rqq4Q==", + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.12.tgz", + "integrity": "sha512-LhJR7/RAjdHJ2Isl2pgc/JaoxNk0KtBgkVpiDJPVExVWA1c6gzY57+3zWuxuyWzTG+fhLZo2Y80pLXgIJv7g3g==", "cpu": [ "arm64" ], @@ -1126,9 +1126,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.10", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.10.tgz", - "integrity": "sha512-WDv1YtAV07nhfy3i1visr5p/tjiH6CeXp4wX78lzP1jI07t4PnHHG1WEDFOduXh3WT4hG6yN82EQBQHDi7hBrQ==", + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.12.tgz", + "integrity": "sha512-1DWLL/B9nBNiQRng+1aqs3OaZcxC16Nf+mOnpcrZZSdyKHek3WQh6j/fkbukObgNGwmCoVevLUa/p3UFTTqgqg==", "cpu": [ "x64" ], @@ -1141,9 +1141,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.10", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.10.tgz", - "integrity": "sha512-zFkzqc737xr6qoBgDa3AwC7jPQzGLjDlkNmt/ljvQJ/Veri5ECdHjZCUuiTUfVjshNIIpki6FuP0RaQYK9iCRg==", + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.12.tgz", + "integrity": "sha512-kEAJmgYFhp0VL+eRWmUkVxLVunn7oL9Mdue/FS8yzRBVj7Z0AnIrHpTIeIUl1bbdQq1VaoOztnKicAjfkLTRCQ==", "cpu": [ "x64" ], @@ -1156,9 +1156,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.10", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.10.tgz", - "integrity": "sha512-IboRS8IWz5mWfnjAdCekkl8s0B7ijpWeDwK2O8CdgZkoCDY0ZQHBSGiJ2KViAG6+BJVfLvcP+a2fh6cdyBr9QQ==", + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.12.tgz", + "integrity": "sha512-GMLuL/loR6yIIRTnPRY6UGbLL9MBdw2anxkOnANxvLvsml4F0HNIgvnU3Ej4BjbqMTNjD4hcPFdlEow4XHPdZA==", "cpu": [ "arm64" ], @@ -1171,9 +1171,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.10", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.10.tgz", - "integrity": "sha512-bSA+4j8jY4EEiwD/M2bol4uVEu1lBlgsGdvM+mmBm/BbqofNBfaZ2qwSbwE2OwbAmzNdVJRFRXQZ0dkjopTRaQ==", + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.12.tgz", + "integrity": "sha512-PhgNqN2Vnkm7XaMdRmmX0ZSwZXQAtamBVSa9A/V1dfKQCV1rjIZeiy/dbBnVYGdj63ANfsOR/30XpxP71W0eww==", "cpu": [ "ia32" ], @@ -1186,9 +1186,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.10", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.10.tgz", - "integrity": "sha512-g2+tU63yTWmcVQKDGY0MV1PjjqgZtwM4rB1oVVi/v0brdZAcrcTV+04agKzWtvWroyFz6IqtT0MoZJA7PNyLVw==", + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.12.tgz", + "integrity": "sha512-Z+56e/Ljt0bUs+T+jPjhFyxYBcdY2RIq9ELFU+qAMQMteHo7ymbV7CKmlcX59RI9C4YzN8PgMgLyAoi916b5HA==", "cpu": [ "x64" ], @@ -1493,9 +1493,9 @@ } }, "node_modules/@types/node": { - "version": "18.17.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.0.tgz", - "integrity": "sha512-GXZxEtOxYGFchyUzxvKI14iff9KZ2DI+A6a37o6EQevtg6uO9t+aUZKcaC1Te5Ng1OnLM7K9NVVj+FbecD9cJg==" + "version": "18.17.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.1.tgz", + "integrity": "sha512-xlR1jahfizdplZYRU59JlUx9uzF1ARa8jbhM11ccpCJya8kvos5jwdm2ZAgxSCwOl0fq21svP18EVwPBXMQudw==" }, "node_modules/@types/node-fetch": { "version": "2.6.4", @@ -2049,9 +2049,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001516", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz", - "integrity": "sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==", + "version": "1.0.30001517", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", + "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", "funding": [ { "type": "opencollective", @@ -2335,9 +2335,9 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, "node_modules/cron": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/cron/-/cron-2.3.1.tgz", - "integrity": "sha512-1eRRlIT0UfIqauwbG9pkg3J6CX9A6My2ytJWqAXoK0T9oJnUZTzGBNPxao0zjodIbPgf8UQWjE62BMb9eVllSQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cron/-/cron-2.4.0.tgz", + "integrity": "sha512-Cx77ic1TyIAtUggr0oAhtS8MLzPBUqGNIvdDM7jE3oFIxfe8LXWI9q3iQN/H2CebAiMir53LQKWOhEKnzkJTAQ==", "dependencies": { "luxon": "^3.2.1" } @@ -2467,9 +2467,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.461", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.461.tgz", - "integrity": "sha512-1JkvV2sgEGTDXjdsaQCeSwYYuhLRphRpc+g6EHTFELJXEiznLt3/0pZ9JuAOQ5p2rI3YxKTbivtvajirIfhrEQ==", + "version": "1.4.473", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.473.tgz", + "integrity": "sha512-aVfC8+440vGfl06l8HKKn8/PD5jRfSnLkTTD65EFvU46igbpQRri1gxSzW9/+TeUlwYzrXk1sw867T96zlyECA==", "dev": true }, "node_modules/emittery": { @@ -3193,17 +3193,17 @@ } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-source-maps": { @@ -3244,9 +3244,9 @@ "dev": true }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -3972,7 +3972,7 @@ } }, "node_modules/le-coffre-resources": { - "resolved": "git+ssh://git@github.com/smart-chain-fr/leCoffre-resources.git#dffc2429ba6ceb4129deb56e308962799b9b572c", + "resolved": "git+ssh://git@github.com/smart-chain-fr/leCoffre-resources.git#e7916d516fe434c93ef13e765d8d63a7ce3c56b2", "license": "MIT", "dependencies": { "class-transformer": "^0.5.1", @@ -3990,9 +3990,9 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.10.37", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.37.tgz", - "integrity": "sha512-Z10PCaOCiAxbUxLyR31DNeeNugSVP6iv/m7UrSKS5JHziEMApJtgku4e9Q69pzzSC9LnQiM09sqsGf2ticZnMw==" + "version": "1.10.38", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.38.tgz", + "integrity": "sha512-4NjVXVUmpZ9Zsqq6FXa2+MKI+KAI3tOqA0pxXgXGluhpj4ge5didmbWJpMBqGB3AVGv1SnEtKdGTbxjSEG1kCQ==" }, "node_modules/lines-and-columns": { "version": "1.2.4", @@ -4066,20 +4066,53 @@ } }, "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/make-dir/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -4386,11 +4419,11 @@ } }, "node_modules/next": { - "version": "13.4.10", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.10.tgz", - "integrity": "sha512-4ep6aKxVTQ7rkUW2fBLhpBr/5oceCuf4KmlUpvG/aXuDTIf9mexNSpabUD6RWPspu6wiJJvozZREhXhueYO36A==", + "version": "13.4.12", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.12.tgz", + "integrity": "sha512-eHfnru9x6NRmTMcjQp6Nz0J4XH9OubmzOa7CkWL+AUrUxpibub3vWwttjduu9No16dug1kq04hiUUpo7J3m3Xw==", "dependencies": { - "@next/env": "13.4.10", + "@next/env": "13.4.12", "@swc/helpers": "0.5.1", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", @@ -4406,15 +4439,15 @@ "node": ">=16.8.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.10", - "@next/swc-darwin-x64": "13.4.10", - "@next/swc-linux-arm64-gnu": "13.4.10", - "@next/swc-linux-arm64-musl": "13.4.10", - "@next/swc-linux-x64-gnu": "13.4.10", - "@next/swc-linux-x64-musl": "13.4.10", - "@next/swc-win32-arm64-msvc": "13.4.10", - "@next/swc-win32-ia32-msvc": "13.4.10", - "@next/swc-win32-x64-msvc": "13.4.10" + "@next/swc-darwin-arm64": "13.4.12", + "@next/swc-darwin-x64": "13.4.12", + "@next/swc-linux-arm64-gnu": "13.4.12", + "@next/swc-linux-arm64-musl": "13.4.12", + "@next/swc-linux-x64-gnu": "13.4.12", + "@next/swc-linux-x64-musl": "13.4.12", + "@next/swc-win32-arm64-msvc": "13.4.12", + "@next/swc-win32-ia32-msvc": "13.4.12", + "@next/swc-win32-x64-msvc": "13.4.12" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -5661,9 +5694,9 @@ } }, "node_modules/tslib": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", - "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" }, "node_modules/type-detect": { "version": "4.0.8", diff --git a/package.json b/package.json index 31b23e12..17bcb5c6 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "cron": "^2.3.1", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.65", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.66", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", diff --git a/src/app/api/super-admin/LiveVoteController.ts b/src/app/api/super-admin/LiveVoteController.ts index e07b6eab..0e3307f4 100644 --- a/src/app/api/super-admin/LiveVoteController.ts +++ b/src/app/api/super-admin/LiveVoteController.ts @@ -1,20 +1,25 @@ -import { Response, Request } from "express"; -import { Controller, Post } from "@ControllerPattern/index"; -import ApiController from "@Common/system/controller-pattern/ApiController"; -import VotesService from "@Services/super-admin/VotesService/VotesService"; -import { Service } from "typedi"; -import { Vote } from "le-coffre-resources/dist/SuperAdmin"; -import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; -import UsersService from "@Services/super-admin/UsersService/UsersService"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import { Controller, Post } from "@ControllerPattern/index"; import { EAppointmentStatus } from "@prisma/client"; import AppointmentService from "@Services/super-admin/AppointmentsService/AppointmentsService"; import LiveVoteService from "@Services/super-admin/LiveVoteService/LiveVoteService"; +import UsersService from "@Services/super-admin/UsersService/UsersService"; +import VotesService from "@Services/super-admin/VotesService/VotesService"; +import { validateOrReject } from "class-validator"; +import { Request, Response } from "express"; +import { Vote } from "le-coffre-resources/dist/SuperAdmin"; +import { Service } from "typedi"; @Controller() @Service() export default class LiveVoteController extends ApiController { - constructor(private liveVoteService: LiveVoteService, private votesService: VotesService, private usersService: UsersService, private appointmentService: AppointmentService) { + constructor( + private liveVoteService: LiveVoteService, + private votesService: VotesService, + private usersService: UsersService, + private appointmentService: AppointmentService, + ) { super(); } @@ -30,6 +35,7 @@ export default class LiveVoteController extends ApiController { //validate user await validateOrReject(voteEntity, { groups: ["createVote"] }); + let voteFound = []; if (voteEntity.appointment.uid) { const appointment = await this.appointmentService.getByUid(voteEntity.appointment.uid); if (!appointment) { @@ -40,27 +46,25 @@ export default class LiveVoteController extends ApiController { this.httpBadRequest(response, "Appointment is closed"); return; } + voteFound = await this.votesService.get({ + where: { AND: [{ appointment: { uid: voteEntity.appointment.uid } }, { voter: { uid: userId } }] }, + }); + } else { + voteFound = await this.votesService.get({ + where: { + AND: [ + { + appointment: { + AND: [{ user_uid: voteEntity.appointment.targeted_user.uid }, { status: EAppointmentStatus.OPEN }], + }, + }, + { voter: { uid: userId } }, + ], + }, + }); } - const votes = await this.votesService.get({ - where: { - OR: [ - { AND: [{ appointment: { uid: voteEntity.appointment.uid } }, { voter: { uid: userId } }] }, - { - AND: [ - { - appointment: { - AND: [{ user_uid: voteEntity.appointment.targeted_user.uid }, { status: EAppointmentStatus.OPEN }], - }, - }, - { voter: { uid: userId } }, - ], - }, - ], - }, - }); - - if (votes.length) { + if (voteFound.length) { this.httpBadRequest(response, "Voter already voted for this appointment"); return; } @@ -71,7 +75,7 @@ export default class LiveVoteController extends ApiController { //call service to get prisma entity const voteEntityCreated = await this.liveVoteService.create(voteEntity); - if(!voteEntityCreated) { + if (!voteEntityCreated) { this.httpBadRequest(response, "Appointment choice is not valid"); return; } diff --git a/src/common/repositories/VotesRepository.ts b/src/common/repositories/VotesRepository.ts index 0450760a..a9bf7746 100644 --- a/src/common/repositories/VotesRepository.ts +++ b/src/common/repositories/VotesRepository.ts @@ -1,8 +1,8 @@ import Database from "@Common/databases/database"; +import { EAppointmentStatus, EVote, Prisma, Votes } from "@prisma/client"; import BaseRepository from "@Repositories/BaseRepository"; -import { Service } from "typedi"; -import { Votes, Prisma, EVote, EAppointmentStatus } from "@prisma/client"; import { Vote } from "le-coffre-resources/dist/SuperAdmin"; +import { Service } from "typedi"; @Service() export default class VotesRepository extends BaseRepository { @@ -48,6 +48,7 @@ export default class VotesRepository extends BaseRepository { connectOrCreate: { where: whereArg, create: { + choice: EVote[vote.appointment.choice as keyof typeof EVote], user_uid: vote.appointment.targeted_user.uid!, } }, From 69afd66d2ea015ea18dea379d3e5bdb6e7806d96 Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Thu, 27 Jul 2023 15:26:41 +0200 Subject: [PATCH 092/134] :sparkles: Modify seeder --- src/common/databases/seeders/seeder.ts | 34 ++++++-------------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/src/common/databases/seeders/seeder.ts b/src/common/databases/seeders/seeder.ts index cf0129f4..941942db 100644 --- a/src/common/databases/seeders/seeder.ts +++ b/src/common/databases/seeders/seeder.ts @@ -1,18 +1,7 @@ +import { ECivility, ECustomerStatus, EFolderStatus, EOfficeStatus, Prisma, PrismaClient } from "@prisma/client"; +import User, { Address, Contact, Customer, Deed, DeedType, DocumentType, Office, OfficeFolder, OfficeRole, Role, Rule } from "le-coffre-resources/dist/SuperAdmin"; + import "module-alias/register"; -import { EFolderStatus, EOfficeStatus, ECivility, ECustomerStatus, PrismaClient, Prisma } from "@prisma/client"; -import User, { - Address, - Contact, - Customer, - Deed, - DeedType, - Office, - OfficeFolder, - OfficeRole, - Role, - Rule, - DocumentType, -} from "le-coffre-resources/dist/SuperAdmin"; export default async function main() { try{ @@ -605,7 +594,7 @@ export default async function main() { updated_at: new Date(), }, { - name: "PUT deedtypes", + name: "PUT deed-types", created_at: new Date(), updated_at: new Date(), }, @@ -665,7 +654,7 @@ export default async function main() { updated_at: new Date(), }, { - name: "POST deedtypes", + name: "POST deed-types", created_at: new Date(), updated_at: new Date(), }, @@ -862,26 +851,19 @@ export default async function main() { rules: rules.slice(0, 40), }, { - name: "notary", + name: "Notaire", created_at: new Date(), updated_at: new Date(), office: offices[0]!, rules: rules.slice(0, 33), }, { - name: "deputy", + name: "Collaborateur", created_at: new Date(), updated_at: new Date(), office: offices[0]!, rules: rules.slice(0, 22), - }, - { - name: "listener", - created_at: new Date(), - updated_at: new Date(), - office: offices[0]!, - rules: rules.slice(0, 11), - }, + } ]; const users: User[] = [ From 138f7e240760ee035f5f5fdbc82cea858e1bba63 Mon Sep 17 00:00:00 2001 From: Vins Date: Mon, 31 Jul 2023 13:50:11 +0200 Subject: [PATCH 093/134] Redploy back --- src/app/api/idnot/UserController.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/api/idnot/UserController.ts b/src/app/api/idnot/UserController.ts index 2dd2029a..99df1abf 100644 --- a/src/app/api/idnot/UserController.ts +++ b/src/app/api/idnot/UserController.ts @@ -43,6 +43,7 @@ export default class UserController extends ApiController { if (!id) throw new Error("idnot is required"); const payload = await this.authService.getUserJwtPayload(id!); + const accessToken = this.authService.generateAccessToken(payload); const refreshToken = this.authService.generateRefreshToken(payload); From 194565e96272de79d4202efdf6a3d66dbd0acf2a Mon Sep 17 00:00:00 2001 From: Vins Date: Mon, 31 Jul 2023 14:08:23 +0200 Subject: [PATCH 094/134] Edited start script --- package.json | 2 +- src/app/api/idnot/UserController.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index fe9c92be..7467bbf0 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "build": "tsc", "start": "node ./dist/entries/App.js", "cron": "node ./dist/entries/Cron.js", - "api:start": "npm run build-db && npm run migrate && npm run seed && npm run start", + "api:start": "npm run migrate && npm run start", "dev": "nodemon -V", "format": "prettier --write src", "migrate:test": "dotenv -e .env.test -- npx prisma migrate deploy", diff --git a/src/app/api/idnot/UserController.ts b/src/app/api/idnot/UserController.ts index 99df1abf..2dd2029a 100644 --- a/src/app/api/idnot/UserController.ts +++ b/src/app/api/idnot/UserController.ts @@ -43,7 +43,6 @@ export default class UserController extends ApiController { if (!id) throw new Error("idnot is required"); const payload = await this.authService.getUserJwtPayload(id!); - const accessToken = this.authService.generateAccessToken(payload); const refreshToken = this.authService.generateRefreshToken(payload); From 246e8d4394bf62a72ead8ff49047bbe6a6da2262 Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 1 Aug 2023 11:56:00 +0200 Subject: [PATCH 095/134] Super-admin role override every rules --- src/app/middlewares/RulesHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/middlewares/RulesHandler.ts b/src/app/middlewares/RulesHandler.ts index 83baab87..59ac1c0a 100644 --- a/src/app/middlewares/RulesHandler.ts +++ b/src/app/middlewares/RulesHandler.ts @@ -18,7 +18,7 @@ export default async function ruleHandler(req: Request, response: Response, next return; } - if (!rules.includes(req.method + " " + service)) { + if (!rules.includes(req.method + " " + service) && role != "super-admin") { response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with those rules"); return; } From 7777bc6e91d1b06cc8fe7e7ee075e263d276df28 Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Tue, 1 Aug 2023 15:35:40 +0200 Subject: [PATCH 096/134] :bug: Fixing documents get --- .../api/super-admin/DocumentsController.ts | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/app/api/super-admin/DocumentsController.ts b/src/app/api/super-admin/DocumentsController.ts index 7ccdb18c..03621ba8 100644 --- a/src/app/api/super-admin/DocumentsController.ts +++ b/src/app/api/super-admin/DocumentsController.ts @@ -1,14 +1,14 @@ -import { Response, Request } from "express"; -import { Controller, Delete, Get, Post, Put } from "@ControllerPattern/index"; -import ApiController from "@Common/system/controller-pattern/ApiController"; -import { Service } from "typedi"; -import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; -import { Documents, Prisma } from "@prisma/client"; -import { Document } from "le-coffre-resources/dist/SuperAdmin"; -import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; -import ruleHandler from "@App/middlewares/RulesHandler"; import documentHandler from "@App/middlewares/OfficeMembershipHandlers/DocumentHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import { Controller, Delete, Get, Post, Put } from "@ControllerPattern/index"; +import { Documents, Prisma } from "@prisma/client"; +import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; +import { validateOrReject } from "class-validator"; +import { Request, Response } from "express"; +import { Document } from "le-coffre-resources/dist/SuperAdmin"; +import { Service } from "typedi"; @Controller() @Service() @@ -30,12 +30,18 @@ export default class DocumentsController extends ApiController { query = JSON.parse(req.query["q"] as string); } const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId } ; + if(!query.where) query.where = { document_type : {office: officeWhereInput}}; - query.where.document_type!.office = officeWhereInput; + + // query.where.document_type!.office = officeWhereInput; //call service to get prisma entity + const documentEntities = await this.documentsService.get(query); + console.log(documentEntities); + //Hydrate ressource with prisma entity const documents = Document.hydrateArray(documentEntities, { strategy: "excludeAll" }); From a05be05b72efafc4eb7e53f79ca4a51c03114240 Mon Sep 17 00:00:00 2001 From: Vins Date: Wed, 2 Aug 2023 10:53:39 +0200 Subject: [PATCH 097/134] Error when deed types name already exists --- src/app/api/admin/DeedTypesController.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/app/api/admin/DeedTypesController.ts b/src/app/api/admin/DeedTypesController.ts index bb42d6de..852b11cf 100644 --- a/src/app/api/admin/DeedTypesController.ts +++ b/src/app/api/admin/DeedTypesController.ts @@ -71,8 +71,13 @@ export default class DeedTypesController extends ApiController { //init DeedType resource with request body values const deedTypeEntity = DeedType.hydrate(req.body); - //validate deed type + //validate deed type await validateOrReject(deedTypeEntity, { groups: ["createDeedType"], forbidUnknownValues: false }); + const doesExist = await this.deedTypesService.get({ where: { name: deedTypeEntity.name } }); + if (doesExist.length > 0) { + this.httpBadRequest(response, "Deed type name already used"); + return; + } //call service to get prisma entity const deedTypeEntityCreated = await this.deedTypesService.create(deedTypeEntity); @@ -84,7 +89,7 @@ export default class DeedTypesController extends ApiController { //success this.httpCreated(response, deedType); - } catch (error) { + } catch (error) { this.httpInternalError(response, error); return; } From 609a099d0ba6de5711649e5c0c1eed0b0ba1147e Mon Sep 17 00:00:00 2001 From: Vins Date: Wed, 2 Aug 2023 11:04:33 +0200 Subject: [PATCH 098/134] Fixed Document type name unique constraints --- src/app/api/super-admin/DocumentTypesController.ts | 5 +++++ src/app/api/super-admin/OfficeFoldersController.ts | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/app/api/super-admin/DocumentTypesController.ts b/src/app/api/super-admin/DocumentTypesController.ts index baceb4db..577086d5 100644 --- a/src/app/api/super-admin/DocumentTypesController.ts +++ b/src/app/api/super-admin/DocumentTypesController.ts @@ -58,6 +58,11 @@ export default class DocumentTypesController extends ApiController { try { //init DocumentType resource with request body values const documentTypeEntity = DocumentType.hydrate(req.body); + const doesExist = await this.documentTypesService.get({ where: { name: documentTypeEntity.name } }); + if (doesExist.length > 0) { + this.httpBadRequest(response, "Document type name already used"); + return; + } //validate user await validateOrReject(documentTypeEntity, { groups: ["createDocumentType"], forbidUnknownValues: false }); //call service to get prisma entity diff --git a/src/app/api/super-admin/OfficeFoldersController.ts b/src/app/api/super-admin/OfficeFoldersController.ts index dcd1b29c..de9d6586 100644 --- a/src/app/api/super-admin/OfficeFoldersController.ts +++ b/src/app/api/super-admin/OfficeFoldersController.ts @@ -175,7 +175,6 @@ export default class OfficeFoldersController extends ApiController { this.httpInternalError(response, error); return; } - this.httpSuccess(response, await this.officeFoldersService.getByUid("uid")); } /** From 5328313004123763f3a90eff873d244e00c5394d Mon Sep 17 00:00:00 2001 From: Vins Date: Wed, 2 Aug 2023 14:06:40 +0200 Subject: [PATCH 099/134] Fix users --- src/app/api/super-admin/UsersController.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index 71d97022..a9815f14 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -105,13 +105,12 @@ export default class UsersController extends ApiController { //init IUser resource with request body values const userEntity = User.hydrate(req.body); - const userFoundEntity = User.hydrate(userFound, { strategy: "excludeAll" }); //validate user await validateOrReject(userEntity, { groups: ["updateUser"] }); //call service to get prisma entity - const userEntityUpdated = await this.usersService.update(uid, userFoundEntity); + const userEntityUpdated = await this.usersService.update(uid, userEntity); //Hydrate ressource with prisma entity const user = User.hydrate(userEntityUpdated, { From c3317c8cd851e433416d3f2159c96a81be18953f Mon Sep 17 00:00:00 2001 From: pida123 Date: Thu, 3 Aug 2023 10:19:37 +0200 Subject: [PATCH 100/134] fix circleci --- .circleci/config.yml | 51 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 28182707..3f7eb00f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -30,6 +30,10 @@ jobs: - image: cimg/base:stable environment: TAG: << pipeline.git.tag >> + parameters: + env: + type: string + default: stg steps: - checkout - kubernetes/install-kubeconfig: @@ -40,7 +44,7 @@ jobs: command: > helm upgrade lecoffre-back devops/ -i -f devops/values.yaml - -n lecoffre + -n lecoffre-<> --create-namespace --set lecoffreBack.image.repository='rg.fr-par.scw.cloud/lecoffre/back' --set lecoffreBack.image.tag=$TAG @@ -48,7 +52,7 @@ jobs: workflows: version: 2 - build-and-register: + build-and-register-stg: jobs: - build-push-docker-image: filters: @@ -57,10 +61,51 @@ workflows: branches: ignore: /.*/ - deploy-docker-image: + env: stg requires: - build-push-docker-image context: - - staging + - sc-shared-prd + filters: + tags: + only: /^v.*/ + branches: + ignore: /.*/ + + build-and-register-ppd: + jobs: + - build-push-docker-image: + filters: + tags: + only: /^v.*/ + branches: + ignore: /.*/ + - deploy-docker-image: + env: ppd + requires: + - build-push-docker-image + context: + - sc-shared-prd + filters: + tags: + only: /^v.*/ + branches: + ignore: /.*/ + + build-and-register-prd: + jobs: + - build-push-docker-image: + filters: + tags: + only: /^v.*/ + branches: + ignore: /.*/ + - deploy-docker-image: + env: prd + requires: + - build-push-docker-image + context: + - sc-shared-prd filters: tags: only: /^v.*/ From a6c5219620d78b2d32a9eac5e46f0aadec7e69c2 Mon Sep 17 00:00:00 2001 From: pida123 Date: Thu, 3 Aug 2023 10:22:26 +0200 Subject: [PATCH 101/134] fix circleci concurrent build --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3f7eb00f..29889f30 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -59,7 +59,7 @@ workflows: tags: only: /^v.*/ branches: - ignore: /.*/ + only: staging - deploy-docker-image: env: stg requires: @@ -79,7 +79,7 @@ workflows: tags: only: /^v.*/ branches: - ignore: /.*/ + only: preprod - deploy-docker-image: env: ppd requires: @@ -99,7 +99,7 @@ workflows: tags: only: /^v.*/ branches: - ignore: /.*/ + only: main - deploy-docker-image: env: prd requires: From 9360cd012cf3cdd423bee5a533cc69d561619631 Mon Sep 17 00:00:00 2001 From: pida123 Date: Thu, 3 Aug 2023 10:27:18 +0200 Subject: [PATCH 102/134] add logic statement to circleci jobs --- .circleci/config.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 29889f30..9a4ed714 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -53,6 +53,10 @@ jobs: workflows: version: 2 build-and-register-stg: + when: + and: + - equal: [ staging, << pipeline.git.branch >> ] + - << pipeline.git.tag >> jobs: - build-push-docker-image: filters: @@ -73,6 +77,10 @@ workflows: ignore: /.*/ build-and-register-ppd: + when: + and: + - equal: [ preprod, << pipeline.git.branch >> ] + - << pipeline.git.tag >> jobs: - build-push-docker-image: filters: @@ -93,6 +101,10 @@ workflows: ignore: /.*/ build-and-register-prd: + when: + and: + - equal: [ main, << pipeline.git.branch >> ] + - << pipeline.git.tag >> jobs: - build-push-docker-image: filters: From 62952bc9f91df70a665a83c7709e751e00ec1178 Mon Sep 17 00:00:00 2001 From: pida123 Date: Thu, 3 Aug 2023 12:10:07 +0200 Subject: [PATCH 103/134] update devops flow --- .circleci/config.yml | 2 +- devops/ppd.values.yaml | 31 +++++++++++++++++++ devops/prd.values.yaml | 31 +++++++++++++++++++ devops/stg.values.yaml | 38 ++++++++++++++++++++++++ devops/templates/docker-pull-secret.yaml | 6 ++-- devops/templates/lecoffre-back.yaml | 11 ++++--- devops/templates/sealed-secret.yaml | 12 ++++++++ devops/templates/secret-store.yaml | 15 ++++++++++ devops/templates/secrets.yaml | 16 ++++++++++ devops/values.yaml | 26 ++++++---------- 10 files changed, 161 insertions(+), 27 deletions(-) create mode 100644 devops/ppd.values.yaml create mode 100644 devops/prd.values.yaml create mode 100644 devops/stg.values.yaml create mode 100644 devops/templates/sealed-secret.yaml create mode 100644 devops/templates/secret-store.yaml create mode 100644 devops/templates/secrets.yaml diff --git a/.circleci/config.yml b/.circleci/config.yml index 9a4ed714..463ecfed 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -43,7 +43,7 @@ jobs: name: Deploy command: > helm upgrade - lecoffre-back devops/ -i -f devops/values.yaml + lecoffre-back devops/ -i -f devops/<>.values.yaml -n lecoffre-<> --create-namespace --set lecoffreBack.image.repository='rg.fr-par.scw.cloud/lecoffre/back' diff --git a/devops/ppd.values.yaml b/devops/ppd.values.yaml new file mode 100644 index 00000000..3320c1aa --- /dev/null +++ b/devops/ppd.values.yaml @@ -0,0 +1,31 @@ +dockerPullSecret: docker-pull-secret + +scwSecretKey: AgCgjF5QEzxT3GYTS5B6cmQ0e+0/qFWzKaUDSi+Vjc7RoameuvaIJvTXMBkS3he1oy1ulbB34v6vpZI2kxnGNqERA/U5BaYDAyfKSBwMAy4br7HVKhhuwkoF5qoG5JzJXseSmqB1U9vncVIGOZWzJc1Y4/eGlWcvLcLyfw2z/WEpyeNiWJfEhTYpJOB7gv0XnRb2U/JM3jRy1QgEUIk1WR6kgBalF+xaczPQ6uKh+PR2pqkbZa3WaKUrddmzNsgEz4d8PZMWt8IBwR2JOQEHUqCd34p/pJNyLdUgcdDhg02DKwn1oRoAxKTbAio/a7WrMbodjCb3TNWIYGal5mFmItZ7Ok/EBmUf4E85eOkTR+j8ynuuiexld3Q5Kw3o8LsHjgzVL9uP+T2rYaKkjtVt+YQRX1U8l9CrsdUEz0/wEBA0jwCWMfnh1qhD5pM/xwwjsEEAcK4rYV+Q7iAgGZZvZBCQ5aEHzrtn5D95tr1GZCV2hmrW6Seu+LKKLVBS1JmsuEsOuhudYsEK9m2RYVcxbjuS5eokKEjNrGobf2oB8rhBByavfw1JTBixR5JrI8lcYlnCa+oEhxXKJY+4Fx5SAB4YaLCMSo5vw6zsFQ3WKQzlEmCFt+EnapS+a+MGrdlwq07OHTDpvgk/1z39hopoCuhhKckGGfErLXsTYQvDOkFu+EPzgY7m7qDw/d9pSiht5tuSOkAqeOgm7tpNkUufZhaXmP+1aT7i+H5gq1JILGAmXzTI5Wc= + +lecoffreBack: + serviceAccountName: lecoffre-back-sa + command: "npm run api:start" + envSecrets: ppd-env + imagePullSecrets: + - name: docker-pull-secret + image: + pullPolicy: Always + repository: "rg.fr-par.scw.cloud/lecoffre/back" + resources: + requests: + cpu: 200m + memory: 1Gi + limits: + memory: 2Gi + ingress: + host: api.stg.lecoffre.smart-chain.fr + tls: + hosts: + - api.stg.lecoffre.smart-chain.fr + secretName: api-tls + annotations: + kubernetes.io/ingress.class: nginx + cert-manager.io/cluster-issuer: letsencrypt-prod + nginx.ingress.kubernetes.io/from-to-www-redirect: "true" + nginx.ingress.kubernetes.io/force-ssl-redirect: "true" + diff --git a/devops/prd.values.yaml b/devops/prd.values.yaml new file mode 100644 index 00000000..f0fa85c8 --- /dev/null +++ b/devops/prd.values.yaml @@ -0,0 +1,31 @@ +dockerPullSecret: docker-pull-secret + +scwSecretKey: AgBG2y7uQuap+2akNPGFxpCR+l0INO6Wxez5qljtY6t71GFGhJLYN9ZfefflKcFzD2Nv7DQMXXhpnCCaFti+9JMCMDuN324dDgtMMLTot+Pkxk/bAm+L8t3HfRharFdLz/vvzg77bvypi28TEoNYR/AM0e8VMYxBEgEp2TmP5uXcxZOgPzXMrfQoSdNRyzGTJ5tXZwe3PP7XvXyTNsZzHBtoQQM+nul9nL+VFA7CBRaaOpCmKOXjAlt7TyNXo4X5eYBNlxr+NuQw4dh4E/1zqdU/dDCE1+vx88BDbdydBA1qJaTOUSGTFquSK4kb9qAVAexBAIUqRwpfEW6Li945AXtnxLN42gEGPRsA9tSXL2c20k6thuRCqxwEOZljq2E03qtLAkxdP6WFBcb77o4PIEMZ8AmzPASnI+eW5z2mCoP3L+HZQrTLliDjmF4AMtOfZxRi0CCTrsSabOrimJC6v3y3ve0VcSsjA3rd5vvJ3Va4mZK4JAtYwEUx4PCHCGkUxc0w6jRwKB5tL/auZVT4SV/0z/WgW4Kq4AdvxsU6yGOqflt6e3ePIIuvCgjw+1yOYRpUiSGj36oOqNPMA4smxIB7p7Gi3csqt2TrQoW3TaLv/s7gbCcxHWSor+WT71WGg8AVmLm+FzUINmNop+c2RNo3O/Gj7h1uybX/pj+tRLNOuBQCqa+GQkY2bT2NcT9ifnAZB6K+2zAWXl+tdbMlDGV89P2yMYuRMdHGhuOoyuIUPWeA5i0= + +lecoffreBack: + serviceAccountName: lecoffre-back-sa + command: "npm run api:start" + envSecrets: prd-env + imagePullSecrets: + - name: docker-pull-secret + image: + pullPolicy: Always + repository: "rg.fr-par.scw.cloud/lecoffre/back" + resources: + requests: + cpu: 200m + memory: 1Gi + limits: + memory: 2Gi + ingress: + host: api.stg.lecoffre.smart-chain.fr + tls: + hosts: + - api.stg.lecoffre.smart-chain.fr + secretName: api-tls + annotations: + kubernetes.io/ingress.class: nginx + cert-manager.io/cluster-issuer: letsencrypt-prod + nginx.ingress.kubernetes.io/from-to-www-redirect: "true" + nginx.ingress.kubernetes.io/force-ssl-redirect: "true" + diff --git a/devops/stg.values.yaml b/devops/stg.values.yaml new file mode 100644 index 00000000..21eb7d90 --- /dev/null +++ b/devops/stg.values.yaml @@ -0,0 +1,38 @@ +dockerPullSecret: docker-pull-secret + +scwSecretKey: AgChoEnPitXp4Ny/rVMEcevaWKNVpyj2cJYAcq+yFqKwVwnLB+ffDvwqz9XBHu+6d4Nyyjkf37zUAMoaM21lEDWA7x3zfG2/D/j+rvX1qxzZgLD0mjBk7fGElVm332I6JA83oInes8AMMYEDPLElzHnpKRb9KtkIP4NzgOcCeW0ijft3N7Vroez6LEHsBPCA1I9XjKSkGEDvrO0MhWX3iJOlfz+SPMfJAV7rPawOs0ZmohTHrPW8qIvGDn8HCzKyU8zRBoMt+Ogpf5pH4U3JryEFuqD61KAQgablAM8edPIvsgNno9HAEuC2QtRLYA9aUhuKdaKuS58c9P2E80PHWXIlbpFCg6EugQTgNfnYp+3qDUNz8edeCfapYLvF4s9eCMGyMsGnpDR8EDNOyuGy7Y3l7okX8Xqu464gMp9E+hX7bHkcD6a4xfyIgJcWxsku0tm1TH1dpn4M1UXRuyZZif8P08nuE6MTUL67sAR9J1lpn4lVEL4kflk0pP2tZ5ncgPQFafJrRz05krMb0eU5tb2H4gs7ao/LL6idWo8MM9K1yr8lIuT5x2WW5CX+RjA+i50ex114V6vX3PNP5oVyt+DynTUB9QmXzVm3oLfDc3Cae1uqh7X0CFd+xiztJBtg0VtJaD/xUJcuWfY4cV2lERo9fRrykltzlJqiXHO4nowt8OtN0BcViVV8NJhPhYFzyb4ympxpOlTjm3GETuT2TYhUqdgS9nzleEAbOmOHZdIO2COunPE= + +lecoffreBack: + serviceAccountName: lecoffre-back-sa + envSecrets: stg-env + command: "npm run api:start" + imagePullSecrets: + - name: docker-pull-secret + image: + pullPolicy: Always + repository: "rg.fr-par.scw.cloud/lecoffre/back" + resources: + requests: + cpu: 200m + memory: 1Gi + limits: + memory: 2Gi + ingress: + host: api.stg.lecoffre.smart-chain.fr + tls: + hosts: + - api.stg.lecoffre.smart-chain.fr + secretName: api-tls + annotations: + kubernetes.io/ingress.class: nginx + cert-manager.io/cluster-issuer: letsencrypt-prod + nginx.ingress.kubernetes.io/from-to-www-redirect: "true" + nginx.ingress.kubernetes.io/force-ssl-redirect: "true" + # key is name of the environment variable, scwID is the secret ID in SCW with "id:" in front + env: + - key: env1 + scwID: "id:a131edea-84e0-49d6-b4a8-20ab417220c9" + - key: env2 + scwID: "id:f396cfed-098f-4f75-8e5e-92ba60b46cee" + + diff --git a/devops/templates/docker-pull-secret.yaml b/devops/templates/docker-pull-secret.yaml index 9eb72f38..555ec94e 100644 --- a/devops/templates/docker-pull-secret.yaml +++ b/devops/templates/docker-pull-secret.yaml @@ -5,8 +5,8 @@ metadata: spec: refreshInterval: 1h secretStoreRef: - name: dockerpullsecret-vault-cluster-secret-store - kind: ClusterSecretStore + name: secret-store + kind: SecretStore target: template: type: kubernetes.io/dockerconfigjson @@ -16,4 +16,4 @@ spec: - secretKey: .dockerconfigjson remoteRef: key: {{ .Values.dockerPullSecret }} - property: .dockerconfigjson \ No newline at end of file + version: latest_enabled diff --git a/devops/templates/lecoffre-back.yaml b/devops/templates/lecoffre-back.yaml index f6de560e..cb1a8f98 100644 --- a/devops/templates/lecoffre-back.yaml +++ b/devops/templates/lecoffre-back.yaml @@ -3,7 +3,6 @@ apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: lecoffre-back - namespace: {{ .Values.namespace }} {{if .Values.lecoffreBack.ingress.annotations}} annotations: {{toYaml .Values.lecoffreBack.ingress.annotations | indent 4 }} @@ -28,7 +27,6 @@ apiVersion: v1 kind: Service metadata: name: lecoffre-back-svc - namespace: {{ .Values.namespace }} labels: spec: ports: @@ -42,7 +40,6 @@ apiVersion: apps/v1 kind: Deployment metadata: name: lecoffre-back - namespace: {{ .Values.namespace }} labels: app: lecoffre-back spec: @@ -53,7 +50,6 @@ spec: template: metadata: annotations: -{{toYaml .Values.lecoffreBack.vault.annotations | indent 8 }} labels: app: lecoffre-back spec: @@ -62,10 +58,13 @@ spec: - name: docker-pull-secret containers: - name: lecoffre-back - image: "{{ .Values.lecoffreBack.image.repository }}:v{{ .Chart.AppVersion }}" + image: "{{ .Values.lecoffreBack.image.repository }}:{{ .Values.lecoffreBack.image.tag }}" {{if .Values.lecoffreBack.resources}} resources: {{toYaml .Values.lecoffreBack.resources | indent 10}} {{end}} imagePullPolicy: {{ .Values.lecoffreBack.image.pullPolicy }} - command: [{{ .Values.lecoffreBack.command }}] \ No newline at end of file + command: [{{ .Values.lecoffreBack.command }}] + envFrom: + - secretRef: + name: {{ .Values.lecoffreBack.envSecrets }} \ No newline at end of file diff --git a/devops/templates/sealed-secret.yaml b/devops/templates/sealed-secret.yaml new file mode 100644 index 00000000..6938667c --- /dev/null +++ b/devops/templates/sealed-secret.yaml @@ -0,0 +1,12 @@ +apiVersion: bitnami.com/v1alpha1 +kind: SealedSecret +metadata: + creationTimestamp: null + name: scw-secret-key +spec: + encryptedData: + SCW_SECRET_KEY: {{ .Values.scwSecretKey }} + template: + metadata: + creationTimestamp: null + name: scw-secret-key \ No newline at end of file diff --git a/devops/templates/secret-store.yaml b/devops/templates/secret-store.yaml new file mode 100644 index 00000000..ae7d3889 --- /dev/null +++ b/devops/templates/secret-store.yaml @@ -0,0 +1,15 @@ +apiVersion: external-secrets.io/v1beta1 +kind: SecretStore +metadata: + name: secret-store +spec: + provider: + scaleway: + region: fr-par + projectId: c0ed1e9e-d945-461f-920c-98c844ef1ad4 + accessKey: + value: SCWNCSH22EMVGT3MNX09 + secretKey: + secretRef: + name: scw-secret-key + key: SCW_SECRET_KEY \ No newline at end of file diff --git a/devops/templates/secrets.yaml b/devops/templates/secrets.yaml new file mode 100644 index 00000000..e116cc9c --- /dev/null +++ b/devops/templates/secrets.yaml @@ -0,0 +1,16 @@ +apiVersion: external-secrets.io/v1beta1 +kind: ExternalSecret +metadata: + name: {{ .Values.lecoffreBack.envSecrets }} +spec: + refreshInterval: 20s + secretStoreRef: + kind: SecretStore + name: secret-store + data: + {{ range $v := .Values.lecoffreBack.env }} + - secretKey: {{ $v.key }} + remoteRef: + key: {{ $v.scwID}} + version: latest_enabled + {{ end }} \ No newline at end of file diff --git a/devops/values.yaml b/devops/values.yaml index a286f980..0449dec5 100644 --- a/devops/values.yaml +++ b/devops/values.yaml @@ -1,29 +1,17 @@ -dockerPullSecret: secret/data/minteed-stg/config/dockerpullsecret +dockerPullSecret: docker-pull-secret -namespace: lecoffre +scwSecretKey: ss lecoffreBack: serviceAccountName: lecoffre-back-sa - command: "'sh', '-c', '. /vault/secrets/envs-api && npm run api:start'" - vault: - role : custom_lecoffre-back_injector_rol - server: https://vault-stg.smart-chain.fr - annotations: - vault.hashicorp.com/agent-pre-populate-only: "true" - vault.hashicorp.com/agent-inject: "true" - vault.hashicorp.com/agent-inject-secret-envs-api: secret/data/lecoffre-back-stg/config/envs-api - vault.hashicorp.com/role: custom_lecoffre-back_injector_rol - vault.hashicorp.com/agent-inject-template-envs-api: | - {{ with secret "secret/data/lecoffre-back-stg/config/envs-api" }} - {{ range $k, $v := .Data.data }} - export {{ $k }}="{{ $v }}" - {{ end }} - {{ end }} + command: "npm run api:start" + envSecrets: env-env imagePullSecrets: - name: docker-pull-secret image: pullPolicy: Always repository: "rg.fr-par.scw.cloud/lecoffre/back" + tag: resources: requests: cpu: 200m @@ -41,4 +29,8 @@ lecoffreBack: cert-manager.io/cluster-issuer: letsencrypt-prod nginx.ingress.kubernetes.io/from-to-www-redirect: "true" nginx.ingress.kubernetes.io/force-ssl-redirect: "true" + + env: + - key: a + scwID: b From dbebab1ad0424badad57005c3070977b6477a852 Mon Sep 17 00:00:00 2001 From: pida123 Date: Thu, 3 Aug 2023 15:41:18 +0200 Subject: [PATCH 104/134] fix secret injection in helm chart --- devops/ppd.values.yaml | 5 ++++- devops/prd.values.yaml | 5 ++++- devops/stg.values.yaml | 4 +--- devops/templates/lecoffre-back.yaml | 9 ++++++--- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/devops/ppd.values.yaml b/devops/ppd.values.yaml index 3320c1aa..f010ae46 100644 --- a/devops/ppd.values.yaml +++ b/devops/ppd.values.yaml @@ -4,7 +4,7 @@ scwSecretKey: AgCgjF5QEzxT3GYTS5B6cmQ0e+0/qFWzKaUDSi+Vjc7RoameuvaIJvTXMBkS3he1oy lecoffreBack: serviceAccountName: lecoffre-back-sa - command: "npm run api:start" + command: "export $(xargs Date: Thu, 3 Aug 2023 15:59:04 +0200 Subject: [PATCH 105/134] wip --- devops/stg.values.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/devops/stg.values.yaml b/devops/stg.values.yaml index ef2e7c42..f325e396 100644 --- a/devops/stg.values.yaml +++ b/devops/stg.values.yaml @@ -30,7 +30,7 @@ lecoffreBack: nginx.ingress.kubernetes.io/force-ssl-redirect: "true" # key is name of the environment variable, scwID is the secret ID in SCW with "id:" in front env: - - key: env1 - scwID: "id:a131edea-84e0-49d6-b4a8-20ab417220c9" + - key: ENV + scwID: "id:2be9510b-bb1f-4fbe-ab3e-3dc11fb49051" From 0c4f202a51f6131d9856a80fe44c0b33a7180beb Mon Sep 17 00:00:00 2001 From: pida123 Date: Thu, 3 Aug 2023 15:59:55 +0200 Subject: [PATCH 106/134] fix secrets --- devops/ppd.values.yaml | 4 ++-- devops/prd.values.yaml | 4 ++-- devops/stg.values.yaml | 8 ++++---- devops/templates/lecoffre-back.yaml | 3 ++- devops/templates/secrets.yaml | 2 +- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/devops/ppd.values.yaml b/devops/ppd.values.yaml index f010ae46..f2532b48 100644 --- a/devops/ppd.values.yaml +++ b/devops/ppd.values.yaml @@ -4,7 +4,7 @@ scwSecretKey: AgCgjF5QEzxT3GYTS5B6cmQ0e+0/qFWzKaUDSi+Vjc7RoameuvaIJvTXMBkS3he1oy lecoffreBack: serviceAccountName: lecoffre-back-sa - command: "export $(xargs Date: Thu, 3 Aug 2023 16:04:13 +0200 Subject: [PATCH 107/134] app version --- devops/Chart.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devops/Chart.yaml b/devops/Chart.yaml index 208511fb..91793269 100644 --- a/devops/Chart.yaml +++ b/devops/Chart.yaml @@ -21,5 +21,5 @@ version: 0.0.1 # incremented each time you make changes to the application. Versions are not expected to # follow Semantic Versioning. They should reflect the version the application is using. # It is recommended to use it with quotes. -appVersion: 0.5.6 +appVersion: 0.5.7 From 3f96640b549382706478cd06c19fd92970c99377 Mon Sep 17 00:00:00 2001 From: pida123 Date: Thu, 3 Aug 2023 16:06:03 +0200 Subject: [PATCH 108/134] fix filters cicd --- .circleci/config.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 463ecfed..fceafe6d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -56,14 +56,14 @@ workflows: when: and: - equal: [ staging, << pipeline.git.branch >> ] - - << pipeline.git.tag >> + - true jobs: - build-push-docker-image: filters: tags: only: /^v.*/ branches: - only: staging + ignore: /.*/ - deploy-docker-image: env: stg requires: @@ -80,14 +80,14 @@ workflows: when: and: - equal: [ preprod, << pipeline.git.branch >> ] - - << pipeline.git.tag >> + - true jobs: - build-push-docker-image: filters: tags: only: /^v.*/ branches: - only: preprod + ignore: /.*/ - deploy-docker-image: env: ppd requires: @@ -104,7 +104,7 @@ workflows: when: and: - equal: [ main, << pipeline.git.branch >> ] - - << pipeline.git.tag >> + - true jobs: - build-push-docker-image: filters: From c9c416d1ead47f2cc04839b3bdc8cce14591aaca Mon Sep 17 00:00:00 2001 From: pida123 Date: Thu, 3 Aug 2023 16:08:35 +0200 Subject: [PATCH 109/134] fix cicd filters --- .circleci/config.yml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index fceafe6d..36392f46 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -62,8 +62,6 @@ workflows: filters: tags: only: /^v.*/ - branches: - ignore: /.*/ - deploy-docker-image: env: stg requires: @@ -73,8 +71,6 @@ workflows: filters: tags: only: /^v.*/ - branches: - ignore: /.*/ build-and-register-ppd: when: @@ -86,8 +82,6 @@ workflows: filters: tags: only: /^v.*/ - branches: - ignore: /.*/ - deploy-docker-image: env: ppd requires: @@ -97,8 +91,6 @@ workflows: filters: tags: only: /^v.*/ - branches: - ignore: /.*/ build-and-register-prd: when: @@ -110,8 +102,6 @@ workflows: filters: tags: only: /^v.*/ - branches: - only: main - deploy-docker-image: env: prd requires: @@ -121,6 +111,4 @@ workflows: filters: tags: only: /^v.*/ - branches: - ignore: /.*/ From c0d37f8c41835d5aabff954f6cd716d741ebee15 Mon Sep 17 00:00:00 2001 From: pida123 Date: Thu, 3 Aug 2023 16:12:10 +0200 Subject: [PATCH 110/134] fix cicd filters --- .circleci/config.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 36392f46..7dee50f6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -56,7 +56,7 @@ workflows: when: and: - equal: [ staging, << pipeline.git.branch >> ] - - true + - << pipeline.git.tag >> jobs: - build-push-docker-image: filters: @@ -76,7 +76,7 @@ workflows: when: and: - equal: [ preprod, << pipeline.git.branch >> ] - - true + - << pipeline.git.tag >> jobs: - build-push-docker-image: filters: @@ -96,7 +96,7 @@ workflows: when: and: - equal: [ main, << pipeline.git.branch >> ] - - true + - << pipeline.git.tag >> jobs: - build-push-docker-image: filters: From b73d426943d98d5b9e29ccf4ae92a2e64c38f642 Mon Sep 17 00:00:00 2001 From: pida123 Date: Thu, 3 Aug 2023 16:19:04 +0200 Subject: [PATCH 111/134] image tag is now commit short sha --- .circleci/config.yml | 38 +++++++++++++------------------------- 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7dee50f6..109b09a2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -47,21 +47,17 @@ jobs: -n lecoffre-<> --create-namespace --set lecoffreBack.image.repository='rg.fr-par.scw.cloud/lecoffre/back' - --set lecoffreBack.image.tag=$TAG + --set lecoffreBack.image.tag=${CIRCLE_SHA1:0:7} workflows: version: 2 build-and-register-stg: - when: - and: - - equal: [ staging, << pipeline.git.branch >> ] - - << pipeline.git.tag >> jobs: - build-push-docker-image: filters: - tags: - only: /^v.*/ + branches: + only: staging - deploy-docker-image: env: stg requires: @@ -69,19 +65,15 @@ workflows: context: - sc-shared-prd filters: - tags: - only: /^v.*/ + branches: + only: staging build-and-register-ppd: - when: - and: - - equal: [ preprod, << pipeline.git.branch >> ] - - << pipeline.git.tag >> jobs: - build-push-docker-image: filters: - tags: - only: /^v.*/ + branches: + only: preprod - deploy-docker-image: env: ppd requires: @@ -89,19 +81,15 @@ workflows: context: - sc-shared-prd filters: - tags: - only: /^v.*/ + branches: + only: preprod build-and-register-prd: - when: - and: - - equal: [ main, << pipeline.git.branch >> ] - - << pipeline.git.tag >> jobs: - build-push-docker-image: filters: - tags: - only: /^v.*/ + branches: + only: main - deploy-docker-image: env: prd requires: @@ -109,6 +97,6 @@ workflows: context: - sc-shared-prd filters: - tags: - only: /^v.*/ + branches: + only: main From c4cd667bb1c5b9d05d73af970e3976dc1b4ef547 Mon Sep 17 00:00:00 2001 From: pida123 Date: Thu, 3 Aug 2023 16:20:57 +0200 Subject: [PATCH 112/134] fix cicd --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 109b09a2..a1e75a9f 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -21,8 +21,8 @@ jobs: version: 20.10.12 docker_layer_caching: true - run: docker login rg.fr-par.scw.cloud/lecoffre -u nologin -p $SCW_SECRET_KEY - - run: docker build --tag rg.fr-par.scw.cloud/lecoffre/back:$TAG . - - run: docker push rg.fr-par.scw.cloud/lecoffre/back:$TAG + - run: docker build --tag rg.fr-par.scw.cloud/lecoffre/back:${CIRCLE_SHA1:0:7} . + - run: docker push rg.fr-par.scw.cloud/lecoffre/back:${CIRCLE_SHA1:0:7} deploy-docker-image: From 6900888fd89f3778d6431c2150df412982e464e8 Mon Sep 17 00:00:00 2001 From: pida123 Date: Thu, 3 Aug 2023 17:23:58 +0200 Subject: [PATCH 113/134] fix container command --- devops/ppd.values.yaml | 2 +- devops/prd.values.yaml | 2 +- devops/stg.values.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/devops/ppd.values.yaml b/devops/ppd.values.yaml index f2532b48..22c0592b 100644 --- a/devops/ppd.values.yaml +++ b/devops/ppd.values.yaml @@ -4,7 +4,7 @@ scwSecretKey: AgCgjF5QEzxT3GYTS5B6cmQ0e+0/qFWzKaUDSi+Vjc7RoameuvaIJvTXMBkS3he1oy lecoffreBack: serviceAccountName: lecoffre-back-sa - command: "export $(xargs Date: Thu, 3 Aug 2023 17:27:36 +0200 Subject: [PATCH 114/134] add Cron cicd+helm --- devops/ppd.values.yaml | 20 ++++++++++++++++ devops/prd.values.yaml | 20 ++++++++++++++++ devops/stg.values.yaml | 20 ++++++++++++++++ devops/templates/lecoffre-cron.yaml | 37 +++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+) create mode 100644 devops/templates/lecoffre-cron.yaml diff --git a/devops/ppd.values.yaml b/devops/ppd.values.yaml index 22c0592b..892aeb19 100644 --- a/devops/ppd.values.yaml +++ b/devops/ppd.values.yaml @@ -32,3 +32,23 @@ lecoffreBack: - key: .env scwID: "id:a131edea-84e0-49d6-b4a8-20ab417220c9" +lecoffreCron: + serviceAccountName: lecoffre-cron-sa + envSecrets: stg-env + command: "'sh', '-c', 'export $(xargs Date: Thu, 3 Aug 2023 17:27:52 +0200 Subject: [PATCH 115/134] add cron in cicd --- .circleci/config.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a1e75a9f..154c0dd8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -47,7 +47,16 @@ jobs: -n lecoffre-<> --create-namespace --set lecoffreBack.image.repository='rg.fr-par.scw.cloud/lecoffre/back' - --set lecoffreBack.image.tag=${CIRCLE_SHA1:0:7} + --set lecoffreBack.image.tag=${CIRCLE_SHA1:0:7} + - run: + name: Deploy + command: > + helm upgrade + lecoffre-cron devops/ -i -f devops/<>.values.yaml + -n lecoffre-<> + --create-namespace + --set lecoffreBack.image.repository='rg.fr-par.scw.cloud/lecoffre/back' + --set lecoffreBack.image.tag=${CIRCLE_SHA1:0:7} workflows: From b55c9b9107598bbd5c93f01c9c329aa4d58a627a Mon Sep 17 00:00:00 2001 From: pida123 Date: Thu, 3 Aug 2023 17:29:42 +0200 Subject: [PATCH 116/134] fix cron cicd --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 154c0dd8..c68df9f0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -55,8 +55,8 @@ jobs: lecoffre-cron devops/ -i -f devops/<>.values.yaml -n lecoffre-<> --create-namespace - --set lecoffreBack.image.repository='rg.fr-par.scw.cloud/lecoffre/back' - --set lecoffreBack.image.tag=${CIRCLE_SHA1:0:7} + --set lecoffreCron.image.repository='rg.fr-par.scw.cloud/lecoffre/back' + --set lecoffreCron.image.tag=${CIRCLE_SHA1:0:7} workflows: From e660e2d7d9af44a9f515bb3797364d0f39e294ea Mon Sep 17 00:00:00 2001 From: pida123 Date: Thu, 3 Aug 2023 17:42:42 +0200 Subject: [PATCH 117/134] fix cron --- .circleci/config.yml | 10 ++-------- devops/ppd.values.yaml | 2 +- devops/prd.values.yaml | 2 +- devops/stg.values.yaml | 2 +- devops/templates/service-account.yaml | 16 ++++++++++++++++ 5 files changed, 21 insertions(+), 11 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c68df9f0..2c8347dd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -48,15 +48,9 @@ jobs: --create-namespace --set lecoffreBack.image.repository='rg.fr-par.scw.cloud/lecoffre/back' --set lecoffreBack.image.tag=${CIRCLE_SHA1:0:7} - - run: - name: Deploy - command: > - helm upgrade - lecoffre-cron devops/ -i -f devops/<>.values.yaml - -n lecoffre-<> - --create-namespace --set lecoffreCron.image.repository='rg.fr-par.scw.cloud/lecoffre/back' - --set lecoffreCron.image.tag=${CIRCLE_SHA1:0:7} + --set lecoffreCron.image.tag=${CIRCLE_SHA1:0:7} + workflows: diff --git a/devops/ppd.values.yaml b/devops/ppd.values.yaml index 892aeb19..ba5c13a9 100644 --- a/devops/ppd.values.yaml +++ b/devops/ppd.values.yaml @@ -35,7 +35,7 @@ lecoffreBack: lecoffreCron: serviceAccountName: lecoffre-cron-sa envSecrets: stg-env - command: "'sh', '-c', 'export $(xargs Date: Mon, 7 Aug 2023 15:24:48 +0200 Subject: [PATCH 118/134] Added other deed type to seeder --- src/common/databases/seeders/seeder.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/common/databases/seeders/seeder.ts b/src/common/databases/seeders/seeder.ts index 941942db..534545be 100644 --- a/src/common/databases/seeders/seeder.ts +++ b/src/common/databases/seeders/seeder.ts @@ -944,6 +944,15 @@ export default async function main() { created_at: new Date(), updated_at: new Date(), }, + { + name: "Other", + archived_at: null, + description: "Other", + office: offices[0], + created_at: new Date(), + updated_at: new Date(), + }, + ]; const deeds: Deed[] = [ From 5ae54093a14680a76039869efa910dea3472b7ca Mon Sep 17 00:00:00 2001 From: Vins Date: Mon, 7 Aug 2023 15:26:22 +0200 Subject: [PATCH 119/134] Removed other deedtype and added other document type to seeder --- src/common/databases/seeders/seeder.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/common/databases/seeders/seeder.ts b/src/common/databases/seeders/seeder.ts index 534545be..700442cf 100644 --- a/src/common/databases/seeders/seeder.ts +++ b/src/common/databases/seeders/seeder.ts @@ -944,15 +944,6 @@ export default async function main() { created_at: new Date(), updated_at: new Date(), }, - { - name: "Other", - archived_at: null, - description: "Other", - office: offices[0], - created_at: new Date(), - updated_at: new Date(), - }, - ]; const deeds: Deed[] = [ @@ -1255,6 +1246,15 @@ export default async function main() { created_at: new Date(), updated_at: new Date(), }, + { + archived_at: null, + name: "Other", + office: offices[0], + private_description: "Other", + public_description: "Other", + created_at: new Date(), + updated_at: new Date(), + }, ]; const officeFolders: OfficeFolder[] = [ From bd815853d0a9352a09c29c91d07e84bc9526dab4 Mon Sep 17 00:00:00 2001 From: Vins Date: Tue, 8 Aug 2023 09:23:07 +0200 Subject: [PATCH 120/134] Removed useless log --- src/app/api/super-admin/DocumentsController.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/app/api/super-admin/DocumentsController.ts b/src/app/api/super-admin/DocumentsController.ts index 03621ba8..6d2e7400 100644 --- a/src/app/api/super-admin/DocumentsController.ts +++ b/src/app/api/super-admin/DocumentsController.ts @@ -39,9 +39,7 @@ export default class DocumentsController extends ApiController { //call service to get prisma entity - const documentEntities = await this.documentsService.get(query); - console.log(documentEntities); - + const documentEntities = await this.documentsService.get(query); //Hydrate ressource with prisma entity const documents = Document.hydrateArray(documentEntities, { strategy: "excludeAll" }); From a086572b14d67cf01488679df55667828d4435cf Mon Sep 17 00:00:00 2001 From: Vins Date: Wed, 9 Aug 2023 11:39:30 +0200 Subject: [PATCH 121/134] page select folder unmocked --- .../api/customer/OfficeFoldersController.ts | 115 ++++++++++++++++++ src/app/index.ts | 2 + src/app/middlewares/RulesHandler.ts | 8 +- .../common/AuthService/AuthService.ts | 5 +- .../OfficeFoldersService.ts | 29 +++++ 5 files changed, 152 insertions(+), 7 deletions(-) create mode 100644 src/app/api/customer/OfficeFoldersController.ts create mode 100644 src/services/customer/OfficeFoldersService/OfficeFoldersService.ts diff --git a/src/app/api/customer/OfficeFoldersController.ts b/src/app/api/customer/OfficeFoldersController.ts new file mode 100644 index 00000000..19155884 --- /dev/null +++ b/src/app/api/customer/OfficeFoldersController.ts @@ -0,0 +1,115 @@ +import { Response, Request } from "express"; +import { Controller, Get } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import OfficeFoldersService from "@Services/customer/OfficeFoldersService/OfficeFoldersService"; +import { Service } from "typedi"; +import { OfficeFolders, Prisma } from "@prisma/client"; +import { OfficeFolder } from "le-coffre-resources/dist/Customer"; +import authHandler from "@App/middlewares/AuthHandler"; +// import ruleHandler from "@App/middlewares/RulesHandler"; +// import folderHandler from "@App/middlewares/OfficeMembershipHandlers/FolderHandler"; + +@Controller() +@Service() +export default class OfficeFoldersController extends ApiController { + constructor(private officeFoldersService: OfficeFoldersService) { + super(); + } + + /** + * @description Get all folders + */ + @Get("/api/v1/customer/folders", [authHandler]) + protected async get(req: Request, response: Response) { + try { + //get query + let query: Prisma.OfficeFoldersFindManyArgs = {}; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } + + console.log(query.where?.customers?.every); + + if (req.query["search"] && typeof req.query["search"] === "string") { + const filter = req.query["search"]; + query = { + where: { + OR: [ + { + name: { contains: filter, mode: "insensitive" }, + }, + { + folder_number: { contains: filter, mode: "insensitive" }, + }, + { + customers: { + some: { + contact: { + OR: [ + { first_name: { contains: filter, mode: "insensitive" } }, + { last_name: { contains: filter, mode: "insensitive" } }, + ], + }, + }, + }, + }, + ], + }, + }; + } + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId }; + if (!query.where) query.where = { office: officeWhereInput }; + query.where.office = officeWhereInput; + + //call service to get prisma entity + const officeFolderEntities: OfficeFolders[] = await this.officeFoldersService.get(query); + + //Hydrate ressource with prisma entity + const officeFolders = OfficeFolder.hydrateArray(officeFolderEntities, { + strategy: "excludeAll", + }); + //success + this.httpSuccess(response, officeFolders); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + /** + * @description Get a specific folder by uid + * @returns IFolder + */ + @Get("/api/v1/customer/folders/:uid") + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + let query; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } + + const officeFolderEntity = await this.officeFoldersService.getByUid(uid, query); + + if (!officeFolderEntity) { + this.httpNotFoundRequest(response, "folder not found"); + return; + } + + //Hydrate ressource with prisma entity + const officeFolder = OfficeFolder.hydrate(officeFolderEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, officeFolder); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/index.ts b/src/app/index.ts index f550461c..6337a8ef 100644 --- a/src/app/index.ts +++ b/src/app/index.ts @@ -40,6 +40,7 @@ import RolesControllerNotary from "./api/notary/RolesController"; import OfficeRolesControllerNotary from "./api/notary/OfficeRolesController"; import FilesControllerCustomer from "./api/customer/FilesController"; import DocumentsControllerCustomer from "./api/customer/DocumentsController"; +import OfficeFoldersController from "./api/customer/OfficeFoldersController"; import AppointmentsController from "./api/super-admin/AppointmentsController"; import VotesController from "./api/super-admin/VotesController"; import LiveVoteController from "./api/super-admin/LiveVoteController"; @@ -95,5 +96,6 @@ export default { Container.get(OfficeRolesControllerNotary); Container.get(FilesControllerCustomer); Container.get(DocumentsControllerCustomer); + Container.get(OfficeFoldersController); }, }; diff --git a/src/app/middlewares/RulesHandler.ts b/src/app/middlewares/RulesHandler.ts index 59ac1c0a..16040875 100644 --- a/src/app/middlewares/RulesHandler.ts +++ b/src/app/middlewares/RulesHandler.ts @@ -6,10 +6,10 @@ export default async function ruleHandler(req: Request, response: Response, next const rules = req.body.user.rules; const service = req.path && req.path.split("/")[4]; - if (!rules) { - response.status(HttpCodes.UNAUTHORIZED).send("Missing rules in JWT"); - return; - } + // if (!rules) { + // response.status(HttpCodes.UNAUTHORIZED).send("Missing rules in JWT"); + // return; + // } const namespace = req.path && req.path.split("/")[3]; const role = req.body.user.role; diff --git a/src/services/common/AuthService/AuthService.ts b/src/services/common/AuthService/AuthService.ts index b0628cf0..bae190b5 100644 --- a/src/services/common/AuthService/AuthService.ts +++ b/src/services/common/AuthService/AuthService.ts @@ -12,7 +12,7 @@ enum PROVIDER_OPENID { } interface ICustomerJwtPayload { - customerId: string; + userId: string; email: string; } @@ -45,7 +45,7 @@ export default class AuthService extends BaseService { } return { - customerId: contact.customers!.uid, + userId: contact.customers!.uid, email: contact.email, }; } @@ -80,7 +80,6 @@ export default class AuthService extends BaseService { rules: rules, }; } - public generateAccessToken(user: any): string { return jwt.sign({ ...user }, this.variables.ACCESS_TOKEN_SECRET, { expiresIn: "1h" }); } diff --git a/src/services/customer/OfficeFoldersService/OfficeFoldersService.ts b/src/services/customer/OfficeFoldersService/OfficeFoldersService.ts new file mode 100644 index 00000000..6afdede7 --- /dev/null +++ b/src/services/customer/OfficeFoldersService/OfficeFoldersService.ts @@ -0,0 +1,29 @@ +import OfficeFoldersRepository from "@Repositories/OfficeFoldersRepository"; +import BaseService from "@Services/BaseService"; +import { Service } from "typedi"; +import { Prisma } from "@prisma/client"; + +@Service() +export default class OfficeFoldersService extends BaseService { + constructor( + private officeFoldersRepository: OfficeFoldersRepository, + ) { + super(); + } + + /** + * @description : Get all folders + * @throws {Error} If folders cannot be get + */ + public async get(query: Prisma.OfficeFoldersFindManyArgs) { + return this.officeFoldersRepository.findMany(query); + } + + /** + * @description : Get a folder by uid + * @throws {Error} If folder cannot be get by uid + */ + public async getByUid(uid: string, query?: Prisma.OfficeFoldersInclude) { + return this.officeFoldersRepository.findOneByUid(uid, query); + } +} From 5ed44992a98681d9064d6260c789751313b4f4df Mon Sep 17 00:00:00 2001 From: Vins Date: Thu, 10 Aug 2023 14:35:38 +0200 Subject: [PATCH 122/134] Unmocked client dashboard page --- src/app/api/customer/CustomersController.ts | 79 +++++++++++++++++++ src/app/api/customer/DocumentsController.ts | 12 ++- .../api/customer/OfficeFoldersController.ts | 8 +- .../api/franceConnect/CustomerController.ts | 5 +- src/app/index.ts | 2 + .../common/AuthService/AuthService.ts | 11 +-- .../CustomersService/CustomersService.ts | 35 ++++++++ 7 files changed, 136 insertions(+), 16 deletions(-) create mode 100644 src/app/api/customer/CustomersController.ts create mode 100644 src/services/customer/CustomersService/CustomersService.ts diff --git a/src/app/api/customer/CustomersController.ts b/src/app/api/customer/CustomersController.ts new file mode 100644 index 00000000..f958ab7e --- /dev/null +++ b/src/app/api/customer/CustomersController.ts @@ -0,0 +1,79 @@ +import { Response, Request } from "express"; +import { Controller, Get } from "@ControllerPattern/index"; +import ApiController from "@Common/system/controller-pattern/ApiController"; +import CustomersService from "@Services/customer/CustomersService/CustomersService"; +import { Service } from "typedi"; +import Customer from "le-coffre-resources/dist/Customer"; +import authHandler from "@App/middlewares/AuthHandler"; +import ruleHandler from "@App/middlewares/RulesHandler"; + +@Controller() +@Service() +export default class CustomersController extends ApiController { + constructor(private customersService: CustomersService) { + super(); + } + + /** + * @description Get all customers + */ + @Get("/api/v1/customer/customers") + protected async get(req: Request, response: Response) { + try { + //get query + let query; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } + + + //call service to get prisma entity + const customersEntities = await this.customersService.get(query); + + //Hydrate ressource with prisma entity + const customers = Customer.hydrateArray(customersEntities, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, customers); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } + + + /** + * @description Get a specific customer by uid + */ + @Get("/api/v1/customer/customers/:uid", [authHandler, ruleHandler]) + protected async getOneByUid(req: Request, response: Response) { + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "No uid provided"); + return; + } + + let query; + if (req.query["q"]) { + query = JSON.parse(req.query["q"] as string); + } + + const customerEntity = await this.customersService.getByUid(uid, query); + + if (!customerEntity) { + this.httpNotFoundRequest(response, "customer not found"); + return; + } + + //Hydrate ressource with prisma entity + const customer = Customer.hydrate(customerEntity, { strategy: "excludeAll" }); + + //success + this.httpSuccess(response, customer); + } catch (error) { + this.httpInternalError(response, error); + return; + } + } +} diff --git a/src/app/api/customer/DocumentsController.ts b/src/app/api/customer/DocumentsController.ts index 7b7784c9..fdfb16f2 100644 --- a/src/app/api/customer/DocumentsController.ts +++ b/src/app/api/customer/DocumentsController.ts @@ -27,12 +27,18 @@ export default class DocumentsController extends ApiController { if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } - const customerId: string = req.body.user.customerId; - const customerWhereInput: Prisma.DocumentsWhereInput ={ depositor: { uid: customerId } }; - query.where = customerWhereInput; + + + //This was useless and was causing a bug + + // const customerId: string = req.body.user.customerId; + // const customerWhereInput: Prisma.DocumentsWhereInput ={ depositor: { uid: customerId } }; + // query.where = customerWhereInput; + //call service to get prisma entity const documentEntities: Documents[] = await this.documentsService.get(query); + //Hydrate ressource with prisma entity const documents = Document.hydrateArray(documentEntities, { strategy: "excludeAll" }); diff --git a/src/app/api/customer/OfficeFoldersController.ts b/src/app/api/customer/OfficeFoldersController.ts index 19155884..e524b445 100644 --- a/src/app/api/customer/OfficeFoldersController.ts +++ b/src/app/api/customer/OfficeFoldersController.ts @@ -5,7 +5,7 @@ import OfficeFoldersService from "@Services/customer/OfficeFoldersService/Office import { Service } from "typedi"; import { OfficeFolders, Prisma } from "@prisma/client"; import { OfficeFolder } from "le-coffre-resources/dist/Customer"; -import authHandler from "@App/middlewares/AuthHandler"; +// import authHandler from "@App/middlewares/AuthHandler"; // import ruleHandler from "@App/middlewares/RulesHandler"; // import folderHandler from "@App/middlewares/OfficeMembershipHandlers/FolderHandler"; @@ -19,7 +19,7 @@ export default class OfficeFoldersController extends ApiController { /** * @description Get all folders */ - @Get("/api/v1/customer/folders", [authHandler]) + @Get("/api/v1/customer/folders") protected async get(req: Request, response: Response) { try { //get query @@ -28,7 +28,6 @@ export default class OfficeFoldersController extends ApiController { query = JSON.parse(req.query["q"] as string); } - console.log(query.where?.customers?.every); if (req.query["search"] && typeof req.query["search"] === "string") { const filter = req.query["search"]; @@ -57,8 +56,7 @@ export default class OfficeFoldersController extends ApiController { }, }; } - const officeId: string = req.body.user.office_Id; - const officeWhereInput: Prisma.OfficesWhereInput = { uid: officeId }; + const officeWhereInput: Prisma.OfficesWhereInput = {}; if (!query.where) query.where = { office: officeWhereInput }; query.where.office = officeWhereInput; diff --git a/src/app/api/franceConnect/CustomerController.ts b/src/app/api/franceConnect/CustomerController.ts index 54e19b12..633bed86 100644 --- a/src/app/api/franceConnect/CustomerController.ts +++ b/src/app/api/franceConnect/CustomerController.ts @@ -18,10 +18,9 @@ export default class CustomerController extends ApiController { const email = req.params["email"]; if (!email) throw new Error("email is required"); - const payload = await this.authService.getCustomerJwtPayload(email); + const payload = await this.authService.getCustomerJwtPayload(email); const accessToken = this.authService.generateAccessToken(payload); - const refreshToken = this.authService.generateRefreshToken(payload); - + const refreshToken = this.authService.generateRefreshToken(payload); //success this.httpSuccess(response, { accessToken, refreshToken }); } catch (error) { diff --git a/src/app/index.ts b/src/app/index.ts index 6337a8ef..dc98b2e4 100644 --- a/src/app/index.ts +++ b/src/app/index.ts @@ -41,6 +41,7 @@ import OfficeRolesControllerNotary from "./api/notary/OfficeRolesController"; import FilesControllerCustomer from "./api/customer/FilesController"; import DocumentsControllerCustomer from "./api/customer/DocumentsController"; import OfficeFoldersController from "./api/customer/OfficeFoldersController"; +import CustomersController from "./api/customer/CustomersController"; import AppointmentsController from "./api/super-admin/AppointmentsController"; import VotesController from "./api/super-admin/VotesController"; import LiveVoteController from "./api/super-admin/LiveVoteController"; @@ -97,5 +98,6 @@ export default { Container.get(FilesControllerCustomer); Container.get(DocumentsControllerCustomer); Container.get(OfficeFoldersController); + Container.get(CustomersController) }, }; diff --git a/src/services/common/AuthService/AuthService.ts b/src/services/common/AuthService/AuthService.ts index bae190b5..0a751e21 100644 --- a/src/services/common/AuthService/AuthService.ts +++ b/src/services/common/AuthService/AuthService.ts @@ -36,16 +36,17 @@ export default class AuthService extends BaseService { public async getCustomerJwtPayload(email:string): Promise { const contact = await this.contactService.getByEmail(email); - if (!contact) return null; + const customer = await this.customerService.getByUid(contact.customers!.uid, { contact: true }); + if (!customer) return null; - if(contact.customers?.status === ECustomerStatus["PENDING"]) { - contact.customers.status = ECustomerStatus["VALIDATED"]; - this.customerService.update(contact.customers.uid, contact.customers); + if(customer.status === ECustomerStatus["PENDING"]) { + customer.status = ECustomerStatus["VALIDATED"]; + this.customerService.update(customer.uid, customer); } return { - userId: contact.customers!.uid, + userId: customer.uid, email: contact.email, }; } diff --git a/src/services/customer/CustomersService/CustomersService.ts b/src/services/customer/CustomersService/CustomersService.ts new file mode 100644 index 00000000..38509164 --- /dev/null +++ b/src/services/customer/CustomersService/CustomersService.ts @@ -0,0 +1,35 @@ +import { Customers, Prisma } from "@prisma/client"; +import CustomersRepository from "@Repositories/CustomersRepository"; +import BaseService from "@Services/BaseService"; +import { Service } from "typedi"; + +@Service() +export default class CustomersService extends BaseService { + constructor(private customerRepository: CustomersRepository) { + super(); + } + + /** + * @description : Get all Customers + * @throws {Error} If Customers cannot be get + */ + public async get(query: Prisma.CustomersFindManyArgs): Promise { + return this.customerRepository.findMany(query); + } + + /** + * @description : Get a customer by uid + * @throws {Error} If customer cannot be get by uid + */ + public async getByUid(uid: string, query?: Prisma.CustomersInclude): Promise { + return this.customerRepository.findOneByUid(uid, query); + } + + /** + * @description : Get a customer by contact uid + * @throws {Error} If customer cannot be get by contact uid + */ + public async getByContact(contactUid: string): Promise { + return this.customerRepository.findOneByContact(contactUid); + } +} From dfdc09845ca01fda7901ea6f9b243f35e933ac2a Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Mon, 14 Aug 2023 11:58:33 +0200 Subject: [PATCH 123/134] log user connection for debugging --- src/app/api/idnot/UserController.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/api/idnot/UserController.ts b/src/app/api/idnot/UserController.ts index 2dd2029a..8714da20 100644 --- a/src/app/api/idnot/UserController.ts +++ b/src/app/api/idnot/UserController.ts @@ -49,6 +49,7 @@ export default class UserController extends ApiController { //success this.httpSuccess(response, { accessToken, refreshToken }); } catch (error) { + console.log(error); this.httpInternalError(response); return; } From e7ccdaeba3982ca5619a119d7b517d50e7ffdc94 Mon Sep 17 00:00:00 2001 From: "Arnaud D. Natali" <79214488+0xSaitama@users.noreply.github.com> Date: Mon, 14 Aug 2023 12:02:48 +0200 Subject: [PATCH 124/134] log user login for debugging --- src/app/api/idnot/UserController.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/api/idnot/UserController.ts b/src/app/api/idnot/UserController.ts index 2dd2029a..8714da20 100644 --- a/src/app/api/idnot/UserController.ts +++ b/src/app/api/idnot/UserController.ts @@ -49,6 +49,7 @@ export default class UserController extends ApiController { //success this.httpSuccess(response, { accessToken, refreshToken }); } catch (error) { + console.log(error); this.httpInternalError(response); return; } From e7438ae41bf5294134e8775fafcf4eb8bb5d9d8c Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Mon, 14 Aug 2023 14:34:41 +0200 Subject: [PATCH 125/134] refacto/securize vote deletion --- src/app/api/idnot/UserController.ts | 4 ++-- src/app/api/super-admin/VotesController.ts | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/app/api/idnot/UserController.ts b/src/app/api/idnot/UserController.ts index 8714da20..9f240506 100644 --- a/src/app/api/idnot/UserController.ts +++ b/src/app/api/idnot/UserController.ts @@ -42,7 +42,7 @@ export default class UserController extends ApiController { const id = req.params["idnot"]; if (!id) throw new Error("idnot is required"); - const payload = await this.authService.getUserJwtPayload(id!); + const payload = await this.authService.getUserJwtPayload(id); const accessToken = this.authService.generateAccessToken(payload); const refreshToken = this.authService.generateRefreshToken(payload); @@ -50,7 +50,7 @@ export default class UserController extends ApiController { this.httpSuccess(response, { accessToken, refreshToken }); } catch (error) { console.log(error); - this.httpInternalError(response); + this.httpInternalError(response, error); return; } } diff --git a/src/app/api/super-admin/VotesController.ts b/src/app/api/super-admin/VotesController.ts index 4f08ccf8..4d25ef6d 100644 --- a/src/app/api/super-admin/VotesController.ts +++ b/src/app/api/super-admin/VotesController.ts @@ -76,7 +76,7 @@ export default class VotesController extends ApiController { } /** - * @description Delete a specific folder + * @description Delete a specific vote */ @Delete("/api/v1/super-admin/votes/:uid", [authHandler]) protected async delete(req: Request, response: Response) { @@ -94,6 +94,11 @@ export default class VotesController extends ApiController { return; } + if (voteFound.voter_uid !== req.body.user.userId) { + this.httpUnauthorized(response, "Can't delete a vote that's not yours"); + return; + } + //call service to get prisma entity const votetEntity: Votes = await this.votesService.delete(uid); From 18a653e10af08bffa4cc0e306c0ae65dc1461ae7 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Mon, 14 Aug 2023 14:36:12 +0200 Subject: [PATCH 126/134] remove error in response --- src/app/api/idnot/UserController.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/api/idnot/UserController.ts b/src/app/api/idnot/UserController.ts index 9f240506..b63d3fec 100644 --- a/src/app/api/idnot/UserController.ts +++ b/src/app/api/idnot/UserController.ts @@ -50,7 +50,7 @@ export default class UserController extends ApiController { this.httpSuccess(response, { accessToken, refreshToken }); } catch (error) { console.log(error); - this.httpInternalError(response, error); + this.httpInternalError(response); return; } } From 6111321649d608611adbda12afa8c9d49db3f285 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Mon, 14 Aug 2023 16:43:33 +0200 Subject: [PATCH 127/134] add DB url --- src/common/config/variables/Variables.ts | 4 ++++ src/common/system/database/DbProvider.ts | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/common/config/variables/Variables.ts b/src/common/config/variables/Variables.ts index 3747545e..a7b3cf3d 100644 --- a/src/common/config/variables/Variables.ts +++ b/src/common/config/variables/Variables.ts @@ -19,6 +19,9 @@ export class BackendVariables { @IsNotEmpty() public readonly DATABASE_NAME!: string; + @IsNotEmpty() + public readonly DATABASE_URL!: string; + @IsNotEmpty() public readonly API_ROOT_URL!: string; @@ -72,6 +75,7 @@ export class BackendVariables { this.DATABASE_USERNAME = process.env["DATABASE_USERNAME"]!; this.DATABASE_PASSWORD = process.env["DATABASE_PASSWORD"]!; this.DATABASE_NAME = process.env["DATABASE_NAME"]!; + this.DATABASE_URL = process.env["DEV_PRISMA_STUDIO_DB_URL"]!; this.API_ROOT_URL = process.env["API_ROOT_URL"]!; this.APP_PORT = process.env["APP_PORT"]!; this.APP_ROOT_URL = process.env["APP_ROOT_URL"]!; diff --git a/src/common/system/database/DbProvider.ts b/src/common/system/database/DbProvider.ts index fa640f45..c84b75e9 100644 --- a/src/common/system/database/DbProvider.ts +++ b/src/common/system/database/DbProvider.ts @@ -9,7 +9,7 @@ dotenv.config(); export default class DbProvider { protected readonly variables = Container.get(BackendVariables); - protected url = `postgres://${this.variables.DATABASE_USERNAME}:${this.variables.DATABASE_PASSWORD}@${this.variables.DATABASE_HOST}:${this.variables.DATABASE_PORT}/${this.variables.DATABASE_NAME}`; + protected url = this.variables.DATABASE_URL; protected client = new PrismaClient({ datasources: { db: { From 8b1934d49e1aa22e7d79c523838b995a0680299d Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Mon, 14 Aug 2023 17:07:24 +0200 Subject: [PATCH 128/134] add role handler for namespaces --- src/app/api/admin/CustomersController.ts | 7 +++--- src/app/api/admin/DeedTypesController.ts | 9 ++++---- src/app/api/admin/DeedsController.ts | 7 +++--- src/app/api/admin/DocumentTypesController.ts | 7 +++--- src/app/api/admin/DocumentsController.ts | 11 +++++----- src/app/api/admin/FilesController.ts | 9 ++++---- src/app/api/admin/OfficeFoldersController.ts | 11 +++++----- src/app/api/admin/OfficeRolesController.ts | 9 ++++---- src/app/api/admin/OfficesController.ts | 5 +++-- src/app/api/admin/RolesController.ts | 5 +++-- src/app/api/admin/RulesController.ts | 5 +++-- src/app/api/admin/UsersController.ts | 7 +++--- .../api/super-admin/AppointmentsController.ts | 5 +++-- .../api/super-admin/CustomersController.ts | 9 ++++---- .../api/super-admin/DeedTypesController.ts | 9 ++++---- src/app/api/super-admin/DeedsController.ts | 7 +++--- .../super-admin/DocumentTypesController.ts | 9 ++++---- .../api/super-admin/DocumentsController.ts | 11 +++++----- src/app/api/super-admin/FilesController.ts | 9 ++++---- src/app/api/super-admin/LiveVoteController.ts | 3 ++- .../super-admin/OfficeFoldersController.ts | 11 +++++----- .../api/super-admin/OfficeRolesController.ts | 9 ++++---- src/app/api/super-admin/OfficesController.ts | 9 ++++---- src/app/api/super-admin/RolesController.ts | 9 ++++---- src/app/api/super-admin/RulesController.ts | 9 ++++---- src/app/api/super-admin/UsersController.ts | 9 ++++---- src/app/api/super-admin/VotesController.ts | 7 +++--- src/app/middlewares/RolesHandler.ts | 22 +++++++++++++++++++ src/app/middlewares/RulesHandler.ts | 14 +----------- 29 files changed, 145 insertions(+), 108 deletions(-) create mode 100644 src/app/middlewares/RolesHandler.ts diff --git a/src/app/api/admin/CustomersController.ts b/src/app/api/admin/CustomersController.ts index 3b7ea244..90e429cf 100644 --- a/src/app/api/admin/CustomersController.ts +++ b/src/app/api/admin/CustomersController.ts @@ -7,6 +7,7 @@ import { Customer } from "le-coffre-resources/dist/Admin"; import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -18,7 +19,7 @@ export default class CustomersController extends ApiController { /** * @description Get all customers */ - @Get("/api/v1/admin/customers", [authHandler, ruleHandler]) + @Get("/api/v1/admin/customers", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -70,7 +71,7 @@ export default class CustomersController extends ApiController { /** * @description Modify a specific customer by uid */ - @Put("/api/v1/admin/customers/:uid", [authHandler, ruleHandler]) + @Put("/api/v1/admin/customers/:uid", [authHandler, roleHandler, ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -111,7 +112,7 @@ export default class CustomersController extends ApiController { /** * @description Get a specific customer by uid */ - @Get("/api/v1/admin/customers/:uid", [authHandler, ruleHandler]) + @Get("/api/v1/admin/customers/:uid", [authHandler, roleHandler, ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/admin/DeedTypesController.ts b/src/app/api/admin/DeedTypesController.ts index 852b11cf..d1273879 100644 --- a/src/app/api/admin/DeedTypesController.ts +++ b/src/app/api/admin/DeedTypesController.ts @@ -9,6 +9,7 @@ import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import deedTypeHandler from "@App/middlewares/OfficeMembershipHandlers/DeedTypeHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -21,7 +22,7 @@ export default class DeedTypesController extends ApiController { * @description Get all deedtypes * @returns Deedtype[] list of deedtypes */ - @Get("/api/v1/admin/deed-types", [authHandler, ruleHandler]) + @Get("/api/v1/admin/deed-types", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -65,7 +66,7 @@ export default class DeedTypesController extends ApiController { * @description Create a new deedtype * @returns Deedtype created */ - @Post("/api/v1/admin/deed-types", [authHandler, ruleHandler, deedTypeHandler]) + @Post("/api/v1/admin/deed-types", [authHandler, roleHandler, ruleHandler, deedTypeHandler]) protected async post(req: Request, response: Response) { try { //init DeedType resource with request body values @@ -99,7 +100,7 @@ export default class DeedTypesController extends ApiController { * @description Modify a specific deedtype by uid * @returns Deedtype modified */ - @Put("/api/v1/admin/deed-types/:uid", [authHandler, ruleHandler, deedTypeHandler]) + @Put("/api/v1/admin/deed-types/:uid", [authHandler, roleHandler, ruleHandler, deedTypeHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -141,7 +142,7 @@ export default class DeedTypesController extends ApiController { * @description Get a specific deedtype by uid * @returns IDeedtype */ - @Get("/api/v1/admin/deed-types/:uid", [authHandler, ruleHandler, deedTypeHandler]) + @Get("/api/v1/admin/deed-types/:uid", [authHandler, roleHandler, ruleHandler, deedTypeHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/admin/DeedsController.ts b/src/app/api/admin/DeedsController.ts index ae35aa4b..00a2fa20 100644 --- a/src/app/api/admin/DeedsController.ts +++ b/src/app/api/admin/DeedsController.ts @@ -9,6 +9,7 @@ import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import deedHandler from "@App/middlewares/OfficeMembershipHandlers/DeedHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -21,7 +22,7 @@ export default class DeedsController extends ApiController { * @description Get all deeds * @returns Deed[] list of deeds */ - @Get("/api/v1/admin/deeds", [authHandler, ruleHandler]) + @Get("/api/v1/admin/deeds", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -52,7 +53,7 @@ export default class DeedsController extends ApiController { * @description Get a specific deed by uid * @returns Deed */ - @Get("/api/v1/admin/deeds/:uid", [authHandler, ruleHandler, deedHandler]) + @Get("/api/v1/admin/deeds/:uid", [authHandler, roleHandler, ruleHandler, deedHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -87,7 +88,7 @@ export default class DeedsController extends ApiController { /** * @description Modify a specific deed by uid */ - @Put("/api/v1/admin/deeds/:uid", [authHandler, ruleHandler, deedHandler]) + @Put("/api/v1/admin/deeds/:uid", [authHandler, roleHandler, ruleHandler, deedHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/admin/DocumentTypesController.ts b/src/app/api/admin/DocumentTypesController.ts index 9089bd6a..582cd2f2 100644 --- a/src/app/api/admin/DocumentTypesController.ts +++ b/src/app/api/admin/DocumentTypesController.ts @@ -10,6 +10,7 @@ import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import documentTypeHandler from "@App/middlewares/OfficeMembershipHandlers/DocumentTypeHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -21,7 +22,7 @@ export default class DocumentTypesController extends ApiController { /** * @description Get all document-types */ - @Get("/api/v1/admin/document-types", [authHandler, ruleHandler]) + @Get("/api/v1/admin/document-types", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -53,7 +54,7 @@ export default class DocumentTypesController extends ApiController { /** * @description Create a new documentType */ - @Post("/api/v1/admin/document-types", [authHandler, ruleHandler, documentTypeHandler]) + @Post("/api/v1/admin/document-types", [authHandler, roleHandler, ruleHandler, documentTypeHandler]) protected async post(req: Request, response: Response) { try { //init DocumentType resource with request body values @@ -77,7 +78,7 @@ export default class DocumentTypesController extends ApiController { /** * @description Modify a specific documentType by uid */ - @Put("/api/v1/admin/document-types/:uid", [authHandler, ruleHandler, documentTypeHandler]) + @Put("/api/v1/admin/document-types/:uid", [authHandler, roleHandler, ruleHandler, documentTypeHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/admin/DocumentsController.ts b/src/app/api/admin/DocumentsController.ts index 5696450c..05a21c1e 100644 --- a/src/app/api/admin/DocumentsController.ts +++ b/src/app/api/admin/DocumentsController.ts @@ -9,6 +9,7 @@ import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import documentHandler from "@App/middlewares/OfficeMembershipHandlers/DocumentHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -21,7 +22,7 @@ export default class DocumentsController extends ApiController { * @description Get all documents * @returns IDocument[] list of documents */ - @Get("/api/v1/admin/documents", [authHandler, ruleHandler]) + @Get("/api/v1/admin/documents", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -52,7 +53,7 @@ export default class DocumentsController extends ApiController { * @description Create a new document * @returns IDocument created */ - @Post("/api/v1/admin/documents", [authHandler, ruleHandler, documentHandler]) + @Post("/api/v1/admin/documents", [authHandler, roleHandler, ruleHandler, documentHandler]) protected async post(req: Request, response: Response) { try { //init Document resource with request body values @@ -80,7 +81,7 @@ export default class DocumentsController extends ApiController { /** * @description Update a specific document */ - @Put("/api/v1/admin/documents/:uid", [authHandler, ruleHandler, documentHandler]) + @Put("/api/v1/admin/documents/:uid", [authHandler, roleHandler, ruleHandler, documentHandler]) protected async update(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -119,7 +120,7 @@ export default class DocumentsController extends ApiController { /** * @description Delete a specific document */ - @Delete("/api/v1/admin/documents/:uid", [authHandler, ruleHandler, documentHandler]) + @Delete("/api/v1/admin/documents/:uid", [authHandler, roleHandler, ruleHandler, documentHandler]) protected async delete(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -152,7 +153,7 @@ export default class DocumentsController extends ApiController { /** * @description Get a specific document by uid */ - @Get("/api/v1/admin/documents/:uid", [authHandler, ruleHandler, documentHandler]) + @Get("/api/v1/admin/documents/:uid", [authHandler, roleHandler, ruleHandler, documentHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/admin/FilesController.ts b/src/app/api/admin/FilesController.ts index 0317d12f..583d3ddc 100644 --- a/src/app/api/admin/FilesController.ts +++ b/src/app/api/admin/FilesController.ts @@ -8,6 +8,7 @@ import { File } from "le-coffre-resources/dist/Admin"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import fileHandler from "@App/middlewares/OfficeMembershipHandlers/FileHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -20,7 +21,7 @@ export default class FilesController extends ApiController { * @description Get all Files * @returns File[] list of Files */ - @Get("/api/v1/admin/files", [authHandler, ruleHandler]) + @Get("/api/v1/admin/files", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -49,7 +50,7 @@ export default class FilesController extends ApiController { /** * @description Get a specific File by uid */ - @Get("/api/v1/admin/files/download/:uid", [authHandler, ruleHandler, fileHandler]) + @Get("/api/v1/admin/files/download/:uid", [authHandler, roleHandler, ruleHandler, fileHandler]) protected async download(req: Request, response: Response) { const uid = req.params["uid"]; if (!uid) { @@ -77,7 +78,7 @@ export default class FilesController extends ApiController { /** * @description Delete a specific File */ - @Delete("/api/v1/admin/files/:uid", [authHandler, ruleHandler, fileHandler]) + @Delete("/api/v1/admin/files/:uid", [authHandler, roleHandler, ruleHandler, fileHandler]) protected async delete(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -115,7 +116,7 @@ export default class FilesController extends ApiController { /** * @description Get a specific File by uid */ - @Get("/api/v1/admin/files/:uid", [authHandler, ruleHandler, fileHandler]) + @Get("/api/v1/admin/files/:uid", [authHandler, roleHandler, ruleHandler, fileHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/admin/OfficeFoldersController.ts b/src/app/api/admin/OfficeFoldersController.ts index b5906906..42fbdc58 100644 --- a/src/app/api/admin/OfficeFoldersController.ts +++ b/src/app/api/admin/OfficeFoldersController.ts @@ -9,6 +9,7 @@ import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import folderHandler from "@App/middlewares/OfficeMembershipHandlers/FolderHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -20,7 +21,7 @@ export default class OfficeFoldersController extends ApiController { /** * @description Get all folders */ - @Get("/api/v1/admin/folders", [authHandler, ruleHandler]) + @Get("/api/v1/admin/folders", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -80,7 +81,7 @@ export default class OfficeFoldersController extends ApiController { /** * @description Create a new folder */ - @Post("/api/v1/admin/folders", [authHandler, ruleHandler, folderHandler]) + @Post("/api/v1/admin/folders", [authHandler, roleHandler, ruleHandler, folderHandler]) protected async post(req: Request, response: Response) { try { //init OfficeFolder resource with request body values @@ -104,7 +105,7 @@ export default class OfficeFoldersController extends ApiController { /** * @description Modify a specific folder by uid */ - @Put("/api/v1/admin/folders/:uid", [authHandler, ruleHandler, folderHandler]) + @Put("/api/v1/admin/folders/:uid", [authHandler, roleHandler, ruleHandler, folderHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -146,7 +147,7 @@ export default class OfficeFoldersController extends ApiController { * @description Get a specific folder by uid * @returns IFolder */ - @Get("/api/v1/admin/folders/:uid", [authHandler, ruleHandler, folderHandler]) + @Get("/api/v1/admin/folders/:uid", [authHandler, roleHandler, ruleHandler, folderHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -182,7 +183,7 @@ export default class OfficeFoldersController extends ApiController { /** * @description Delete a specific folder */ - @Delete("/api/v1/admin/folders/:uid", [authHandler, ruleHandler, folderHandler]) + @Delete("/api/v1/admin/folders/:uid", [authHandler, roleHandler, ruleHandler, folderHandler]) protected async delete(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/admin/OfficeRolesController.ts b/src/app/api/admin/OfficeRolesController.ts index 9dfb2022..5c06e471 100644 --- a/src/app/api/admin/OfficeRolesController.ts +++ b/src/app/api/admin/OfficeRolesController.ts @@ -9,6 +9,7 @@ import { Prisma } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import officeRoleHandler from "@App/middlewares/OfficeMembershipHandlers/OfficeRoleHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -20,7 +21,7 @@ export default class OfficeRolesController extends ApiController { /** * @description Get all officeRoles */ - @Get("/api/v1/admin/office-roles", [authHandler, ruleHandler]) + @Get("/api/v1/admin/office-roles", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -63,7 +64,7 @@ export default class OfficeRolesController extends ApiController { /** * @description Create a new officeRole */ - @Post("/api/v1/admin/office-roles", [authHandler, ruleHandler, officeRoleHandler]) + @Post("/api/v1/admin/office-roles", [authHandler, roleHandler, ruleHandler, officeRoleHandler]) protected async getAddresses(req: Request, response: Response) { try { //init IOfficeRole resource with request body values @@ -91,7 +92,7 @@ export default class OfficeRolesController extends ApiController { /** * @description Modify a specific officeRole by uid */ - @Put("/api/v1/admin/office-roles/:uid", [authHandler, ruleHandler, officeRoleHandler]) + @Put("/api/v1/admin/office-roles/:uid", [authHandler, roleHandler, ruleHandler, officeRoleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -132,7 +133,7 @@ export default class OfficeRolesController extends ApiController { /** * @description Get a specific officeRole by uid */ - @Get("/api/v1/admin/office-roles/:uid", [authHandler, ruleHandler, officeRoleHandler]) + @Get("/api/v1/admin/office-roles/:uid", [authHandler, roleHandler, ruleHandler, officeRoleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/admin/OfficesController.ts b/src/app/api/admin/OfficesController.ts index 99433c13..546d240f 100644 --- a/src/app/api/admin/OfficesController.ts +++ b/src/app/api/admin/OfficesController.ts @@ -7,6 +7,7 @@ import { Offices } from "@prisma/client"; import { Office as OfficeResource } from "le-coffre-resources/dist/Admin"; import ruleHandler from "@App/middlewares/RulesHandler"; import authHandler from "@App/middlewares/AuthHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -17,7 +18,7 @@ export default class OfficesController extends ApiController { /** * @description Get all offices */ - @Get("/api/v1/admin/offices", [authHandler, ruleHandler]) + @Get("/api/v1/admin/offices", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -40,7 +41,7 @@ export default class OfficesController extends ApiController { /** * @description Get a specific office by uid */ - @Get("/api/v1/admin/offices/:uid", [authHandler, ruleHandler]) + @Get("/api/v1/admin/offices/:uid", [authHandler, roleHandler, ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/admin/RolesController.ts b/src/app/api/admin/RolesController.ts index 32ab6440..634bd92e 100644 --- a/src/app/api/admin/RolesController.ts +++ b/src/app/api/admin/RolesController.ts @@ -6,6 +6,7 @@ import { Service } from "typedi"; import { Role } from "le-coffre-resources/dist/Admin"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -17,7 +18,7 @@ export default class RolesController extends ApiController { /** * @description Get all roles */ - @Get("/api/v1/admin/roles", [authHandler, ruleHandler]) + @Get("/api/v1/admin/roles", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -43,7 +44,7 @@ export default class RolesController extends ApiController { /** * @description Get a specific role by uid */ - @Get("/api/v1/admin/roles/:uid", [authHandler, ruleHandler]) + @Get("/api/v1/admin/roles/:uid", [authHandler, roleHandler, ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/admin/RulesController.ts b/src/app/api/admin/RulesController.ts index de343769..55526601 100644 --- a/src/app/api/admin/RulesController.ts +++ b/src/app/api/admin/RulesController.ts @@ -6,6 +6,7 @@ import { Service } from "typedi"; import { Rule } from "le-coffre-resources/dist/Admin"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -17,7 +18,7 @@ export default class RulesController extends ApiController { /** * @description Get all rules */ - @Get("/api/v1/admin/rules", [authHandler, ruleHandler]) + @Get("/api/v1/admin/rules", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -43,7 +44,7 @@ export default class RulesController extends ApiController { /** * @description Get a specific rule by uid */ - @Get("/api/v1/admin/rules/:uid", [authHandler, ruleHandler]) + @Get("/api/v1/admin/rules/:uid", [authHandler, roleHandler, ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/admin/UsersController.ts b/src/app/api/admin/UsersController.ts index 2d6d3465..ee208504 100644 --- a/src/app/api/admin/UsersController.ts +++ b/src/app/api/admin/UsersController.ts @@ -9,6 +9,7 @@ import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import userHandler from "@App/middlewares/OfficeMembershipHandlers/UserHandler"; import { validateOrReject } from "class-validator"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -20,7 +21,7 @@ export default class UsersController extends ApiController { /** * @description Get all users */ - @Get("/api/v1/admin/users", [authHandler, ruleHandler]) + @Get("/api/v1/admin/users", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -65,7 +66,7 @@ export default class UsersController extends ApiController { /** * @description Modify a specific user by uid */ - @Put("/api/v1/admin/users/:uid", [authHandler, ruleHandler]) + @Put("/api/v1/admin/users/:uid", [authHandler, roleHandler, ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -106,7 +107,7 @@ export default class UsersController extends ApiController { /** * @description Get a specific user by uid */ - @Get("/api/v1/admin/users/:uid", [authHandler, ruleHandler, userHandler]) + @Get("/api/v1/admin/users/:uid", [authHandler, roleHandler, ruleHandler, userHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/AppointmentsController.ts b/src/app/api/super-admin/AppointmentsController.ts index f2790755..1c3f7346 100644 --- a/src/app/api/super-admin/AppointmentsController.ts +++ b/src/app/api/super-admin/AppointmentsController.ts @@ -5,6 +5,7 @@ import AppointmentsService from "@Services/super-admin/AppointmentsService/Appoi import { Service } from "typedi"; import { Appointment } from "le-coffre-resources/dist/SuperAdmin"; import authHandler from "@App/middlewares/AuthHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -16,7 +17,7 @@ export default class AppointmentsController extends ApiController { /** * @description Get all appointments */ - @Get("/api/v1/super-admin/appointments", [authHandler]) + @Get("/api/v1/super-admin/appointments", [authHandler, roleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -42,7 +43,7 @@ export default class AppointmentsController extends ApiController { /** * @description Get a specific appointment by uid */ - @Get("/api/v1/super-admin/appointments/:uid", [authHandler]) + @Get("/api/v1/super-admin/appointments/:uid", [authHandler, roleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/CustomersController.ts b/src/app/api/super-admin/CustomersController.ts index 56c718b0..d1a15fd2 100644 --- a/src/app/api/super-admin/CustomersController.ts +++ b/src/app/api/super-admin/CustomersController.ts @@ -7,6 +7,7 @@ import { Customer } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -18,7 +19,7 @@ export default class CustomersController extends ApiController { /** * @description Get all customers */ - @Get("/api/v1/super-admin/customers", [authHandler, ruleHandler]) + @Get("/api/v1/super-admin/customers", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -44,7 +45,7 @@ export default class CustomersController extends ApiController { /** * @description Create a new customer */ - @Post("/api/v1/super-admin/customers", [authHandler, ruleHandler]) + @Post("/api/v1/super-admin/customers", [authHandler, roleHandler, ruleHandler]) protected async post(req: Request, response: Response) { try { //init IUser resource with request body values @@ -70,7 +71,7 @@ export default class CustomersController extends ApiController { /** * @description Modify a specific customer by uid */ - @Put("/api/v1/super-admin/customers/:uid", [authHandler, ruleHandler]) + @Put("/api/v1/super-admin/customers/:uid", [authHandler, roleHandler, ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -111,7 +112,7 @@ export default class CustomersController extends ApiController { /** * @description Get a specific customer by uid */ - @Get("/api/v1/super-admin/customers/:uid", [authHandler, ruleHandler]) + @Get("/api/v1/super-admin/customers/:uid", [authHandler, roleHandler, ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/DeedTypesController.ts b/src/app/api/super-admin/DeedTypesController.ts index 0a499a8f..5ab62ce1 100644 --- a/src/app/api/super-admin/DeedTypesController.ts +++ b/src/app/api/super-admin/DeedTypesController.ts @@ -9,6 +9,7 @@ import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import deedTypeHandler from "@App/middlewares/OfficeMembershipHandlers/DeedTypeHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -21,7 +22,7 @@ export default class DeedTypesController extends ApiController { * @description Get all deedtypes * @returns Deedtype[] list of deedtypes */ - @Get("/api/v1/super-admin/deed-types", [authHandler, ruleHandler]) + @Get("/api/v1/super-admin/deed-types", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -65,7 +66,7 @@ export default class DeedTypesController extends ApiController { * @description Create a new deedtype * @returns Deedtype created */ - @Post("/api/v1/super-admin/deed-types", [authHandler, ruleHandler, deedTypeHandler]) + @Post("/api/v1/super-admin/deed-types", [authHandler, roleHandler, ruleHandler, deedTypeHandler]) protected async post(req: Request, response: Response) { try { //init DeedType resource with request body values @@ -94,7 +95,7 @@ export default class DeedTypesController extends ApiController { * @description Modify a specific deedtype by uid * @returns Deedtype modified */ - @Put("/api/v1/super-admin/deed-types/:uid", [authHandler, ruleHandler, deedTypeHandler]) + @Put("/api/v1/super-admin/deed-types/:uid", [authHandler, roleHandler, ruleHandler, deedTypeHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -136,7 +137,7 @@ export default class DeedTypesController extends ApiController { * @description Get a specific deedtype by uid * @returns IDeedtype */ - @Get("/api/v1/super-admin/deed-types/:uid", [authHandler, ruleHandler, deedTypeHandler]) + @Get("/api/v1/super-admin/deed-types/:uid", [authHandler, roleHandler, ruleHandler, deedTypeHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/DeedsController.ts b/src/app/api/super-admin/DeedsController.ts index 06e20d9d..a06de5ad 100644 --- a/src/app/api/super-admin/DeedsController.ts +++ b/src/app/api/super-admin/DeedsController.ts @@ -9,6 +9,7 @@ import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import deedHandler from "@App/middlewares/OfficeMembershipHandlers/DeedHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -21,7 +22,7 @@ export default class DeedsController extends ApiController { * @description Get all deeds * @returns Deed[] list of deeds */ - @Get("/api/v1/super-admin/deeds", [authHandler, ruleHandler]) + @Get("/api/v1/super-admin/deeds", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -52,7 +53,7 @@ export default class DeedsController extends ApiController { * @description Get a specific deed by uid * @returns Deed */ - @Get("/api/v1/super-admin/deeds/:uid", [authHandler, ruleHandler, deedHandler]) + @Get("/api/v1/super-admin/deeds/:uid", [authHandler, roleHandler, ruleHandler, deedHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -87,7 +88,7 @@ export default class DeedsController extends ApiController { /** * @description Modify a specific deed by uid */ - @Put("/api/v1/super-admin/deeds/:uid", [authHandler, ruleHandler, deedHandler]) + @Put("/api/v1/super-admin/deeds/:uid", [authHandler, roleHandler, ruleHandler, deedHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/DocumentTypesController.ts b/src/app/api/super-admin/DocumentTypesController.ts index 577086d5..85dc6896 100644 --- a/src/app/api/super-admin/DocumentTypesController.ts +++ b/src/app/api/super-admin/DocumentTypesController.ts @@ -10,6 +10,7 @@ import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import documentTypeHandler from "@App/middlewares/OfficeMembershipHandlers/DocumentTypeHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -21,7 +22,7 @@ export default class DocumentTypesController extends ApiController { /** * @description Get all document-types */ - @Get("/api/v1/super-admin/document-types", [authHandler, ruleHandler]) + @Get("/api/v1/super-admin/document-types", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -53,7 +54,7 @@ export default class DocumentTypesController extends ApiController { /** * @description Create a new documentType */ - @Post("/api/v1/super-admin/document-types", [authHandler, ruleHandler, documentTypeHandler]) + @Post("/api/v1/super-admin/document-types", [authHandler, roleHandler, ruleHandler, documentTypeHandler]) protected async post(req: Request, response: Response) { try { //init DocumentType resource with request body values @@ -82,7 +83,7 @@ export default class DocumentTypesController extends ApiController { /** * @description Modify a specific documentType by uid */ - @Put("/api/v1/super-admin/document-types/:uid", [authHandler, ruleHandler, documentTypeHandler]) + @Put("/api/v1/super-admin/document-types/:uid", [authHandler, roleHandler, ruleHandler, documentTypeHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -122,7 +123,7 @@ export default class DocumentTypesController extends ApiController { /** * @description Get a specific documentType by uid */ - @Get("/api/v1/super-admin/document-types/:uid", [authHandler, ruleHandler, documentTypeHandler]) + @Get("/api/v1/super-admin/document-types/:uid", [authHandler, roleHandler, ruleHandler, documentTypeHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/DocumentsController.ts b/src/app/api/super-admin/DocumentsController.ts index 6d2e7400..f589ce4c 100644 --- a/src/app/api/super-admin/DocumentsController.ts +++ b/src/app/api/super-admin/DocumentsController.ts @@ -1,5 +1,6 @@ import authHandler from "@App/middlewares/AuthHandler"; import documentHandler from "@App/middlewares/OfficeMembershipHandlers/DocumentHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import ApiController from "@Common/system/controller-pattern/ApiController"; import { Controller, Delete, Get, Post, Put } from "@ControllerPattern/index"; @@ -21,7 +22,7 @@ export default class DocumentsController extends ApiController { * @description Get all documents * @returns IDocument[] list of documents */ - @Get("/api/v1/super-admin/documents", [authHandler, ruleHandler]) + @Get("/api/v1/super-admin/documents", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -56,7 +57,7 @@ export default class DocumentsController extends ApiController { * @description Create a new document * @returns IDocument created */ - @Post("/api/v1/super-admin/documents", [authHandler, ruleHandler, documentHandler]) + @Post("/api/v1/super-admin/documents", [authHandler, roleHandler, ruleHandler, documentHandler]) protected async post(req: Request, response: Response) { try { //init Document resource with request body values @@ -84,7 +85,7 @@ export default class DocumentsController extends ApiController { /** * @description Update a specific document */ - @Put("/api/v1/super-admin/documents/:uid", [authHandler, ruleHandler, documentHandler]) + @Put("/api/v1/super-admin/documents/:uid", [authHandler, roleHandler, ruleHandler, documentHandler]) protected async update(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -123,7 +124,7 @@ export default class DocumentsController extends ApiController { /** * @description Delete a specific document */ - @Delete("/api/v1/super-admin/documents/:uid", [authHandler, ruleHandler, documentHandler]) + @Delete("/api/v1/super-admin/documents/:uid", [authHandler, roleHandler, ruleHandler, documentHandler]) protected async delete(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -156,7 +157,7 @@ export default class DocumentsController extends ApiController { /** * @description Get a specific document by uid */ - @Get("/api/v1/super-admin/documents/:uid", [authHandler, ruleHandler, documentHandler]) + @Get("/api/v1/super-admin/documents/:uid", [authHandler, roleHandler, ruleHandler, documentHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/FilesController.ts b/src/app/api/super-admin/FilesController.ts index cf085d5f..cb1b7f8d 100644 --- a/src/app/api/super-admin/FilesController.ts +++ b/src/app/api/super-admin/FilesController.ts @@ -8,6 +8,7 @@ import { File } from "le-coffre-resources/dist/SuperAdmin"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import fileHandler from "@App/middlewares/OfficeMembershipHandlers/FileHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -20,7 +21,7 @@ export default class FilesController extends ApiController { * @description Get all Files * @returns File[] list of Files */ - @Get("/api/v1/super-admin/files", [authHandler, ruleHandler]) + @Get("/api/v1/super-admin/files", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -50,7 +51,7 @@ export default class FilesController extends ApiController { /** * @description Get a specific File by uid */ - @Get("/api/v1/super-admin/files/download/:uid", [authHandler, ruleHandler, fileHandler]) + @Get("/api/v1/super-admin/files/download/:uid", [authHandler, roleHandler, ruleHandler, fileHandler]) protected async download(req: Request, response: Response) { const uid = req.params["uid"]; if (!uid) { @@ -78,7 +79,7 @@ export default class FilesController extends ApiController { /** * @description Delete a specific File */ - @Delete("/api/v1/super-admin/files/:uid", [authHandler, ruleHandler, fileHandler]) + @Delete("/api/v1/super-admin/files/:uid", [authHandler, roleHandler, ruleHandler, fileHandler]) protected async delete(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -116,7 +117,7 @@ export default class FilesController extends ApiController { /** * @description Get a specific File by uid */ - @Get("/api/v1/super-admin/files/:uid", [authHandler, ruleHandler, fileHandler]) + @Get("/api/v1/super-admin/files/:uid", [authHandler, roleHandler, ruleHandler, fileHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/LiveVoteController.ts b/src/app/api/super-admin/LiveVoteController.ts index 0e3307f4..4a9104ca 100644 --- a/src/app/api/super-admin/LiveVoteController.ts +++ b/src/app/api/super-admin/LiveVoteController.ts @@ -1,4 +1,5 @@ import authHandler from "@App/middlewares/AuthHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; import ApiController from "@Common/system/controller-pattern/ApiController"; import { Controller, Post } from "@ControllerPattern/index"; import { EAppointmentStatus } from "@prisma/client"; @@ -26,7 +27,7 @@ export default class LiveVoteController extends ApiController { /** * @description Create a new vote */ - @Post("/api/v1/super-admin/live-votes", [authHandler]) + @Post("/api/v1/super-admin/live-votes", [authHandler, roleHandler]) protected async post(req: Request, response: Response) { try { const userId = req.body.user.userId; diff --git a/src/app/api/super-admin/OfficeFoldersController.ts b/src/app/api/super-admin/OfficeFoldersController.ts index de9d6586..e0b01345 100644 --- a/src/app/api/super-admin/OfficeFoldersController.ts +++ b/src/app/api/super-admin/OfficeFoldersController.ts @@ -9,6 +9,7 @@ import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import folderHandler from "@App/middlewares/OfficeMembershipHandlers/FolderHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -20,7 +21,7 @@ export default class OfficeFoldersController extends ApiController { /** * @description Get all folders */ - @Get("/api/v1/super-admin/folders", [authHandler, ruleHandler]) + @Get("/api/v1/super-admin/folders", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -79,7 +80,7 @@ export default class OfficeFoldersController extends ApiController { /** * @description Create a new folder */ - @Post("/api/v1/super-admin/folders", [authHandler, ruleHandler, folderHandler]) + @Post("/api/v1/super-admin/folders", [authHandler, roleHandler, ruleHandler, folderHandler]) protected async post(req: Request, response: Response) { try { //init OfficeFolder resource with request body values @@ -103,7 +104,7 @@ export default class OfficeFoldersController extends ApiController { /** * @description Modify a specific folder by uid */ - @Put("/api/v1/super-admin/folders/:uid", [authHandler, ruleHandler, folderHandler]) + @Put("/api/v1/super-admin/folders/:uid", [authHandler, roleHandler, ruleHandler, folderHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -145,7 +146,7 @@ export default class OfficeFoldersController extends ApiController { * @description Get a specific folder by uid * @returns IFolder */ - @Get("/api/v1/super-admin/folders/:uid", [authHandler, ruleHandler, folderHandler]) + @Get("/api/v1/super-admin/folders/:uid", [authHandler, roleHandler, ruleHandler, folderHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -180,7 +181,7 @@ export default class OfficeFoldersController extends ApiController { /** * @description Delete a specific folder */ - @Delete("/api/v1/super-admin/folders/:uid", [authHandler, ruleHandler, folderHandler]) + @Delete("/api/v1/super-admin/folders/:uid", [authHandler, roleHandler, ruleHandler, folderHandler]) protected async delete(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/OfficeRolesController.ts b/src/app/api/super-admin/OfficeRolesController.ts index 80d54d7e..802c223e 100644 --- a/src/app/api/super-admin/OfficeRolesController.ts +++ b/src/app/api/super-admin/OfficeRolesController.ts @@ -9,6 +9,7 @@ import { Prisma } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import officeRoleHandler from "@App/middlewares/OfficeMembershipHandlers/OfficeRoleHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -20,7 +21,7 @@ export default class OfficeRolesController extends ApiController { /** * @description Get all officeRoles */ - @Get("/api/v1/super-admin/office-roles", [authHandler, ruleHandler]) + @Get("/api/v1/super-admin/office-roles", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -62,7 +63,7 @@ export default class OfficeRolesController extends ApiController { /** * @description Create a new officeRole */ - @Post("/api/v1/super-admin/office-roles", [authHandler, ruleHandler, officeRoleHandler]) + @Post("/api/v1/super-admin/office-roles", [authHandler, roleHandler, ruleHandler, officeRoleHandler]) protected async getAddresses(req: Request, response: Response) { try { //init IOfficeRole resource with request body values @@ -90,7 +91,7 @@ export default class OfficeRolesController extends ApiController { /** * @description Modify a specific officeRole by uid */ - @Put("/api/v1/super-admin/office-roles/:uid", [authHandler, ruleHandler, officeRoleHandler]) + @Put("/api/v1/super-admin/office-roles/:uid", [authHandler, roleHandler, ruleHandler, officeRoleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -131,7 +132,7 @@ export default class OfficeRolesController extends ApiController { /** * @description Get a specific officeRole by uid */ - @Get("/api/v1/super-admin/office-roles/:uid", [authHandler, ruleHandler, officeRoleHandler]) + @Get("/api/v1/super-admin/office-roles/:uid", [authHandler, roleHandler, ruleHandler, officeRoleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/OfficesController.ts b/src/app/api/super-admin/OfficesController.ts index e6702675..3fb1bd00 100644 --- a/src/app/api/super-admin/OfficesController.ts +++ b/src/app/api/super-admin/OfficesController.ts @@ -8,6 +8,7 @@ import { Office as OfficeResource } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; import ruleHandler from "@App/middlewares/RulesHandler"; import authHandler from "@App/middlewares/AuthHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -18,7 +19,7 @@ export default class OfficesController extends ApiController { /** * @description Get all offices */ - @Get("/api/v1/super-admin/offices", [authHandler, ruleHandler]) + @Get("/api/v1/super-admin/offices", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -53,7 +54,7 @@ export default class OfficesController extends ApiController { /** * @description Create a new office */ - @Post("/api/v1/super-admin/offices", [authHandler, ruleHandler]) + @Post("/api/v1/super-admin/offices", [authHandler, roleHandler, ruleHandler]) protected async post(req: Request, response: Response) { try { //init IUser resource with request body values @@ -76,7 +77,7 @@ export default class OfficesController extends ApiController { /** * @description Modify a specific office by uid */ - @Put("/api/v1/super-admin/offices/:uid", [authHandler, ruleHandler]) + @Put("/api/v1/super-admin/offices/:uid", [authHandler, roleHandler, ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -111,7 +112,7 @@ export default class OfficesController extends ApiController { /** * @description Get a specific office by uid */ - @Get("/api/v1/super-admin/offices/:uid", [authHandler, ruleHandler]) + @Get("/api/v1/super-admin/offices/:uid", [authHandler, roleHandler, ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/RolesController.ts b/src/app/api/super-admin/RolesController.ts index ba0683ab..372c02c5 100644 --- a/src/app/api/super-admin/RolesController.ts +++ b/src/app/api/super-admin/RolesController.ts @@ -7,6 +7,7 @@ import { validateOrReject } from "class-validator"; import { Role } from "le-coffre-resources/dist/SuperAdmin"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -18,7 +19,7 @@ export default class RolesController extends ApiController { /** * @description Get all roles */ - @Get("/api/v1/super-admin/roles", [authHandler, ruleHandler]) + @Get("/api/v1/super-admin/roles", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -44,7 +45,7 @@ export default class RolesController extends ApiController { /** * @description Create a new role */ - @Post("/api/v1/super-admin/roles", [authHandler, ruleHandler]) + @Post("/api/v1/super-admin/roles", [authHandler, roleHandler, ruleHandler]) protected async getAddresses(req: Request, response: Response) { try { //init IRole resource with request body values @@ -72,7 +73,7 @@ export default class RolesController extends ApiController { /** * @description Modify a specific role by uid */ - @Put("/api/v1/super-admin/roles/:uid", [authHandler, ruleHandler]) + @Put("/api/v1/super-admin/roles/:uid", [authHandler, roleHandler, ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -113,7 +114,7 @@ export default class RolesController extends ApiController { /** * @description Get a specific role by uid */ - @Get("/api/v1/super-admin/roles/:uid", [authHandler, ruleHandler]) + @Get("/api/v1/super-admin/roles/:uid", [authHandler, roleHandler, ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/RulesController.ts b/src/app/api/super-admin/RulesController.ts index c0bc87c1..025ec5c0 100644 --- a/src/app/api/super-admin/RulesController.ts +++ b/src/app/api/super-admin/RulesController.ts @@ -7,6 +7,7 @@ import { validateOrReject } from "class-validator"; import { Rule } from "le-coffre-resources/dist/SuperAdmin"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -18,7 +19,7 @@ export default class RulesController extends ApiController { /** * @description Get all rules */ - @Get("/api/v1/super-admin/rules", [authHandler, ruleHandler]) + @Get("/api/v1/super-admin/rules", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -44,7 +45,7 @@ export default class RulesController extends ApiController { /** * @description Create a new rule */ - @Post("/api/v1/super-admin/rules", [authHandler, ruleHandler]) + @Post("/api/v1/super-admin/rules", [authHandler, roleHandler, ruleHandler]) protected async getAddresses(req: Request, response: Response) { try { //init IRule resource with request body values @@ -72,7 +73,7 @@ export default class RulesController extends ApiController { /** * @description Modify a specific rule by uid */ - @Put("/api/v1/super-admin/rules/:uid", [authHandler, ruleHandler]) + @Put("/api/v1/super-admin/rules/:uid", [authHandler, roleHandler, ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -113,7 +114,7 @@ export default class RulesController extends ApiController { /** * @description Get a specific rule by uid */ - @Get("/api/v1/super-admin/rules/:uid", [authHandler, ruleHandler]) + @Get("/api/v1/super-admin/rules/:uid", [authHandler, roleHandler, ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index a9815f14..f6e28794 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -7,6 +7,7 @@ import { validateOrReject } from "class-validator"; import User from "le-coffre-resources/dist/SuperAdmin"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -18,7 +19,7 @@ export default class UsersController extends ApiController { /** * @description Get all users */ - @Get("/api/v1/super-admin/users", [authHandler, ruleHandler]) + @Get("/api/v1/super-admin/users", [authHandler, roleHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -58,7 +59,7 @@ export default class UsersController extends ApiController { /** * @description Create a new user */ - @Post("/api/v1/super-admin/users", [authHandler, ruleHandler]) + @Post("/api/v1/super-admin/users", [authHandler, roleHandler, ruleHandler]) protected async create(req: Request, response: Response) { try { //init IUser resource with request body values @@ -86,7 +87,7 @@ export default class UsersController extends ApiController { /** * @description Modify a specific user by uid */ - @Put("/api/v1/super-admin/users/:uid", [authHandler, ruleHandler]) + @Put("/api/v1/super-admin/users/:uid", [authHandler, roleHandler, ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -128,7 +129,7 @@ export default class UsersController extends ApiController { /** * @description Get a specific user by uid */ - @Get("/api/v1/super-admin/users/:uid", [authHandler, ruleHandler]) + @Get("/api/v1/super-admin/users/:uid", [authHandler, roleHandler, ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/VotesController.ts b/src/app/api/super-admin/VotesController.ts index 4d25ef6d..308e46e3 100644 --- a/src/app/api/super-admin/VotesController.ts +++ b/src/app/api/super-admin/VotesController.ts @@ -6,6 +6,7 @@ import { Service } from "typedi"; import { Vote } from "le-coffre-resources/dist/SuperAdmin"; import authHandler from "@App/middlewares/AuthHandler"; import { Votes } from "@prisma/client"; +import roleHandler from "@App/middlewares/RolesHandler"; @Controller() @Service() @@ -17,7 +18,7 @@ export default class VotesController extends ApiController { /** * @description Get all votes */ - @Get("/api/v1/super-admin/votes", [authHandler]) + @Get("/api/v1/super-admin/votes", [authHandler, roleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -43,7 +44,7 @@ export default class VotesController extends ApiController { /** * @description Get a specific vote by uid */ - @Get("/api/v1/super-admin/votes/:uid", [authHandler]) + @Get("/api/v1/super-admin/votes/:uid", [authHandler, roleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -78,7 +79,7 @@ export default class VotesController extends ApiController { /** * @description Delete a specific vote */ - @Delete("/api/v1/super-admin/votes/:uid", [authHandler]) + @Delete("/api/v1/super-admin/votes/:uid", [authHandler, roleHandler]) protected async delete(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/middlewares/RolesHandler.ts b/src/app/middlewares/RolesHandler.ts new file mode 100644 index 00000000..3a4a9c77 --- /dev/null +++ b/src/app/middlewares/RolesHandler.ts @@ -0,0 +1,22 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import { NextFunction, Request, Response } from "express"; + +export default async function roleHandler(req: Request, response: Response, next: NextFunction) { + try { + + const namespace = req.path && req.path.split("/")[3]; + const role = req.body.user.role; + + if (namespace != "notary" && role != namespace && role != "super-admin") { + response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this role"); + return; + } + + next(); + + } catch (error) { + console.log(error); + response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); + return; + } +} diff --git a/src/app/middlewares/RulesHandler.ts b/src/app/middlewares/RulesHandler.ts index 16040875..cd35dcfe 100644 --- a/src/app/middlewares/RulesHandler.ts +++ b/src/app/middlewares/RulesHandler.ts @@ -6,19 +6,7 @@ export default async function ruleHandler(req: Request, response: Response, next const rules = req.body.user.rules; const service = req.path && req.path.split("/")[4]; - // if (!rules) { - // response.status(HttpCodes.UNAUTHORIZED).send("Missing rules in JWT"); - // return; - // } - const namespace = req.path && req.path.split("/")[3]; - const role = req.body.user.role; - - if (namespace != "notary" && role != namespace && role != "super-admin") { - response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this role"); - return; - } - - if (!rules.includes(req.method + " " + service) && role != "super-admin") { + if (!rules.includes(req.method + " " + service)) { response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with those rules"); return; } From 24327a99a3cd44616688b3f56d5c8abbe8458821 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Wed, 16 Aug 2023 11:09:48 +0200 Subject: [PATCH 129/134] add checks on user (office)role update --- src/app/api/admin/UsersController.ts | 31 +++++++++++++++++-- src/app/api/super-admin/UsersController.ts | 30 ++++++++++++++++-- .../admin/UsersService/UsersService.ts | 10 +++++- 3 files changed, 65 insertions(+), 6 deletions(-) diff --git a/src/app/api/admin/UsersController.ts b/src/app/api/admin/UsersController.ts index ee208504..1c7c3251 100644 --- a/src/app/api/admin/UsersController.ts +++ b/src/app/api/admin/UsersController.ts @@ -10,11 +10,13 @@ import ruleHandler from "@App/middlewares/RulesHandler"; import userHandler from "@App/middlewares/OfficeMembershipHandlers/UserHandler"; import { validateOrReject } from "class-validator"; import roleHandler from "@App/middlewares/RolesHandler"; +import RolesService from "@Services/admin/RolesService/RolesService"; +import OfficeRolesService from "@Services/admin/OfficeRolesService/OfficeRolesService"; @Controller() @Service() export default class UsersController extends ApiController { - constructor(private usersService: UsersService) { + constructor(private usersService: UsersService, private roleService: RolesService, private officeRoleService: OfficeRolesService) { super(); } @@ -75,7 +77,7 @@ export default class UsersController extends ApiController { return; } - const userFound = await this.usersService.getByUid(uid); + const userFound = await this.usersService.getByUidWithRole(uid); if (!userFound) { this.httpNotFoundRequest(response, "user not found"); @@ -87,7 +89,30 @@ export default class UsersController extends ApiController { //validate user await validateOrReject(userEntity, { groups: ["updateUser"] }); - + + if(userEntity.role) { + const role = await this.roleService.getByUid(userEntity.role.uid!); + if(!role) { + this.httpBadRequest(response, "Role not found"); + return; + } + if (role.name === "super-admin" || userFound.role.name === "super-admin" ) { + this.httpBadRequest(response, "Cannot assign or remove super-admin role"); + return; + } + } + + if(userEntity.office_role) { + const officeRole = await this.officeRoleService.getByUid(userEntity.office_role.uid!); + if(!officeRole) { + this.httpBadRequest(response, "Office role not found"); + return; + } + if (officeRole.office_uid != userFound.office_uid) { + this.httpBadRequest(response, "Cannot assign an office role from another office"); + return; + } + } //call service to get prisma entity const userEntityUpdated = await this.usersService.update(uid, userEntity); diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index f6e28794..618c4728 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -8,11 +8,13 @@ import User from "le-coffre-resources/dist/SuperAdmin"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import roleHandler from "@App/middlewares/RolesHandler"; +import RolesService from "@Services/super-admin/RolesService/RolesService"; +import OfficeRolesService from "@Services/super-admin/OfficeRolesService/OfficeRolesService"; @Controller() @Service() export default class UsersController extends ApiController { - constructor(private usersService: UsersService) { + constructor(private usersService: UsersService, private roleService: RolesService, private officeRoleService: OfficeRolesService) { super(); } @@ -97,7 +99,7 @@ export default class UsersController extends ApiController { return; } - const userFound = await this.usersService.getByUid(uid, {role: true, votes: true}); + const userFound = await this.usersService.getByUidWithRole(uid); if (!userFound) { this.httpNotFoundRequest(response, "user not found"); @@ -109,6 +111,30 @@ export default class UsersController extends ApiController { //validate user await validateOrReject(userEntity, { groups: ["updateUser"] }); + + if(userEntity.role) { + const role = await this.roleService.getByUid(userEntity.role.uid!); + if(!role) { + this.httpBadRequest(response, "Role not found"); + return; + } + if (role.name === "super-admin" || userFound.role.name === "super-admin" ) { + this.httpBadRequest(response, "Cannot assign or remove super-admin role"); + return; + } + } + + if(userEntity.office_role) { + const officeRole = await this.officeRoleService.getByUid(userEntity.office_role.uid!); + if(!officeRole) { + this.httpBadRequest(response, "Office role not found"); + return; + } + if (officeRole.office_uid != userFound.office_uid) { + this.httpBadRequest(response, "Cannot assign an office role from another office"); + return; + } + } //call service to get prisma entity const userEntityUpdated = await this.usersService.update(uid, userEntity); diff --git a/src/services/admin/UsersService/UsersService.ts b/src/services/admin/UsersService/UsersService.ts index f23c09d7..6167352e 100644 --- a/src/services/admin/UsersService/UsersService.ts +++ b/src/services/admin/UsersService/UsersService.ts @@ -31,7 +31,7 @@ export default class UsersService extends BaseService { * @description : Modify a user * @throws {Error} If user modification failed */ - public update(uid: string, userEntity: User): Promise { + public async update(uid: string, userEntity: User): Promise { return this.userRepository.updateRole(uid, userEntity); } @@ -51,6 +51,14 @@ export default class UsersService extends BaseService { return this.userRepository.findOneByUidWithOffice(uid); } + /** + * @description : Get a user by uid with office + * @throws {Error} If user cannot be get by uid + */ + public getByUidWithRole(uid: string) { + return this.userRepository.findOneByUidWithRole(uid); + } + /** * @description : Get a user by uid * @throws {Error} If user cannot be get by uid From 1ce013b5f661c663cb9ea749421d960b3859404c Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Wed, 16 Aug 2023 13:53:32 +0200 Subject: [PATCH 130/134] remove uid in req body for updates --- package-lock.json | 862 ++++++++++--------- package.json | 2 +- src/app/api/admin/UsersController.ts | 4 - src/app/api/customer/FilesController.ts | 3 - src/app/api/super-admin/OfficesController.ts | 3 +- src/app/api/super-admin/RulesController.ts | 3 - src/app/api/super-admin/UsersController.ts | 3 - 7 files changed, 460 insertions(+), 420 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0290f4ae..e6e9857e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "cron": "^2.3.1", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.66", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.67", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", @@ -70,17 +70,89 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", + "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.5" + "@babel/highlight": "^7.22.10", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { "version": "7.22.9", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", @@ -91,21 +163,21 @@ } }, "node_modules/@babel/core": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", - "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", + "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.9", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", + "@babel/helper-compilation-targets": "^7.22.10", "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.6", - "@babel/parser": "^7.22.7", + "@babel/helpers": "^7.22.10", + "@babel/parser": "^7.22.10", "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.8", - "@babel/types": "^7.22.5", + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -150,12 +222,12 @@ "dev": true }, "node_modules/@babel/generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", - "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz", + "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5", + "@babel/types": "^7.22.10", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -165,9 +237,9 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", - "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", + "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", @@ -178,9 +250,6 @@ }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-environment-visitor": { @@ -309,27 +378,27 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", - "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", + "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", "dev": true, "dependencies": { "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.6", - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.22.10", + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", + "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -408,9 +477,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", - "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -611,19 +680,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", - "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz", + "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.7", + "@babel/code-frame": "^7.22.10", + "@babel/generator": "^7.22.10", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.7", - "@babel/types": "^7.22.5", + "@babel/parser": "^7.22.10", + "@babel/types": "^7.22.10", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -655,9 +724,9 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", + "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", @@ -720,16 +789,16 @@ } }, "node_modules/@jest/console": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz", - "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.2.tgz", + "integrity": "sha512-0N0yZof5hi44HAR2pPS+ikJ3nzKNoZdVu8FffRf3wy47I7Dm7etk/3KetMdRUqzVd16V4O2m2ISpNTbnIuqy1w==", "dev": true, "dependencies": { "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.6.1", - "jest-util": "^29.6.1", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", "slash": "^3.0.0" }, "engines": { @@ -737,15 +806,15 @@ } }, "node_modules/@jest/core": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz", - "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.2.tgz", + "integrity": "sha512-Oj+5B+sDMiMWLhPFF+4/DvHOf+U10rgvCLGPHP8Xlsy/7QxS51aU/eBngudHlJXnaWD5EohAgJ4js+T6pa+zOg==", "dev": true, "dependencies": { - "@jest/console": "^29.6.1", - "@jest/reporters": "^29.6.1", - "@jest/test-result": "^29.6.1", - "@jest/transform": "^29.6.1", + "@jest/console": "^29.6.2", + "@jest/reporters": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", @@ -754,20 +823,20 @@ "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.5.0", - "jest-config": "^29.6.1", - "jest-haste-map": "^29.6.1", - "jest-message-util": "^29.6.1", + "jest-config": "^29.6.2", + "jest-haste-map": "^29.6.2", + "jest-message-util": "^29.6.2", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.1", - "jest-resolve-dependencies": "^29.6.1", - "jest-runner": "^29.6.1", - "jest-runtime": "^29.6.1", - "jest-snapshot": "^29.6.1", - "jest-util": "^29.6.1", - "jest-validate": "^29.6.1", - "jest-watcher": "^29.6.1", + "jest-resolve": "^29.6.2", + "jest-resolve-dependencies": "^29.6.2", + "jest-runner": "^29.6.2", + "jest-runtime": "^29.6.2", + "jest-snapshot": "^29.6.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", + "jest-watcher": "^29.6.2", "micromatch": "^4.0.4", - "pretty-format": "^29.6.1", + "pretty-format": "^29.6.2", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -784,37 +853,37 @@ } }, "node_modules/@jest/environment": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz", - "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.2.tgz", + "integrity": "sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.6.1", + "@jest/fake-timers": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^29.6.1" + "jest-mock": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz", - "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.2.tgz", + "integrity": "sha512-m6DrEJxVKjkELTVAztTLyS/7C92Y2b0VYqmDROYKLLALHn8T/04yPs70NADUYPrV3ruI+H3J0iUIuhkjp7vkfg==", "dev": true, "dependencies": { - "expect": "^29.6.1", - "jest-snapshot": "^29.6.1" + "expect": "^29.6.2", + "jest-snapshot": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", - "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.2.tgz", + "integrity": "sha512-6zIhM8go3RV2IG4aIZaZbxwpOzz3ZiM23oxAlkquOIole+G6TrbeXnykxWYlqF7kz2HlBjdKtca20x9atkEQYg==", "dev": true, "dependencies": { "jest-get-type": "^29.4.3" @@ -824,47 +893,47 @@ } }, "node_modules/@jest/fake-timers": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz", - "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.2.tgz", + "integrity": "sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==", "dev": true, "dependencies": { "@jest/types": "^29.6.1", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.6.1", - "jest-mock": "^29.6.1", - "jest-util": "^29.6.1" + "jest-message-util": "^29.6.2", + "jest-mock": "^29.6.2", + "jest-util": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz", - "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.2.tgz", + "integrity": "sha512-cjuJmNDjs6aMijCmSa1g2TNG4Lby/AeU7/02VtpW+SLcZXzOLK2GpN2nLqcFjmhy3B3AoPeQVx7BnyOf681bAw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.1", - "@jest/expect": "^29.6.1", + "@jest/environment": "^29.6.2", + "@jest/expect": "^29.6.2", "@jest/types": "^29.6.1", - "jest-mock": "^29.6.1" + "jest-mock": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz", - "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.2.tgz", + "integrity": "sha512-sWtijrvIav8LgfJZlrGCdN0nP2EWbakglJY49J1Y5QihcQLfy7ovyxxjJBRXMNltgt4uPtEcFmIMbVshEDfFWw==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.6.1", - "@jest/test-result": "^29.6.1", - "@jest/transform": "^29.6.1", + "@jest/console": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", "@jest/types": "^29.6.1", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", @@ -878,9 +947,9 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.6.1", - "jest-util": "^29.6.1", - "jest-worker": "^29.6.1", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", + "jest-worker": "^29.6.2", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -925,12 +994,12 @@ } }, "node_modules/@jest/test-result": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz", - "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.2.tgz", + "integrity": "sha512-3VKFXzcV42EYhMCsJQURptSqnyjqCGbtLuX5Xxb6Pm6gUf1wIRIl+mandIRGJyWKgNKYF9cnstti6Ls5ekduqw==", "dev": true, "dependencies": { - "@jest/console": "^29.6.1", + "@jest/console": "^29.6.2", "@jest/types": "^29.6.1", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" @@ -940,14 +1009,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz", - "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.2.tgz", + "integrity": "sha512-GVYi6PfPwVejO7slw6IDO0qKVum5jtrJ3KoLGbgBWyr2qr4GaxFV6su+ZAjdTX75Sr1DkMFRk09r2ZVa+wtCGw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.1", + "@jest/test-result": "^29.6.2", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.1", + "jest-haste-map": "^29.6.2", "slash": "^3.0.0" }, "engines": { @@ -955,9 +1024,9 @@ } }, "node_modules/@jest/transform": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz", - "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.2.tgz", + "integrity": "sha512-ZqCqEISr58Ce3U+buNFJYUktLJZOggfyvR+bZMaiV1e8B1SIvJbwZMrYz3gx/KAPn9EXmOmN+uB08yLCjWkQQg==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -968,9 +1037,9 @@ "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.1", + "jest-haste-map": "^29.6.2", "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.1", + "jest-util": "^29.6.2", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -1012,9 +1081,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "engines": { "node": ">=6.0.0" } @@ -1034,21 +1103,15 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, "node_modules/@mailchimp/mailchimp_transactional": { "version": "1.0.50", "resolved": "https://registry.npmjs.org/@mailchimp/mailchimp_transactional/-/mailchimp_transactional-1.0.50.tgz", @@ -1061,14 +1124,14 @@ } }, "node_modules/@next/env": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.12.tgz", - "integrity": "sha512-RmHanbV21saP/6OEPBJ7yJMuys68cIf8OBBWd7+uj40LdpmswVAwe1uzeuFyUsd6SfeITWT3XnQfn6wULeKwDQ==" + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.16.tgz", + "integrity": "sha512-pCU0sJBqdfKP9mwDadxvZd+eLz3fZrTlmmDHY12Hdpl3DD0vy8ou5HWKVfG0zZS6tqhL4wnQqRbspdY5nqa7MA==" }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.12.tgz", - "integrity": "sha512-deUrbCXTMZ6ZhbOoloqecnUeNpUOupi8SE2tx4jPfNS9uyUR9zK4iXBvH65opVcA/9F5I/p8vDXSYbUlbmBjZg==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.16.tgz", + "integrity": "sha512-Rl6i1uUq0ciRa3VfEpw6GnWAJTSKo9oM2OrkGXPsm7rMxdd2FR5NkKc0C9xzFCI4+QtmBviWBdF2m3ur3Nqstw==", "cpu": [ "arm64" ], @@ -1081,9 +1144,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.12.tgz", - "integrity": "sha512-WRvH7RxgRHlC1yb5oG0ZLx8F7uci9AivM5/HGGv9ZyG2Als8Ij64GC3d+mQ5sJhWjusyU6T6V1WKTUoTmOB0zQ==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.16.tgz", + "integrity": "sha512-o1vIKYbZORyDmTrPV1hApt9NLyWrS5vr2p5hhLGpOnkBY1cz6DAXjv8Lgan8t6X87+83F0EUDlu7klN8ieZ06A==", "cpu": [ "x64" ], @@ -1096,9 +1159,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.12.tgz", - "integrity": "sha512-YEKracAWuxp54tKiAvvq73PUs9lok57cc8meYRibTWe/VdPB2vLgkTVWFcw31YDuRXdEhdX0fWS6Q+ESBhnEig==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.16.tgz", + "integrity": "sha512-JRyAl8lCfyTng4zoOmE6hNI2f1MFUr7JyTYCHl1RxX42H4a5LMwJhDVQ7a9tmDZ/yj+0hpBn+Aan+d6lA3v0UQ==", "cpu": [ "arm64" ], @@ -1111,9 +1174,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.12.tgz", - "integrity": "sha512-LhJR7/RAjdHJ2Isl2pgc/JaoxNk0KtBgkVpiDJPVExVWA1c6gzY57+3zWuxuyWzTG+fhLZo2Y80pLXgIJv7g3g==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.16.tgz", + "integrity": "sha512-9gqVqNzUMWbUDgDiND18xoUqhwSm2gmksqXgCU0qaOKt6oAjWz8cWYjgpPVD0WICKFylEY/gvPEP1fMZDVFZ/g==", "cpu": [ "arm64" ], @@ -1126,9 +1189,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.12.tgz", - "integrity": "sha512-1DWLL/B9nBNiQRng+1aqs3OaZcxC16Nf+mOnpcrZZSdyKHek3WQh6j/fkbukObgNGwmCoVevLUa/p3UFTTqgqg==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.16.tgz", + "integrity": "sha512-KcQGwchAKmZVPa8i5PLTxvTs1/rcFnSltfpTm803Tr/BtBV3AxCkHLfhtoyVtVzx/kl/oue8oS+DSmbepQKwhw==", "cpu": [ "x64" ], @@ -1141,9 +1204,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.12.tgz", - "integrity": "sha512-kEAJmgYFhp0VL+eRWmUkVxLVunn7oL9Mdue/FS8yzRBVj7Z0AnIrHpTIeIUl1bbdQq1VaoOztnKicAjfkLTRCQ==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.16.tgz", + "integrity": "sha512-2RbMZNxYnJmW8EPHVBsGZPq5zqWAyBOc/YFxq/jIQ/Yn3RMFZ1dZVCjtIcsiaKmgh7mjA/W0ApbumutHNxRqqQ==", "cpu": [ "x64" ], @@ -1156,9 +1219,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.12.tgz", - "integrity": "sha512-GMLuL/loR6yIIRTnPRY6UGbLL9MBdw2anxkOnANxvLvsml4F0HNIgvnU3Ej4BjbqMTNjD4hcPFdlEow4XHPdZA==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.16.tgz", + "integrity": "sha512-thDcGonELN7edUKzjzlHrdoKkm7y8IAdItQpRvvMxNUXa4d9r0ElofhTZj5emR7AiXft17hpen+QAkcWpqG7Jg==", "cpu": [ "arm64" ], @@ -1171,9 +1234,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.12.tgz", - "integrity": "sha512-PhgNqN2Vnkm7XaMdRmmX0ZSwZXQAtamBVSa9A/V1dfKQCV1rjIZeiy/dbBnVYGdj63ANfsOR/30XpxP71W0eww==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.16.tgz", + "integrity": "sha512-f7SE1Mo4JAchUWl0LQsbtySR9xCa+x55C0taetjUApKtcLR3AgAjASrrP+oE1inmLmw573qRnE1eZN8YJfEBQw==", "cpu": [ "ia32" ], @@ -1186,9 +1249,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.12.tgz", - "integrity": "sha512-Z+56e/Ljt0bUs+T+jPjhFyxYBcdY2RIq9ELFU+qAMQMteHo7ymbV7CKmlcX59RI9C4YzN8PgMgLyAoi916b5HA==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.16.tgz", + "integrity": "sha512-WamDZm1M/OEM4QLce3lOmD1XdLEl37zYZwlmOLhmF7qYJ2G6oYm9+ejZVv+LakQIsIuXhSpVlOvrxIAHqwRkPQ==", "cpu": [ "x64" ], @@ -1365,13 +1428,13 @@ } }, "node_modules/@types/cron": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/cron/-/cron-2.0.1.tgz", - "integrity": "sha512-WHa/1rtNtD2Q/H0+YTTZoty+/5rcE66iAFX2IY+JuUoOACsevYyFkSYu/2vdw+G5LrmO7Lxowrqm0av4k3qWNQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/cron/-/cron-2.4.0.tgz", + "integrity": "sha512-5bBaAkqvSFBX8JMi/xCofNzG5E594TNsApMz68dLd/sQYz/HGQqgcxGHTRjOvD4G3Y+YF1Oo3S7QdCvKt1KAJQ==", + "deprecated": "This is a stub types definition. cron provides its own type definitions, so you do not need this installed.", "dev": true, "dependencies": { - "@types/luxon": "*", - "@types/node": "*" + "cron": "*" } }, "node_modules/@types/express": { @@ -1456,12 +1519,6 @@ "@types/node": "*" } }, - "node_modules/@types/luxon": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-3.3.1.tgz", - "integrity": "sha512-XOS5nBcgEeP2PpcqJHjCWhUCAzGfXIU8ILOSLpx2FhxqMW9KdxgCGXNOEKGVBfveKtIpztHzKK5vSRVLyW/NqA==", - "dev": true - }, "node_modules/@types/mailchimp__mailchimp_transactional": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/mailchimp__mailchimp_transactional/-/mailchimp__mailchimp_transactional-1.0.5.tgz", @@ -1478,9 +1535,9 @@ "dev": true }, "node_modules/@types/module-alias": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/module-alias/-/module-alias-2.0.1.tgz", - "integrity": "sha512-DN/CCT1HQG6HquBNJdLkvV+4v5l/oEuwOHUPLxI+Eub0NED+lk0YUfba04WGH90EINiUrNgClkNnwGmbICeWMQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/module-alias/-/module-alias-2.0.2.tgz", + "integrity": "sha512-Oeo5NEjAceFgN8OzGiLXPswgv2GBmrDGuTnLS0sQ8g4Mq5sB5c97Hu5B+n9Gu/j+5Y+oUb4TSawHXkZ8MENGyw==", "dev": true }, "node_modules/@types/multer": { @@ -1493,9 +1550,9 @@ } }, "node_modules/@types/node": { - "version": "18.17.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.1.tgz", - "integrity": "sha512-xlR1jahfizdplZYRU59JlUx9uzF1ARa8jbhM11ccpCJya8kvos5jwdm2ZAgxSCwOl0fq21svP18EVwPBXMQudw==" + "version": "18.17.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.5.tgz", + "integrity": "sha512-xNbS75FxH6P4UXTPUJp/zNPq6/xsfdJKussCWNOnz4aULWIRwMgP1LgaB5RiBnMX1DPCYenuqGZfnIAx5mbFLA==" }, "node_modules/@types/node-fetch": { "version": "2.6.4", @@ -1530,12 +1587,6 @@ "@types/node": "*" } }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true - }, "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", @@ -1582,9 +1633,9 @@ "dev": true }, "node_modules/@types/validator": { - "version": "13.7.17", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.7.17.tgz", - "integrity": "sha512-aqayTNmeWrZcvnG2MG9eGYI6b7S5fl+yKgPs6bAjOTwPS316R5SxBGKvtSExfyoJU7pIeHJfsHI0Ji41RVMkvQ==" + "version": "13.11.1", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.1.tgz", + "integrity": "sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==" }, "node_modules/@types/yargs": { "version": "17.0.24", @@ -1728,12 +1779,12 @@ } }, "node_modules/babel-jest": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz", - "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.2.tgz", + "integrity": "sha512-BYCzImLos6J3BH/+HvUCHG1dTf2MzmAB4jaVxHV+29RZLjR29XuYTmsf2sdDwkrb+FczkGo3kOhE7ga6sI0P4A==", "dev": true, "dependencies": { - "@jest/transform": "^29.6.1", + "@jest/transform": "^29.6.2", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.5.0", @@ -1906,9 +1957,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", - "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", "dev": true, "funding": [ { @@ -1925,9 +1976,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001503", - "electron-to-chromium": "^1.4.431", - "node-releases": "^2.0.12", + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", "update-browserslist-db": "^1.0.11" }, "bin": { @@ -2049,9 +2100,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001517", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz", - "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==", + "version": "1.0.30001521", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001521.tgz", + "integrity": "sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==", "funding": [ { "type": "opencollective", @@ -2335,17 +2386,17 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, "node_modules/cron": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/cron/-/cron-2.4.0.tgz", - "integrity": "sha512-Cx77ic1TyIAtUggr0oAhtS8MLzPBUqGNIvdDM7jE3oFIxfe8LXWI9q3iQN/H2CebAiMir53LQKWOhEKnzkJTAQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/cron/-/cron-2.4.1.tgz", + "integrity": "sha512-ty0hUSPuENwDtIShDFxUxWEIsqiu2vhoFtt6Vwrbg4lHGtJX2/cV2p0hH6/qaEM9Pj+i6mQoau48BO5wBpkP4w==", "dependencies": { "luxon": "^3.2.1" } }, "node_modules/cron-parser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.8.1.tgz", - "integrity": "sha512-jbokKWGcyU4gl6jAfX97E1gDpY12DJ1cLJZmoDzaAln/shZ+S3KBFBuA2Q6WeUN4gJf/8klnV1EfvhA2lK5IRQ==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", + "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", "dependencies": { "luxon": "^3.2.1" }, @@ -2376,10 +2427,18 @@ } }, "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } }, "node_modules/deepmerge": { "version": "4.3.1", @@ -2467,9 +2526,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.473", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.473.tgz", - "integrity": "sha512-aVfC8+440vGfl06l8HKKn8/PD5jRfSnLkTTD65EFvU46igbpQRri1gxSzW9/+TeUlwYzrXk1sw867T96zlyECA==", + "version": "1.4.492", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.492.tgz", + "integrity": "sha512-36K9b/6skMVwAIEsC7GiQ8I8N3soCALVSHqWHzNDtGemAcI9Xu8hP02cywWM0A794rTHm0b0zHPeLJHtgFVamQ==", "dev": true }, "node_modules/emittery": { @@ -2584,17 +2643,17 @@ } }, "node_modules/expect": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", - "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.2.tgz", + "integrity": "sha512-iAErsLxJ8C+S02QbLAwgSGSezLQK+XXRDt8IuFXFpwCNw2ECmzZSmjKcCaFVp5VRMk+WAvz6h6jokzEzBFZEuA==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.6.1", + "@jest/expect-utils": "^29.6.2", "@types/node": "*", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.6.1", - "jest-message-util": "^29.6.1", - "jest-util": "^29.6.1" + "jest-matcher-utils": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3061,9 +3120,9 @@ } }, "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -3257,15 +3316,15 @@ } }, "node_modules/jest": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz", - "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.2.tgz", + "integrity": "sha512-8eQg2mqFbaP7CwfsTpCxQ+sHzw1WuNWL5UUvjnWP4hx2riGz9fPSzYOaU5q8/GqWn1TfgZIVTqYJygbGbWAANg==", "dev": true, "dependencies": { - "@jest/core": "^29.6.1", + "@jest/core": "^29.6.2", "@jest/types": "^29.6.1", "import-local": "^3.0.2", - "jest-cli": "^29.6.1" + "jest-cli": "^29.6.2" }, "bin": { "jest": "bin/jest.js" @@ -3296,28 +3355,28 @@ } }, "node_modules/jest-circus": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz", - "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.2.tgz", + "integrity": "sha512-G9mN+KOYIUe2sB9kpJkO9Bk18J4dTDArNFPwoZ7WKHKel55eKIS/u2bLthxgojwlf9NLCVQfgzM/WsOVvoC6Fw==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.1", - "@jest/expect": "^29.6.1", - "@jest/test-result": "^29.6.1", + "@jest/environment": "^29.6.2", + "@jest/expect": "^29.6.2", + "@jest/test-result": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "dedent": "^0.7.0", + "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.6.1", - "jest-matcher-utils": "^29.6.1", - "jest-message-util": "^29.6.1", - "jest-runtime": "^29.6.1", - "jest-snapshot": "^29.6.1", - "jest-util": "^29.6.1", + "jest-each": "^29.6.2", + "jest-matcher-utils": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-runtime": "^29.6.2", + "jest-snapshot": "^29.6.2", + "jest-util": "^29.6.2", "p-limit": "^3.1.0", - "pretty-format": "^29.6.1", + "pretty-format": "^29.6.2", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -3327,21 +3386,21 @@ } }, "node_modules/jest-cli": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz", - "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.2.tgz", + "integrity": "sha512-TT6O247v6dCEX2UGHGyflMpxhnrL0DNqP2fRTKYm3nJJpCTfXX3GCMQPGFjXDoj0i5/Blp3jriKXFgdfmbYB6Q==", "dev": true, "dependencies": { - "@jest/core": "^29.6.1", - "@jest/test-result": "^29.6.1", + "@jest/core": "^29.6.2", + "@jest/test-result": "^29.6.2", "@jest/types": "^29.6.1", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.6.1", - "jest-util": "^29.6.1", - "jest-validate": "^29.6.1", + "jest-config": "^29.6.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", "prompts": "^2.0.1", "yargs": "^17.3.1" }, @@ -3361,31 +3420,31 @@ } }, "node_modules/jest-config": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz", - "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.2.tgz", + "integrity": "sha512-VxwFOC8gkiJbuodG9CPtMRjBUNZEHxwfQXmIudSTzFWxaci3Qub1ddTRbFNQlD/zUeaifLndh/eDccFX4wCMQw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.6.1", + "@jest/test-sequencer": "^29.6.2", "@jest/types": "^29.6.1", - "babel-jest": "^29.6.1", + "babel-jest": "^29.6.2", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.6.1", - "jest-environment-node": "^29.6.1", + "jest-circus": "^29.6.2", + "jest-environment-node": "^29.6.2", "jest-get-type": "^29.4.3", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.1", - "jest-runner": "^29.6.1", - "jest-util": "^29.6.1", - "jest-validate": "^29.6.1", + "jest-resolve": "^29.6.2", + "jest-runner": "^29.6.2", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.6.1", + "pretty-format": "^29.6.2", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -3406,15 +3465,15 @@ } }, "node_modules/jest-diff": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", - "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.2.tgz", + "integrity": "sha512-t+ST7CB9GX5F2xKwhwCf0TAR17uNDiaPTZnVymP9lw0lssa9vG+AFyDZoeIHStU3WowFFwT+ky+er0WVl2yGhA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.4.3", "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.1" + "pretty-format": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3433,33 +3492,33 @@ } }, "node_modules/jest-each": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz", - "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.2.tgz", + "integrity": "sha512-MsrsqA0Ia99cIpABBc3izS1ZYoYfhIy0NNWqPSE0YXbQjwchyt6B1HD2khzyPe1WiJA7hbxXy77ZoUQxn8UlSw==", "dev": true, "dependencies": { "@jest/types": "^29.6.1", "chalk": "^4.0.0", "jest-get-type": "^29.4.3", - "jest-util": "^29.6.1", - "pretty-format": "^29.6.1" + "jest-util": "^29.6.2", + "pretty-format": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-node": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz", - "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.2.tgz", + "integrity": "sha512-YGdFeZ3T9a+/612c5mTQIllvWkddPbYcN2v95ZH24oWMbGA4GGS2XdIF92QMhUhvrjjuQWYgUGW2zawOyH63MQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.1", - "@jest/fake-timers": "^29.6.1", + "@jest/environment": "^29.6.2", + "@jest/fake-timers": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", - "jest-mock": "^29.6.1", - "jest-util": "^29.6.1" + "jest-mock": "^29.6.2", + "jest-util": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3475,9 +3534,9 @@ } }, "node_modules/jest-haste-map": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz", - "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.2.tgz", + "integrity": "sha512-+51XleTDAAysvU8rT6AnS1ZJ+WHVNqhj1k6nTvN2PYP+HjU3kqlaKQ1Lnw3NYW3bm2r8vq82X0Z1nDDHZMzHVA==", "dev": true, "dependencies": { "@jest/types": "^29.6.1", @@ -3487,8 +3546,8 @@ "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.4.3", - "jest-util": "^29.6.1", - "jest-worker": "^29.6.1", + "jest-util": "^29.6.2", + "jest-worker": "^29.6.2", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -3500,37 +3559,37 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz", - "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.2.tgz", + "integrity": "sha512-aNqYhfp5uYEO3tdWMb2bfWv6f0b4I0LOxVRpnRLAeque2uqOVVMLh6khnTcE2qJ5wAKop0HcreM1btoysD6bPQ==", "dev": true, "dependencies": { "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.1" + "pretty-format": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", - "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.2.tgz", + "integrity": "sha512-4LiAk3hSSobtomeIAzFTe+N8kL6z0JtF3n6I4fg29iIW7tt99R7ZcIFW34QkX+DuVrf+CUe6wuVOpm7ZKFJzZQ==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.6.1", + "jest-diff": "^29.6.2", "jest-get-type": "^29.4.3", - "pretty-format": "^29.6.1" + "pretty-format": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", - "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.2.tgz", + "integrity": "sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", @@ -3539,7 +3598,7 @@ "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.6.1", + "pretty-format": "^29.6.2", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -3548,14 +3607,14 @@ } }, "node_modules/jest-mock": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz", - "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.2.tgz", + "integrity": "sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg==", "dev": true, "dependencies": { "@jest/types": "^29.6.1", "@types/node": "*", - "jest-util": "^29.6.1" + "jest-util": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3588,17 +3647,17 @@ } }, "node_modules/jest-resolve": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz", - "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.2.tgz", + "integrity": "sha512-G/iQUvZWI5e3SMFssc4ug4dH0aZiZpsDq9o1PtXTV1210Ztyb2+w+ZgQkB3iOiC5SmAEzJBOHWz6Hvrd+QnNPw==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.1", + "jest-haste-map": "^29.6.2", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.6.1", - "jest-validate": "^29.6.1", + "jest-util": "^29.6.2", + "jest-validate": "^29.6.2", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -3608,43 +3667,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz", - "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.2.tgz", + "integrity": "sha512-LGqjDWxg2fuQQm7ypDxduLu/m4+4Lb4gczc13v51VMZbVP5tSBILqVx8qfWcsdP8f0G7aIqByIALDB0R93yL+w==", "dev": true, "dependencies": { "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.6.1" + "jest-snapshot": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz", - "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.2.tgz", + "integrity": "sha512-wXOT/a0EspYgfMiYHxwGLPCZfC0c38MivAlb2lMEAlwHINKemrttu1uSbcGbfDV31sFaPWnWJPmb2qXM8pqZ4w==", "dev": true, "dependencies": { - "@jest/console": "^29.6.1", - "@jest/environment": "^29.6.1", - "@jest/test-result": "^29.6.1", - "@jest/transform": "^29.6.1", + "@jest/console": "^29.6.2", + "@jest/environment": "^29.6.2", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.6.1", - "jest-haste-map": "^29.6.1", - "jest-leak-detector": "^29.6.1", - "jest-message-util": "^29.6.1", - "jest-resolve": "^29.6.1", - "jest-runtime": "^29.6.1", - "jest-util": "^29.6.1", - "jest-watcher": "^29.6.1", - "jest-worker": "^29.6.1", + "jest-environment-node": "^29.6.2", + "jest-haste-map": "^29.6.2", + "jest-leak-detector": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-resolve": "^29.6.2", + "jest-runtime": "^29.6.2", + "jest-util": "^29.6.2", + "jest-watcher": "^29.6.2", + "jest-worker": "^29.6.2", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -3653,17 +3712,17 @@ } }, "node_modules/jest-runtime": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz", - "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.2.tgz", + "integrity": "sha512-2X9dqK768KufGJyIeLmIzToDmsN0m7Iek8QNxRSI/2+iPFYHF0jTwlO3ftn7gdKd98G/VQw9XJCk77rbTGZnJg==", "dev": true, "dependencies": { - "@jest/environment": "^29.6.1", - "@jest/fake-timers": "^29.6.1", - "@jest/globals": "^29.6.1", + "@jest/environment": "^29.6.2", + "@jest/fake-timers": "^29.6.2", + "@jest/globals": "^29.6.2", "@jest/source-map": "^29.6.0", - "@jest/test-result": "^29.6.1", - "@jest/transform": "^29.6.1", + "@jest/test-result": "^29.6.2", + "@jest/transform": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", "chalk": "^4.0.0", @@ -3671,13 +3730,13 @@ "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.6.1", - "jest-message-util": "^29.6.1", - "jest-mock": "^29.6.1", + "jest-haste-map": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-mock": "^29.6.2", "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.6.1", - "jest-snapshot": "^29.6.1", - "jest-util": "^29.6.1", + "jest-resolve": "^29.6.2", + "jest-snapshot": "^29.6.2", + "jest-util": "^29.6.2", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -3686,9 +3745,9 @@ } }, "node_modules/jest-snapshot": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz", - "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.2.tgz", + "integrity": "sha512-1OdjqvqmRdGNvWXr/YZHuyhh5DeaLp1p/F8Tht/MrMw4Kr1Uu/j4lRG+iKl1DAqUJDWxtQBMk41Lnf/JETYBRA==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", @@ -3696,21 +3755,20 @@ "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.6.1", - "@jest/transform": "^29.6.1", + "@jest/expect-utils": "^29.6.2", + "@jest/transform": "^29.6.2", "@jest/types": "^29.6.1", - "@types/prettier": "^2.1.5", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.6.1", + "expect": "^29.6.2", "graceful-fs": "^4.2.9", - "jest-diff": "^29.6.1", + "jest-diff": "^29.6.2", "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.6.1", - "jest-message-util": "^29.6.1", - "jest-util": "^29.6.1", + "jest-matcher-utils": "^29.6.2", + "jest-message-util": "^29.6.2", + "jest-util": "^29.6.2", "natural-compare": "^1.4.0", - "pretty-format": "^29.6.1", + "pretty-format": "^29.6.2", "semver": "^7.5.3" }, "engines": { @@ -3751,9 +3809,9 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", - "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.2.tgz", + "integrity": "sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==", "dev": true, "dependencies": { "@jest/types": "^29.6.1", @@ -3768,9 +3826,9 @@ } }, "node_modules/jest-validate": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz", - "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.2.tgz", + "integrity": "sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg==", "dev": true, "dependencies": { "@jest/types": "^29.6.1", @@ -3778,7 +3836,7 @@ "chalk": "^4.0.0", "jest-get-type": "^29.4.3", "leven": "^3.1.0", - "pretty-format": "^29.6.1" + "pretty-format": "^29.6.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3797,18 +3855,18 @@ } }, "node_modules/jest-watcher": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz", - "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.2.tgz", + "integrity": "sha512-GZitlqkMkhkefjfN/p3SJjrDaxPflqxEAv3/ik10OirZqJGYH5rPiIsgVcfof0Tdqg3shQGdEIxDBx+B4tuLzA==", "dev": true, "dependencies": { - "@jest/test-result": "^29.6.1", + "@jest/test-result": "^29.6.2", "@jest/types": "^29.6.1", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.6.1", + "jest-util": "^29.6.2", "string-length": "^4.0.1" }, "engines": { @@ -3816,13 +3874,13 @@ } }, "node_modules/jest-worker": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz", - "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.2.tgz", + "integrity": "sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.6.1", + "jest-util": "^29.6.2", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -3972,7 +4030,7 @@ } }, "node_modules/le-coffre-resources": { - "resolved": "git+ssh://git@github.com/smart-chain-fr/leCoffre-resources.git#e7916d516fe434c93ef13e765d8d63a7ce3c56b2", + "resolved": "git+ssh://git@github.com/smart-chain-fr/leCoffre-resources.git#e0b1ff55a860f624b7708d37f5bfe3072ef63e5f", "license": "MIT", "dependencies": { "class-transformer": "^0.5.1", @@ -3990,9 +4048,9 @@ } }, "node_modules/libphonenumber-js": { - "version": "1.10.38", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.38.tgz", - "integrity": "sha512-4NjVXVUmpZ9Zsqq6FXa2+MKI+KAI3tOqA0pxXgXGluhpj4ge5didmbWJpMBqGB3AVGv1SnEtKdGTbxjSEG1kCQ==" + "version": "1.10.41", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.41.tgz", + "integrity": "sha512-4rmmF4u4vD3eGNuuCGjCPwRwO+fIuu1WWcS7VwbPTiMFkJd8F02v8o5pY5tlYuMR+xOvJ88mtOHpkm0Tnu2LcQ==" }, "node_modules/lines-and-columns": { "version": "1.2.4", @@ -4050,9 +4108,9 @@ } }, "node_modules/luxon": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz", - "integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.0.tgz", + "integrity": "sha512-7eDo4Pt7aGhoCheGFIuq4Xa2fJm4ZpmldpGhjTYBNUYNCN6TIEP6v7chwwwt3KRp7YR+rghbfvjyo3V5y9hgBw==", "engines": { "node": ">=12" } @@ -4419,11 +4477,11 @@ } }, "node_modules/next": { - "version": "13.4.12", - "resolved": "https://registry.npmjs.org/next/-/next-13.4.12.tgz", - "integrity": "sha512-eHfnru9x6NRmTMcjQp6Nz0J4XH9OubmzOa7CkWL+AUrUxpibub3vWwttjduu9No16dug1kq04hiUUpo7J3m3Xw==", + "version": "13.4.16", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.16.tgz", + "integrity": "sha512-1xaA/5DrfpPu0eV31Iro7JfPeqO8uxQWb1zYNTe+KDKdzqkAGapLcDYHMLNKXKB7lHjZ7LfKUOf9dyuzcibrhA==", "dependencies": { - "@next/env": "13.4.12", + "@next/env": "13.4.16", "@swc/helpers": "0.5.1", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", @@ -4439,19 +4497,18 @@ "node": ">=16.8.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.4.12", - "@next/swc-darwin-x64": "13.4.12", - "@next/swc-linux-arm64-gnu": "13.4.12", - "@next/swc-linux-arm64-musl": "13.4.12", - "@next/swc-linux-x64-gnu": "13.4.12", - "@next/swc-linux-x64-musl": "13.4.12", - "@next/swc-win32-arm64-msvc": "13.4.12", - "@next/swc-win32-ia32-msvc": "13.4.12", - "@next/swc-win32-x64-msvc": "13.4.12" + "@next/swc-darwin-arm64": "13.4.16", + "@next/swc-darwin-x64": "13.4.16", + "@next/swc-linux-arm64-gnu": "13.4.16", + "@next/swc-linux-arm64-musl": "13.4.16", + "@next/swc-linux-x64-gnu": "13.4.16", + "@next/swc-linux-x64-musl": "13.4.16", + "@next/swc-win32-arm64-msvc": "13.4.16", + "@next/swc-win32-ia32-msvc": "13.4.16", + "@next/swc-win32-x64-msvc": "13.4.16" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "fibers": ">= 3.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -4460,9 +4517,6 @@ "@opentelemetry/api": { "optional": true }, - "fibers": { - "optional": true - }, "sass": { "optional": true } @@ -4884,9 +4938,9 @@ } }, "node_modules/pretty-format": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", - "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "version": "29.6.2", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", + "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.0", @@ -5104,12 +5158,12 @@ } }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -5879,9 +5933,9 @@ "dev": true }, "node_modules/validator": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", - "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", "engines": { "node": ">= 0.10" } diff --git a/package.json b/package.json index fd68c5be..02c81b78 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "cron": "^2.3.1", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.66", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.67", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", diff --git a/src/app/api/admin/UsersController.ts b/src/app/api/admin/UsersController.ts index 1c7c3251..cc4cde87 100644 --- a/src/app/api/admin/UsersController.ts +++ b/src/app/api/admin/UsersController.ts @@ -8,7 +8,6 @@ import { Prisma } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; import userHandler from "@App/middlewares/OfficeMembershipHandlers/UserHandler"; -import { validateOrReject } from "class-validator"; import roleHandler from "@App/middlewares/RolesHandler"; import RolesService from "@Services/admin/RolesService/RolesService"; import OfficeRolesService from "@Services/admin/OfficeRolesService/OfficeRolesService"; @@ -87,9 +86,6 @@ export default class UsersController extends ApiController { //init IUser resource with request body values const userEntity = User.hydrate(req.body); - //validate user - await validateOrReject(userEntity, { groups: ["updateUser"] }); - if(userEntity.role) { const role = await this.roleService.getByUid(userEntity.role.uid!); if(!role) { diff --git a/src/app/api/customer/FilesController.ts b/src/app/api/customer/FilesController.ts index 76dd93ee..f58b3944 100644 --- a/src/app/api/customer/FilesController.ts +++ b/src/app/api/customer/FilesController.ts @@ -135,9 +135,6 @@ export default class FilesController extends ApiController { //init File resource with request body values const fileEntity = File.hydrate(req.body); - //validate file - await validateOrReject(fileEntity, { groups: ["updateFile"] }); - //call service to get prisma entity const fileEntityUpdated: Files = await this.filesService.update(uid, fileEntity); diff --git a/src/app/api/super-admin/OfficesController.ts b/src/app/api/super-admin/OfficesController.ts index 3fb1bd00..f4edab79 100644 --- a/src/app/api/super-admin/OfficesController.ts +++ b/src/app/api/super-admin/OfficesController.ts @@ -94,8 +94,7 @@ export default class OfficesController extends ApiController { } //init IUser resource with request body values const officeEntity = OfficeResource.hydrate(req.body); - //validate user - await validateOrReject(officeEntity, { groups: ["updateOffice"] }); + //call service to get prisma entity const officeEntityUpdated = await this.officesService.update(uid, officeEntity); //Hydrate ressource with prisma entity diff --git a/src/app/api/super-admin/RulesController.ts b/src/app/api/super-admin/RulesController.ts index 025ec5c0..6f2f21a4 100644 --- a/src/app/api/super-admin/RulesController.ts +++ b/src/app/api/super-admin/RulesController.ts @@ -92,9 +92,6 @@ export default class RulesController extends ApiController { //init IRule resource with request body values const ruleEntity = Rule.hydrate(req.body); - //validate rule - await validateOrReject(ruleEntity, { groups: ["updateRule"] }); - //call service to get prisma entity const ruleEntityUpdated = await this.rulesService.update(ruleEntity); diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index 618c4728..fd135312 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -109,9 +109,6 @@ export default class UsersController extends ApiController { //init IUser resource with request body values const userEntity = User.hydrate(req.body); - //validate user - await validateOrReject(userEntity, { groups: ["updateUser"] }); - if(userEntity.role) { const role = await this.roleService.getByUid(userEntity.role.uid!); if(!role) { From 232633fc937d4626498013a84a4e0b30aa93fcb0 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Wed, 16 Aug 2023 16:27:52 +0200 Subject: [PATCH 131/134] add role and rules label --- package-lock.json | 4 +- package.json | 2 +- .../20230816144031_v22/migration.sql | 12 ++ src/common/databases/schema.prisma | 2 + src/common/databases/seeders/seeder.ts | 114 +++++++++--------- src/common/repositories/UsersRepository.ts | 1 + .../notary/RolesService/RolesService.ts | 1 - .../notary/RulesService/RulesService.ts | 1 - .../notary/UsersService/UsersService.ts | 20 +-- 9 files changed, 73 insertions(+), 84 deletions(-) create mode 100644 src/common/databases/migrations/20230816144031_v22/migration.sql diff --git a/package-lock.json b/package-lock.json index e6e9857e..d147eb2c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "cron": "^2.3.1", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.67", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.68", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", @@ -4030,7 +4030,7 @@ } }, "node_modules/le-coffre-resources": { - "resolved": "git+ssh://git@github.com/smart-chain-fr/leCoffre-resources.git#e0b1ff55a860f624b7708d37f5bfe3072ef63e5f", + "resolved": "git+ssh://git@github.com/smart-chain-fr/leCoffre-resources.git#ad0660abcb9de6ee7f396dce9b25fa7731a8e3b8", "license": "MIT", "dependencies": { "class-transformer": "^0.5.1", diff --git a/package.json b/package.json index 02c81b78..19fd003b 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "cron": "^2.3.1", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.67", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.68", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", diff --git a/src/common/databases/migrations/20230816144031_v22/migration.sql b/src/common/databases/migrations/20230816144031_v22/migration.sql new file mode 100644 index 00000000..59a287ba --- /dev/null +++ b/src/common/databases/migrations/20230816144031_v22/migration.sql @@ -0,0 +1,12 @@ +/* + Warnings: + + - Added the required column `label` to the `roles` table without a default value. This is not possible if the table is not empty. + - Added the required column `label` to the `rules` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "roles" ADD COLUMN "label" VARCHAR(255) NOT NULL; + +-- AlterTable +ALTER TABLE "rules" ADD COLUMN "label" VARCHAR(255) NOT NULL; diff --git a/src/common/databases/schema.prisma b/src/common/databases/schema.prisma index 98ff92ea..858709ed 100644 --- a/src/common/databases/schema.prisma +++ b/src/common/databases/schema.prisma @@ -241,6 +241,7 @@ model DeedTypes { model Roles { uid String @id @unique @default(uuid()) name String @db.VarChar(255) + label String @db.VarChar(255) created_at DateTime? @default(now()) updated_at DateTime? @updatedAt rules Rules[] @relation("RolesHasRules") @@ -265,6 +266,7 @@ model OfficeRoles { model Rules { uid String @id @unique @default(uuid()) name String @db.VarChar(255) + label String @db.VarChar(255) created_at DateTime? @default(now()) updated_at DateTime? @updatedAt role Roles[] @relation("RolesHasRules") diff --git a/src/common/databases/seeders/seeder.ts b/src/common/databases/seeders/seeder.ts index 700442cf..cfc8ccda 100644 --- a/src/common/databases/seeders/seeder.ts +++ b/src/common/databases/seeders/seeder.ts @@ -515,301 +515,289 @@ export default async function main() { const rules: Rule[] = [ { name: "GET users", + label: "Lecture des utilisateurs", created_at: new Date(), updated_at: new Date(), }, { name: "GET offices", + label: "Lecture des offices", created_at: new Date(), updated_at: new Date(), }, { name: "GET customers", + label: "Lecture des clients", created_at: new Date(), updated_at: new Date(), }, { name: "GET deeds", + label: "Lecture des actes", created_at: new Date(), updated_at: new Date(), }, { name: "GET deed-types", + label: "Lecture des types d'actes", created_at: new Date(), updated_at: new Date(), }, { name: "GET documents", + label: "Lecture des documents", created_at: new Date(), updated_at: new Date(), }, { name: "GET document-types", + label: "Lecture des types de documents", created_at: new Date(), updated_at: new Date(), }, { name: "GET files", + label: "Lecture des fichiers", created_at: new Date(), updated_at: new Date(), }, { name: "GET folders", + label: "Lecture des dossiers", created_at: new Date(), updated_at: new Date(), }, { name: "GET roles", + label: "Lecture utilisateurs", created_at: new Date(), updated_at: new Date(), }, { name: "GET rules", + label: "Lecture des droits", created_at: new Date(), updated_at: new Date(), }, { name: "GET office-roles", + label: "Lecture des rôles d'office", created_at: new Date(), updated_at: new Date(), }, { name: "PUT users", + label: "Modification des utilisateurs", created_at: new Date(), updated_at: new Date(), }, { name: "PUT offices", + label: "Modification des offices", created_at: new Date(), updated_at: new Date(), }, { name: "PUT customers", + label: "Modification des clients", created_at: new Date(), updated_at: new Date(), }, { name: "PUT deeds", + label: "Modification des actes", created_at: new Date(), updated_at: new Date(), }, { name: "PUT deed-types", + label: "Modification des types d'actes", created_at: new Date(), updated_at: new Date(), }, { name: "PUT documents", + label: "Modification des documents", created_at: new Date(), updated_at: new Date(), }, { name: "PUT document-types", + label: "Modification des types de documents", created_at: new Date(), updated_at: new Date(), }, { name: "PUT files", + label: "Modification des fichiers", created_at: new Date(), updated_at: new Date(), }, { name: "PUT folders", + label: "Modification des dossiers", created_at: new Date(), updated_at: new Date(), }, { name: "PUT roles", + label: "Modification des rôles", created_at: new Date(), updated_at: new Date(), }, { name: "PUT rules", + label: "Modification des droits", created_at: new Date(), updated_at: new Date(), }, { name: "PUT office-roles", + label: "Modification des rôles d'office", created_at: new Date(), updated_at: new Date(), }, { name: "POST users", + label: "Création des utilisateurs", created_at: new Date(), updated_at: new Date(), }, { name: "POST offices", + label: "Création des offices", created_at: new Date(), updated_at: new Date(), }, { name: "POST customers", + label: "Création des clients", created_at: new Date(), updated_at: new Date(), }, { name: "POST deeds", + label: "Création des actes", created_at: new Date(), updated_at: new Date(), }, { name: "POST deed-types", + label: "Création des types d'actes", created_at: new Date(), updated_at: new Date(), }, { name: "POST documents", + label: "Création des documents", created_at: new Date(), updated_at: new Date(), }, { name: "POST document-types", + label: "Création des types de documents", created_at: new Date(), updated_at: new Date(), }, { name: "POST files", + label: "Création des fichiers", created_at: new Date(), updated_at: new Date(), }, { name: "POST folders", + label: "Création des dossiers", created_at: new Date(), updated_at: new Date(), }, { name: "POST roles", + label: "Création des rôles", created_at: new Date(), updated_at: new Date(), }, { name: "POST rules", + label: "Création des droits", created_at: new Date(), updated_at: new Date(), }, { name: "POST office-roles", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST users", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST offices", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST customers", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST deeds", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST deed-types", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST documents", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST document-types", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST files", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST folders", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST roles", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST rules", - created_at: new Date(), - updated_at: new Date(), - }, - { - name: "POST office-roles", + label: "Création des rôles d'office", created_at: new Date(), updated_at: new Date(), }, { name: "DELETE users", + label: "Suppression des utilisateurs", created_at: new Date(), updated_at: new Date(), }, { name: "DELETE offices", + label: "Suppression des offices", created_at: new Date(), updated_at: new Date(), }, { name: "DELETE customers", + label: "Suppression des clients", created_at: new Date(), updated_at: new Date(), }, { name: "DELETE deeds", + label: "Suppression des actes", created_at: new Date(), updated_at: new Date(), }, { name: "DELETE deed-types", + label: "Suppression des types d'actes", created_at: new Date(), updated_at: new Date(), }, { name: "DELETE documents", + label: "Suppression des documents", created_at: new Date(), updated_at: new Date(), }, { name: "DELETE document-types", + label: "Suppression des types de documents", created_at: new Date(), updated_at: new Date(), }, { name: "DELETE files", + label: "Suppression des fichiers", created_at: new Date(), updated_at: new Date(), }, { name: "DELETE folders", + label: "Suppression des dossiers", created_at: new Date(), updated_at: new Date(), }, { name: "DELETE roles", + label: "Suppression des rôles", created_at: new Date(), updated_at: new Date(), }, { name: "DELETE rules", + label: "Suppression des droits", created_at: new Date(), updated_at: new Date(), }, { name: "DELETE office-roles", + label: "Suppression des rôles d'office", created_at: new Date(), updated_at: new Date(), }, @@ -818,24 +806,28 @@ export default async function main() { const roles: Role[] = [ { name: "super-admin", + label: "Super administrateur", created_at: new Date(), updated_at: new Date(), rules: rules, }, { name: "admin", + label: "Administrateur", created_at: new Date(), updated_at: new Date(), rules: rules.slice(0, 33), }, { name: "notary", + label: "Notaire", created_at: new Date(), updated_at: new Date(), rules: rules.slice(0, 22), }, { name: "default", + label: "Utilisateur", created_at: new Date(), updated_at: new Date(), rules: rules.slice(0, 11), @@ -1381,6 +1373,7 @@ export default async function main() { const ruleCreated = await prisma.rules.create({ data: { name: rule.name, + label: rule.label, }, }); rule.uid = ruleCreated.uid; @@ -1390,6 +1383,7 @@ export default async function main() { const roleCreated = await prisma.roles.create({ data: { name: role.name, + label: role.label, rules: { connect: role.rules?.map((rule) => ({ uid: rule.uid!, diff --git a/src/common/repositories/UsersRepository.ts b/src/common/repositories/UsersRepository.ts index 49673146..739aea8f 100644 --- a/src/common/repositories/UsersRepository.ts +++ b/src/common/repositories/UsersRepository.ts @@ -87,6 +87,7 @@ export default class UsersRepository extends BaseRepository { /** * @description : Update data from a user */ + public async update(uid: string, user: User): Promise { const updateArgs: Prisma.UsersUpdateArgs = { where: { diff --git a/src/services/notary/RolesService/RolesService.ts b/src/services/notary/RolesService/RolesService.ts index f59c26b1..6e652687 100644 --- a/src/services/notary/RolesService/RolesService.ts +++ b/src/services/notary/RolesService/RolesService.ts @@ -1,5 +1,4 @@ import BaseService from "@Services/BaseService"; -import "reflect-metadata"; import { Service } from "typedi"; import RolesRepository from "@Repositories/RolesRepository"; import { Prisma } from "@prisma/client"; diff --git a/src/services/notary/RulesService/RulesService.ts b/src/services/notary/RulesService/RulesService.ts index e52ad9bf..c59c9133 100644 --- a/src/services/notary/RulesService/RulesService.ts +++ b/src/services/notary/RulesService/RulesService.ts @@ -1,5 +1,4 @@ import BaseService from "@Services/BaseService"; -import "reflect-metadata"; import { Service } from "typedi"; import RulesRepository from "@Repositories/RulesRepository"; import { Prisma } from "@prisma/client"; diff --git a/src/services/notary/UsersService/UsersService.ts b/src/services/notary/UsersService/UsersService.ts index f6927c87..5efbfff9 100644 --- a/src/services/notary/UsersService/UsersService.ts +++ b/src/services/notary/UsersService/UsersService.ts @@ -1,9 +1,7 @@ import BaseService from "@Services/BaseService"; -import "reflect-metadata"; import { Service } from "typedi"; import UsersRepository from "@Repositories/UsersRepository"; -import User from "le-coffre-resources/dist/Notary"; -import { Prisma, Users } from "@prisma/client"; +import { Prisma } from "@prisma/client"; @Service() export default class UsersService extends BaseService { @@ -19,22 +17,6 @@ export default class UsersService extends BaseService { return this.userRepository.findMany(query); } - /** - * @description : Create a user - * @throws {Error} If user couldn't be created - */ - public create(userEntity: User): Promise { - return this.userRepository.create(userEntity); - } - - /** - * @description : Modify a user - * @throws {Error} If user modification failed - */ - public update(uid: string, userEntity: User): Promise { - return this.userRepository.update(uid, userEntity); - } - /** * @description : Get a user by uid * @throws {Error} If user cannot be get by uid From 527a4fd837afba729a62fa54d780bc9821fe0481 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Thu, 17 Aug 2023 11:28:30 +0200 Subject: [PATCH 132/134] refacto rules assignment in jwt --- src/common/databases/seeders/seeder.ts | 7 ------ src/common/repositories/RolesRepository.ts | 2 ++ src/common/repositories/RulesRepository.ts | 2 ++ .../common/AuthService/AuthService.ts | 25 ++++++++----------- src/test/config/Init.ts | 3 +++ 5 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/common/databases/seeders/seeder.ts b/src/common/databases/seeders/seeder.ts index cfc8ccda..0e812e5c 100644 --- a/src/common/databases/seeders/seeder.ts +++ b/src/common/databases/seeders/seeder.ts @@ -835,13 +835,6 @@ export default async function main() { ]; const officeRoles: OfficeRole[] = [ - { - name: "admin", - created_at: new Date(), - updated_at: new Date(), - office: offices[0]!, - rules: rules.slice(0, 40), - }, { name: "Notaire", created_at: new Date(), diff --git a/src/common/repositories/RolesRepository.ts b/src/common/repositories/RolesRepository.ts index 20d203c7..5467f0a0 100644 --- a/src/common/repositories/RolesRepository.ts +++ b/src/common/repositories/RolesRepository.ts @@ -31,6 +31,7 @@ export default class RolesRepository extends BaseRepository { const createArgs: Prisma.RolesCreateArgs = { data: { name: role.name, + label: role.label, rules: { connect: role.rules?.map((rule) => ({ uid: rule.uid!, @@ -52,6 +53,7 @@ export default class RolesRepository extends BaseRepository { }, data: { name: role.name, + label: role.label, rules: { set: role.rules?.map((rule) => ({ uid: rule.uid!, diff --git a/src/common/repositories/RulesRepository.ts b/src/common/repositories/RulesRepository.ts index 7781290b..281e505b 100644 --- a/src/common/repositories/RulesRepository.ts +++ b/src/common/repositories/RulesRepository.ts @@ -31,6 +31,7 @@ export default class RulesRepository extends BaseRepository { const createArgs: Prisma.RulesCreateArgs = { data: { name: rule.name, + label: rule.label }, }; @@ -47,6 +48,7 @@ export default class RulesRepository extends BaseRepository { }, data: { name: rule.name, + label: rule.label }, }; diff --git a/src/services/common/AuthService/AuthService.ts b/src/services/common/AuthService/AuthService.ts index 0a751e21..4410cd35 100644 --- a/src/services/common/AuthService/AuthService.ts +++ b/src/services/common/AuthService/AuthService.ts @@ -12,7 +12,7 @@ enum PROVIDER_OPENID { } interface ICustomerJwtPayload { - userId: string; + customerId: string; email: string; } @@ -46,7 +46,7 @@ export default class AuthService extends BaseService { } return { - userId: customer.uid, + customerId: customer.uid, email: contact.email, }; } @@ -57,22 +57,19 @@ export default class AuthService extends BaseService { if (!user) return null; const rules: string[] = []; - if (user.office_role) { - user.office_role.rules.forEach((rule) => { - rules.push(rule.name); - }); - return { - userId: user.uid, - openId: { providerName: providerName, userId: user.idNot }, - office_Id: user.office_membership.uid, - role: user.role.name, - rules: rules, - }; - } user.role.rules.forEach((rule) => { rules.push(rule.name); }); + + if (user.office_role) { + user.office_role.rules.forEach((rule) => { + if(!rules.includes(rule.name)) { + rules.push(rule.name); + } + }); + } + return { userId: user.uid, openId: { providerName: providerName, userId: user.idNot }, diff --git a/src/test/config/Init.ts b/src/test/config/Init.ts index 74721622..c3921d70 100644 --- a/src/test/config/Init.ts +++ b/src/test/config/Init.ts @@ -95,6 +95,7 @@ export const initRules = (rule: Rule): Promise => { return prisma.rules.create({ data: { name: rule.name, + label: rule.label, }, }); }; @@ -103,6 +104,7 @@ export const initRoles = (role: Role): Promise => { return prisma.roles.create({ data: { name: role.name, + label: role.label, }, }); }; @@ -154,6 +156,7 @@ export const initUsers = (user: User): Promise => { }, create: { name: user.role!.name, + label: user.role!.label }, }, }, From f1fc9deae7f9c4a68256ae8415f9ba8387374767 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Thu, 17 Aug 2023 13:39:08 +0200 Subject: [PATCH 133/134] update resources version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 19fd003b..fd95302f 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "cron": "^2.3.1", "express": "^4.18.2", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.68", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.69", "module-alias": "^2.2.2", "multer": "^1.4.5-lts.1", "next": "^13.1.5", From 12ce8ddff4f66e47646d97a034a0fb783c5518f9 Mon Sep 17 00:00:00 2001 From: OxSaitama Date: Thu, 17 Aug 2023 13:44:50 +0200 Subject: [PATCH 134/134] fix where query for documents --- src/app/api/customer/DocumentsController.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/app/api/customer/DocumentsController.ts b/src/app/api/customer/DocumentsController.ts index fdfb16f2..a7f2b1a7 100644 --- a/src/app/api/customer/DocumentsController.ts +++ b/src/app/api/customer/DocumentsController.ts @@ -28,12 +28,9 @@ export default class DocumentsController extends ApiController { query = JSON.parse(req.query["q"] as string); } - - //This was useless and was causing a bug - - // const customerId: string = req.body.user.customerId; - // const customerWhereInput: Prisma.DocumentsWhereInput ={ depositor: { uid: customerId } }; - // query.where = customerWhereInput; + const customerId: string = req.body.user.customerId; + const customerWhereInput: Prisma.DocumentsWhereInput ={ depositor: { uid: customerId } }; + query.where = customerWhereInput; //call service to get prisma entity