From b8499ca97d65d5752b2306af2212402538b7e21e Mon Sep 17 00:00:00 2001 From: Rogee Date: Fri, 13 Sep 2024 21:52:15 +0800 Subject: [PATCH] feat: add http server --- .fun.yaml | 7 + .../public/model/channel_messages.go | 1 + .../public/table/channel_messages.go | 7 +- go.mod | 6 + go.sum | 15 ++ internal/cmd_serve.go | 187 ++++++++++++++++++ main.go | 1 + 7 files changed, 222 insertions(+), 2 deletions(-) create mode 100644 .fun.yaml create mode 100644 internal/cmd_serve.go diff --git a/.fun.yaml b/.fun.yaml new file mode 100644 index 0000000..8594b29 --- /dev/null +++ b/.fun.yaml @@ -0,0 +1,7 @@ +gen: + model: + dsn: "postgresql://postgres:xixi0202@10.1.1.3:5432/telegram_resource?sslmode=disable" + source: postgres + schema: public + path: ./database + ignores: [] # ignore tables diff --git a/database/telegram_resource/public/model/channel_messages.go b/database/telegram_resource/public/model/channel_messages.go index a0db615..987c20b 100644 --- a/database/telegram_resource/public/model/channel_messages.go +++ b/database/telegram_resource/public/model/channel_messages.go @@ -21,4 +21,5 @@ type ChannelMessages struct { CreatedAt time.Time GroupID int64 Published bool + Like bool } diff --git a/database/telegram_resource/public/table/channel_messages.go b/database/telegram_resource/public/table/channel_messages.go index 8973aa7..46e7b9e 100644 --- a/database/telegram_resource/public/table/channel_messages.go +++ b/database/telegram_resource/public/table/channel_messages.go @@ -26,6 +26,7 @@ type channelMessagesTable struct { CreatedAt postgres.ColumnTimestampz GroupID postgres.ColumnInteger Published postgres.ColumnBool + Like postgres.ColumnBool AllColumns postgres.ColumnList MutableColumns postgres.ColumnList @@ -75,8 +76,9 @@ func newChannelMessagesTableImpl(schemaName, tableName, alias string) channelMes CreatedAtColumn = postgres.TimestampzColumn("created_at") GroupIDColumn = postgres.IntegerColumn("group_id") PublishedColumn = postgres.BoolColumn("published") - allColumns = postgres.ColumnList{IDColumn, ChannelIDColumn, UUIDColumn, ContentColumn, MediaColumn, PublishedAtColumn, CreatedAtColumn, GroupIDColumn, PublishedColumn} - mutableColumns = postgres.ColumnList{ChannelIDColumn, UUIDColumn, ContentColumn, MediaColumn, PublishedAtColumn, CreatedAtColumn, GroupIDColumn, PublishedColumn} + LikeColumn = postgres.BoolColumn("like") + allColumns = postgres.ColumnList{IDColumn, ChannelIDColumn, UUIDColumn, ContentColumn, MediaColumn, PublishedAtColumn, CreatedAtColumn, GroupIDColumn, PublishedColumn, LikeColumn} + mutableColumns = postgres.ColumnList{ChannelIDColumn, UUIDColumn, ContentColumn, MediaColumn, PublishedAtColumn, CreatedAtColumn, GroupIDColumn, PublishedColumn, LikeColumn} ) return channelMessagesTable{ @@ -92,6 +94,7 @@ func newChannelMessagesTableImpl(schemaName, tableName, alias string) channelMes CreatedAt: CreatedAtColumn, GroupID: GroupIDColumn, Published: PublishedColumn, + Like: LikeColumn, AllColumns: allColumns, MutableColumns: mutableColumns, diff --git a/go.mod b/go.mod index c9c0a28..923642c 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.22.1 require ( github.com/dustin/go-humanize v1.0.1 github.com/go-jet/jet/v2 v2.11.1 + github.com/gofiber/fiber/v2 v2.52.5 github.com/gotd/td v0.107.0 github.com/imroc/req/v3 v3.43.7 github.com/jedib0t/go-pretty/v6 v6.5.9 @@ -42,6 +43,8 @@ require ( github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/klauspost/compress v1.17.9 // indirect github.com/magiconair/properties v1.8.7 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/onsi/ginkgo/v2 v2.16.0 // indirect @@ -60,6 +63,9 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/testify v1.9.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasthttp v1.51.0 // indirect + github.com/valyala/tcplisten v1.0.0 // indirect go.opentelemetry.io/otel v1.28.0 // indirect go.opentelemetry.io/otel/trace v1.28.0 // indirect go.uber.org/atomic v1.11.0 // indirect diff --git a/go.sum b/go.sum index b92046c..1b20184 100644 --- a/go.sum +++ b/go.sum @@ -28,6 +28,8 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yGMo= +github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= @@ -67,6 +69,11 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -127,6 +134,12 @@ github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8 github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/usememos/memos v0.22.5 h1:sSRtIJfP2z8OcnppjRY+Ksc9aSdY3pPJOXWxeOfsT8w= github.com/usememos/memos v0.22.5/go.mod h1:jqZYscdq0Qudq2d0azMzkm58vvt2Ml32IcayxI0Gcxc= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA= +github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g= +github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= +github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= @@ -152,6 +165,8 @@ golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.24.0 h1:Mh5cbb+Zk2hqqXNO7S1iTjEphVL+jb8ZWaqh/g+JWkM= diff --git a/internal/cmd_serve.go b/internal/cmd_serve.go new file mode 100644 index 0000000..d30bb37 --- /dev/null +++ b/internal/cmd_serve.go @@ -0,0 +1,187 @@ +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)) +} diff --git a/main.go b/main.go index 5e25a3e..7fc9d20 100644 --- a/main.go +++ b/main.go @@ -45,6 +45,7 @@ func main() { internal.LoginCmd(), internal.PublishCmd(), internal.ChannelCmd(), + internal.ServeCmd(), ) // rootCmd.SilenceErrors = true