✨ Mixed draft list API
This commit is contained in:
parent
e4d2a625d9
commit
ad3257dabf
@ -6,6 +6,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"git.solsynth.dev/hydrogen/interactive/pkg/internal/database"
|
"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/models"
|
||||||
"git.solsynth.dev/hydrogen/interactive/pkg/internal/services"
|
"git.solsynth.dev/hydrogen/interactive/pkg/internal/services"
|
||||||
"github.com/gofiber/fiber/v2"
|
"github.com/gofiber/fiber/v2"
|
||||||
@ -105,3 +106,68 @@ func listFeed(c *fiber.Ctx) error {
|
|||||||
"data": feed,
|
"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 := api.Group("/drafts").Name("Draft box API")
|
||||||
{
|
{
|
||||||
|
drafts.Get("/", listDraftMixed)
|
||||||
drafts.Get("/posts", listDraftPost)
|
drafts.Get("/posts", listDraftPost)
|
||||||
drafts.Get("/articles", listDraftArticle)
|
drafts.Get("/articles", listDraftArticle)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user