110 lines
2.2 KiB
Go
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
|
|
}
|