Files
douyin-autojs-follower/modules/web/route_expert.go
2024-09-30 11:02:26 +08:00

201 lines
4.0 KiB
Go

package web
import (
"encoding/json"
"fmt"
"time"
"dyproxy/.gen/model"
"dyproxy/.gen/table"
. "github.com/go-jet/jet/v2/sqlite"
"github.com/gofiber/fiber/v3"
"github.com/sirupsen/logrus"
)
func (s *WebServer) routeGetExpertConfig(c fiber.Ctx) error {
uid := c.Params("uid", "")
var user model.Expert
err := table.Expert.SELECT(table.Expert.AllColumns).WHERE(table.Expert.UID.EQ(String(uid))).QueryContext(c.UserContext(), s.db, &user)
if err != nil {
return err
}
if user.Config == "" {
user.Config = "{}"
}
var config ExpertConfig
if err := json.Unmarshal([]byte(user.Config), &config); err != nil {
return err
}
c.Response().Header.Set("x-config-at", fmt.Sprintf("%d", user.ConfigAt))
return c.JSON(config)
}
func (s *WebServer) routeGetExpert(c fiber.Ctx) error {
uid := c.Params("uid", "")
var user model.Expert
err := table.Expert.SELECT(table.Expert.AllColumns).WHERE(table.Expert.UID.EQ(String(uid))).QueryContext(c.UserContext(), s.db, &user)
if err != nil {
return err
}
return c.JSON(user)
}
func (s *WebServer) routeGetExperts(c fiber.Ctx) error {
stmt := table.Expert.SELECT(table.Expert.AllColumns).ORDER_BY(table.Expert.ID)
var rows []model.Expert
if err := stmt.Query(s.db, &rows); err != nil {
return err
}
sql := `SELECT
expert_uid,
COUNT(*) AS total,
SUM(case when followed = 1 then 1 else 0 end) AS followed
FROM
follower
GROUP BY
expert_uid;`
r, err := s.db.QueryContext(c.UserContext(), sql)
if err != nil {
return err
}
type statistics struct {
UserUID string
Total int32
Followed int32
}
var statisticsItems []statistics
for r.Next() {
item := statistics{}
if err := r.Scan(&item.UserUID, &item.Total, &item.Followed); err != nil {
return err
}
statisticsItems = append(statisticsItems, item)
}
type resp struct {
Focus int32
Total int32
Conf ExpertConfig
model.Expert `json:",inline"`
}
var users []resp
for _, row := range rows {
stat := statistics{}
// get item from statisticsItems where row.UID == item.UserUID
for _, item := range statisticsItems {
if row.UID == item.UserUID {
stat = item
break
}
}
var conf ExpertConfig
if row.Config == "" {
row.Config = "{}"
}
if err := json.Unmarshal([]byte(row.Config), &conf); err != nil {
logrus.Error(err)
continue
}
row.Config = ""
users = append(users, resp{
Focus: stat.Followed,
Total: stat.Total,
Conf: conf,
Expert: row,
})
}
return c.JSON(users)
}
func (s *WebServer) routePostExperts(c fiber.Ctx) error {
expert := &model.Expert{}
if err := c.Bind().JSON(expert); err != nil {
return err
}
tbl := table.Expert
_, err := tbl.
INSERT(tbl.AllColumns.Except(tbl.ID)).
MODEL(expert).
ON_CONFLICT(tbl.UID).
DO_NOTHING().
ExecContext(c.UserContext(), s.db)
return err
}
func (s *WebServer) routePatchExpertConfig(c fiber.Ctx) error {
var data struct {
Since int32 `json:"since"`
ExpertConfig `json:",inline"`
}
if err := c.Bind().JSON(&data); err != nil {
return err
}
uid := c.Params("uid")
tbl := table.Expert
// get expert by uid
var expert model.Expert
if err := tbl.SELECT(tbl.AllColumns).WHERE(tbl.UID.EQ(String(uid))).QueryContext(c.UserContext(), s.db, &expert); err != nil {
return err
}
if expert.Config == "" {
expert.Config = "{}"
}
newExpertConfig, err := json.Marshal(data.ExpertConfig)
if err != nil {
return err
}
_, err = tbl.
UPDATE().
SET(
tbl.Config.SET(String(string(newExpertConfig))),
tbl.ConfigAt.SET(Int(time.Now().Unix())),
).
WHERE(tbl.UID.EQ(String(uid))).
ExecContext(c.UserContext(), s.db)
return err
}
const (
StateNormal = ""
StateStop = "stop"
)
func (s *WebServer) routePatchExpertState(c fiber.Ctx) error {
var state struct {
State string `json:"state"`
}
if err := c.Bind().JSON(&state); err != nil {
return err
}
uid := c.Params("uid")
tbl := table.Expert
_, err := tbl.
UPDATE().
SET(tbl.State.SET(String(state.State))).
WHERE(tbl.UID.EQ(String(uid))).
ExecContext(c.UserContext(), s.db)
return err
}