feat: update magazine and magazine files

This commit is contained in:
hanif salafi 2025-01-21 15:54:43 +07:00
parent 21cb8aa74e
commit 7c8bb9ef6a
12 changed files with 303 additions and 24 deletions

View File

@ -102,6 +102,8 @@ func (_i *magazineFilesController) Show(c *fiber.Ctx) error {
// @Tags Magazine Files // @Tags Magazine Files
// @Security Bearer // @Security Bearer
// @Param files formData file true "Upload file" multiple true // @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" // @Param magazineId path int true "Magazine ID"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
@ -109,12 +111,14 @@ func (_i *magazineFilesController) Show(c *fiber.Ctx) error {
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /magazine-files/{magazineId} [post] // @Router /magazine-files/{magazineId} [post]
func (_i *magazineFilesController) Save(c *fiber.Ctx) error { 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 { if err != nil {
return err 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 { if err != nil {
return err return err
} }

View File

@ -17,7 +17,7 @@ type magazineFilesRepository struct {
type MagazineFilesRepository interface { type MagazineFilesRepository interface {
GetAll(req request.MagazineFilesQueryRequest) (magazineFiless []*entity.MagazineFiles, paging paginator.Pagination, err error) GetAll(req request.MagazineFilesQueryRequest) (magazineFiless []*entity.MagazineFiles, paging paginator.Pagination, err error)
FindOne(id uint) (magazineFiles *entity.MagazineFiles, 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) FindByFilename(filename string) (magazineFiles *entity.MagazineFiles, err error)
Create(magazineFiles *entity.MagazineFiles) (err error) Create(magazineFiles *entity.MagazineFiles) (err error)
Update(id uint, 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 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 { if err := _i.DB.DB.Where("magazine_id = ?", magazineId).Find(&magazineFiles).Error; err != nil {
return nil, err return nil, err
} }

View File

@ -32,7 +32,7 @@ type magazineFilesService struct {
type MagazineFilesService interface { type MagazineFilesService interface {
All(req request.MagazineFilesQueryRequest) (magazineFiles []*response.MagazineFilesResponse, paging paginator.Pagination, err error) All(req request.MagazineFilesQueryRequest) (magazineFiles []*response.MagazineFilesResponse, paging paginator.Pagination, err error)
Show(id uint) (magazineFiles *response.MagazineFilesResponse, 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) Update(id uint, req request.MagazineFilesUpdateRequest) (err error)
Delete(id uint) error Delete(id uint) error
Viewer(c *fiber.Ctx) error Viewer(c *fiber.Ctx) error
@ -71,7 +71,7 @@ func (_i *magazineFilesService) Show(id uint) (magazineFiles *response.MagazineF
return mapper.MagazineFilesResponseMapper(result), nil 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 bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName
form, err := c.MultipartForm() form, err := c.MultipartForm()
@ -126,7 +126,8 @@ func (_i *magazineFilesService) Save(c *fiber.Ctx, id uint) (err error) {
req := request.MagazineFilesCreateRequest{ req := request.MagazineFilesCreateRequest{
MagazineId: id, MagazineId: id,
Title: newFilename, Title: title,
Description: description,
FilePath: &objectName, FilePath: &objectName,
FileName: &newFilename, FileName: &newFilename,
FileAlt: &filenameAlt, FileAlt: &filenameAlt,

View File

@ -34,6 +34,8 @@ func NewMagazinesController(magazinesService service.MagazinesService) Magazines
// @Description API for getting all Magazines // @Description API for getting all Magazines
// @Tags Magazines // @Tags Magazines
// @Security Bearer // @Security Bearer
// @Param req query request.MagazinesQueryRequest false "query parameters"
// @Param req query paginator.Pagination false "pagination parameters"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
// @Failure 401 {object} response.UnauthorizedError // @Failure 401 {object} response.UnauthorizedError

View File

@ -2,10 +2,21 @@ package mapper
import ( import (
"go-humas-be/app/database/entity" "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" 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 { if magazinesReq != nil {
magazinesRes = &res.MagazinesResponse{ magazinesRes = &res.MagazinesResponse{
ID: magazinesReq.ID, ID: magazinesReq.ID,
@ -21,6 +32,7 @@ func MagazinesResponseMapper(magazinesReq *entity.Magazines) (magazinesRes *res.
IsActive: magazinesReq.IsActive, IsActive: magazinesReq.IsActive,
CreatedAt: magazinesReq.CreatedAt, CreatedAt: magazinesReq.CreatedAt,
UpdatedAt: magazinesReq.UpdatedAt, UpdatedAt: magazinesReq.UpdatedAt,
MagazineFiles: magazineFilesArr,
} }
} }
return magazinesRes return magazinesRes

View File

@ -46,6 +46,7 @@ func (req MagazinesCreateRequest) ToEntity() *entity.Magazines {
StatusId: req.StatusId, StatusId: req.StatusId,
IsPublish: req.IsPublish, IsPublish: req.IsPublish,
PublishedAt: req.PublishedAt, PublishedAt: req.PublishedAt,
IsActive: true,
} }
} }

View File

@ -1,6 +1,9 @@
package response package response
import "time" import (
magazineFilesResponse "go-humas-be/app/module/magazine_files/response"
"time"
)
type MagazinesResponse struct { type MagazinesResponse struct {
ID uint `json:"id"` ID uint `json:"id"`
@ -16,4 +19,6 @@ type MagazinesResponse struct {
IsActive bool `json:"isActive"` IsActive bool `json:"isActive"`
CreatedAt time.Time `json:"createdAt"` CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"` UpdatedAt time.Time `json:"updatedAt"`
MagazineFiles []*magazineFilesResponse.MagazineFilesResponse `json:"files"`
} }

View File

@ -2,6 +2,7 @@ package service
import ( import (
"github.com/rs/zerolog" "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/mapper"
"go-humas-be/app/module/magazines/repository" "go-humas-be/app/module/magazines/repository"
"go-humas-be/app/module/magazines/request" "go-humas-be/app/module/magazines/request"
@ -15,6 +16,7 @@ import (
type magazinesService struct { type magazinesService struct {
Repo repository.MagazinesRepository Repo repository.MagazinesRepository
UsersRepo usersRepository.UsersRepository UsersRepo usersRepository.UsersRepository
MagazineFilesRepo magazineFilesRepository.MagazineFilesRepository
Log zerolog.Logger Log zerolog.Logger
} }
@ -28,10 +30,11 @@ type MagazinesService interface {
} }
// NewMagazinesService init MagazinesService // 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{ return &magazinesService{
Repo: repo, Repo: repo,
MagazineFilesRepo: magazineFilesRepo,
UsersRepo: usersRepo, UsersRepo: usersRepo,
Log: log, Log: log,
} }
@ -45,7 +48,7 @@ func (_i *magazinesService) All(req request.MagazinesQueryRequest) (magaziness [
} }
for _, result := range results { for _, result := range results {
magaziness = append(magaziness, mapper.MagazinesResponseMapper(result)) magaziness = append(magaziness, mapper.MagazinesResponseMapper(result, _i.MagazineFilesRepo))
} }
return return
@ -57,7 +60,7 @@ func (_i *magazinesService) Show(id uint) (magazines *response.MagazinesResponse
return nil, err 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) { func (_i *magazinesService) Save(req request.MagazinesCreateRequest, authToken string) (err error) {

View File

@ -13,7 +13,7 @@ body-limit = 1048576000 # "100 * 1024 * 1024"
[db.postgres] [db.postgres]
dsn = "postgresql://humas_user:HumasDB@2024@38.47.180.165:5432/humas_db" # <driver>://<username>:<password>@<host>:<port>/<database> dsn = "postgresql://humas_user:HumasDB@2024@38.47.180.165:5432/humas_db" # <driver>://<username>:<password>@<host>:<port>/<database>
migrate = true migrate = false
seed = false seed = false
[logger] [logger]

View File

@ -3046,6 +3046,20 @@ const docTemplate = `{
"in": "formData", "in": "formData",
"required": true "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", "type": "integer",
"description": "Magazine ID", "description": "Magazine ID",
@ -3094,6 +3108,88 @@ const docTemplate = `{
"Magazines" "Magazines"
], ],
"summary": "Get all 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": { "responses": {
"200": { "200": {
"description": "OK", "description": "OK",

View File

@ -3035,6 +3035,20 @@
"in": "formData", "in": "formData",
"required": true "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", "type": "integer",
"description": "Magazine ID", "description": "Magazine ID",
@ -3083,6 +3097,88 @@
"Magazines" "Magazines"
], ],
"summary": "Get all 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": { "responses": {
"200": { "200": {
"description": "OK", "description": "OK",

View File

@ -2555,6 +2555,16 @@ paths:
name: files name: files
required: true required: true
type: file 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 - description: Magazine ID
in: path in: path
name: magazineId name: magazineId
@ -2616,6 +2626,55 @@ paths:
/magazines: /magazines:
get: get:
description: API for getting all Magazines 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: responses:
"200": "200":
description: OK description: OK