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) }