From 7c8bb9ef6a28703b75b8f2e37cf20d9f1f98afb7 Mon Sep 17 00:00:00 2001 From: hanif salafi Date: Tue, 21 Jan 2025 15:54:43 +0700 Subject: [PATCH] feat: update magazine and magazine files --- .../controller/magazine_files.controller.go | 8 +- .../repository/magazine_files.repository.go | 4 +- .../service/magazine_files.service.go | 17 ++-- .../controller/magazines.controller.go | 2 + .../magazines/mapper/magazines.mapper.go | 14 ++- .../magazines/request/magazines.request.go | 1 + .../magazines/response/magazines.response.go | 7 +- .../magazines/service/magazines.service.go | 21 ++-- config/toml/config.toml | 2 +- docs/swagger/docs.go | 96 +++++++++++++++++++ docs/swagger/swagger.json | 96 +++++++++++++++++++ docs/swagger/swagger.yaml | 59 ++++++++++++ 12 files changed, 303 insertions(+), 24 deletions(-) diff --git a/app/module/magazine_files/controller/magazine_files.controller.go b/app/module/magazine_files/controller/magazine_files.controller.go index 0536be4..8b56e08 100644 --- a/app/module/magazine_files/controller/magazine_files.controller.go +++ b/app/module/magazine_files/controller/magazine_files.controller.go @@ -102,6 +102,8 @@ func (_i *magazineFilesController) Show(c *fiber.Ctx) error { // @Tags Magazine Files // @Security Bearer // @Param files formData file true "Upload file" multiple true +// @Param title formData string true "Magazine file title" +// @Param description formData string true "Magazine file description" // @Param magazineId path int true "Magazine ID" // @Success 200 {object} response.Response // @Failure 400 {object} response.BadRequestError @@ -109,12 +111,14 @@ func (_i *magazineFilesController) Show(c *fiber.Ctx) error { // @Failure 500 {object} response.InternalServerError // @Router /magazine-files/{magazineId} [post] func (_i *magazineFilesController) Save(c *fiber.Ctx) error { - id, err := strconv.ParseUint(c.Params("articleId"), 10, 0) + id, err := strconv.ParseUint(c.Params("magazineId"), 10, 0) if err != nil { return err } + title := c.Params("title") + description := c.Params("description") - err = _i.magazineFilesService.Save(c, uint(id)) + err = _i.magazineFilesService.Save(c, uint(id), title, description) if err != nil { return err } diff --git a/app/module/magazine_files/repository/magazine_files.repository.go b/app/module/magazine_files/repository/magazine_files.repository.go index 5002a9b..b751b83 100644 --- a/app/module/magazine_files/repository/magazine_files.repository.go +++ b/app/module/magazine_files/repository/magazine_files.repository.go @@ -17,7 +17,7 @@ type magazineFilesRepository struct { type MagazineFilesRepository interface { GetAll(req request.MagazineFilesQueryRequest) (magazineFiless []*entity.MagazineFiles, paging paginator.Pagination, err error) FindOne(id uint) (magazineFiles *entity.MagazineFiles, err error) - FindByArticle(magazineId uint) (magazineFiles []*entity.MagazineFiles, err error) + FindByMagazine(magazineId uint) (magazineFiles []*entity.MagazineFiles, err error) FindByFilename(filename string) (magazineFiles *entity.MagazineFiles, err error) Create(magazineFiles *entity.MagazineFiles) (err error) Update(id uint, magazineFiles *entity.MagazineFiles) (err error) @@ -76,7 +76,7 @@ func (_i *magazineFilesRepository) GetAll(req request.MagazineFilesQueryRequest) return } -func (_i *magazineFilesRepository) FindByArticle(magazineId uint) (magazineFiles []*entity.MagazineFiles, err error) { +func (_i *magazineFilesRepository) FindByMagazine(magazineId uint) (magazineFiles []*entity.MagazineFiles, err error) { if err := _i.DB.DB.Where("magazine_id = ?", magazineId).Find(&magazineFiles).Error; err != nil { return nil, err } diff --git a/app/module/magazine_files/service/magazine_files.service.go b/app/module/magazine_files/service/magazine_files.service.go index 5f48d8f..280aeb7 100644 --- a/app/module/magazine_files/service/magazine_files.service.go +++ b/app/module/magazine_files/service/magazine_files.service.go @@ -32,7 +32,7 @@ type magazineFilesService struct { type MagazineFilesService interface { All(req request.MagazineFilesQueryRequest) (magazineFiles []*response.MagazineFilesResponse, paging paginator.Pagination, err error) Show(id uint) (magazineFiles *response.MagazineFilesResponse, err error) - Save(c *fiber.Ctx, id uint) (err error) + Save(c *fiber.Ctx, id uint, title string, description string) (err error) Update(id uint, req request.MagazineFilesUpdateRequest) (err error) Delete(id uint) error Viewer(c *fiber.Ctx) error @@ -71,7 +71,7 @@ func (_i *magazineFilesService) Show(id uint) (magazineFiles *response.MagazineF return mapper.MagazineFilesResponseMapper(result), nil } -func (_i *magazineFilesService) Save(c *fiber.Ctx, id uint) (err error) { +func (_i *magazineFilesService) Save(c *fiber.Ctx, id uint, title string, description string) (err error) { bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName form, err := c.MultipartForm() @@ -125,12 +125,13 @@ func (_i *magazineFilesService) Save(c *fiber.Ctx, id uint) (err error) { fileSize := strconv.FormatInt(fileHeader.Size, 10) req := request.MagazineFilesCreateRequest{ - MagazineId: id, - Title: newFilename, - FilePath: &objectName, - FileName: &newFilename, - FileAlt: &filenameAlt, - Size: &fileSize, + MagazineId: id, + Title: title, + Description: description, + FilePath: &objectName, + FileName: &newFilename, + FileAlt: &filenameAlt, + Size: &fileSize, } err = _i.Repo.Create(req.ToEntity()) diff --git a/app/module/magazines/controller/magazines.controller.go b/app/module/magazines/controller/magazines.controller.go index 8c42942..e8202f8 100644 --- a/app/module/magazines/controller/magazines.controller.go +++ b/app/module/magazines/controller/magazines.controller.go @@ -34,6 +34,8 @@ func NewMagazinesController(magazinesService service.MagazinesService) Magazines // @Description API for getting all Magazines // @Tags Magazines // @Security Bearer +// @Param req query request.MagazinesQueryRequest false "query parameters" +// @Param req query paginator.Pagination false "pagination parameters" // @Success 200 {object} response.Response // @Failure 400 {object} response.BadRequestError // @Failure 401 {object} response.UnauthorizedError diff --git a/app/module/magazines/mapper/magazines.mapper.go b/app/module/magazines/mapper/magazines.mapper.go index a22278d..37206d3 100644 --- a/app/module/magazines/mapper/magazines.mapper.go +++ b/app/module/magazines/mapper/magazines.mapper.go @@ -2,10 +2,21 @@ package mapper import ( "go-humas-be/app/database/entity" + magazineFilesMapper "go-humas-be/app/module/magazine_files/mapper" + magazineFilesRepository "go-humas-be/app/module/magazine_files/repository" + magazineFilesResponse "go-humas-be/app/module/magazine_files/response" res "go-humas-be/app/module/magazines/response" ) -func MagazinesResponseMapper(magazinesReq *entity.Magazines) (magazinesRes *res.MagazinesResponse) { +func MagazinesResponseMapper(magazinesReq *entity.Magazines, magazineFilesRepo magazineFilesRepository.MagazineFilesRepository) (magazinesRes *res.MagazinesResponse) { + magazineFiles, _ := magazineFilesRepo.FindByMagazine(magazinesReq.ID) + var magazineFilesArr []*magazineFilesResponse.MagazineFilesResponse + if magazineFiles != nil && len(magazineFiles) > 0 { + for _, result := range magazineFiles { + magazineFilesArr = append(magazineFilesArr, magazineFilesMapper.MagazineFilesResponseMapper(result)) + } + } + if magazinesReq != nil { magazinesRes = &res.MagazinesResponse{ ID: magazinesReq.ID, @@ -21,6 +32,7 @@ func MagazinesResponseMapper(magazinesReq *entity.Magazines) (magazinesRes *res. IsActive: magazinesReq.IsActive, CreatedAt: magazinesReq.CreatedAt, UpdatedAt: magazinesReq.UpdatedAt, + MagazineFiles: magazineFilesArr, } } return magazinesRes diff --git a/app/module/magazines/request/magazines.request.go b/app/module/magazines/request/magazines.request.go index 3e33e59..ee798d0 100644 --- a/app/module/magazines/request/magazines.request.go +++ b/app/module/magazines/request/magazines.request.go @@ -46,6 +46,7 @@ func (req MagazinesCreateRequest) ToEntity() *entity.Magazines { StatusId: req.StatusId, IsPublish: req.IsPublish, PublishedAt: req.PublishedAt, + IsActive: true, } } diff --git a/app/module/magazines/response/magazines.response.go b/app/module/magazines/response/magazines.response.go index ecca98b..cf246db 100644 --- a/app/module/magazines/response/magazines.response.go +++ b/app/module/magazines/response/magazines.response.go @@ -1,6 +1,9 @@ package response -import "time" +import ( + magazineFilesResponse "go-humas-be/app/module/magazine_files/response" + "time" +) type MagazinesResponse struct { ID uint `json:"id"` @@ -16,4 +19,6 @@ type MagazinesResponse struct { IsActive bool `json:"isActive"` CreatedAt time.Time `json:"createdAt"` UpdatedAt time.Time `json:"updatedAt"` + + MagazineFiles []*magazineFilesResponse.MagazineFilesResponse `json:"files"` } diff --git a/app/module/magazines/service/magazines.service.go b/app/module/magazines/service/magazines.service.go index 581f104..a1e31bd 100644 --- a/app/module/magazines/service/magazines.service.go +++ b/app/module/magazines/service/magazines.service.go @@ -2,6 +2,7 @@ package service import ( "github.com/rs/zerolog" + magazineFilesRepository "go-humas-be/app/module/magazine_files/repository" "go-humas-be/app/module/magazines/mapper" "go-humas-be/app/module/magazines/repository" "go-humas-be/app/module/magazines/request" @@ -13,9 +14,10 @@ import ( // MagazinesService type magazinesService struct { - Repo repository.MagazinesRepository - UsersRepo usersRepository.UsersRepository - Log zerolog.Logger + Repo repository.MagazinesRepository + UsersRepo usersRepository.UsersRepository + MagazineFilesRepo magazineFilesRepository.MagazineFilesRepository + Log zerolog.Logger } // MagazinesService define interface of IMagazinesService @@ -28,12 +30,13 @@ type MagazinesService interface { } // NewMagazinesService init MagazinesService -func NewMagazinesService(repo repository.MagazinesRepository, usersRepo usersRepository.UsersRepository, log zerolog.Logger) MagazinesService { +func NewMagazinesService(repo repository.MagazinesRepository, magazineFilesRepo magazineFilesRepository.MagazineFilesRepository, usersRepo usersRepository.UsersRepository, log zerolog.Logger) MagazinesService { return &magazinesService{ - Repo: repo, - UsersRepo: usersRepo, - Log: log, + Repo: repo, + MagazineFilesRepo: magazineFilesRepo, + UsersRepo: usersRepo, + Log: log, } } @@ -45,7 +48,7 @@ func (_i *magazinesService) All(req request.MagazinesQueryRequest) (magaziness [ } for _, result := range results { - magaziness = append(magaziness, mapper.MagazinesResponseMapper(result)) + magaziness = append(magaziness, mapper.MagazinesResponseMapper(result, _i.MagazineFilesRepo)) } return @@ -57,7 +60,7 @@ func (_i *magazinesService) Show(id uint) (magazines *response.MagazinesResponse return nil, err } - return mapper.MagazinesResponseMapper(result), nil + return mapper.MagazinesResponseMapper(result, _i.MagazineFilesRepo), nil } func (_i *magazinesService) Save(req request.MagazinesCreateRequest, authToken string) (err error) { diff --git a/config/toml/config.toml b/config/toml/config.toml index 44ac923..90fde7c 100644 --- a/config/toml/config.toml +++ b/config/toml/config.toml @@ -13,7 +13,7 @@ body-limit = 1048576000 # "100 * 1024 * 1024" [db.postgres] dsn = "postgresql://humas_user:HumasDB@2024@38.47.180.165:5432/humas_db" # ://:@:/ -migrate = true +migrate = false seed = false [logger] diff --git a/docs/swagger/docs.go b/docs/swagger/docs.go index ee56b25..c6e40cc 100644 --- a/docs/swagger/docs.go +++ b/docs/swagger/docs.go @@ -3046,6 +3046,20 @@ const docTemplate = `{ "in": "formData", "required": true }, + { + "type": "string", + "description": "Magazine file title", + "name": "title", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "Magazine file description", + "name": "description", + "in": "formData", + "required": true + }, { "type": "integer", "description": "Magazine ID", @@ -3094,6 +3108,88 @@ const docTemplate = `{ "Magazines" ], "summary": "Get all Magazines", + "parameters": [ + { + "type": "integer", + "name": "createdById", + "in": "query" + }, + { + "type": "string", + "name": "description", + "in": "query" + }, + { + "type": "boolean", + "name": "isPublish", + "in": "query" + }, + { + "type": "string", + "name": "pageUrl", + "in": "query" + }, + { + "type": "integer", + "name": "statusId", + "in": "query" + }, + { + "type": "string", + "name": "thumbnailPath", + "in": "query" + }, + { + "type": "string", + "name": "thumbnailUrl", + "in": "query" + }, + { + "type": "string", + "name": "title", + "in": "query" + }, + { + "type": "integer", + "name": "count", + "in": "query" + }, + { + "type": "integer", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "name": "nextPage", + "in": "query" + }, + { + "type": "integer", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "name": "previousPage", + "in": "query" + }, + { + "type": "string", + "name": "sort", + "in": "query" + }, + { + "type": "string", + "name": "sortBy", + "in": "query" + }, + { + "type": "integer", + "name": "totalPage", + "in": "query" + } + ], "responses": { "200": { "description": "OK", diff --git a/docs/swagger/swagger.json b/docs/swagger/swagger.json index 91669f7..2f20ab4 100644 --- a/docs/swagger/swagger.json +++ b/docs/swagger/swagger.json @@ -3035,6 +3035,20 @@ "in": "formData", "required": true }, + { + "type": "string", + "description": "Magazine file title", + "name": "title", + "in": "formData", + "required": true + }, + { + "type": "string", + "description": "Magazine file description", + "name": "description", + "in": "formData", + "required": true + }, { "type": "integer", "description": "Magazine ID", @@ -3083,6 +3097,88 @@ "Magazines" ], "summary": "Get all Magazines", + "parameters": [ + { + "type": "integer", + "name": "createdById", + "in": "query" + }, + { + "type": "string", + "name": "description", + "in": "query" + }, + { + "type": "boolean", + "name": "isPublish", + "in": "query" + }, + { + "type": "string", + "name": "pageUrl", + "in": "query" + }, + { + "type": "integer", + "name": "statusId", + "in": "query" + }, + { + "type": "string", + "name": "thumbnailPath", + "in": "query" + }, + { + "type": "string", + "name": "thumbnailUrl", + "in": "query" + }, + { + "type": "string", + "name": "title", + "in": "query" + }, + { + "type": "integer", + "name": "count", + "in": "query" + }, + { + "type": "integer", + "name": "limit", + "in": "query" + }, + { + "type": "integer", + "name": "nextPage", + "in": "query" + }, + { + "type": "integer", + "name": "page", + "in": "query" + }, + { + "type": "integer", + "name": "previousPage", + "in": "query" + }, + { + "type": "string", + "name": "sort", + "in": "query" + }, + { + "type": "string", + "name": "sortBy", + "in": "query" + }, + { + "type": "integer", + "name": "totalPage", + "in": "query" + } + ], "responses": { "200": { "description": "OK", diff --git a/docs/swagger/swagger.yaml b/docs/swagger/swagger.yaml index 0582b28..78da3cf 100644 --- a/docs/swagger/swagger.yaml +++ b/docs/swagger/swagger.yaml @@ -2555,6 +2555,16 @@ paths: name: files required: true type: file + - description: Magazine file title + in: formData + name: title + required: true + type: string + - description: Magazine file description + in: formData + name: description + required: true + type: string - description: Magazine ID in: path name: magazineId @@ -2616,6 +2626,55 @@ paths: /magazines: get: description: API for getting all Magazines + parameters: + - in: query + name: createdById + type: integer + - in: query + name: description + type: string + - in: query + name: isPublish + type: boolean + - in: query + name: pageUrl + type: string + - in: query + name: statusId + type: integer + - in: query + name: thumbnailPath + type: string + - in: query + name: thumbnailUrl + type: string + - in: query + name: title + type: string + - in: query + name: count + type: integer + - in: query + name: limit + type: integer + - in: query + name: nextPage + type: integer + - in: query + name: page + type: integer + - in: query + name: previousPage + type: integer + - in: query + name: sort + type: string + - in: query + name: sortBy + type: string + - in: query + name: totalPage + type: integer responses: "200": description: OK