174 lines
4.2 KiB
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)
|
|
}
|