fix: update voki requests/responses à v3

This commit is contained in:
Victor Lacasse-Beaudoin 2024-08-21 13:39:03 -04:00
parent b4529e8102
commit 7bc4eed8ae
20 changed files with 169 additions and 175 deletions

View file

@ -4,7 +4,7 @@ import (
"net/http"
"sort"
"codeberg.org/vlbeaudoin/pave"
"codeberg.org/vlbeaudoin/pave/v2"
"git.agecem.com/agecem/agecem-org/config"
"git.agecem.com/agecem/agecem-org/media"
"github.com/labstack/echo/v4"

View file

@ -4,6 +4,7 @@ import (
"context"
"net/http"
"codeberg.org/vlbeaudoin/voki/v3"
"git.agecem.com/agecem/agecem-org/apirequest"
"git.agecem.com/agecem/agecem-org/apiresponse"
"github.com/labstack/echo/v4"
@ -17,9 +18,9 @@ func (h *V1Handler) V1BucketsGET(c echo.Context) error {
if !request.Complete() {
response.Message = "Incomplete V1BucketsGET request received"
response.StatusCode = http.StatusBadRequest
response.SetStatusCode(http.StatusBadRequest)
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
var buckets = make(map[string]string)
@ -27,11 +28,10 @@ func (h *V1Handler) V1BucketsGET(c echo.Context) error {
for bucket_name, bucket_display_name := range h.Config.Server.Documents.Buckets {
exists, err := h.MediaClient.MinioClient.BucketExists(context.Background(), bucket_name)
if err != nil {
response.StatusCode = http.StatusInternalServerError
response.Message = "Error during minio#BucketExists"
// response.Error = err.Error()
response.SetStatusCode(http.StatusInternalServerError)
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
if exists {
@ -39,11 +39,11 @@ func (h *V1Handler) V1BucketsGET(c echo.Context) error {
}
}
response.StatusCode = http.StatusOK
response.SetStatusCode(http.StatusOK)
response.Message = "Buckets list successful"
response.Data.Buckets = buckets
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
func (h *V1Handler) V1BucketGET(c echo.Context) error {
@ -54,9 +54,9 @@ func (h *V1Handler) V1BucketGET(c echo.Context) error {
if !request.Complete() {
response.Message = "Incomplete V1BucketGET request received"
response.StatusCode = http.StatusBadRequest
response.SetStatusCode(http.StatusBadRequest)
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
allowed := false
@ -67,7 +67,8 @@ func (h *V1Handler) V1BucketGET(c echo.Context) error {
}
if !allowed {
return c.JSON(apiresponse.NotFoundResponse())
response := voki.ResponseNotFound{}
return c.JSON(response.StatusCode(), response)
}
ctx, cancel := context.WithCancel(context.Background())
@ -76,33 +77,34 @@ func (h *V1Handler) V1BucketGET(c echo.Context) error {
exists, err := h.MediaClient.MinioClient.BucketExists(ctx, request.Params.Bucket)
if err != nil {
response.StatusCode = http.StatusInternalServerError
response.Message = "Error during minio#BucketExists"
response.SetStatusCode(http.StatusInternalServerError)
response.Error = err.Error()
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
if !exists {
return c.JSON(apiresponse.NotFoundResponse())
response := voki.ResponseNotFound{}
return c.JSON(response.StatusCode(), response)
}
objectCh := h.MediaClient.MinioClient.ListObjects(ctx, request.Params.Bucket, minio.ListObjectsOptions{})
for object := range objectCh {
if object.Err != nil {
response.StatusCode = http.StatusInternalServerError
response.Message = "Error during minio#ListObjects"
response.SetStatusCode(http.StatusInternalServerError)
//TODO make sure this is safe
//response.Error = object.Err.Error()
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
response.Data.Keys = append(response.Data.Keys, object.Key)
}
response.StatusCode = http.StatusOK
response.Message = "V1BucketRead ok"
response.SetStatusCode(http.StatusOK)
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}

View file

@ -5,6 +5,7 @@ import (
"fmt"
"net/http"
"codeberg.org/vlbeaudoin/voki/v3"
"git.agecem.com/agecem/agecem-org/apirequest"
"git.agecem.com/agecem/agecem-org/apiresponse"
"github.com/labstack/echo/v4"
@ -34,28 +35,29 @@ func (h *V1Handler) V1DocumentsPOST(c echo.Context) (err error) {
}
if !allowed {
return c.JSON(apiresponse.NotFoundResponse())
response := voki.ResponseNotFound{}
return c.JSON(response.StatusCode(), response)
}
form, err := c.MultipartForm()
if err != nil {
response.Message = fmt.Sprintf("Téléversement invalide: %s", err)
response.StatusCode = http.StatusBadRequest
response.SetStatusCode(http.StatusBadRequest)
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
if form == nil {
response.Message = "MultipartForm pointe vers une addresse mémoire nil"
response.StatusCode = http.StatusBadRequest
response.SetStatusCode(http.StatusBadRequest)
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
if len(form.File) == 0 {
response.Message = "Veuillez sélectionner au moins 1 document à téléverser"
response.StatusCode = http.StatusBadRequest
response.SetStatusCode(http.StatusBadRequest)
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
for inputName, inputFileHeaders := range form.File {
@ -66,21 +68,23 @@ func (h *V1Handler) V1DocumentsPOST(c echo.Context) (err error) {
if request.Data.Documents == nil {
response.Message = "Impossible d'obtenir les documents depuis le formulaire"
response.StatusCode = http.StatusBadRequest
response.SetStatusCode(http.StatusBadRequest)
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
if !request.Complete() {
response.Message = "Requête V1DocumentsPOST incomplète reçue"
response.StatusCode = http.StatusBadRequest
response.SetStatusCode(http.StatusBadRequest)
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
response.StatusCode, response.Message = h.MediaClient.UploadFormFiles(request.Params.Bucket, request.Data.Documents)
var code int
code, response.Message = h.MediaClient.UploadFormFiles(request.Params.Bucket, request.Data.Documents)
response.SetStatusCode(code)
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
// V1DocumentPOST permet d'ajouter un object dans un bucket, par multipart/form-data
@ -92,11 +96,11 @@ func (h *V1Handler) V1DocumentPOST(c echo.Context) (err error) {
request.Data.Document, err = c.FormFile("document")
if err != nil {
response.StatusCode = http.StatusBadRequest
response.SetStatusCode(http.StatusBadRequest)
response.Message = "Error during HandleV1DocumentCreate's echo#Context.FormFile"
response.Error = err.Error()
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
allowed := false
@ -107,14 +111,15 @@ func (h *V1Handler) V1DocumentPOST(c echo.Context) (err error) {
}
if !allowed {
return c.JSON(apiresponse.NotFoundResponse())
response := voki.ResponseNotFound{}
return c.JSON(response.StatusCode(), response)
}
if !request.Complete() {
response.Message = "Incomplete V1DocumentPOST request received"
response.StatusCode = http.StatusBadRequest
response.SetStatusCode(http.StatusBadRequest)
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
ctx, cancel := context.WithCancel(context.Background())
@ -123,11 +128,11 @@ func (h *V1Handler) V1DocumentPOST(c echo.Context) (err error) {
src, err := request.Data.Document.Open()
if err != nil {
response.StatusCode = http.StatusBadRequest
response.SetStatusCode(http.StatusBadRequest)
response.Message = "Error during form_file.Open()"
response.Error = err.Error()
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
defer src.Close()
@ -135,20 +140,20 @@ func (h *V1Handler) V1DocumentPOST(c echo.Context) (err error) {
ContentType: request.Data.Document.Header.Get("Content-Type"),
})
if err != nil {
response.StatusCode = http.StatusInternalServerError
response.SetStatusCode(http.StatusInternalServerError)
response.Message = "Error during minio#PutObject"
//response.Error = err.Error()
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
response.StatusCode = http.StatusOK
response.SetStatusCode(http.StatusOK)
response.Message = "ok"
response.Data.Bucket = info.Bucket
response.Data.Key = info.Key
response.Data.Size = info.Size
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
// V1DocumentGET permet de lire le contenu d'un fichier et protentiellement de le télécharger
@ -164,7 +169,8 @@ func (h *V1Handler) V1DocumentGET(c echo.Context) error {
}
if !allowed {
return c.JSON(apiresponse.NotFoundResponse())
response := voki.ResponseNotFound{}
return c.JSON(response.StatusCode(), response)
}
ctx, cancel := context.WithCancel(context.Background())
@ -177,7 +183,8 @@ func (h *V1Handler) V1DocumentGET(c echo.Context) error {
}
if !bucket_exists {
return c.JSON(apiresponse.NotFoundResponse())
response := voki.ResponseNotFound{}
return c.JSON(response.StatusCode(), response)
}
document_info, err := h.MediaClient.MinioClient.StatObject(ctx, bucket, document, minio.StatObjectOptions{})
@ -185,7 +192,8 @@ func (h *V1Handler) V1DocumentGET(c echo.Context) error {
if err != nil {
if err.Error() == "The specified key does not exist." {
return c.JSON(apiresponse.NotFoundResponse())
response := voki.ResponseNotFound{}
return c.JSON(response.StatusCode(), response)
}
return c.JSON(http.StatusInternalServerError, map[string]interface{}{
@ -223,14 +231,15 @@ func (h *V1Handler) V1DocumentDELETE(c echo.Context) error {
}
if !allowed {
return c.JSON(apiresponse.NotFoundResponse())
response := voki.ResponseNotFound{}
return c.JSON(response.StatusCode(), response)
}
if !request.Complete() {
response.Message = "Incomplete V1DocumentDELETE request received"
response.StatusCode = http.StatusBadRequest
response.SetStatusCode(http.StatusBadRequest)
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
ctx, cancel := context.WithCancel(context.Background())
@ -243,21 +252,23 @@ func (h *V1Handler) V1DocumentDELETE(c echo.Context) error {
}
if !bucket_exists {
return c.JSON(apiresponse.NotFoundResponse())
response := voki.ResponseNotFound{}
return c.JSON(response.StatusCode(), response)
}
document_info, err := h.MediaClient.MinioClient.StatObject(ctx, request.Params.Bucket, request.Params.Document, minio.StatObjectOptions{})
if err != nil {
if err.Error() == "The specified key does not exist." {
return c.JSON(apiresponse.NotFoundResponse())
response := voki.ResponseNotFound{}
return c.JSON(response.StatusCode(), response)
}
//response.Error = err.Error()
response.Message = "Error during minio#StatObject"
response.StatusCode = http.StatusInternalServerError
response.SetStatusCode(http.StatusInternalServerError)
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
//TODO Add error validation
@ -267,15 +278,15 @@ func (h *V1Handler) V1DocumentDELETE(c echo.Context) error {
if err != nil {
//response.Error = err.Error()
response.Message = "Error during minio#RemoveObject"
response.StatusCode = http.StatusInternalServerError
response.SetStatusCode(http.StatusInternalServerError)
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
response.Message = "Document deleted"
response.StatusCode = http.StatusOK
response.SetStatusCode(http.StatusOK)
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
// V1DocumentKeyPUT
@ -289,25 +300,25 @@ func (h *V1Handler) V1DocumentKeyPUT(c echo.Context) (err error) {
var newKey string
err = c.Bind(&newKey)
if err != nil {
response.StatusCode = http.StatusBadRequest
response.SetStatusCode(http.StatusBadRequest)
response.Message = err.Error()
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
request, err = apirequest.NewV1DocumentKeyPUT(bucket, document, newKey)
if err != nil {
response.StatusCode = http.StatusBadRequest
response.SetStatusCode(http.StatusBadRequest)
response.Message = err.Error()
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
if !request.Complete() {
response.StatusCode = http.StatusBadRequest
response.SetStatusCode(http.StatusBadRequest)
response.Message = "Incomplete V1DocumentKeyPUT request received"
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
var allowed bool
@ -318,7 +329,8 @@ func (h *V1Handler) V1DocumentKeyPUT(c echo.Context) (err error) {
}
if !allowed {
return c.JSON(apiresponse.NotFoundResponse())
response := voki.ResponseNotFound{}
return c.JSON(response.StatusCode(), response)
}
ctx, cancel := context.WithCancel(context.Background())
@ -330,7 +342,8 @@ func (h *V1Handler) V1DocumentKeyPUT(c echo.Context) (err error) {
}
if !bucketExists {
return c.JSON(apiresponse.NotFoundResponse())
response := voki.ResponseNotFound{}
return c.JSON(response.StatusCode(), response)
}
// Check source object exists
@ -338,13 +351,14 @@ func (h *V1Handler) V1DocumentKeyPUT(c echo.Context) (err error) {
if _, err := h.MediaClient.MinioClient.StatObject(ctx, request.Params.Bucket, request.Params.Document, minio.StatObjectOptions{}); err != nil {
if err.Error() == "The specified key does not exist." {
return c.JSON(apiresponse.NotFoundResponse())
response := voki.ResponseNotFound{}
return c.JSON(response.StatusCode(), response)
}
response.Message = fmt.Sprintf("Could not obtain information on %s/%s", request.Params.Bucket, request.Params.Document)
response.StatusCode = http.StatusInternalServerError
response.SetStatusCode(http.StatusInternalServerError)
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
// Copy object to newKey
@ -353,34 +367,34 @@ func (h *V1Handler) V1DocumentKeyPUT(c echo.Context) (err error) {
minio.CopyDestOptions{Bucket: request.Params.Bucket, Object: request.Data.NewKey},
minio.CopySrcOptions{Bucket: request.Params.Bucket, Object: request.Params.Document},
); err != nil {
response.StatusCode = http.StatusInternalServerError
response.SetStatusCode(http.StatusInternalServerError)
response.Message = "Impossible de copier un document pour le renommer"
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
// Verify copy was successful
if _, err := h.MediaClient.MinioClient.StatObject(ctx,
request.Params.Bucket, request.Data.NewKey, minio.GetObjectOptions{}); err != nil {
response.StatusCode = http.StatusInternalServerError
response.SetStatusCode(http.StatusInternalServerError)
response.Message = "Copie de document ne semble pas avoir fonctionnée"
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
// Delete old file
if err := h.MediaClient.MinioClient.RemoveObject(ctx,
request.Params.Bucket, request.Params.Document, minio.RemoveObjectOptions{}); err != nil {
response.StatusCode = http.StatusInternalServerError
response.SetStatusCode(http.StatusInternalServerError)
response.Message = "Erreur pendant tentative de supprimer document source"
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
//TODO cleanup
// Return result
response.StatusCode = http.StatusOK
response.SetStatusCode(http.StatusOK)
response.Message = "Document renommé avec succès"
response.Data.Bucket = request.Params.Bucket
response.Data.Key = request.Data.NewKey
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}

View file

@ -15,11 +15,11 @@ func (h *V1Handler) V1SeedPOST(c echo.Context) error {
new_buckets, err := h.MediaClient.Seed()
response.Data.Buckets = new_buckets
if err != nil {
response.StatusCode = http.StatusInternalServerError
response.SetStatusCode(http.StatusInternalServerError)
response.Message = "Error during mediaClient.Seed()"
response.Error = err.Error()
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
if len(new_buckets) == 0 {
@ -29,7 +29,7 @@ func (h *V1Handler) V1SeedPOST(c echo.Context) error {
response.Message = "Buckets successfully created"
}
response.StatusCode = http.StatusOK
response.SetStatusCode(http.StatusOK)
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}

View file

@ -18,9 +18,9 @@ func (h *V1Handler) V1SpecGET(c echo.Context) error {
if !request.Complete() {
response.Message = "Incomplete V1SpecGET request received"
response.StatusCode = http.StatusBadRequest
response.SetStatusCode(http.StatusBadRequest)
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}
response.Data.Spec = fmt.Sprintf("# pave spec for agecem-org %s\n", version.Version())
@ -30,7 +30,7 @@ func (h *V1Handler) V1SpecGET(c echo.Context) error {
}
response.Message = "ok"
response.StatusCode = http.StatusOK
response.SetStatusCode(http.StatusOK)
return c.JSON(response.StatusCode, response)
return c.JSON(response.StatusCode(), response)
}