feat: add http server

This commit is contained in:
Rogee
2024-09-13 21:52:15 +08:00
parent e4e4861d42
commit b8499ca97d
7 changed files with 222 additions and 2 deletions

7
.fun.yaml Normal file
View File

@@ -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

View File

@@ -21,4 +21,5 @@ type ChannelMessages struct {
CreatedAt time.Time
GroupID int64
Published bool
Like bool
}

View File

@@ -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,

6
go.mod
View File

@@ -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

15
go.sum
View File

@@ -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=

187
internal/cmd_serve.go Normal file
View File

@@ -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))
}

View File

@@ -45,6 +45,7 @@ func main() {
internal.LoginCmd(),
internal.PublishCmd(),
internal.ChannelCmd(),
internal.ServeCmd(),
)
// rootCmd.SilenceErrors = true