geoGo/internal/service/publish.go

206 lines
4.9 KiB
Go

package service
import (
"errors"
"fmt"
"geo/internal/data/model"
"geo/utils"
"os"
"path/filepath"
"time"
"github.com/gofiber/fiber/v2"
"geo/internal/biz"
"geo/internal/config"
"geo/internal/entitys"
"geo/internal/manager"
"geo/pkg"
"geo/tmpl/errcode"
)
type PublishService struct {
cfg *config.Config
publishBiz *biz.PublishBiz
db *utils.Db
}
func NewPublishService(
cfg *config.Config,
publishBiz *biz.PublishBiz,
db *utils.Db,
) *PublishService {
return &PublishService{
cfg: cfg,
publishBiz: publishBiz,
db: db,
}
}
func (s *PublishService) PublishRecords(c *fiber.Ctx, req *entitys.PublishRecordsRequest) error {
// 验证token
tokenInfo, err := s.publishBiz.ValidateAccessToken(c.UserContext(), req.AccessToken)
if err != nil {
return err
}
// 转换记录
validRecords := make([]*model.Publish, 0)
for _, record := range req.Records {
publishTime, err := time.Parse("2006-01-02 15:04:05", record.PublishTime)
if err != nil {
return errcode.ParamErr(fmt.Sprintf("时间格式错误: %v", err))
}
validRecords = append(validRecords, &model.Publish{
UserIndex: record.UserIndex,
RequestID: record.RequestID,
Title: record.Title,
Tag: record.Tag,
Type: record.Type,
PlatIndex: record.PlatIndex,
URL: record.URL,
PublishTime: publishTime,
Img: record.Img,
TokenID: tokenInfo.ID,
})
}
err = s.publishBiz.BatchInsertPublish(c.UserContext(), validRecords)
if err != nil {
return err
}
return pkg.HandleResponse(c, fiber.Map{
"total": len(validRecords),
})
}
func (s *PublishService) PublishOn(c *fiber.Ctx, req *entitys.PublishOnRequest) error {
tokenInfo, err := s.publishBiz.ValidateAccessToken(c.UserContext(), req.AccessToken)
if err != nil {
return err
}
pm := manager.GetPublishManager(s.cfg, s.db)
if pm.Start(int(tokenInfo.ID)) {
return pkg.HandleResponse(c, fiber.Map{
"auto_status": pm.AutoStatus,
})
}
return errors.New("自动发布服务已在运行中")
}
func (s *PublishService) PublishOff(c *fiber.Ctx, req *entitys.PublishOffRequest) error {
_, err := s.publishBiz.ValidateAccessToken(c.UserContext(), req.AccessToken)
if err != nil {
return err
}
pm := manager.GetPublishManager(s.cfg, s.db)
if pm.Stop() {
return pkg.HandleResponse(c, fiber.Map{})
}
return errors.New("自动发布服务未运行")
}
func (s *PublishService) PublishStatus(c *fiber.Ctx, req *entitys.PublishStatusRequest) error {
_, err := s.publishBiz.ValidateAccessToken(c.UserContext(), req.AccessToken)
if err != nil {
return err
}
pm := manager.GetPublishManager(s.cfg, s.db)
if req.RequestID != "" {
// 查询单个任务
task, err := s.publishBiz.GetTaskByRequestID(c.UserContext(), req.RequestID)
if err != nil {
return errcode.NotFound("任务不存在")
}
return pkg.HandleResponse(c, task)
}
// 查询整体状态
return pkg.HandleResponse(c, pm.GetStatus())
}
func (s *PublishService) PublishExecuteOnce(c *fiber.Ctx, req *entitys.PublishExecuteOnceRequest) error {
tokenInfo, err := s.publishBiz.ValidateAccessToken(c.UserContext(), req.AccessToken)
if err != nil {
return err
}
pm := manager.GetPublishManager(s.cfg, s.db)
result := pm.ExecuteOnce(tokenInfo.ID)
return pkg.HandleResponse(c, result)
}
func (s *PublishService) PublishExecuteRetry(c *fiber.Ctx, req *entitys.PublishExecuteRetryRequest) error {
_, err := s.publishBiz.ValidateAccessToken(c.UserContext(), req.AccessToken)
if err != nil {
return err
}
pm := manager.GetPublishManager(s.cfg, s.db)
result := pm.RetryTask(req.RequestID)
return pkg.HandleResponse(c, result)
}
func (s *PublishService) GetPublishList(c *fiber.Ctx, req *entitys.GetPublishListRequest) error {
tokenInfo, err := s.publishBiz.ValidateAccessToken(c.UserContext(), req.AccessToken)
if err != nil {
return err
}
page := req.Page
if page < 1 {
page = 1
}
pageSize := req.PageSize
if pageSize < 1 {
pageSize = 20
}
if pageSize > 100 {
pageSize = 100
}
filters := map[string]interface{}{
"user_index": req.UserIndex,
"tag": req.Tag,
"type": req.Type,
"plat_index": req.PlatIndex,
"status": req.Status,
"request_id": req.RequestID,
}
list, total, err := s.publishBiz.GetPublishList(c.UserContext(), tokenInfo.ID, page, pageSize, filters)
if err != nil {
return err
}
return pkg.HandleResponse(c, fiber.Map{
"list": list,
"pagination": fiber.Map{
"page": page,
"page_size": pageSize,
"total": total,
"total_pages": (total + int64(pageSize) - 1) / int64(pageSize),
},
})
}
func (s *PublishService) GetLogs(c *fiber.Ctx, requestID string) error {
logFile := filepath.Join(s.cfg.Sys.LogsDir, requestID+".log")
content, err := os.ReadFile(logFile)
if err != nil {
return errcode.NotFound("日志文件不存在")
}
return pkg.HandleResponse(c, fiber.Map{
"request_id": requestID,
"log_content": string(content),
})
}