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.

224 lines
5.1 KiB
Go

package column
import (
"cls/internal/domain/column"
"cls/internal/domain/purchase"
"cls/internal/domain/user"
"cls/pkg/logger"
"cls/pkg/util/page"
"cls/pkg/web"
"errors"
"time"
)
var (
ErrInvalidTitle = errors.New("标题不能为空")
ErrNotFound = errors.New("专栏不存在")
ErrInvalidPage = errors.New("无效的分页参数")
)
// Service 专栏应用服务
type Service struct {
repo column.ColumnRepository
purchaseRepo purchase.Repository
userRepo user.UserRepository
log logger.Logger
}
// NewService 创建专栏服务
func NewService(repo column.ColumnRepository, purchaseRepo purchase.Repository, userRepo user.UserRepository, log logger.New) *Service {
return &Service{
repo: repo,
purchaseRepo: purchaseRepo,
userRepo: userRepo,
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
}
// GetColumn 获取专栏信息
func (s *Service) GetColumn(ePhone string, name string) (*ColumnDto, error) {
unlock := false
col, err := s.repo.FindByName(name)
if err != nil {
s.log.Error("failed to find column", "error", err)
return nil, err
}
if ePhone != "" {
u, _ := s.userRepo.FindByPhone(ePhone)
if u != nil {
data, _ := s.purchaseRepo.FindColumnWithId(u.Id, col.ID)
if data != nil {
if data.ContentId == col.ID {
unlock = true
}
}
}
}
columnDto := &ColumnDto{
ID: col.ID,
Title: col.Title,
Brief: col.Brief,
Cover: col.Brief,
ArticleNum: col.ArticleNum,
FollowNum: col.FollowNum,
PurchaseNum: col.PurchaseNum,
Unlock: unlock,
CreatedAt: time.Time{},
}
if ePhone == "" {
return columnDto, nil
}
userData, err := s.userRepo.FindByPhone(ePhone)
if err != nil {
s.log.Error(err.Error())
return columnDto, nil
}
purchaseData, err := s.purchaseRepo.FindColumnById(userData.Id, col.ID)
if err != nil {
s.log.Error(err)
return columnDto, nil
}
if len(purchaseData) != 0 {
if purchaseData[0].ContentId == col.ID {
columnDto.Unlock = true
}
}
return columnDto, nil
}
// GetAuthorColumns 获取作者的专栏列表
func (s *Service) GetAuthorColumns(authorID uint64) ([]*ColumnDto, error) {
cols, err := s.repo.FindByAuthorID(authorID)
if err != nil {
s.log.Error("failed to find author columns", "error", err)
return nil, err
}
return ToDtoList(cols), 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(p.Content.([]*column.Column))
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
}