feat: fixing article files upload + viewer

This commit is contained in:
hanif salafi 2024-05-08 00:56:49 +07:00
parent 3b05b665c3
commit 7e9041d58b
7 changed files with 37 additions and 16 deletions

View File

@ -13,7 +13,7 @@ type ArticleFiles struct {
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;default:0"`
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"`

View File

@ -49,6 +49,6 @@ func (_i *ArticleFilesRouter) RegisterArticleFilesRoutes() {
router.Post("/:articleId", articleFilesController.Save) router.Post("/:articleId", articleFilesController.Save)
router.Put("/:id", articleFilesController.Update) router.Put("/:id", articleFilesController.Update)
router.Delete("/:id", articleFilesController.Delete) router.Delete("/:id", articleFilesController.Delete)
router.Get("/viewer/:id", articleFilesController.Viewer) router.Get("/viewer/:filename", articleFilesController.Viewer)
}) })
} }

View File

@ -195,16 +195,12 @@ func (_i *articleFilesController) Delete(c *fiber.Ctx) error {
// @Description API for create ArticleFiles // @Description API for create ArticleFiles
// @Tags Article Files // @Tags Article Files
// @Security Bearer // @Security Bearer
// @Param id path string true "Article File ID" // @Param filename path string true "Article File Name"
// @Success 200 {object} response.Response // @Success 200 {object} response.Response
// @Failure 400 {object} response.BadRequestError // @Failure 400 {object} response.BadRequestError
// @Failure 401 {object} response.UnauthorizedError // @Failure 401 {object} response.UnauthorizedError
// @Failure 500 {object} response.InternalServerError // @Failure 500 {object} response.InternalServerError
// @Router /article-files/viewer/{id} [get] // @Router /article-files/viewer/{filename} [get]
func (_i *articleFilesController) Viewer(c *fiber.Ctx) error { func (_i *articleFilesController) Viewer(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 0) return _i.articleFilesService.Viewer(c)
if err != nil {
return err
}
return _i.articleFilesService.Viewer(c, uint(id))
} }

View File

@ -18,6 +18,7 @@ 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) FindByArticle(articleId uint) (articleFiles []*entity.ArticleFiles, err error)
FindByFilename(filename string) (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)
@ -88,6 +89,15 @@ func (_i *articleFilesRepository) FindByArticle(articleId uint) (articleFiles []
return articleFiles, nil return articleFiles, nil
} }
func (_i *articleFilesRepository) FindByFilename(articleFilename string) (articleFiles *entity.ArticleFiles, err error) {
if err := _i.DB.DB.Where("file_name = ?", articleFilename).First(&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

@ -13,6 +13,7 @@ import (
"go-humas-be/utils/paginator" "go-humas-be/utils/paginator"
"io" "io"
"log" "log"
"math/rand"
"mime" "mime"
"path/filepath" "path/filepath"
"strconv" "strconv"
@ -34,7 +35,7 @@ type ArticleFilesService interface {
Save(c *fiber.Ctx, id uint) error Save(c *fiber.Ctx, id uint) error
Update(id uint, req request.ArticleFilesUpdateRequest) (err error) Update(id uint, req request.ArticleFilesUpdateRequest) (err error)
Delete(id uint) error Delete(id uint) error
Viewer(c *fiber.Ctx, id uint) error Viewer(c *fiber.Ctx) error
} }
// NewArticleFilesService init ArticleFilesService // NewArticleFilesService init ArticleFilesService
@ -102,15 +103,26 @@ func (_i *articleFilesService) Save(c *fiber.Ctx, id uint) (err error) {
} }
defer src.Close() defer src.Close()
objectName := "articles/upload/" + file.Filename filename := filepath.Base(file.Filename)
filenameOnly := file.Filename[:len(file.Filename)-len(filepath.Ext(file.Filename))] filenameAlt := filepath.Clean(filename[:len(filename)-len(filepath.Ext(filename))])
filename = strings.ReplaceAll(filename, " ", "")
filenameWithoutExt := filepath.Clean(filename[:len(filename)-len(filepath.Ext(filename))])
extension := filepath.Ext(file.Filename)[1:]
rand.New(rand.NewSource(time.Now().UnixNano()))
randUniqueId := rand.Intn(1000000)
newFilenameWithoutExt := filenameWithoutExt + "_" + strconv.Itoa(randUniqueId)
newFilename := newFilenameWithoutExt + "." + extension
objectName := "articles/upload/" + newFilename
fileSize := strconv.FormatInt(file.Size, 10) fileSize := strconv.FormatInt(file.Size, 10)
req := request.ArticleFilesCreateRequest{ req := request.ArticleFilesCreateRequest{
ArticleId: id, ArticleId: id,
FilePath: &objectName, FilePath: &objectName,
FileName: &file.Filename, FileName: &newFilename,
FileAlt: &filenameOnly, FileAlt: &filenameAlt,
Size: &fileSize, Size: &fileSize,
} }
@ -147,8 +159,9 @@ func (_i *articleFilesService) Delete(id uint) error {
return _i.Repo.Update(id, result) return _i.Repo.Update(id, result)
} }
func (_i *articleFilesService) Viewer(c *fiber.Ctx, id uint) (err error) { func (_i *articleFilesService) Viewer(c *fiber.Ctx) (err error) {
result, err := _i.Repo.FindOne(id) filename := c.Params("filename")
result, err := _i.Repo.FindByFilename(filename)
if err != nil { if err != nil {
return err return err
} }

View File

@ -144,6 +144,7 @@ func (_i *articlesService) SaveThumbnail(c *fiber.Ctx) (err error) {
defer src.Close() defer src.Close()
filename := filepath.Base(file.Filename) filename := filepath.Base(file.Filename)
filename = strings.ReplaceAll(filename, " ", "")
filenameWithoutExt := filepath.Clean(filename[:len(filename)-len(filepath.Ext(filename))]) filenameWithoutExt := filepath.Clean(filename[:len(filename)-len(filepath.Ext(filename))])
extension := filepath.Ext(file.Filename)[1:] extension := filepath.Ext(file.Filename)[1:]

View File

@ -149,6 +149,7 @@ func (_i *ppidDataCategoriesService) SaveThumbnail(c *fiber.Ctx) (err error) {
defer src.Close() defer src.Close()
filename := filepath.Base(file.Filename) filename := filepath.Base(file.Filename)
filename = strings.ReplaceAll(filename, " ", "")
filenameWithoutExt := filepath.Clean(filename[:len(filename)-len(filepath.Ext(filename))]) filenameWithoutExt := filepath.Clean(filename[:len(filename)-len(filepath.Ext(filename))])
extension := filepath.Ext(file.Filename)[1:] extension := filepath.Ext(file.Filename)[1:]