feat: update article files response

This commit is contained in:
hanif salafi 2024-05-07 14:48:46 +07:00
parent 116433b2f0
commit b36fb3455a
7 changed files with 114 additions and 73 deletions

View File

@ -3,22 +3,22 @@ package entity
import "time" import "time"
type ArticleFiles struct { type ArticleFiles struct {
ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"` ID uint `json:"id" gorm:"primaryKey;type:int4;autoIncrement"`
ArticleId uint `json:"article_id" gorm:"type:int4"` ArticleId uint `json:"article_id" gorm:"type:int4"`
FilePath string `json:"file_path" gorm:"type:varchar"` FilePath *string `json:"file_path" gorm:"type:varchar"`
FileUrl string `json:"file_url" gorm:"type:varchar"` FileUrl *string `json:"file_url" gorm:"type:varchar"`
FileName string `json:"file_name" gorm:"type:varchar"` FileName *string `json:"file_name" gorm:"type:varchar"`
FileThumbnail string `json:"file_thumbnail" gorm:"type:varchar"` FileThumbnail *string `json:"file_thumbnail" gorm:"type:varchar"`
FileAlt string `json:"file_alt" gorm:"type:varchar"` FileAlt *string `json:"file_alt" gorm:"type:varchar"`
WidthPixel string `json:"width_pixel" gorm:"type:varchar"` WidthPixel *string `json:"width_pixel" gorm:"type:varchar"`
HeightPixel string `json:"height_pixel" gorm:"type:varchar"` HeightPixel *string `json:"height_pixel" gorm:"type:varchar"`
Size string `json:"size" gorm:"type:varchar"` Size *string `json:"size" gorm:"type:varchar"`
DownloadCount int `json:"download_count" gorm:"type:int4"` DownloadCount *int `json:"download_count" gorm:"type:int4"`
CreatedById int `json:"created_by_id" gorm:"type:int4"` CreatedById int `json:"created_by_id" gorm:"type:int4"`
StatusId int `json:"status_id" gorm:"type:int4"` StatusId int `json:"status_id" gorm:"type:int4"`
IsPublish bool `json:"is_publish" gorm:"type:bool;default:false"` IsPublish *bool `json:"is_publish" gorm:"type:bool;default:false"`
PublishedAt time.Time `json:"published_at" gorm:"type:timestamp"` PublishedAt *time.Time `json:"published_at" gorm:"type:timestamp"`
IsActive bool `json:"is_active" gorm:"type:bool;default:true"` IsActive bool `json:"is_active" gorm:"type:bool;default:true"`
CreatedAt time.Time `json:"created_at" gorm:"default:now()"` CreatedAt time.Time `json:"created_at" gorm:"default:now()"`
UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"` UpdatedAt time.Time `json:"updated_at" gorm:"default:now()"`
} }

View File

@ -6,26 +6,31 @@ import (
) )
func ArticleFilesResponseMapper(articleFilesReq *entity.ArticleFiles) (articleFilesRes *res.ArticleFilesResponse) { func ArticleFilesResponseMapper(articleFilesReq *entity.ArticleFiles) (articleFilesRes *res.ArticleFilesResponse) {
fileUrl := "/article-files/viewer/"
if articleFilesReq.FileName != nil {
fileUrl += *articleFilesReq.FileName
}
if articleFilesReq != nil { if articleFilesReq != nil {
articleFilesRes = &res.ArticleFilesResponse{ articleFilesRes = &res.ArticleFilesResponse{
ID: articleFilesReq.ID, ID: articleFilesReq.ID,
ArticleId: articleFilesReq.ArticleId, ArticleId: articleFilesReq.ArticleId,
FilePath: articleFilesReq.FilePath, FilePath: *articleFilesReq.FilePath,
FileUrl: articleFilesReq.FileUrl, FileUrl: fileUrl,
FileName: articleFilesReq.FileName, FileName: *articleFilesReq.FileName,
FileThumbnail: articleFilesReq.FileThumbnail, FileThumbnail: *articleFilesReq.FileThumbnail,
FileAlt: articleFilesReq.FileAlt, FileAlt: *articleFilesReq.FileAlt,
WidthPixel: articleFilesReq.WidthPixel, WidthPixel: articleFilesReq.WidthPixel,
HeightPixel: articleFilesReq.HeightPixel, HeightPixel: articleFilesReq.HeightPixel,
Size: articleFilesReq.Size, Size: articleFilesReq.Size,
DownloadCount: articleFilesReq.DownloadCount, DownloadCount: articleFilesReq.DownloadCount,
CreatedById: articleFilesReq.CreatedById, CreatedById: articleFilesReq.CreatedById,
StatusId: articleFilesReq.StatusId, StatusId: articleFilesReq.StatusId,
IsPublish: articleFilesReq.IsPublish, IsPublish: articleFilesReq.IsPublish,
PublishedAt: articleFilesReq.PublishedAt, PublishedAt: articleFilesReq.PublishedAt,
IsActive: articleFilesReq.IsActive, IsActive: articleFilesReq.IsActive,
CreatedAt: articleFilesReq.CreatedAt, CreatedAt: articleFilesReq.CreatedAt,
UpdatedAt: articleFilesReq.UpdatedAt, UpdatedAt: articleFilesReq.UpdatedAt,
} }
} }
return articleFilesRes return articleFilesRes

View File

@ -17,6 +17,7 @@ type articleFilesRepository struct {
type ArticleFilesRepository interface { type ArticleFilesRepository interface {
GetAll(req request.ArticleFilesQueryRequest) (articleFiless []*entity.ArticleFiles, paging paginator.Pagination, err error) GetAll(req request.ArticleFilesQueryRequest) (articleFiless []*entity.ArticleFiles, paging paginator.Pagination, err error)
FindOne(id uint) (articleFiles *entity.ArticleFiles, err error) FindOne(id uint) (articleFiles *entity.ArticleFiles, err error)
FindByArticle(articleId uint) (articleFiles []*entity.ArticleFiles, err error)
Create(articleFiles *entity.ArticleFiles) (err error) Create(articleFiles *entity.ArticleFiles) (err error)
Update(id uint, articleFiles *entity.ArticleFiles) (err error) Update(id uint, articleFiles *entity.ArticleFiles) (err error)
Delete(id uint) (err error) Delete(id uint) (err error)
@ -79,6 +80,14 @@ func (_i *articleFilesRepository) FindOne(id uint) (articleFiles *entity.Article
return articleFiles, nil return articleFiles, nil
} }
func (_i *articleFilesRepository) FindByArticle(articleId uint) (articleFiles []*entity.ArticleFiles, err error) {
if err := _i.DB.DB.Where("article_id = ?", articleId).Find(&articleFiles).Error; err != nil {
return nil, err
}
return articleFiles, nil
}
func (_i *articleFilesRepository) Create(articleFiles *entity.ArticleFiles) (err error) { func (_i *articleFilesRepository) Create(articleFiles *entity.ArticleFiles) (err error) {
return _i.DB.DB.Create(articleFiles).Error return _i.DB.DB.Create(articleFiles).Error
} }

View File

@ -20,17 +20,16 @@ type ArticleFilesQueryRequest struct {
} }
type ArticleFilesCreateRequest struct { type ArticleFilesCreateRequest struct {
ArticleId uint `json:"articleId" validate:"required"` ArticleId uint `json:"articleId" validate:"required"`
FilePath string `json:"filePath" validate:"required"` StatusId int `json:"statusId" validate:"required"`
FileUrl string `json:"fileUrl" validate:"required"` FilePath *string `json:"filePath"`
FileName string `json:"fileName" validate:"required"` FileUrl *string `json:"fileUrl"`
FileThumbnail string `json:"fileThumbnail" validate:"required"` FileName *string `json:"fileName"`
FileAlt string `json:"fileAlt" validate:"required"` FileThumbnail *string `json:"fileThumbnail"`
WidthPixel string `json:"widthPixel" validate:"required"` FileAlt *string `json:"fileAlt"`
HeightPixel string `json:"heightPixel" validate:"required"` WidthPixel *string `json:"widthPixel"`
Size string `json:"size" validate:"required"` HeightPixel *string `json:"heightPixel"`
DownloadCount int `json:"downloadCount" validate:"required"` Size *string `json:"size"`
StatusId int `json:"statusId" validate:"required"`
} }
func (req ArticleFilesCreateRequest) ToEntity() *entity.ArticleFiles { func (req ArticleFilesCreateRequest) ToEntity() *entity.ArticleFiles {
@ -44,28 +43,24 @@ func (req ArticleFilesCreateRequest) ToEntity() *entity.ArticleFiles {
WidthPixel: req.WidthPixel, WidthPixel: req.WidthPixel,
HeightPixel: req.HeightPixel, HeightPixel: req.HeightPixel,
Size: req.Size, Size: req.Size,
DownloadCount: req.DownloadCount,
StatusId: req.StatusId, StatusId: req.StatusId,
IsPublish: false,
} }
} }
type ArticleFilesUpdateRequest struct { type ArticleFilesUpdateRequest struct {
ID uint `json:"id" validate:"required"` ID uint `json:"id" validate:"required"`
ArticleId uint `json:"articleId" validate:"required"` ArticleId uint `json:"articleId" validate:"required"`
FilePath string `json:"filePath" validate:"required"` StatusId int `json:"statusId" validate:"required"`
FileUrl string `json:"fileUrl" validate:"required"` FilePath *string `json:"filePath"`
FileName string `json:"fileName" validate:"required"` FileUrl *string `json:"fileUrl"`
FileThumbnail string `json:"fileThumbnail" validate:"required"` FileName *string `json:"fileName"`
FileAlt string `json:"fileAlt" validate:"required"` FileThumbnail *string `json:"fileThumbnail"`
WidthPixel string `json:"widthPixel" validate:"required"` FileAlt *string `json:"fileAlt"`
HeightPixel string `json:"heightPixel" validate:"required"` WidthPixel *string `json:"widthPixel"`
Size string `json:"size" validate:"required"` HeightPixel *string `json:"heightPixel"`
DownloadCount int `json:"downloadCount" validate:"required"` Size *string `json:"size"`
CreatedById int `json:"createdById" validate:"required"` IsPublish *bool `json:"isPublish" validate:"required"`
StatusId int `json:"statusId" validate:"required"` PublishedAt *time.Time `json:"publishedAt" validate:"required"`
IsPublish bool `json:"isPublish" validate:"required"`
PublishedAt time.Time `json:"publishedAt" validate:"required"`
} }
func (req ArticleFilesUpdateRequest) ToEntity() *entity.ArticleFiles { func (req ArticleFilesUpdateRequest) ToEntity() *entity.ArticleFiles {
@ -80,8 +75,6 @@ func (req ArticleFilesUpdateRequest) ToEntity() *entity.ArticleFiles {
WidthPixel: req.WidthPixel, WidthPixel: req.WidthPixel,
HeightPixel: req.HeightPixel, HeightPixel: req.HeightPixel,
Size: req.Size, Size: req.Size,
DownloadCount: req.DownloadCount,
CreatedById: req.CreatedById,
StatusId: req.StatusId, StatusId: req.StatusId,
IsPublish: req.IsPublish, IsPublish: req.IsPublish,
PublishedAt: req.PublishedAt, PublishedAt: req.PublishedAt,

View File

@ -104,13 +104,14 @@ func (_i *articleFilesService) Save(c *fiber.Ctx, id uint) (err error) {
objectName := "articles/upload/" + file.Filename objectName := "articles/upload/" + file.Filename
filenameOnly := file.Filename[:len(file.Filename)-len(filepath.Ext(file.Filename))] filenameOnly := file.Filename[:len(file.Filename)-len(filepath.Ext(file.Filename))]
fileSize := strconv.FormatInt(file.Size, 10)
req := request.ArticleFilesCreateRequest{ req := request.ArticleFilesCreateRequest{
ArticleId: id, ArticleId: id,
FilePath: objectName, FilePath: &objectName,
FileName: file.Filename, FileName: &file.Filename,
FileAlt: filenameOnly, FileAlt: &filenameOnly,
Size: strconv.FormatInt(file.Size, 10), Size: &fileSize,
} }
err = _i.Repo.Create(req.ToEntity()) err = _i.Repo.Create(req.ToEntity())
@ -154,7 +155,7 @@ func (_i *articleFilesService) Viewer(c *fiber.Ctx, id uint) (err error) {
ctx := context.Background() ctx := context.Background()
bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName
objectName := result.FilePath objectName := *result.FilePath
_i.Log.Info().Str("timestamp", time.Now(). _i.Log.Info().Str("timestamp", time.Now().
Format(time.RFC3339)).Str("Service:Resource", "Article:Uploads"). Format(time.RFC3339)).Str("Service:Resource", "Article:Uploads").

View File

@ -2,14 +2,38 @@ package mapper
import ( import (
"go-humas-be/app/database/entity" "go-humas-be/app/database/entity"
articleFilesMapper "go-humas-be/app/module/article_files/mapper"
articleFilesRepository "go-humas-be/app/module/article_files/repository"
articleFilesResponse "go-humas-be/app/module/article_files/response"
res "go-humas-be/app/module/articles/response" res "go-humas-be/app/module/articles/response"
usersRepository "go-humas-be/app/module/users/repository"
) )
func ArticlesResponseMapper(articlesReq *entity.Articles) (articlesRes *res.ArticlesResponse) { func ArticlesResponseMapper(
articlesReq *entity.Articles,
articleFilesRepo articleFilesRepository.ArticleFilesRepository,
usersRepo usersRepository.UsersRepository,
) (articlesRes *res.ArticlesResponse) {
thumbnailUrl := "/articles/thumbnail/viewer/" thumbnailUrl := "/articles/thumbnail/viewer/"
if articlesReq.ThumbnailName != nil { if articlesReq.ThumbnailName != nil {
thumbnailUrl += *articlesReq.ThumbnailName thumbnailUrl += *articlesReq.ThumbnailName
} }
findUser, _ := usersRepo.FindOne(*articlesReq.CreatedById)
createdByName := ""
if findUser != nil {
createdByName = findUser.Fullname
}
articleFiles, _ := articleFilesRepo.FindByArticle(articlesReq.ID)
var articleFilesArr []*articleFilesResponse.ArticleFilesResponse
if len(articleFiles) > 0 {
for _, result := range articleFiles {
articleFilesArr = append(articleFilesArr, articleFilesMapper.ArticleFilesResponseMapper(result))
}
}
if articlesReq != nil { if articlesReq != nil {
articlesRes = &res.ArticlesResponse{ articlesRes = &res.ArticlesResponse{
ID: articlesReq.ID, ID: articlesReq.ID,
@ -22,6 +46,7 @@ func ArticlesResponseMapper(articlesReq *entity.Articles) (articlesRes *res.Arti
ThumbnailUrl: thumbnailUrl, ThumbnailUrl: thumbnailUrl,
PageUrl: articlesReq.PageUrl, PageUrl: articlesReq.PageUrl,
CreatedById: articlesReq.CreatedById, CreatedById: articlesReq.CreatedById,
CreatedByName: &createdByName,
ShareCount: articlesReq.ShareCount, ShareCount: articlesReq.ShareCount,
ViewCount: articlesReq.ViewCount, ViewCount: articlesReq.ViewCount,
DownloadCount: articlesReq.DownloadCount, DownloadCount: articlesReq.DownloadCount,
@ -31,6 +56,8 @@ func ArticlesResponseMapper(articlesReq *entity.Articles) (articlesRes *res.Arti
IsActive: articlesReq.IsActive, IsActive: articlesReq.IsActive,
CreatedAt: articlesReq.CreatedAt, CreatedAt: articlesReq.CreatedAt,
UpdatedAt: articlesReq.UpdatedAt, UpdatedAt: articlesReq.UpdatedAt,
ArticleFiles: articleFilesArr,
} }
} }
return articlesRes return articlesRes

View File

@ -1,6 +1,9 @@
package response package response
import "time" import (
articleFilesResponse "go-humas-be/app/module/article_files/response"
"time"
)
type ArticlesResponse struct { type ArticlesResponse struct {
ID uint `json:"id"` ID uint `json:"id"`
@ -15,6 +18,7 @@ type ArticlesResponse struct {
ThumbnailUrl string `json:"thumbnailUrl"` ThumbnailUrl string `json:"thumbnailUrl"`
PageUrl *string `json:"pageUrl"` PageUrl *string `json:"pageUrl"`
CreatedById *uint `json:"createdById"` CreatedById *uint `json:"createdById"`
CreatedByName *string `json:"createdByName"`
ShareCount *int `json:"shareSount"` ShareCount *int `json:"shareSount"`
ViewCount *int `json:"viewCount"` ViewCount *int `json:"viewCount"`
DownloadCount *int `json:"downloadCount"` DownloadCount *int `json:"downloadCount"`
@ -24,4 +28,6 @@ type ArticlesResponse 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"`
ArticleFiles []*articleFilesResponse.ArticleFilesResponse `json:"files"`
} }