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

110 lines
2.2 KiB
Go

package web
import (
"errors"
"strconv"
"time"
"dyproxy/.gen/model"
"dyproxy/.gen/table"
"github.com/go-jet/jet/v2/qrm"
. "github.com/go-jet/jet/v2/sqlite"
"github.com/gofiber/fiber/v3"
"github.com/sirupsen/logrus"
)
func (s *WebServer) routeGetFollower(c fiber.Ctx) error {
if s.pendingItems == nil {
s.pendingItems = make(map[int32]time.Time)
}
tbl := table.Follower
lastID := c.Query("last", "")
if lastID != "" {
id, err := strconv.Atoi(lastID)
if err != nil {
return err
}
// remove from pending
s.listLock.Lock()
delete(s.pendingItems, int32(id))
s.listLock.Unlock()
tbl.
UPDATE(table.Follower.Followed).
SET(Int32(1)).
WHERE(table.Follower.ID.EQ(Int32(int32(id)))).
ExecContext(c.UserContext(), s.db)
}
uid := c.Params("uid")
pendingIDs := []Expression{}
for i := range s.pendingItems {
pendingIDs = append(pendingIDs, Int32(i))
}
var expert model.Expert
err := table.Expert.SELECT(table.Expert.State, table.Expert.Since).WHERE(table.Expert.UID.EQ(String(uid))).QueryContext(c.UserContext(), s.db, &expert)
if err != nil {
return err
}
if expert.State == StateStop {
return c.JSON(nil)
}
condition := tbl.Followed.EQ(Int32(0)).
AND(tbl.ExpertUID.EQ(String(uid))).
AND(tbl.ID.NOT_IN(pendingIDs...)).
AND(tbl.CreatedAt.GT(Int32(expert.Since)))
stmt := tbl.
SELECT(tbl.AllColumns).
WHERE(condition).
ORDER_BY(table.Follower.ID.DESC()).
LIMIT(1)
logrus.Debug(stmt.DebugSql())
var follower model.Follower
if err := stmt.QueryContext(c.UserContext(), s.db, &follower); err != nil {
if errors.Is(err, qrm.ErrNoRows) {
return c.JSON(nil)
}
return err
}
s.listLock.Lock()
s.pendingItems[int32(follower.ID)] = time.Now()
s.listLock.Unlock()
return c.JSON(follower)
}
func (s *WebServer) routePostFollower(c fiber.Ctx) error {
followers := []model.Follower{}
if err := c.Bind().JSON(&followers); err != nil {
return err
}
tbl := table.Follower
for _, f := range followers {
f.CreatedAt = int32(time.Now().In(s.local).Unix())
_, err := tbl.
INSERT(tbl.AllColumns.Except(tbl.ID)).
MODEL(f).
ON_CONFLICT(tbl.UID).
DO_NOTHING().
ExecContext(c.UserContext(), s.db)
if err != nil {
logrus.Error(err)
}
}
return nil
}