♻️ 一切尽在帖子表 #4
| @@ -1,131 +0,0 @@ | |||||||
| package api |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"fmt" |  | ||||||
| 	"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" |  | ||||||
| 	jsoniter "github.com/json-iterator/go" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| type FeedRecord struct { |  | ||||||
| 	Type      string         `json:"type"` |  | ||||||
| 	Data      map[string]any `json:"data"` |  | ||||||
| 	CreatedAt time.Time      `json:"created_at"` |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func listFeed(c *fiber.Ctx) error { |  | ||||||
| 	take := c.QueryInt("take", 0) |  | ||||||
| 	offset := c.QueryInt("offset", 0) |  | ||||||
| 	realmId := c.QueryInt("realmId", 0) |  | ||||||
|  |  | ||||||
| 	postTx := services.FilterPostDraft(database.C) |  | ||||||
|  |  | ||||||
| 	if realmId > 0 { |  | ||||||
| 		if realm, err := services.GetRealmWithExtID(uint(realmId)); err != nil { |  | ||||||
| 			return fiber.NewError(fiber.StatusBadRequest, fmt.Sprintf("realm was not found: %v", err)) |  | ||||||
| 		} else { |  | ||||||
| 			postTx = services.FilterPostWithRealm(postTx, realm.ID) |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if len(c.Query("authorId")) > 0 { |  | ||||||
| 		var author models.Account |  | ||||||
| 		if err := database.C.Where(&models.Account{Name: c.Query("authorId")}).First(&author).Error; err != nil { |  | ||||||
| 			return fiber.NewError(fiber.StatusNotFound, err.Error()) |  | ||||||
| 		} |  | ||||||
| 		postTx = postTx.Where("author_id = ?", author.ID) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if len(c.Query("category")) > 0 { |  | ||||||
| 		postTx = services.FilterPostWithCategory(postTx, c.Query("category")) |  | ||||||
| 	} |  | ||||||
| 	if len(c.Query("tag")) > 0 { |  | ||||||
| 		postTx = services.FilterPostWithTag(postTx, c.Query("tag")) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	postCountTx := postTx |  | ||||||
|  |  | ||||||
| 	postCount, err := services.CountPost(postCountTx) |  | ||||||
| 	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()) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	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)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return c.JSON(fiber.Map{ |  | ||||||
| 		"count": postCount, |  | ||||||
| 		"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) |  | ||||||
| 	postCountTx := postTx |  | ||||||
|  |  | ||||||
| 	postCount, err := services.CountPost(postCountTx) |  | ||||||
| 	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()) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	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)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	return c.JSON(fiber.Map{ |  | ||||||
| 		"count": postCount, |  | ||||||
| 		"data":  feed, |  | ||||||
| 	}) |  | ||||||
| } |  | ||||||
| @@ -10,14 +10,6 @@ func MapAPIs(app *fiber.App, baseURL string) { | |||||||
| 		api.Get("/users/me", getUserinfo) | 		api.Get("/users/me", getUserinfo) | ||||||
| 		api.Get("/users/:accountId", getOthersInfo) | 		api.Get("/users/:accountId", getOthersInfo) | ||||||
|  |  | ||||||
| 		api.Get("/feed", listFeed) |  | ||||||
|  |  | ||||||
| 		drafts := api.Group("/drafts").Name("Draft box API") |  | ||||||
| 		{ |  | ||||||
| 			drafts.Get("/", listDraftMixed) |  | ||||||
| 			drafts.Get("/posts", listDraftPost) |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		stories := api.Group("/stories").Name("Story API") | 		stories := api.Group("/stories").Name("Story API") | ||||||
| 		{ | 		{ | ||||||
| 			stories.Post("/", createStory) | 			stories.Post("/", createStory) | ||||||
| @@ -32,6 +24,7 @@ func MapAPIs(app *fiber.App, baseURL string) { | |||||||
| 		posts := api.Group("/posts").Name("Posts API") | 		posts := api.Group("/posts").Name("Posts API") | ||||||
| 		{ | 		{ | ||||||
| 			posts.Get("/", listPost) | 			posts.Get("/", listPost) | ||||||
|  | 			posts.Get("/drafts", listDraftPost) | ||||||
| 			posts.Get("/:postId", getPost) | 			posts.Get("/:postId", getPost) | ||||||
| 			posts.Post("/:postId/react", reactPost) | 			posts.Post("/:postId/react", reactPost) | ||||||
| 			posts.Delete("/:postId", deletePost) | 			posts.Delete("/:postId", deletePost) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user