diff --git a/apihandler/document.go b/apihandler/document.go index 284add4..b7fecd0 100644 --- a/apihandler/document.go +++ b/apihandler/document.go @@ -285,7 +285,15 @@ func (h *V1Handler) V1DocumentKeyPUT(c echo.Context) (err error) { bucket := c.Param("bucket") document := c.Param("document") - newKey := c.Bind( + + var newKey string + err = c.Bind(&newKey) + if err != nil { + response.StatusCode = http.StatusBadRequest + response.Message = err.Error() + + return c.JSON(response.StatusCode, response) + } request, err = apirequest.NewV1DocumentKeyPUT(bucket, document, newKey) if err != nil { @@ -316,7 +324,7 @@ func (h *V1Handler) V1DocumentKeyPUT(c echo.Context) (err error) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - bucketExists, err := h.MediaClient.MinioClient.BucketExists(ctx, bucket) + bucketExists, err := h.MediaClient.MinioClient.BucketExists(ctx, request.Params.Bucket) if err != nil { return c.JSON(http.StatusInternalServerError, "Could not validate bucket exists") } @@ -325,33 +333,54 @@ func (h *V1Handler) V1DocumentKeyPUT(c echo.Context) (err error) { return c.JSON(apiresponse.NotFoundResponse()) } - if _, err := h.MediaClient.MinioClient.StatObject(ctx, bucket, document, minio.StatObjectOptions{}); err != nil { + // Check source object exists + + 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.Message = fmt.Sprintf("Could not obtain information on %s/%s", bucket, document) + response.Message = fmt.Sprintf("Could not obtain information on %s/%s", request.Params.Bucket, request.Params.Document) response.StatusCode = http.StatusInternalServerError return c.JSON(response.StatusCode, response) } + // Copy object to newKey + if _, err := h.MediaClient.MinioClient.CopyObject(ctx, - minio.CopyDestOptions{Bucket: bucket, Object: newKey}, - minio.CopySrcOptions{Bucket: bucket, Object: document}, + 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.Message = "Impossible de copier un document pour le renommer" return c.JSON(response.StatusCode, response) } - //TODO verify copy was successful + // 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.Message = "Copie de document ne semble pas avoir fonctionnée" + return c.JSON(response.StatusCode, response) + } - //TODO delete old file + // 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.Message = "Erreur pendant tentative de supprimer document source" + return c.JSON(response.StatusCode, response) + } //TODO cleanup - //TODO return result + // Return result + response.StatusCode = 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) } diff --git a/cmd/server.go b/cmd/server.go index 1028f89..b528664 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -226,7 +226,7 @@ func RunServer() { if err := pave.EchoRegister[ apirequest.V1DocumentKeyPUT, - apiresponse.V1DocumentKeyPUT](groupV1, &p, "/v1", http.MethodPut, "/:bucket/:document", "Renommer un document", "V1DocumentKeyPUT", v1Handler.V1DocumentKeyPUT); err != nil { + apiresponse.V1DocumentKeyPUT](groupV1, &p, "/v1", http.MethodPut, "/bucket/:bucket/:document/key", "Renommer un document", "V1DocumentKeyPUT", v1Handler.V1DocumentKeyPUT); err != nil { log.Fatal(err) }