feat: update article files response

This commit is contained in:
hanif salafi 2024-05-07 14:48:46 +07:00
parent 0127b2fbda
commit 93adfdd217
7 changed files with 114 additions and 73 deletions

View File

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

View File

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

View File

@ -17,6 +17,7 @@ type articleFilesRepository struct {
type ArticleFilesRepository interface {
GetAll(req request.ArticleFilesQueryRequest) (articleFiless []*entity.ArticleFiles, paging paginator.Pagination, err error)
FindOne(id uint) (articleFiles *entity.ArticleFiles, err error)
FindByArticle(articleId uint) (articleFiles []*entity.ArticleFiles, err error)
Create(articleFiles *entity.ArticleFiles) (err error)
Update(id uint, articleFiles *entity.ArticleFiles) (err error)
Delete(id uint) (err error)
@ -79,6 +80,14 @@ func (_i *articleFilesRepository) FindOne(id uint) (articleFiles *entity.Article
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) {
return _i.DB.DB.Create(articleFiles).Error
}

View File

@ -20,17 +20,16 @@ type ArticleFilesQueryRequest struct {
}
type ArticleFilesCreateRequest struct {
ArticleId uint `json:"articleId" validate:"required"`
FilePath string `json:"filePath" validate:"required"`
FileUrl string `json:"fileUrl" validate:"required"`
FileName string `json:"fileName" validate:"required"`
FileThumbnail string `json:"fileThumbnail" validate:"required"`
FileAlt string `json:"fileAlt" validate:"required"`
WidthPixel string `json:"widthPixel" validate:"required"`
HeightPixel string `json:"heightPixel" validate:"required"`
Size string `json:"size" validate:"required"`
DownloadCount int `json:"downloadCount" validate:"required"`
StatusId int `json:"statusId" validate:"required"`
ArticleId uint `json:"articleId" validate:"required"`
StatusId int `json:"statusId" validate:"required"`
FilePath *string `json:"filePath"`
FileUrl *string `json:"fileUrl"`
FileName *string `json:"fileName"`
FileThumbnail *string `json:"fileThumbnail"`
FileAlt *string `json:"fileAlt"`
WidthPixel *string `json:"widthPixel"`
HeightPixel *string `json:"heightPixel"`
Size *string `json:"size"`
}
func (req ArticleFilesCreateRequest) ToEntity() *entity.ArticleFiles {
@ -44,28 +43,24 @@ func (req ArticleFilesCreateRequest) ToEntity() *entity.ArticleFiles {
WidthPixel: req.WidthPixel,
HeightPixel: req.HeightPixel,
Size: req.Size,
DownloadCount: req.DownloadCount,
StatusId: req.StatusId,
IsPublish: false,
}
}
type ArticleFilesUpdateRequest struct {
ID uint `json:"id" validate:"required"`
ArticleId uint `json:"articleId" validate:"required"`
FilePath string `json:"filePath" validate:"required"`
FileUrl string `json:"fileUrl" validate:"required"`
FileName string `json:"fileName" validate:"required"`
FileThumbnail string `json:"fileThumbnail" validate:"required"`
FileAlt string `json:"fileAlt" validate:"required"`
WidthPixel string `json:"widthPixel" validate:"required"`
HeightPixel string `json:"heightPixel" validate:"required"`
Size string `json:"size" validate:"required"`
DownloadCount int `json:"downloadCount" validate:"required"`
CreatedById int `json:"createdById" validate:"required"`
StatusId int `json:"statusId" validate:"required"`
IsPublish bool `json:"isPublish" validate:"required"`
PublishedAt time.Time `json:"publishedAt" validate:"required"`
ID uint `json:"id" validate:"required"`
ArticleId uint `json:"articleId" validate:"required"`
StatusId int `json:"statusId" validate:"required"`
FilePath *string `json:"filePath"`
FileUrl *string `json:"fileUrl"`
FileName *string `json:"fileName"`
FileThumbnail *string `json:"fileThumbnail"`
FileAlt *string `json:"fileAlt"`
WidthPixel *string `json:"widthPixel"`
HeightPixel *string `json:"heightPixel"`
Size *string `json:"size"`
IsPublish *bool `json:"isPublish" validate:"required"`
PublishedAt *time.Time `json:"publishedAt" validate:"required"`
}
func (req ArticleFilesUpdateRequest) ToEntity() *entity.ArticleFiles {
@ -80,8 +75,6 @@ func (req ArticleFilesUpdateRequest) ToEntity() *entity.ArticleFiles {
WidthPixel: req.WidthPixel,
HeightPixel: req.HeightPixel,
Size: req.Size,
DownloadCount: req.DownloadCount,
CreatedById: req.CreatedById,
StatusId: req.StatusId,
IsPublish: req.IsPublish,
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
filenameOnly := file.Filename[:len(file.Filename)-len(filepath.Ext(file.Filename))]
fileSize := strconv.FormatInt(file.Size, 10)
req := request.ArticleFilesCreateRequest{
ArticleId: id,
FilePath: objectName,
FileName: file.Filename,
FileAlt: filenameOnly,
Size: strconv.FormatInt(file.Size, 10),
FilePath: &objectName,
FileName: &file.Filename,
FileAlt: &filenameOnly,
Size: &fileSize,
}
err = _i.Repo.Create(req.ToEntity())
@ -154,7 +155,7 @@ func (_i *articleFilesService) Viewer(c *fiber.Ctx, id uint) (err error) {
ctx := context.Background()
bucketName := _i.MinioStorage.Cfg.ObjectStorage.MinioStorage.BucketName
objectName := result.FilePath
objectName := *result.FilePath
_i.Log.Info().Str("timestamp", time.Now().
Format(time.RFC3339)).Str("Service:Resource", "Article:Uploads").

View File

@ -2,14 +2,38 @@ package mapper
import (
"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"
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/"
if articlesReq.ThumbnailName != nil {
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 {
articlesRes = &res.ArticlesResponse{
ID: articlesReq.ID,
@ -22,6 +46,7 @@ func ArticlesResponseMapper(articlesReq *entity.Articles) (articlesRes *res.Arti
ThumbnailUrl: thumbnailUrl,
PageUrl: articlesReq.PageUrl,
CreatedById: articlesReq.CreatedById,
CreatedByName: &createdByName,
ShareCount: articlesReq.ShareCount,
ViewCount: articlesReq.ViewCount,
DownloadCount: articlesReq.DownloadCount,
@ -31,6 +56,8 @@ func ArticlesResponseMapper(articlesReq *entity.Articles) (articlesRes *res.Arti
IsActive: articlesReq.IsActive,
CreatedAt: articlesReq.CreatedAt,
UpdatedAt: articlesReq.UpdatedAt,
ArticleFiles: articleFilesArr,
}
}
return articlesRes

View File

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