feat: update article files response
This commit is contained in:
parent
116433b2f0
commit
b36fb3455a
|
|
@ -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()"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,27 +6,32 @@ 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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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").
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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"`
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue