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
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
|
|
}
|