feat: add frontend
This commit is contained in:
@@ -2,35 +2,21 @@ package internal
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"exporter/database/telegram_resource/public/model"
|
||||
"exporter/database/telegram_resource/public/table"
|
||||
"exporter/frontend/dist"
|
||||
|
||||
. "github.com/go-jet/jet/v2/postgres"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/favicon"
|
||||
"github.com/gofiber/fiber/v2/middleware/filesystem"
|
||||
"github.com/gofiber/fiber/v2/middleware/recover"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
type Pagination struct {
|
||||
Page int64 `json:"page"`
|
||||
Limit int64 `json:"limit"`
|
||||
Offset int64 `json:"-"`
|
||||
}
|
||||
|
||||
func (p *Pagination) Format() {
|
||||
if p.Limit == 0 {
|
||||
p.Limit = 10
|
||||
}
|
||||
|
||||
if p.Page == 0 {
|
||||
p.Offset = 0
|
||||
} else {
|
||||
p.Offset = (p.Page - 1) * p.Limit
|
||||
}
|
||||
}
|
||||
|
||||
func ServeCmd() *cobra.Command {
|
||||
cmd := &cobra.Command{
|
||||
Use: "serve",
|
||||
@@ -54,11 +40,24 @@ func serveCmd(cmd *cobra.Command, args []string) error {
|
||||
app := fiber.New()
|
||||
|
||||
app.Static("/medias", "/share/telegram/outputs")
|
||||
app.Static("/", "/public")
|
||||
|
||||
app.Use(favicon.New(favicon.Config{
|
||||
Data: dist.Favicon,
|
||||
}))
|
||||
|
||||
app.Use("/assets", filesystem.New(filesystem.Config{
|
||||
Root: http.FS(dist.StaticDist),
|
||||
PathPrefix: "assets",
|
||||
}))
|
||||
|
||||
// Initialize default config
|
||||
app.Use(recover.New())
|
||||
|
||||
app.Get("/", func(c *fiber.Ctx) error {
|
||||
c.Context().SetContentType("text/html")
|
||||
return c.SendString(dist.IndexPage)
|
||||
})
|
||||
|
||||
group := app.Group("/api")
|
||||
|
||||
// get channel list
|
||||
@@ -101,21 +100,20 @@ func serveCmd(cmd *cobra.Command, args []string) error {
|
||||
return err
|
||||
}
|
||||
|
||||
var p Pagination
|
||||
if err := c.QueryParser(&p); err != nil {
|
||||
return err
|
||||
}
|
||||
p.Format()
|
||||
offsetPk := c.QueryInt("offset", 0)
|
||||
|
||||
var messages []model.ChannelMessages
|
||||
|
||||
tbl := table.ChannelMessages
|
||||
cond := tbl.ChannelID.EQ(Int64(int64(channelID)))
|
||||
if offsetPk > 0 {
|
||||
cond = cond.AND(tbl.ID.LT(Int64(int64(offsetPk))))
|
||||
}
|
||||
err = tbl.
|
||||
SELECT(tbl.AllColumns).
|
||||
WHERE(tbl.ChannelID.EQ(Int64(int64(channelID)))).
|
||||
WHERE(cond).
|
||||
LIMIT(5).
|
||||
ORDER_BY(tbl.ID.DESC()).
|
||||
LIMIT(p.Limit).
|
||||
OFFSET(p.Offset).
|
||||
QueryContext(c.Context(), db, &messages)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -126,25 +124,24 @@ func serveCmd(cmd *cobra.Command, args []string) error {
|
||||
|
||||
// favorite messages
|
||||
group.Get("/favorites", func(c *fiber.Ctx) error {
|
||||
var p Pagination
|
||||
if err := c.QueryParser(&p); err != nil {
|
||||
return err
|
||||
offsetPk := c.QueryInt("offset", 0)
|
||||
|
||||
tbl := table.ChannelMessages
|
||||
cond := tbl.ChannelID.EQ(Int64(int64(channelID))).AND(
|
||||
tbl.Like.EQ(Bool(true)),
|
||||
)
|
||||
|
||||
if offsetPk > 0 {
|
||||
cond = cond.AND(tbl.ID.LT(Int64(int64(offsetPk))))
|
||||
}
|
||||
p.Format()
|
||||
|
||||
var messages []model.ChannelMessages
|
||||
|
||||
tbl := table.ChannelMessages
|
||||
err = tbl.
|
||||
SELECT(tbl.AllColumns).
|
||||
WHERE(
|
||||
tbl.ChannelID.EQ(Int64(int64(channelID))).AND(
|
||||
tbl.Like.EQ(Bool(true)),
|
||||
),
|
||||
).
|
||||
WHERE(cond).
|
||||
LIMIT(5).
|
||||
ORDER_BY(tbl.ID.DESC()).
|
||||
LIMIT(p.Limit).
|
||||
OFFSET(p.Offset).
|
||||
QueryContext(c.Context(), db, &messages)
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
Reference in New Issue
Block a user