package service import ( "fmt" "geo/internal/manager" "geo/internal/publisher" "os" "path/filepath" "strconv" "github.com/gofiber/fiber/v2" "geo/internal/biz" "geo/internal/config" "geo/internal/entitys" "geo/pkg" "geo/tmpl/errcode" ) type LoginService struct { cfg *config.Config publishBiz *biz.PublishBiz authBiz *biz.AuthBiz } func NewLoginService( cfg *config.Config, publishBiz *biz.PublishBiz, authBiz *biz.AuthBiz, ) *LoginService { return &LoginService{ cfg: cfg, publishBiz: publishBiz, authBiz: authBiz, } } func (s *LoginService) LoginPlatform(c *fiber.Ctx, req *entitys.LoginPlatformRequest) error { _, err := s.authBiz.ValidateAccessToken(c.UserContext(), req.AccessToken) if err != nil { return err } // 获取平台信息 platInfo, err := s.publishBiz.GetPlatInfo(c.UserContext(), req.PlatIndex) if err != nil { return errcode.NotFound("平台不存在") } // 创建发布器 publisherClass := manager.GetPublisherClass(req.PlatIndex) if publisherClass == nil { return errcode.NotFound("平台不存在") } task := &publisher.TaskParams{ PlatIndex: req.PlatIndex, UserIndex: req.UserIndex, PublishData: &entitys.PublishTaskDetail{ LoginedUrl: platInfo.LoginedURL, EditUrl: platInfo.EditURL, LoginUrl: platInfo.LoginURL, }, } pub := publisherClass.InitMethod(c.UserContext(), task, s.cfg, nil) success, msg := pub.WaitLogin() if !success { return errcode.SysErr(msg) } // 更新登录状态 err = s.publishBiz.UpdateLoginStatus(c.UserContext(), req.UserIndex, req.PlatIndex, 1) if err != nil { return err } return pkg.HandleResponse(c, fiber.Map{}) } func (s *LoginService) LogoutPlatform(c *fiber.Ctx, req *entitys.LogoutPlatformRequest) error { _, err := s.authBiz.ValidateAccessToken(c.UserContext(), req.AccessToken) if err != nil { return err } // 更新登录状态为未登录 err = s.publishBiz.UpdateLoginStatus(c.UserContext(), req.UserIndex, req.PlatIndex, 2) if err != nil { return err } return pkg.HandleResponse(c, fiber.Map{}) } func (s *LoginService) ServeQrcode(c *fiber.Ctx, filename string) error { filepath := filepath.Join(s.cfg.Sys.QrcodesDir, filename) if _, err := os.Stat(filepath); os.IsNotExist(err) { return errcode.NotFound("二维码不存在") } return c.SendFile(filepath) } func (s *LoginService) Log(c *fiber.Ctx) error { var content []byte r_id := c.Params("request_id", "") if r_id == "" { return errcode.ParamErr("request_id未传") } idStr := c.Params("publish_id", "") id, err := strconv.Atoi(idStr) if err != nil { // 转换失败处理 return errcode.ParamErr("idStr格式错误") } logFile := filepath.Join(s.cfg.Sys.LogsDir, fmt.Sprintf("%d_%s.log", id, r_id)) if _, err := os.Stat(logFile); !os.IsNotExist(err) { content, err = os.ReadFile(logFile) if err != nil { return errcode.SysErr("读取日志失败") } } else { publishData, _err := s.publishBiz.GetTaskByPublishId(c.UserContext(), id) if _err != nil || len(publishData.LogUrl) == 0 { return errcode.SysErr("读取日志失败") } logPath, _err := pkg.DownloadFile(publishData.LogUrl, s.cfg.Sys.LogsDir, fmt.Sprintf("%d_%s.log", id, r_id)) if _err != nil { return errcode.SysErr("读取日志失败") } content, _err = os.ReadFile(logPath) if _err != nil { return errcode.SysErr("读取日志失败") } } return pkg.HandleResponse(c, fiber.Map{"content": string(content)}) }