From 789af541210d2812f7ff0daa7e00b6df681554dc Mon Sep 17 00:00:00 2001 From: Victor Lacasse-Beaudoin Date: Tue, 15 Aug 2023 15:50:40 -0400 Subject: [PATCH 1/7] [BREAKING] Change Config.Server.Documents type []string -> map[string]string Add DisplayName object to use in documentation-html render --- cmd/server.go | 21 ++++++++++++++------- config/config.go | 14 +++++++------- examples/config/agecem-org.yaml | 6 ++++-- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/cmd/server.go b/cmd/server.go index 5173374..499e7ba 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -96,7 +96,12 @@ func init() { viper.BindPFlag("server.documents.use_ssl", serverCmd.Flags().Lookup("server-documents-use-ssl")) // server.documents.buckets - --server-documents-buckets - serverCmd.Flags().StringSlice("server-documents-buckets", []string{"proces-verbaux", "politiques-et-reglements"}, "Buckets that are allowed to be accessed by the API (config: server.documents.buckets)") + serverCmd.Flags().StringToString("server-documents-buckets", map[string]string{ + "proces-verbaux": "Procès-verbaux", + "politiques": "Politiques", + "reglements": "Règlements", + "formulaires": "Formulaires", + }, "Buckets that are allowed to be accessed by the API (config: server.documents.buckets)") viper.BindPFlag("server.documents.buckets", serverCmd.Flags().Lookup("server-documents-buckets")) // server.api.auth - --server-api-auth @@ -293,7 +298,7 @@ func handleDocumentation(c echo.Context) error { return c.Render(http.StatusInternalServerError, "documentation-html", nil) } - var buckets []string + var buckets map[string]string err = json.Unmarshal(result, &buckets) if err != nil { @@ -301,13 +306,14 @@ func handleDocumentation(c echo.Context) error { } type Bucket struct { - Name string - Documents []string + Name string + DisplayName string + Documents []string } var data []Bucket - for _, bucket := range buckets { + for bucket, displayName := range buckets { content, err := client.Call(http.MethodGet, fmt.Sprintf("/v1/bucket/%s", bucket)) if err != nil { return c.Render(http.StatusInternalServerError, "documentation-html", nil) @@ -339,8 +345,9 @@ func handleDocumentation(c echo.Context) error { */ data = append(data, Bucket{ - Name: bucket, - Documents: documents, + Name: bucket, + DisplayName: displayName, + Documents: documents, }) } diff --git a/config/config.go b/config/config.go index d2d637a..26f1a95 100644 --- a/config/config.go +++ b/config/config.go @@ -28,13 +28,13 @@ type Config struct { Protocol string `mapstructure:"protocol"` } `mapstructure:"api"` Documents struct { - AccessKeyId string `mapstructure:"access_key_id"` - Buckets []string `mapstructure:"buckets"` - Endpoint string `mapstructure:"endpoint"` - SecretAccessKey string `mapstructure:"secret_access_key"` - UseSSL bool `mapstructure:"use_ssl"` - KeyId string `mapstructure:"keyid"` - KeyValue string `mapstructure:"keyvalue"` + AccessKeyId string `mapstructure:"access_key_id"` + Buckets map[string]string `mapstructure:"buckets"` + Endpoint string `mapstructure:"endpoint"` + SecretAccessKey string `mapstructure:"secret_access_key"` + UseSSL bool `mapstructure:"use_ssl"` + KeyId string `mapstructure:"keyid"` + KeyValue string `mapstructure:"keyvalue"` } `mapstructure:"documents"` Port int `mapstructure:"port"` } `mapstructure:"server"` diff --git a/examples/config/agecem-org.yaml b/examples/config/agecem-org.yaml index 55a2535..5d77cf5 100644 --- a/examples/config/agecem-org.yaml +++ b/examples/config/agecem-org.yaml @@ -35,8 +35,10 @@ server: # # Also used to specify which buckets are to be created on receiving a POST request on /v1/seed buckets: - - 'proces-verbaux' - - 'politiques-et-reglements' + 'proces-verbaux': 'Procès-verbaux' + 'politiques': 'Politiques' + 'reglements': 'Règlements' + 'formulaires': 'Formulaires' api: # Enable or disable key auth on /v1 routes From 0a6008189c3fe74b0dc66b64c0b219a2c5a67801 Mon Sep 17 00:00:00 2001 From: Victor Lacasse-Beaudoin Date: Tue, 15 Aug 2023 15:51:42 -0400 Subject: [PATCH 2/7] Fix mediaclient usage of map[string]string buckets --- media/media.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/media/media.go b/media/media.go index 8f22e8f..b5cb765 100644 --- a/media/media.go +++ b/media/media.go @@ -58,7 +58,7 @@ func (m *MediaClient) Seed() ([]string, error) { var new_buckets []string - for _, bucket := range cfg.Server.Documents.Buckets { + for bucket := range cfg.Server.Documents.Buckets { exists, err := m.MinioClient.BucketExists(context.Background(), bucket) if err != nil { return new_buckets, err From 9bcf49b5e9775e81c1c21bfc1d2b32314e843c57 Mon Sep 17 00:00:00 2001 From: Victor Lacasse-Beaudoin Date: Tue, 15 Aug 2023 15:52:03 -0400 Subject: [PATCH 3/7] Fix serverhandlers usage of map[string]string buckets --- serverhandlers/serverhandlers.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/serverhandlers/serverhandlers.go b/serverhandlers/serverhandlers.go index eb688b5..6aca6d1 100644 --- a/serverhandlers/serverhandlers.go +++ b/serverhandlers/serverhandlers.go @@ -72,16 +72,16 @@ func HandleV1BucketList(c echo.Context) error { }) } - var buckets []string + var buckets = make(map[string]string) - for _, bucket_name := range cfg.Server.Documents.Buckets { + for bucket_name, bucket_display_name := range cfg.Server.Documents.Buckets { exists, err := mediaClient.MinioClient.BucketExists(context.Background(), bucket_name) if err != nil { return c.JSON(http.StatusInternalServerError, "Error during minio#BucketExists") } if exists { - buckets = append(buckets, bucket_name) + buckets[bucket_name] = bucket_display_name } } @@ -99,7 +99,7 @@ func HandleV1BucketRead(c echo.Context) error { bucket := c.Param("bucket") allowed := false - for _, bucket_allowed := range cfg.Server.Documents.Buckets { + for bucket_allowed := range cfg.Server.Documents.Buckets { if bucket == bucket_allowed { allowed = true } @@ -171,7 +171,7 @@ func HandleV1DocumentCreate(c echo.Context) error { } allowed := false - for _, bucket_allowed := range cfg.Server.Documents.Buckets { + for bucket_allowed := range cfg.Server.Documents.Buckets { if bucket == bucket_allowed { allowed = true } @@ -240,7 +240,7 @@ func HandleV1DocumentRead(c echo.Context) error { document := c.Param("document") allowed := false - for _, bucket_allowed := range cfg.Server.Documents.Buckets { + for bucket_allowed := range cfg.Server.Documents.Buckets { if bucket == bucket_allowed { allowed = true } @@ -317,7 +317,7 @@ func HandleV1DocumentDelete(c echo.Context) error { document := c.Param("document") allowed := false - for _, bucket_allowed := range cfg.Server.Documents.Buckets { + for bucket_allowed := range cfg.Server.Documents.Buckets { if bucket == bucket_allowed { allowed = true } From 58d7c7890bab8ee08fcc6524dcc1d198ef567c27 Mon Sep 17 00:00:00 2001 From: Victor Lacasse-Beaudoin Date: Tue, 15 Aug 2023 15:58:12 -0400 Subject: [PATCH 4/7] Utiliser Bucket.DisplayName dans documentation-html --- templates/html/documentation.gohtml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/templates/html/documentation.gohtml b/templates/html/documentation.gohtml index 2faaa88..ab846ed 100644 --- a/templates/html/documentation.gohtml +++ b/templates/html/documentation.gohtml @@ -12,8 +12,9 @@

{{ range . }} {{ $bucket_name := .Name }} + {{ $bucket_display_name := .DisplayName }}

- {{ $bucket_name }} + {{ $bucket_display_name }}
    {{ range .Documents }} From c74bfe153b81083e9ab29db5258ae50304721303 Mon Sep 17 00:00:00 2001 From: Victor Lacasse-Beaudoin Date: Tue, 15 Aug 2023 16:19:37 -0400 Subject: [PATCH 5/7] Remplir dropdown admin upload documents avec types de document Utilise Config.Server.Documents.Buckets pour le bucketName et le displayName --- cmd/server.go | 83 +++++++++++++++++++++++++++--- templates/html/admin-upload.gohtml | 5 +- 2 files changed, 79 insertions(+), 9 deletions(-) diff --git a/cmd/server.go b/cmd/server.go index 499e7ba..84a2b25 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -388,10 +388,56 @@ func handleAdmin(c echo.Context) error { } func handleAdminDocumentsUpload(c echo.Context) error { - return c.Render(http.StatusOK, "admin-upload-html", nil) + client, err := api.NewApiClientFromViper() + if err != nil { + return c.Render(http.StatusInternalServerError, "documentation-html", nil) + } + + result, err := client.Call(http.MethodGet, "/v1/bucket") + if err != nil { + return c.Render(http.StatusInternalServerError, "documentation-html", nil) + } + + var buckets map[string]string + + err = json.Unmarshal(result, &buckets) + if err != nil { + return c.Render(http.StatusInternalServerError, "documentation-html", nil) + } + + type Bucket struct { + Name string + DisplayName string + Documents []string + } + + var data struct { + Buckets []Bucket + Message string + } + + for bucketName, displayName := range buckets { + data.Buckets = append(data.Buckets, Bucket{ + Name: bucketName, + DisplayName: displayName, + }) + } + + return c.Render(http.StatusOK, "admin-upload-html", data) } func handleAdminDocumentsUploadPOST(c echo.Context) error { + type Bucket struct { + Name string + DisplayName string + Documents []string + } + + var data struct { + Buckets []Bucket + Message string + } + client, err := api.New(cfg.Server.Api.Protocol, cfg.Server.Api.Host, cfg.Server.Port, api.APIOptions{ KeyAuth: cfg.Server.Api.Auth, Key: cfg.Server.Api.Key, @@ -400,29 +446,52 @@ func handleAdminDocumentsUploadPOST(c echo.Context) error { Password: cfg.Server.Admin.Password, }) if err != nil { - return c.Render(http.StatusInternalServerError, "admin-upload-html", struct{ Message string }{Message: fmt.Sprintf("handleAdminDocumentsUploadPOST#api.New: %s", err)}) + data.Message = fmt.Sprintf("handleAdminDocumentsUploadPOST#api.New: %s", err) + return c.Render(http.StatusInternalServerError, "admin-upload-html", data) + } + + result, err := client.Call(http.MethodGet, "/v1/bucket") + if err != nil { + data.Message = "Error during GET /v1/bucket" + return c.Render(http.StatusInternalServerError, "documentation-html", data) + } + + var buckets map[string]string + + err = json.Unmarshal(result, &buckets) + if err != nil { + return c.Render(http.StatusInternalServerError, "documentation-html", nil) + } + + for bucketName, displayName := range buckets { + data.Buckets = append(data.Buckets, Bucket{ + Name: bucketName, + DisplayName: displayName, + }) } bucket := c.FormValue("bucket") document, err := c.FormFile("document") if err != nil { - return c.Render(http.StatusBadRequest, "admin-upload-html", struct{ Message string }{Message: fmt.Sprintf("handleAdminDocumentsUploadPOST#c.FormFile: %s", err)}) + data.Message = fmt.Sprintf("handleAdminDocumentsUploadPOST#c.FormFile: %s", err) + return c.Render(http.StatusBadRequest, "admin-upload-html", data) } response, err := client.UploadDocument(bucket, document) if err != nil { - return c.Render(http.StatusInternalServerError, "admin-upload-html", struct{ Message string }{Message: fmt.Sprintf("handleAdminDocumentsUploadPOST#client.UploadDocument: %s", err)}) + data.Message = fmt.Sprintf("handleAdminDocumentsUploadPOST#client.UploadDocument: %s", err) + return c.Render(http.StatusInternalServerError, "admin-upload-html", data) } // Format response - var message, info, status string + var info, status string info = fmt.Sprintf("[%.0f] /public/documentation/%s/%s", response.Info.Size, response.Info.Bucket, response.Info.Object) status = response.Message - message = fmt.Sprintf("%s - %s", status, info) + data.Message = fmt.Sprintf("%s - %s", status, info) - return c.Render(http.StatusOK, "admin-upload-html", struct{ Message string }{Message: message}) + return c.Render(http.StatusOK, "admin-upload-html", data) } diff --git a/templates/html/admin-upload.gohtml b/templates/html/admin-upload.gohtml index 3c145fb..9200b03 100644 --- a/templates/html/admin-upload.gohtml +++ b/templates/html/admin-upload.gohtml @@ -13,8 +13,9 @@
    Document: From e5e1dc68cb7f0b4c2e929b2c563fbb546ff4662b Mon Sep 17 00:00:00 2001 From: Victor Lacasse-Beaudoin Date: Tue, 15 Aug 2023 16:31:13 -0400 Subject: [PATCH 6/7] Update alpine -> 3.18.3 et retirer apk upgrade --- Dockerfile | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6f77d91..0473506 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,9 +24,7 @@ RUN CGO_ENABLED=0 go build -a -installsuffix cgo -o agecem-org . # Alpine -FROM alpine:3.17.2 - -RUN apk update && apk upgrade --no-cache +FROM alpine:3.18.3 WORKDIR /app From b6af4dd29eca966a905b8fc09bfda0a585834d55 Mon Sep 17 00:00:00 2001 From: Victor Lacasse-Beaudoin Date: Tue, 15 Aug 2023 16:32:23 -0400 Subject: [PATCH 7/7] Update golang -> 1.21.0 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 6f77d91..c5e3cad 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.20.6 as build +FROM golang:1.21.0 as build LABEL author="Victor Lacasse-Beaudoin "