206 lines
4.9 KiB
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),
|
|
})
|
|
}
|