go-learn/service/post.go

76 lines
1.6 KiB
Go
Raw Normal View History

package service
import (
"errors"
"go_redis_learn2/domain"
"go_redis_learn2/internal/repository"
)
// IPostService 定义文章服务的业务接口
type IPostService interface {
CreatePost(post domain.Post) error
DeletePost(id uint) error
UpdatePost(post domain.Post) error
GetAllPosts() ([]domain.Post, error)
}
// PostService 实现 IPostService 接口
type PostService struct {
repo *repository.PostRepository
}
var _ IPostService = (*PostService)(nil)
// NewPostService 创建 PostService 实例
func NewPostService(repo *repository.PostRepository) IPostService {
return &PostService{
repo: repo,
}
}
// CreatePost 创建新文章
func (s *PostService) CreatePost(post domain.Post) error {
if err := s.validatePost(post); err != nil {
return err
}
return s.repo.Create(post)
}
// DeletePost 根据ID删除文章
func (s *PostService) DeletePost(id uint) error {
if id == 0 {
return errors.New("invalid post id")
}
return s.repo.DeleteByID(id)
}
// UpdatePost 更新文章
func (s *PostService) UpdatePost(post domain.Post) error {
if post.ID == 0 {
return errors.New("invalid post id")
}
if err := s.validatePost(post); err != nil {
return err
}
return s.repo.Update(post)
}
// GetAllPosts 获取所有文章
func (s *PostService) GetAllPosts() ([]domain.Post, error) {
return s.repo.FindAll()
}
// validatePost 验证文章数据
func (s *PostService) validatePost(post domain.Post) error {
if post.Title == "" {
return errors.New("标题不能为空")
}
if len(post.Title) > 100 {
return errors.New("标题长度不能超过100个字符")
}
if post.Text == "" {
return errors.New("文章内容不能为空")
}
return nil
}