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  }