diff --git a/app/middleware/register.middleware.go b/app/middleware/register.middleware.go index 17b8a37..ed96257 100644 --- a/app/middleware/register.middleware.go +++ b/app/middleware/register.middleware.go @@ -30,6 +30,7 @@ func NewMiddleware(app *fiber.App, cfg *config.Config) *Middleware { // Register registers all the middleware functions func (m *Middleware) Register() { // Add Extra Middlewares + m.App.Use(limiter.New(limiter.Config{ Next: utils.IsEnabled(m.Cfg.Middleware.Limiter.Enable), Max: m.Cfg.Middleware.Limiter.Max, diff --git a/app/module/article_files/service/article_files.service.go b/app/module/article_files/service/article_files.service.go index 71a67b5..acbcb9d 100644 --- a/app/module/article_files/service/article_files.service.go +++ b/app/module/article_files/service/article_files.service.go @@ -75,10 +75,11 @@ func (_i *articleFilesService) Save(c *fiber.Ctx, id uint) (err error) { bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName form, err := c.MultipartForm() + if err != nil { return err } - files := form.File["files"] + //filess := form.File["files"] // Create minio connection. minioClient, err := _i.MinioStorage.ConnectMinio() @@ -90,51 +91,56 @@ func (_i *articleFilesService) Save(c *fiber.Ctx, id uint) (err error) { }) } - // Iterasi semua file yang diunggah - for _, file := range files { + for _, files := range form.File { _i.Log.Info().Str("timestamp", time.Now(). - Format(time.RFC3339)).Str("Service:Resource", "Uploader:: loop1"). - Interface("data", file).Msg("") + Format(time.RFC3339)).Str("Service:Resource", "Uploader:: top"). + Interface("files", files).Msg("") - src, err := file.Open() - if err != nil { - return err - } - defer src.Close() + for _, fileHeader := range files { + _i.Log.Info().Str("timestamp", time.Now(). + Format(time.RFC3339)).Str("Service:Resource", "Uploader:: loop"). + Interface("data", fileHeader).Msg("") - filename := filepath.Base(file.Filename) - filenameAlt := filepath.Clean(filename[:len(filename)-len(filepath.Ext(filename))]) - filename = strings.ReplaceAll(filename, " ", "") - filenameWithoutExt := filepath.Clean(filename[:len(filename)-len(filepath.Ext(filename))]) - extension := filepath.Ext(file.Filename)[1:] + src, err := fileHeader.Open() + if err != nil { + return err + } + defer src.Close() - rand.New(rand.NewSource(time.Now().UnixNano())) - randUniqueId := rand.Intn(1000000) + filename := filepath.Base(fileHeader.Filename) + filenameAlt := filepath.Clean(filename[:len(filename)-len(filepath.Ext(filename))]) + filename = strings.ReplaceAll(filename, " ", "") + filenameWithoutExt := filepath.Clean(filename[:len(filename)-len(filepath.Ext(filename))]) + extension := filepath.Ext(fileHeader.Filename)[1:] - newFilenameWithoutExt := filenameWithoutExt + "_" + strconv.Itoa(randUniqueId) - newFilename := newFilenameWithoutExt + "." + extension + rand.New(rand.NewSource(time.Now().UnixNano())) + randUniqueId := rand.Intn(1000000) - objectName := "articles/upload/" + newFilename - fileSize := strconv.FormatInt(file.Size, 10) + newFilenameWithoutExt := filenameWithoutExt + "_" + strconv.Itoa(randUniqueId) + newFilename := newFilenameWithoutExt + "." + extension - req := request.ArticleFilesCreateRequest{ - ArticleId: id, - FilePath: &objectName, - FileName: &newFilename, - FileAlt: &filenameAlt, - Size: &fileSize, - } + objectName := "articles/upload/" + newFilename + fileSize := strconv.FormatInt(fileHeader.Size, 10) - err = _i.Repo.Create(req.ToEntity()) - if err != nil { - return err - } + req := request.ArticleFilesCreateRequest{ + ArticleId: id, + FilePath: &objectName, + FileName: &newFilename, + FileAlt: &filenameAlt, + Size: &fileSize, + } - // Upload file ke MinIO - _, err = minioClient.PutObject(context.Background(), bucketName, objectName, src, file.Size, minio.PutObjectOptions{}) - if err != nil { - return err + err = _i.Repo.Create(req.ToEntity()) + if err != nil { + return err + } + + // Upload file ke MinIO + _, err = minioClient.PutObject(context.Background(), bucketName, objectName, src, fileHeader.Size, minio.PutObjectOptions{}) + if err != nil { + return err + } } } diff --git a/config/config/index.config.go b/config/config/index.config.go index 49733c7..b414765 100644 --- a/config/config/index.config.go +++ b/config/config/index.config.go @@ -20,6 +20,7 @@ type app = struct { Prefork bool `toml:"prefork"` Production bool `toml:"production"` IdleTimeout time.Duration `toml:"idle-timeout"` + BodyLimit int `toml:"body-limit"` } // db struct config diff --git a/config/toml/config.toml b/config/toml/config.toml index 44d16d6..44cdf3a 100644 --- a/config/toml/config.toml +++ b/config/toml/config.toml @@ -6,6 +6,7 @@ idle-timeout = 5 # As seconds print-routes = false prefork = true production = false +body-limit = 104857600 # "100 * 1024 * 1024" [db.postgres] dsn = "postgresql://humas_polri:P@ssw0rd.1@103.82.242.92:5432/humas_polri" # ://:@:/ diff --git a/config/webserver/webserver.config.go b/config/webserver/webserver.config.go index dc5b7f5..e12ed3f 100644 --- a/config/webserver/webserver.config.go +++ b/config/webserver/webserver.config.go @@ -29,6 +29,7 @@ func NewFiber(cfg *config.Config) *fiber.App { ErrorHandler: response.ErrorHandler, IdleTimeout: cfg.App.IdleTimeout * time.Second, EnablePrintRoutes: cfg.App.PrintRoutes, + BodyLimit: cfg.App.BodyLimit, DisableStartupMessage: true, ReadBufferSize: 8192, }) diff --git a/docs/swagger/docs.go b/docs/swagger/docs.go index c8460ab..dedd9b8 100644 --- a/docs/swagger/docs.go +++ b/docs/swagger/docs.go @@ -792,7 +792,7 @@ const docTemplate = `{ } } }, - "/article-files/viewer/{id}": { + "/article-files/viewer/{filename}": { "get": { "security": [ { @@ -807,8 +807,8 @@ const docTemplate = `{ "parameters": [ { "type": "string", - "description": "Article File ID", - "name": "id", + "description": "Article File Name", + "name": "filename", "in": "path", "required": true } diff --git a/docs/swagger/swagger.json b/docs/swagger/swagger.json index 548cf9f..c622d71 100644 --- a/docs/swagger/swagger.json +++ b/docs/swagger/swagger.json @@ -781,7 +781,7 @@ } } }, - "/article-files/viewer/{id}": { + "/article-files/viewer/{filename}": { "get": { "security": [ { @@ -796,8 +796,8 @@ "parameters": [ { "type": "string", - "description": "Article File ID", - "name": "id", + "description": "Article File Name", + "name": "filename", "in": "path", "required": true } diff --git a/docs/swagger/swagger.yaml b/docs/swagger/swagger.yaml index fe06c74..1eb2921 100644 --- a/docs/swagger/swagger.yaml +++ b/docs/swagger/swagger.yaml @@ -1245,13 +1245,13 @@ paths: summary: Update ArticleFiles tags: - Article Files - /article-files/viewer/{id}: + /article-files/viewer/{filename}: get: description: API for create ArticleFiles parameters: - - description: Article File ID + - description: Article File Name in: path - name: id + name: filename required: true type: string responses: