geoGo/internal/service/app.go

174 lines
4.2 KiB
Go

package service
import (
"fmt"
"github.com/gofiber/fiber/v2"
"xorm.io/builder"
"geo/internal/biz"
"geo/internal/config"
"geo/internal/data/impl"
"geo/internal/data/model"
"geo/internal/entitys"
"geo/internal/manager"
"geo/pkg"
"geo/tmpl/errcode"
)
type AppService struct {
cfg *config.Config
tokenImpl *impl.TokenImpl
userImpl *impl.UserImpl
platImpl *impl.PlatImpl
publishBiz *biz.PublishBiz
}
func NewAppService(
cfg *config.Config,
tokenImpl *impl.TokenImpl,
userImpl *impl.UserImpl,
platImpl *impl.PlatImpl,
publishBiz *biz.PublishBiz,
) *AppService {
return &AppService{
cfg: cfg,
tokenImpl: tokenImpl,
userImpl: userImpl,
platImpl: platImpl,
publishBiz: publishBiz,
}
}
func (a *AppService) LoginApp(c *fiber.Ctx, req *entitys.LoginAppRequest) error {
cond := builder.NewCond().
And(builder.Eq{"secret": req.Secret}).
And(builder.Eq{"status": 1})
tokenInfo := &model.Token{}
err := a.tokenImpl.GetOneBySearchStruct(c.UserContext(), &cond, tokenInfo)
if err != nil || tokenInfo == nil {
return errcode.Forbidden("密钥无效")
}
accessToken := pkg.GenerateUUID()
err = a.tokenImpl.UpdateByKey(c.UserContext(), a.tokenImpl.PrimaryKey(), tokenInfo.ID, &model.Token{
AccessToken: accessToken,
})
if err != nil {
return err
}
return pkg.HandleResponse(c, fiber.Map{
"access_token": accessToken,
"user_limit": tokenInfo.UserLimit,
"expire_time": tokenInfo.ExpireTime,
})
}
func (a *AppService) GetUserAndAutoStatus(c *fiber.Ctx, req *entitys.GetUserAndAutoStatusRequest) error {
tokenInfo, err := a.publishBiz.ValidateAccessToken(c.UserContext(), req.AccessToken)
if err != nil {
return err
}
cond := builder.NewCond().
And(builder.Eq{"token_id": tokenInfo.ID}).
And(builder.Eq{"status": 1})
users := make([]model.User, 0)
_, err = a.userImpl.GetListToStruct(c.UserContext(), &cond, nil, &users, "id desc")
if err != nil {
return err
}
pm := manager.GetPublishManager(a.cfg, a.tokenImpl.GetDb())
return pkg.HandleResponse(c, fiber.Map{
"user": users,
"auto_status": pm.AutoStatus,
})
}
func (a *AppService) AddUser(c *fiber.Ctx, req *entitys.AddUserRequest) error {
tokenInfo, err := a.publishBiz.ValidateAccessToken(c.UserContext(), req.AccessToken)
if err != nil {
return err
}
cond := builder.NewCond().
And(builder.Eq{"token_id": tokenInfo.ID}).
And(builder.Eq{"status": 1})
userCount, err := a.userImpl.CountByCond(c.UserContext(), &cond)
if err != nil {
return err
}
if userCount >= int64(tokenInfo.UserLimit) {
return errcode.ParamErr(fmt.Sprintf("用户已达上限(%d)", tokenInfo.UserLimit))
}
userIndex := pkg.GenerateUserIndex()
err = a.userImpl.Add(c.UserContext(), &model.User{
TokenID: tokenInfo.ID,
UserIndex: userIndex,
Name: req.Name,
Status: 1,
})
if err != nil {
return errcode.SqlErr(err)
}
// 获取平台列表并关联
platCond := builder.NewCond().And(builder.Eq{"status": 1})
plats := make([]model.Plat, 0)
_, err = a.platImpl.GetListToStruct(c.UserContext(), &platCond, nil, &plats, "")
if err != nil {
return err
}
for _, plat := range plats {
loginRelation := &model.LoginRelation{
UserIndex: userIndex,
PlatIndex: plat.Index,
LoginStatus: 2,
Status: 1,
}
// 这里需要调用 loginRelationImpl 的 Add 方法
_ = loginRelation
}
return pkg.HandleResponse(c, fiber.Map{
"user_name": req.Name,
"user_index": userIndex,
})
}
func (a *AppService) DelUser(c *fiber.Ctx, req *entitys.DelUserRequest) error {
// 需要从请求中获取 access_token
// 这里简化处理
err := a.userImpl.DeleteByKey(c.UserContext(), a.userImpl.PrimaryKey(), int64(req.ID))
if err != nil {
return err
}
return pkg.HandleResponse(c, fiber.Map{})
}
func (a *AppService) GetApp(c *fiber.Ctx, req *entitys.GetAppRequest) error {
_, err := a.publishBiz.ValidateAccessToken(c.UserContext(), req.AccessToken)
if err != nil {
return err
}
cond := builder.NewCond().
And(builder.Eq{"login_relation.user_index": req.UserIndex}).
And(builder.Eq{"login_relation.status": 1}).
And(builder.Eq{"plat.status": 1})
result, err := a.platImpl.GetPlatListWithLoginStatus(c.UserContext(), &cond)
if err != nil {
return err
}
return pkg.HandleResponse(c, result)
}