✨ Mixed draft list API
This commit is contained in:
parent
e4d2a625d9
commit
ad3257dabf
@ -6,6 +6,7 @@ import (
|
||||
"time"
|
||||
|
||||
"git.solsynth.dev/hydrogen/interactive/pkg/internal/database"
|
||||
"git.solsynth.dev/hydrogen/interactive/pkg/internal/gap"
|
||||
"git.solsynth.dev/hydrogen/interactive/pkg/internal/models"
|
||||
"git.solsynth.dev/hydrogen/interactive/pkg/internal/services"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
@ -105,3 +106,68 @@ func listFeed(c *fiber.Ctx) error {
|
||||
"data": feed,
|
||||
})
|
||||
}
|
||||
|
||||
func listDraftMixed(c *fiber.Ctx) error {
|
||||
take := c.QueryInt("take", 0)
|
||||
offset := c.QueryInt("offset", 0)
|
||||
|
||||
if err := gap.H.EnsureAuthenticated(c); err != nil {
|
||||
return err
|
||||
}
|
||||
user := c.Locals("user").(models.Account)
|
||||
|
||||
postTx := services.FilterPostWithAuthorDraft(database.C, user.ID)
|
||||
articleTx := services.FilterArticleWithAuthorDraft(database.C, user.ID)
|
||||
|
||||
postCountTx := postTx
|
||||
articleCountTx := articleTx
|
||||
|
||||
postCount, err := services.CountPost(postCountTx)
|
||||
if err != nil {
|
||||
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
|
||||
}
|
||||
articleCount, err := services.CountArticle(articleCountTx)
|
||||
if err != nil {
|
||||
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
|
||||
}
|
||||
|
||||
postItems, err := services.ListPost(postTx, take, offset)
|
||||
if err != nil {
|
||||
return fiber.NewError(fiber.StatusBadRequest, err.Error())
|
||||
}
|
||||
articleItems, err := services.ListArticle(articleTx, take, offset)
|
||||
if err != nil {
|
||||
return fiber.NewError(fiber.StatusBadRequest, err.Error())
|
||||
}
|
||||
|
||||
var feed []FeedRecord
|
||||
|
||||
encodeToFeed := func(t string, in any, createdAt time.Time) FeedRecord {
|
||||
var result map[string]any
|
||||
raw, _ := jsoniter.Marshal(in)
|
||||
jsoniter.Unmarshal(raw, &result)
|
||||
|
||||
return FeedRecord{
|
||||
Type: t,
|
||||
Data: result,
|
||||
CreatedAt: createdAt,
|
||||
}
|
||||
}
|
||||
|
||||
for _, post := range postItems {
|
||||
feed = append(feed, encodeToFeed("post", post, post.CreatedAt))
|
||||
}
|
||||
|
||||
for _, article := range articleItems {
|
||||
feed = append(feed, encodeToFeed("article", article, article.CreatedAt))
|
||||
}
|
||||
|
||||
sort.Slice(feed, func(i, j int) bool {
|
||||
return feed[i].CreatedAt.After(feed[j].CreatedAt)
|
||||
})
|
||||
|
||||
return c.JSON(fiber.Map{
|
||||
"count": postCount + articleCount,
|
||||
"data": feed,
|
||||
})
|
||||
}
|
||||
|
@ -14,6 +14,7 @@ func MapAPIs(app *fiber.App) {
|
||||
|
||||
drafts := api.Group("/drafts").Name("Draft box API")
|
||||
{
|
||||
drafts.Get("/", listDraftMixed)
|
||||
drafts.Get("/posts", listDraftPost)
|
||||
drafts.Get("/articles", listDraftArticle)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user