package internal import ( "fmt" "strconv" "exporter/database/telegram_resource/public/model" "exporter/database/telegram_resource/public/table" . "github.com/go-jet/jet/v2/postgres" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/recover" "github.com/spf13/cobra" ) func ServeCmd() *cobra.Command { cmd := &cobra.Command{ Use: "serve", Short: "http server", RunE: serveCmd, } return cmd } func serveCmd(cmd *cobra.Command, args []string) error { var err error var port int64 = 3000 if len(args) > 0 { port, err = strconv.ParseInt(args[0], 10, 64) if err != nil { return err } } app := fiber.New() // Initialize default config app.Use(recover.New()) app.Get("/channels", func(c *fiber.Ctx) error { var channels []model.Channels tbl := table.Channels if err := tbl.SELECT(tbl.AllColumns).QueryContext(c.Context(), db, &channels); err != nil { return err } return c.JSON(channels) }) // 获取频道最新一条数据 app.Get("/channels/:id", func(c *fiber.Ctx) error { channelID, err := c.ParamsInt("id") if err != nil { return err } var channel model.Channels tbl := table.Channels err = tbl. SELECT(tbl.AllColumns). WHERE(tbl.ID.EQ(Int64(int64(channelID)))). QueryContext(c.Context(), db, &channel) if err != nil { return err } return c.JSON(channel) }) app.Get("/channels/:id/message", func(c *fiber.Ctx) error { channelID, err := c.ParamsInt("id") if err != nil { return err } var msg model.ChannelMessages tbl := table.ChannelMessages err = tbl. SELECT(tbl.AllColumns). WHERE(tbl.ChannelID.EQ(Int64(int64(channelID)))). ORDER_BY(tbl.ID.DESC()). LIMIT(1). QueryContext(c.Context(), db, &msg) if err != nil { return err } return c.JSON(msg) }) app.Get("/channels/:id/message/like", func(c *fiber.Ctx) error { channelID, err := c.ParamsInt("id") if err != nil { return err } var msg model.ChannelMessages tbl := table.ChannelMessages err = tbl. SELECT(tbl.AllColumns). WHERE( tbl.ChannelID.EQ(Int64(int64(channelID))).AND( tbl.Like.EQ(Bool(true)), ), ). ORDER_BY(tbl.ID.DESC()). LIMIT(1). QueryContext(c.Context(), db, &msg) if err != nil { return err } return c.JSON(msg) }) // toggle msg likes app.Patch("/channels/:channelID/message/:id/like", func(c *fiber.Ctx) error { channelID, err := c.ParamsInt("channelID") if err != nil { return err } msgID, err := c.ParamsInt("id") if err != nil { return err } var msg model.ChannelMessages tbl := table.ChannelMessages cond := tbl.ChannelID.EQ(Int64(int64(channelID))).AND(tbl.ID.EQ(Int64(int64(msgID)))) err = tbl. SELECT(tbl.AllColumns). WHERE(cond). ORDER_BY(tbl.ID.DESC()). LIMIT(1). QueryContext(c.Context(), db, &msg) if err != nil { return err } _, err = tbl. UPDATE(). SET(tbl.Like.SET(Bool(!msg.Like))). WHERE(cond). ExecContext(c.Context(), db) if err != nil { return err } return nil }) // delete message app.Delete("/channels/:channelID/message/:id", func(c *fiber.Ctx) error { channelID, err := c.ParamsInt("channelID") if err != nil { return err } msgID, err := c.ParamsInt("id") if err != nil { return err } tbl := table.ChannelMessages cond := tbl.ChannelID.EQ(Int64(int64(channelID))).AND(tbl.ID.EQ(Int64(int64(msgID)))) _, err = tbl. DELETE(). WHERE(cond). ExecContext(c.Context(), db) if err != nil { return err } return nil }) return app.Listen(fmt.Sprintf(":%d", port)) }