You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
3.4 KiB
Go
156 lines
3.4 KiB
Go
![]()
3 weeks ago
|
package column
|
||
|
|
||
|
import (
|
||
|
"cls-server/internal/domain/column"
|
||
|
"cls-server/pkg/logger"
|
||
|
"cls-server/pkg/util/page"
|
||
|
"cls-server/pkg/web"
|
||
|
"errors"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
ErrInvalidTitle = errors.New("标题不能为空")
|
||
|
ErrNotFound = errors.New("专栏不存在")
|
||
|
ErrInvalidPage = errors.New("无效的分页参数")
|
||
|
)
|
||
|
|
||
|
// Service 专栏应用服务
|
||
|
type Service struct {
|
||
|
repo column.ColumnRepository
|
||
|
log logger.Logger
|
||
|
}
|
||
|
|
||
|
// NewService 创建专栏服务
|
||
|
func NewService(repo column.ColumnRepository, log logger.New) *Service {
|
||
|
return &Service{
|
||
|
repo: repo,
|
||
|
log: log("cls:service:column"),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// CreateColumn 创建专栏
|
||
|
func (s *Service) CreateColumn(req *CreateColumnReq) (*ColumnDto, error) {
|
||
|
if req.Title == "" {
|
||
|
return nil, ErrInvalidTitle
|
||
|
}
|
||
|
|
||
|
col := column.NewColumn(req.Title, req.Brief, req.Cover, req.AuthorID)
|
||
|
if err := s.repo.Save(col); err != nil {
|
||
|
s.log.Error("failed to save column", "error", err)
|
||
|
return nil, err
|
||
|
}
|
||
|
return ToDto(col), nil
|
||
|
}
|
||
|
|
||
|
// GetColumnList 获取专栏列表
|
||
|
func (s *Service) GetColumnList(p *page.Page, params map[string]string) error {
|
||
|
conds := web.ParseFilters(params)
|
||
|
cols := make([]*column.Column, 0)
|
||
|
p.Content = &cols
|
||
|
if err := s.repo.FindAll(p, conds); err != nil {
|
||
|
s.log.Error("failed to find columns", "error", err)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
p.Content = ToDtoList(cols)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// UpdateColumn 更新专栏信息
|
||
|
func (s *Service) UpdateColumn(req *UpdateColumnReq) (*ColumnDto, error) {
|
||
|
if req.Title == "" {
|
||
|
return nil, ErrInvalidTitle
|
||
|
}
|
||
|
|
||
|
col, err := s.repo.FindByID(req.ID)
|
||
|
if err != nil {
|
||
|
s.log.Error("failed to find column", "error", err)
|
||
|
return nil, err
|
||
|
}
|
||
|
if col == nil {
|
||
|
return nil, ErrNotFound
|
||
|
}
|
||
|
|
||
|
col.Title = req.Title
|
||
|
col.Brief = req.Brief
|
||
|
col.Cover = req.Cover
|
||
|
|
||
|
if err := s.repo.Update(col); err != nil {
|
||
|
s.log.Error("failed to update column", "error", err)
|
||
|
return nil, err
|
||
|
}
|
||
|
return ToDto(col), nil
|
||
|
}
|
||
|
|
||
|
// DeleteColumn 删除专栏
|
||
|
func (s *Service) DeleteColumn(id uint64) error {
|
||
|
return s.repo.Delete(id)
|
||
|
}
|
||
|
|
||
|
// UpdateColumnStatus 更新专栏状态
|
||
|
func (s *Service) UpdateColumnStatus(req *UpdateStatusReq) (*ColumnDto, error) {
|
||
|
col, err := s.repo.FindByID(req.ID)
|
||
|
if err != nil {
|
||
|
s.log.Error("failed to find column", "error", err)
|
||
|
return nil, err
|
||
|
}
|
||
|
if col == nil {
|
||
|
return nil, ErrNotFound
|
||
|
}
|
||
|
|
||
|
col.Status = req.Status
|
||
|
if err := s.repo.Update(col); err != nil {
|
||
|
s.log.Error("failed to update column status", "error", err)
|
||
|
return nil, err
|
||
|
}
|
||
|
return ToDto(col), nil
|
||
|
}
|
||
|
|
||
|
// UpdateFollowNum 更新关注人数
|
||
|
func (s *Service) UpdateFollowNum(id uint64, isAdd bool) error {
|
||
|
col, err := s.repo.FindByID(id)
|
||
|
if err != nil {
|
||
|
s.log.Error("failed to find column", "error", err)
|
||
|
return err
|
||
|
}
|
||
|
if col == nil {
|
||
|
return ErrNotFound
|
||
|
}
|
||
|
|
||
|
if isAdd {
|
||
|
col.AddFollow()
|
||
|
} else {
|
||
|
col.RemoveFollow()
|
||
|
}
|
||
|
|
||
|
if err := s.repo.Update(col); err != nil {
|
||
|
s.log.Error("failed to update column follow num", "error", err)
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// UpdatePurchaseNum 更新购买人数
|
||
|
func (s *Service) UpdatePurchaseNum(id uint64, isAdd bool) error {
|
||
|
col, err := s.repo.FindByID(id)
|
||
|
if err != nil {
|
||
|
s.log.Error("failed to find column", "error", err)
|
||
|
return err
|
||
|
}
|
||
|
if col == nil {
|
||
|
return ErrNotFound
|
||
|
}
|
||
|
|
||
|
if isAdd {
|
||
|
col.AddPurchase()
|
||
|
} else {
|
||
|
col.RemovePurchase()
|
||
|
}
|
||
|
|
||
|
if err := s.repo.Update(col); err != nil {
|
||
|
s.log.Error("failed to update column purchase num", "error", err)
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|