diff --git a/app/database/entity/article_files.entity.go b/app/database/entity/article_files.entity.go index 45f110a..4757937 100644 --- a/app/database/entity/article_files.entity.go +++ b/app/database/entity/article_files.entity.go @@ -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()"` } diff --git a/app/module/article_files/mapper/article_files.mapper.go b/app/module/article_files/mapper/article_files.mapper.go index f1a079b..c11e410 100644 --- a/app/module/article_files/mapper/article_files.mapper.go +++ b/app/module/article_files/mapper/article_files.mapper.go @@ -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 -} \ No newline at end of file +} diff --git a/app/module/article_files/repository/article_files.repository.go b/app/module/article_files/repository/article_files.repository.go index 6291ebb..3b96db7 100644 --- a/app/module/article_files/repository/article_files.repository.go +++ b/app/module/article_files/repository/article_files.repository.go @@ -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 } diff --git a/app/module/article_files/request/article_files.request.go b/app/module/article_files/request/article_files.request.go index d7650ee..b3b90f7 100644 --- a/app/module/article_files/request/article_files.request.go +++ b/app/module/article_files/request/article_files.request.go @@ -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, diff --git a/app/module/article_files/service/article_files.service.go b/app/module/article_files/service/article_files.service.go index 2269c74..b688fe7 100644 --- a/app/module/article_files/service/article_files.service.go +++ b/app/module/article_files/service/article_files.service.go @@ -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"). diff --git a/app/module/articles/mapper/articles.mapper.go b/app/module/articles/mapper/articles.mapper.go index ae829a0..370a31f 100644 --- a/app/module/articles/mapper/articles.mapper.go +++ b/app/module/articles/mapper/articles.mapper.go @@ -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 diff --git a/app/module/articles/response/articles.response.go b/app/module/articles/response/articles.response.go index 6bcdbc9..71d09b2 100644 --- a/app/module/articles/response/articles.response.go +++ b/app/module/articles/response/articles.response.go @@ -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"` }