Files
backend/internal/service/material_service.go
lafay 67a5660952
All checks were successful
Build Backend / build (push) Successful in 3m54s
Build Backend / build-docker (push) Successful in 1m9s
refactor: unify code formatting and improve push/search implementations
- Remove BOM from all Go source files
- Standardize import ordering and whitespace across handlers and services
- Replace PostgreSQL full-text search with ILIKE pattern matching in post and user repositories
- Enhance JPush client with TLS transport, rate limit monitoring, and simplified API
- Refactor PushService to include userID in device management methods
- Add MaxDevicesPerUser limit and extract helper functions for push payload construction
2026-04-28 14:53:04 +08:00

175 lines
5.6 KiB
Go

package service
import (
"errors"
"with_you/internal/dto"
"with_you/internal/model"
"with_you/internal/repository"
)
// ErrSubjectHasMaterials 学科下存在资料,无法删除
var ErrSubjectHasMaterials = errors.New("学科下存在资料,无法删除")
// MaterialService 学习资料服务接口
type MaterialService interface {
// 学科相关
ListActiveSubjects() ([]*model.MaterialSubject, error)
ListAllSubjects() ([]*model.MaterialSubject, error)
GetSubjectByID(id string) (*model.MaterialSubject, error)
GetSubjectByIDWithMaterialCount(id string) (*model.MaterialSubject, int64, error)
CreateSubject(name, icon, color, description string, sortOrder int, isActive bool) (*model.MaterialSubject, error)
UpdateSubject(id, name, icon, color, description string, sortOrder int, isActive bool) (*model.MaterialSubject, error)
DeleteSubject(id string) error
// 资料相关
ListMaterials(params dto.MaterialFileQueryParams) ([]*model.MaterialFile, int64, error)
GetMaterialByID(id string) (*model.MaterialFile, error)
GetMaterialByIDWithSubject(id string) (*model.MaterialFile, error)
GetMaterialsBySubject(subjectID string, page, pageSize int) ([]*model.MaterialFile, int64, error)
SearchMaterials(keyword string, page, pageSize int) ([]*model.MaterialFile, int64, error)
GetHotMaterials(limit int) ([]*model.MaterialFile, error)
GetLatestMaterials(limit int) ([]*model.MaterialFile, error)
CreateMaterial(file *model.MaterialFile) error
UpdateMaterial(file *model.MaterialFile) error
DeleteMaterial(id string) error
IncrementDownloadCount(id string) error
}
// materialServiceImpl 学习资料服务实现
type materialServiceImpl struct {
subjectRepo repository.MaterialSubjectRepository
fileRepo repository.MaterialFileRepository
}
// NewMaterialService 创建学习资料服务
func NewMaterialService(
subjectRepo repository.MaterialSubjectRepository,
fileRepo repository.MaterialFileRepository,
) MaterialService {
return &materialServiceImpl{
subjectRepo: subjectRepo,
fileRepo: fileRepo,
}
}
// =====================================================
// 学科相关方法
// =====================================================
func (s *materialServiceImpl) ListActiveSubjects() ([]*model.MaterialSubject, error) {
return s.subjectRepo.ListActive()
}
func (s *materialServiceImpl) ListAllSubjects() ([]*model.MaterialSubject, error) {
return s.subjectRepo.ListAll()
}
func (s *materialServiceImpl) GetSubjectByID(id string) (*model.MaterialSubject, error) {
return s.subjectRepo.GetByID(id)
}
func (s *materialServiceImpl) GetSubjectByIDWithMaterialCount(id string) (*model.MaterialSubject, int64, error) {
subject, err := s.subjectRepo.GetByID(id)
if err != nil {
return nil, 0, err
}
count, err := s.subjectRepo.CountMaterials(id)
if err != nil {
return subject, 0, nil
}
return subject, count, nil
}
func (s *materialServiceImpl) CreateSubject(name, icon, color, description string, sortOrder int, isActive bool) (*model.MaterialSubject, error) {
subject := &model.MaterialSubject{
Name: name,
Icon: icon,
Color: color,
Description: description,
SortOrder: sortOrder,
IsActive: isActive,
}
if err := s.subjectRepo.Create(subject); err != nil {
return nil, err
}
return subject, nil
}
func (s *materialServiceImpl) UpdateSubject(id, name, icon, color, description string, sortOrder int, isActive bool) (*model.MaterialSubject, error) {
subject, err := s.subjectRepo.GetByID(id)
if err != nil {
return nil, err
}
subject.Name = name
subject.Icon = icon
subject.Color = color
subject.Description = description
subject.SortOrder = sortOrder
subject.IsActive = isActive
if err := s.subjectRepo.Update(subject); err != nil {
return nil, err
}
return subject, nil
}
func (s *materialServiceImpl) DeleteSubject(id string) error {
// 检查学科下是否有资料
count, err := s.subjectRepo.CountMaterials(id)
if err != nil {
return err
}
if count > 0 {
return ErrSubjectHasMaterials
}
return s.subjectRepo.Delete(id)
}
// =====================================================
// 资料相关方法
// =====================================================
func (s *materialServiceImpl) ListMaterials(params dto.MaterialFileQueryParams) ([]*model.MaterialFile, int64, error) {
return s.fileRepo.List(params)
}
func (s *materialServiceImpl) GetMaterialByID(id string) (*model.MaterialFile, error) {
return s.fileRepo.GetByID(id)
}
func (s *materialServiceImpl) GetMaterialByIDWithSubject(id string) (*model.MaterialFile, error) {
return s.fileRepo.GetByIDWithSubject(id)
}
func (s *materialServiceImpl) GetMaterialsBySubject(subjectID string, page, pageSize int) ([]*model.MaterialFile, int64, error) {
return s.fileRepo.GetBySubjectID(subjectID, page, pageSize)
}
func (s *materialServiceImpl) SearchMaterials(keyword string, page, pageSize int) ([]*model.MaterialFile, int64, error) {
return s.fileRepo.Search(keyword, page, pageSize)
}
func (s *materialServiceImpl) GetHotMaterials(limit int) ([]*model.MaterialFile, error) {
return s.fileRepo.GetHotMaterials(limit)
}
func (s *materialServiceImpl) GetLatestMaterials(limit int) ([]*model.MaterialFile, error) {
return s.fileRepo.GetLatestMaterials(limit)
}
func (s *materialServiceImpl) CreateMaterial(file *model.MaterialFile) error {
return s.fileRepo.Create(file)
}
func (s *materialServiceImpl) UpdateMaterial(file *model.MaterialFile) error {
return s.fileRepo.Update(file)
}
func (s *materialServiceImpl) DeleteMaterial(id string) error {
return s.fileRepo.Delete(id)
}
func (s *materialServiceImpl) IncrementDownloadCount(id string) error {
return s.fileRepo.IncrementDownloadCount(id)
}