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" ) 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) { col, err := s.repo.FindByName(name) if err != nil { s.log.Error("failed to find column", "error", err) return nil, err } columnDto := &ColumnDto{ ID: col.ID, Title: col.Title, Brief: col.Brief, Cover: col.Brief, Unlock: false, } 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 }