Files
quyun/backend/app/http/admin/posts.go
2025-04-09 21:16:55 +08:00

174 lines
4.3 KiB
Go

package admin
import (
"quyun/app/models"
"quyun/app/requests"
"quyun/database/fields"
"quyun/database/schemas/public/model"
"github.com/gofiber/fiber/v3"
"github.com/samber/lo"
)
type ListQuery struct {
Keyword *string `query:"keyword"`
}
// @provider
type posts struct{}
// List posts
// @Router /v1/admin/posts [get]
// @Bind pagination query
// @Bind query query
func (ctl *posts) List(ctx fiber.Ctx, pagination *requests.Pagination, query *ListQuery) (*requests.Pager, error) {
cond := models.Posts.BuildConditionWithKey(query.Keyword)
return models.Posts.List(ctx.Context(), pagination, cond)
}
type PostForm struct {
Title string `json:"title"`
Price int64 `json:"price"`
Discount int16 `json:"discount"`
Introduction string `json:"introduction"`
Medias []int64 `json:"medias"`
Status fields.PostStatus `json:"status"`
}
// Create
// @Router /v1/admin/posts [post]
// @Bind form body
func (ctl *posts) Create(ctx fiber.Ctx, form *PostForm) error {
post := model.Posts{
Title: form.Title,
Price: form.Price,
Discount: form.Discount,
Description: form.Introduction,
Status: form.Status,
Content: "",
Tags: fields.Json[[]string]{},
Assets: fields.Json[[]fields.MediaAsset]{},
}
if form.Medias != nil {
medias, err := models.Medias.GetByIds(ctx.Context(), form.Medias)
if err != nil {
return err
}
assets := lo.Map(medias, func(media *model.Medias, _ int) fields.MediaAsset {
return fields.MediaAsset{
Type: models.Medias.ConvertFileTypeByMimeType(media.MimeType),
Media: media.ID,
Mark: nil,
}
})
post.Assets = fields.ToJson(assets)
}
if err := models.Posts.Create(ctx.Context(), &post); err != nil {
return err
}
return nil
}
// Update posts
// @Router /v1/admin/posts/:id [put]
// @Bind id path
// @Bind form body
func (ctl *posts) Update(ctx fiber.Ctx, id int64, form *PostForm) error {
oldPost, err := models.Posts.GetByID(ctx.Context(), id)
if err != nil {
return err
}
post := &model.Posts{
Title: form.Title,
Price: form.Price,
Discount: form.Discount,
Description: form.Introduction,
Status: form.Status,
Content: "",
Tags: fields.Json[[]string]{},
Assets: fields.Json[[]fields.MediaAsset]{},
CreatedAt: oldPost.CreatedAt,
UpdatedAt: oldPost.UpdatedAt,
DeletedAt: oldPost.DeletedAt,
Views: oldPost.Views,
Likes: oldPost.Likes,
}
if form.Medias != nil {
medias, err := models.Medias.GetByIds(ctx.Context(), form.Medias)
if err != nil {
return err
}
assets := lo.Map(medias, func(media *model.Medias, _ int) fields.MediaAsset {
return fields.MediaAsset{
Type: models.Medias.ConvertFileTypeByMimeType(media.MimeType),
Media: media.ID,
Mark: nil,
}
})
post.Assets = fields.ToJson(assets)
}
if err := models.Posts.Update(ctx.Context(), id, post); err != nil {
return err
}
return nil
}
// Delete posts
// @Router /v1/admin/posts/:id [delete]
// @Bind id path
func (ctl *posts) Delete(ctx fiber.Ctx, id int64) error {
post, err := models.Posts.GetByID(ctx.Context(), id)
if err != nil {
return err
}
if post == nil {
return fiber.ErrNotFound
}
if err := models.Posts.DeleteByID(ctx.Context(), id); err != nil {
return err
}
return nil
}
type PostItem struct {
*model.Posts
Medias []*models.MediaItem `json:"medias"`
}
// Show posts by id
// @Router /v1/admin/posts/:id [get]
// @Bind id path
func (ctl *posts) Show(ctx fiber.Ctx, id int64) (*PostItem, error) {
post, err := models.Posts.GetByID(ctx.Context(), id)
if err != nil {
return nil, err
}
medias, err := models.Medias.GetByIds(ctx.Context(), lo.Map(post.Assets.Data, func(asset fields.MediaAsset, _ int) int64 {
return asset.Media
}))
if err != nil {
return nil, err
}
return &PostItem{
Posts: post,
Medias: lo.Map(medias, func(media *model.Medias, _ int) *models.MediaItem {
return &models.MediaItem{
ID: media.ID,
Name: media.Name,
UploadTime: media.CreatedAt.Format("2006-01-02 15:04:05"),
FileSize: media.Size,
MimeType: media.MimeType,
FileType: models.Medias.ConvertFileTypeByMimeType(media.MimeType),
ThumbnailUrl: "",
}
}),
}, nil
}