From 0d7f24ed0e0951e558c5a93322bd8d8ae3f7bb52 Mon Sep 17 00:00:00 2001 From: hanif salafi Date: Fri, 17 Jan 2025 15:24:35 +0700 Subject: [PATCH] feat: update magazine, and magazine files --- .../controller/magazine_files.controller.go | 9 +- .../repository/magazine_files.repository.go | 28 ++++++ .../request/magazine_files.request.go | 76 +++++++++++---- .../controller/magazines.controller.go | 9 +- .../repository/magazines.repository.go | 31 +++++- .../magazines/request/magazines.request.go | 94 +++++++++++++------ 6 files changed, 198 insertions(+), 49 deletions(-) diff --git a/app/module/magazine_files/controller/magazine_files.controller.go b/app/module/magazine_files/controller/magazine_files.controller.go index 4f2625c..0536be4 100644 --- a/app/module/magazine_files/controller/magazine_files.controller.go +++ b/app/module/magazine_files/controller/magazine_files.controller.go @@ -46,7 +46,14 @@ func (_i *magazineFilesController) All(c *fiber.Ctx) error { return err } - var req request.MagazineFilesQueryRequest + reqContext := request.MagazineFilesQueryRequestContext{ + Title: c.Query("title"), + Description: c.Query("description"), + MagazineId: c.Query("magazineId"), + StatusId: c.Query("statusId"), + IsPublish: c.Query("isPublish"), + } + req := reqContext.ToParamRequest() req.Pagination = paginate magazineFilesData, paging, err := _i.magazineFilesService.All(req) diff --git a/app/module/magazine_files/repository/magazine_files.repository.go b/app/module/magazine_files/repository/magazine_files.repository.go index e389c88..5002a9b 100644 --- a/app/module/magazine_files/repository/magazine_files.repository.go +++ b/app/module/magazine_files/repository/magazine_files.repository.go @@ -1,10 +1,12 @@ package repository import ( + "fmt" "go-humas-be/app/database" "go-humas-be/app/database/entity" "go-humas-be/app/module/magazine_files/request" "go-humas-be/utils/paginator" + "strings" ) type magazineFilesRepository struct { @@ -33,8 +35,34 @@ func (_i *magazineFilesRepository) GetAll(req request.MagazineFilesQueryRequest) var count int64 query := _i.DB.DB.Model(&entity.MagazineFiles{}) + query = query.Where("is_active = ?", true) + + if req.Title != nil && *req.Title != "" { + title := strings.ToLower(*req.Title) + query = query.Where("LOWER(title) LIKE ?", "%"+strings.ToLower(title)+"%") + } + if req.Description != nil && *req.Description != "" { + description := strings.ToLower(*req.Description) + query = query.Where("LOWER(description) LIKE ?", "%"+strings.ToLower(description)+"%") + } + if req.MagazineId != nil { + query = query.Where("magazine_id = ?", req.MagazineId) + } + if req.IsPublish != nil { + query = query.Where("is_publish = ?", req.IsPublish) + } + if req.StatusId != nil { + query = query.Where("status_id = ?", req.StatusId) + } query.Count(&count) + if req.Pagination.SortBy != "" { + direction := "ASC" + if req.Pagination.Sort == "desc" { + direction = "DESC" + } + query.Order(fmt.Sprintf("%s %s", req.Pagination.SortBy, direction)) + } req.Pagination.Count = count req.Pagination = paginator.Paging(req.Pagination) diff --git a/app/module/magazine_files/request/magazine_files.request.go b/app/module/magazine_files/request/magazine_files.request.go index 3b2ad34..728738f 100644 --- a/app/module/magazine_files/request/magazine_files.request.go +++ b/app/module/magazine_files/request/magazine_files.request.go @@ -3,6 +3,7 @@ package request import ( "go-humas-be/app/database/entity" "go-humas-be/utils/paginator" + "strconv" "time" ) @@ -11,23 +12,23 @@ type MagazineFilesGeneric interface { } type MagazineFilesQueryRequest struct { - Title string `json:"title" validate:"required"` - Description string `json:"description" validate:"required"` - MagazineId int `json:"magazine_id" validate:"required"` - DownloadCount int `json:"download_count" validate:"required"` - StatusId int `json:"status_id" validate:"required"` - IsPublish bool `json:"is_publish" validate:"required"` - PublishedAt time.Time `json:"published_at" validate:"required"` - IsActive bool `json:"is_active" validate:"required"` + Title *string `json:"title"` + Description *string `json:"description"` + MagazineId *int `json:"magazineId"` + DownloadCount *int `json:"downloadCount"` + StatusId *int `json:"statusId"` + IsPublish *bool `json:"isPublish"` + PublishedAt *time.Time `json:"publishedAt"` + IsActive *bool `json:"isActive"` Pagination *paginator.Pagination `json:"pagination"` } type MagazineFilesCreateRequest struct { Title string `json:"title" validate:"required"` Description string `json:"description" validate:"required"` - MagazineId uint `json:"magazine_id" validate:"required"` - StatusId int `json:"status_id" validate:"required"` - DownloadCount *int `json:"download_count"` + MagazineId uint `json:"magazineId" validate:"required"` + StatusId int `json:"statusId" validate:"required"` + DownloadCount *int `json:"downloadCount"` FilePath *string `json:"filePath"` FileUrl *string `json:"fileUrl"` FileName *string `json:"fileName"` @@ -35,8 +36,8 @@ type MagazineFilesCreateRequest struct { WidthPixel *string `json:"widthPixel"` HeightPixel *string `json:"heightPixel"` Size *string `json:"size"` - IsPublish *bool `json:"is_publish"` - PublishedAt *time.Time `json:"published_at"` + IsPublish *bool `json:"isPublish"` + PublishedAt *time.Time `json:"publishedAt"` } func (req MagazineFilesCreateRequest) ToEntity() *entity.MagazineFiles { @@ -62,9 +63,9 @@ type MagazineFilesUpdateRequest struct { ID uint `json:"id" validate:"required"` Title string `json:"title" validate:"required"` Description string `json:"description" validate:"required"` - MagazineId uint `json:"magazine_id" validate:"required"` - DownloadCount *int `json:"download_count" validate:"required"` - StatusId int `json:"status_id" validate:"required"` + MagazineId uint `json:"magazineId" validate:"required"` + StatusId int `json:"statusId" validate:"required"` + DownloadCount *int `json:"downloadCount"` FilePath *string `json:"filePath"` FileUrl *string `json:"fileUrl"` FileName *string `json:"fileName"` @@ -72,8 +73,8 @@ type MagazineFilesUpdateRequest struct { WidthPixel *string `json:"widthPixel"` HeightPixel *string `json:"heightPixel"` Size *string `json:"size"` - IsPublish *bool `json:"is_publish"` - PublishedAt *time.Time `json:"published_at"` + IsPublish *bool `json:"isPublish"` + PublishedAt *time.Time `json:"publishedAt"` } func (req MagazineFilesUpdateRequest) ToEntity() *entity.MagazineFiles { @@ -95,3 +96,42 @@ func (req MagazineFilesUpdateRequest) ToEntity() *entity.MagazineFiles { PublishedAt: req.PublishedAt, } } + +type MagazineFilesQueryRequestContext struct { + Title string `json:"title"` + Description string `json:"description"` + MagazineId string `json:"magazineId"` + IsPublish string `json:"isPublish"` + StatusId string `json:"statusId"` +} + +func (req MagazineFilesQueryRequestContext) ToParamRequest() MagazineFilesQueryRequest { + var request MagazineFilesQueryRequest + + if title := req.Title; title != "" { + request.Title = &title + } + if description := req.Description; description != "" { + request.Description = &description + } + if magazineIdStr := req.MagazineId; magazineIdStr != "" { + magazineId, err := strconv.Atoi(magazineIdStr) + if err == nil { + request.MagazineId = &magazineId + } + } + if isPublishStr := req.IsPublish; isPublishStr != "" { + isPublish, err := strconv.ParseBool(isPublishStr) + if err == nil { + request.IsPublish = &isPublish + } + } + if statusIdStr := req.StatusId; statusIdStr != "" { + statusId, err := strconv.Atoi(statusIdStr) + if err == nil { + request.StatusId = &statusId + } + } + + return request +} diff --git a/app/module/magazines/controller/magazines.controller.go b/app/module/magazines/controller/magazines.controller.go index 14901c3..8c42942 100644 --- a/app/module/magazines/controller/magazines.controller.go +++ b/app/module/magazines/controller/magazines.controller.go @@ -45,7 +45,14 @@ func (_i *magazinesController) All(c *fiber.Ctx) error { return err } - var req request.MagazinesQueryRequest + reqContext := request.MagazinesQueryRequestContext{ + Title: c.Query("title"), + Description: c.Query("description"), + CreatedById: c.Query("createdById"), + StatusId: c.Query("statusId"), + IsPublish: c.Query("isPublish"), + } + req := reqContext.ToParamRequest() req.Pagination = paginate magazinesData, paging, err := _i.magazinesService.All(req) diff --git a/app/module/magazines/repository/magazines.repository.go b/app/module/magazines/repository/magazines.repository.go index ddbec12..8403f46 100644 --- a/app/module/magazines/repository/magazines.repository.go +++ b/app/module/magazines/repository/magazines.repository.go @@ -1,10 +1,12 @@ package repository import ( + "fmt" "go-humas-be/app/database" "go-humas-be/app/database/entity" "go-humas-be/app/module/magazines/request" "go-humas-be/utils/paginator" + "strings" ) type magazinesRepository struct { @@ -31,8 +33,35 @@ func (_i *magazinesRepository) GetAll(req request.MagazinesQueryRequest) (magazi var count int64 query := _i.DB.DB.Model(&entity.Magazines{}) + query = query.Where("is_active = ?", true) + + if req.Title != nil && *req.Title != "" { + title := strings.ToLower(*req.Title) + query = query.Where("LOWER(title) LIKE ?", "%"+strings.ToLower(title)+"%") + } + if req.Description != nil && *req.Description != "" { + description := strings.ToLower(*req.Description) + query = query.Where("LOWER(description) LIKE ?", "%"+strings.ToLower(description)+"%") + } + if req.CreatedById != nil { + query = query.Where("created_by_id = ?", req.CreatedById) + } + if req.IsPublish != nil { + query = query.Where("is_publish = ?", req.IsPublish) + } + if req.StatusId != nil { + query = query.Where("status_id = ?", req.StatusId) + } query.Count(&count) + if req.Pagination.SortBy != "" { + direction := "ASC" + if req.Pagination.Sort == "desc" { + direction = "DESC" + } + query.Order(fmt.Sprintf("%s %s", req.Pagination.SortBy, direction)) + } + req.Pagination.Count = count req.Pagination = paginator.Paging(req.Pagination) @@ -66,4 +95,4 @@ func (_i *magazinesRepository) Update(id uint, magazines *entity.Magazines) (err func (_i *magazinesRepository) Delete(id uint) error { return _i.DB.DB.Delete(&entity.Magazines{}, id).Error -} \ No newline at end of file +} diff --git a/app/module/magazines/request/magazines.request.go b/app/module/magazines/request/magazines.request.go index 2721836..6ea34d3 100644 --- a/app/module/magazines/request/magazines.request.go +++ b/app/module/magazines/request/magazines.request.go @@ -3,6 +3,7 @@ package request import ( "go-humas-be/app/database/entity" "go-humas-be/utils/paginator" + "strconv" "time" ) @@ -11,30 +12,28 @@ type MagazinesGeneric interface { } type MagazinesQueryRequest struct { - Title string `json:"title" validate:"required"` - Description string `json:"description" validate:"required"` - ThumbnailPath string `json:"thumbnail_path" validate:"required"` - ThumbnailUrl string `json:"thumbnail_url" validate:"required"` - PageUrl string `json:"page_url" validate:"required"` - CreatedById int `json:"created_by_id" validate:"required"` - StatusId int `json:"status_id" validate:"required"` - IsPublish bool `json:"is_publish" validate:"required"` - PublishedAt time.Time `json:"published_at" validate:"required"` - IsActive bool `json:"is_active" validate:"required"` + Title *string `json:"title"` + Description *string `json:"description"` + ThumbnailPath *string `json:"thumbnailPath"` + ThumbnailUrl *string `json:"thumbnailUrl"` + PageUrl *string `json:"pageUrl"` + CreatedById *int `json:"createdById"` + StatusId *int `json:"statusId"` + IsPublish *bool `json:"isPublish"` Pagination *paginator.Pagination `json:"pagination"` } type MagazinesCreateRequest struct { Title string `json:"title" validate:"required"` Description string `json:"description" validate:"required"` - ThumbnailPath string `json:"thumbnail_path" validate:"required"` - ThumbnailUrl string `json:"thumbnail_url" validate:"required"` - PageUrl string `json:"page_url" validate:"required"` - CreatedById int `json:"created_by_id" validate:"required"` - StatusId int `json:"status_id" validate:"required"` - IsPublish bool `json:"is_publish" validate:"required"` - PublishedAt time.Time `json:"published_at" validate:"required"` - IsActive bool `json:"is_active" validate:"required"` + ThumbnailPath string `json:"thumbnailPath" validate:"required"` + ThumbnailUrl string `json:"thumbnailUrl" validate:"required"` + PageUrl string `json:"pageUrl" validate:"required"` + CreatedById *uint `json:"createdById" validate:"required"` + StatusId int `json:"statusId" validate:"required"` + IsPublish bool `json:"isPublish" validate:"required"` + PublishedAt time.Time `json:"publishedAt" validate:"required"` + IsActive bool `json:"isActive" validate:"required"` } func (req MagazinesCreateRequest) ToEntity() *entity.Magazines { @@ -56,16 +55,16 @@ type MagazinesUpdateRequest struct { ID uint `json:"id" validate:"required"` Title string `json:"title" validate:"required"` Description string `json:"description" validate:"required"` - ThumbnailPath string `json:"thumbnail_path" validate:"required"` - ThumbnailUrl string `json:"thumbnail_url" validate:"required"` - PageUrl string `json:"page_url" validate:"required"` - CreatedById int `json:"created_by_id" validate:"required"` - StatusId int `json:"status_id" validate:"required"` - IsPublish bool `json:"is_publish" validate:"required"` - PublishedAt time.Time `json:"published_at" validate:"required"` - IsActive bool `json:"is_active" validate:"required"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` + ThumbnailPath string `json:"thumbnailPath" validate:"required"` + ThumbnailUrl string `json:"thumbnailUrl" validate:"required"` + PageUrl string `json:"pageUrl" validate:"required"` + CreatedById *uint `json:"createdById" validate:"required"` + StatusId int `json:"statusId" validate:"required"` + IsPublish bool `json:"isPublish" validate:"required"` + PublishedAt time.Time `json:"publishedAt" validate:"required"` + IsActive bool `json:"isActive" validate:"required"` + CreatedAt time.Time `json:"createdAt"` + UpdatedAt time.Time `json:"updatedAt"` } func (req MagazinesUpdateRequest) ToEntity() *entity.Magazines { @@ -85,3 +84,42 @@ func (req MagazinesUpdateRequest) ToEntity() *entity.Magazines { UpdatedAt: req.UpdatedAt, } } + +type MagazinesQueryRequestContext struct { + Title string `json:"title"` + Description string `json:"description"` + CreatedById string `json:"createdById"` + IsPublish string `json:"isPublish"` + StatusId string `json:"statusId"` +} + +func (req MagazinesQueryRequestContext) ToParamRequest() MagazinesQueryRequest { + var request MagazinesQueryRequest + + if title := req.Title; title != "" { + request.Title = &title + } + if description := req.Description; description != "" { + request.Description = &description + } + if isPublishStr := req.IsPublish; isPublishStr != "" { + isPublish, err := strconv.ParseBool(isPublishStr) + if err == nil { + request.IsPublish = &isPublish + } + } + if statusIdStr := req.StatusId; statusIdStr != "" { + statusId, err := strconv.Atoi(statusIdStr) + if err == nil { + request.StatusId = &statusId + } + } + if createdByIdStr := req.CreatedById; createdByIdStr != "" { + createdById, err := strconv.Atoi(createdByIdStr) + if err == nil { + request.CreatedById = &createdById + } + } + + return request +}