github.com/benoitkugler/goacve@v0.0.0-20201217100549-151ce6e55dc8/server/documents/views.go (about) 1 package documents 2 3 import ( 4 "errors" 5 "mime" 6 7 rd "github.com/benoitkugler/goACVE/server/core/rawdata" 8 "github.com/benoitkugler/goACVE/server/shared" 9 "github.com/labstack/echo" 10 ) 11 12 // SertMiniature peut recevoir deux types pour `crypted-id`: 13 // - l'id d'un document déjà généré 14 // - le chemin vers un document d'un camp 15 func (ct Controller) SertMiniature(c echo.Context) (err error) { 16 cryptedId := c.QueryParam("crypted-id") 17 mode := c.QueryParam("mode") 18 var min []byte 19 switch mode { 20 case DocumentAbsolu: 21 min, _, err = ct.loadDocument(cryptedId, true) 22 case DocumentRelatif: 23 min, _, err = ct.genereDocument(cryptedId, true) 24 default: 25 err = errors.New("invalid miniature mode") 26 } 27 if err != nil { 28 return c.File(pathMiniatureError) 29 } 30 return c.Blob(200, mime.TypeByExtension(".png"), min) 31 } 32 33 // SertDocument peut recevoir deux types pour `crypted-id`: 34 // - l'id d'un document déjà généré 35 // - le chemin vers un document d'un camp 36 func (ct Controller) SertDocument(c echo.Context) (err error) { 37 cryptedId := c.QueryParam("crypted-id") 38 noAttachment := c.QueryParam("no-attachment") != "" 39 mode := c.QueryParam("mode") 40 var ( 41 doc []byte 42 filename string 43 ) 44 switch mode { 45 case DocumentAbsolu: 46 doc, filename, err = ct.loadDocument(cryptedId, false) 47 case DocumentRelatif: 48 doc, filename, err = ct.genereDocument(cryptedId, false) 49 default: 50 err = errors.New("invalid document mode") 51 } 52 if err != nil { 53 return shared.RedirectError(c, err) 54 } 55 return Attachment(c, filename, doc, !noAttachment) 56 } 57 58 // HandleUpload enregistre le contenu d'un document déjà référencé 59 // La sécurité est assurée par le cryptage des Ids. 60 func (ct Controller) HandleUpload(c echo.Context) error { 61 ci := c.FormValue("crypted-id") 62 id, err := shared.DecodeID(ct.Signing, ci, shared.OrDocument) 63 if err != nil { 64 return shared.FormatErr("Le document n'a pu être identifié.", err) 65 } 66 67 if err = ct.checkModifDoc(id); err != nil { 68 return err 69 } 70 71 fileHeader, err := c.FormFile("file") 72 if err != nil { 73 return shared.FormatErr("Fichier manquant.", err) 74 } 75 doc, err := ct.uploadDocument(fileHeader, id) 76 if err != nil { 77 return shared.FormatErr("Une erreur est survenue pendant l'enregistrement du document.", err) 78 } 79 out, err := PublieDocument(ct.Signing, c.Request().Host, doc) 80 if err != nil { 81 return err 82 } 83 return c.JSON(200, out) 84 } 85 86 // HandleDelete supprime un document déjà référencé 87 // La sécurité est assurée par le cryptage des Ids. 88 func (ct Controller) HandleDelete(c echo.Context) error { 89 id, err := shared.DecodeID(ct.Signing, c.QueryParam("id-crypted"), shared.OrDocument) 90 if err != nil { 91 return shared.FormatErr("Le document n'a pu être identifié.", err) 92 } 93 94 if err = ct.checkModifDoc(id); err != nil { 95 return err 96 } 97 98 tx, err := ct.DB.Begin() 99 if err != nil { 100 return err 101 } 102 103 // si le document est à remplir, on le délie la contrainte 104 _, err = tx.Exec("UPDATE contraintes SET id_document = NULL WHERE id_document = $1", id) 105 if err != nil { 106 return shared.Rollback(tx, err) 107 } 108 109 // les liens sont supprimés par cascade 110 111 _, err = rd.DeleteDocumentById(tx, id) 112 if err != nil { 113 return shared.Rollback(tx, err) 114 } 115 if err = tx.Commit(); err != nil { 116 return err 117 } 118 return c.NoContent(200) 119 }