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

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
}