feat: init
This commit is contained in:
109
modules/web/route_follower.go
Normal file
109
modules/web/route_follower.go
Normal file
@@ -0,0 +1,109 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user