github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/documents/checks.go (about) 1 package documents 2 3 import ( 4 "bytes" 5 "database/sql" 6 "errors" 7 8 rd "github.com/benoitkugler/goACVE/server/core/rawdata" 9 "github.com/benoitkugler/goACVE/server/shared" 10 ) 11 12 func (ct Controller) checkModifDoc(idDoc int64) error { 13 if err := ct.checkDocumentAide(idDoc); err != nil { 14 return err 15 } 16 if err := ct.checkLettre(idDoc); err != nil { 17 return err 18 } 19 return ct.checkContrainteBuiltin(idDoc) 20 } 21 22 // assure que l'aide sous-jacente est encore non validée 23 func (ct Controller) checkDocumentAide(idDoc int64) error { 24 row := ct.DB.QueryRow(`SELECT aides.* FROM aides 25 JOIN document_aides ON document_aides.id_aide = aides.id 26 WHERE document_aides.id_document = $1`, idDoc) 27 aide, err := rd.ScanAide(row) 28 if err == sql.ErrNoRows { 29 return nil // le document n'est pas lié à une aide 30 } else if err != nil { 31 return shared.FormatErr("La provenance du document n'a pu être vérifiée.", err) 32 } 33 if aide.Valide { 34 return errors.New("L'aide est déjà validée. La modification par l'espace personnel n'est plus possible.") 35 } 36 return nil 37 } 38 39 // vérifie que le document n'est pas un document (à remplir) 40 // d'une contrainte 'builtin' 41 func (ct Controller) checkContrainteBuiltin(idDoc int64) error { 42 rows, err := ct.DB.Query("SELECT * FROM contraintes WHERE id_document = $1 AND builtin <> ''", idDoc) 43 if err != nil { 44 return shared.FormatErr("La provenance du document n'a pu être vérifiée.", err) 45 } 46 contraintes, err := rd.ScanContraintes(rows) 47 if err != nil { 48 return shared.FormatErr("La provenance du document n'a pu être vérifiée.", err) 49 } 50 if len(contraintes) > 0 { 51 return errors.New("Le document est une pièce à remplir d'une contrainte universelle.") 52 } 53 return nil 54 } 55 56 // vérifie que le document n'est pas une lettre de camp 57 // (les lettres de camp sont générés automatiquement) 58 func (ct Controller) checkLettre(idDoc int64) error { 59 docCamp, found, err := rd.SelectDocumentCampByIdDocument(ct.DB, idDoc) 60 if err != nil { 61 return shared.FormatErr("La provenance du document n'a pu être vérifiée.", err) 62 } else if !found { 63 return nil // le document n'est pas lié à un camp 64 } 65 if docCamp.IsLettre { 66 return errors.New("Le document est une lettre de séjour.") 67 } 68 return nil 69 } 70 71 // vérifie que `contenu` n'est pas déjà présent chez la personne pour la contrainte 72 // (ignore les autres documents) 73 func checkDoublons(db rd.DB, newContenu []byte, idDocument int64) error { 74 lien, found, err := rd.SelectDocumentPersonneByIdDocument(db, idDocument) 75 if err != nil { 76 return shared.FormatErr("La provenance du document n'a pu être vérifiée.", err) 77 } 78 if !found { 79 return nil // pas concerné 80 } 81 // on charge les documents déjà présents 82 rows, err := db.Query(`SELECT contenu_documents.* FROM contenu_documents 83 JOIN document_personnes ON document_personnes.id_document = contenu_documents.id_document 84 WHERE document_personnes.id_personne = $1 AND document_personnes.id_contrainte = $2`, lien.IdPersonne, lien.IdContrainte) 85 if err != nil { 86 return shared.FormatErr("Les documents similaires n'ont pas pu être chargés.", err) 87 } 88 contenus, err := rd.ScanContenuDocuments(rows) 89 if err != nil { 90 return shared.FormatErr("Les documents similaires n'ont pas pu être chargés.", err) 91 } 92 for _, contenu := range contenus { 93 if contenu.IdDocument == idDocument { // ignore soi-même 94 continue 95 } 96 if bytes.Equal(contenu.Contenu, newContenu) { 97 return shared.FormatErr("Doublon", errors.New("Le même document est déjà présent pour cette personne et cette catégorie.")) 98 } 99 } 100 return nil 101 }