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 *model.Posts) error { return nil }