112 lines
2.5 KiB
Go
112 lines
2.5 KiB
Go
package services
|
|
|
|
import (
|
|
"github.com/goravel/framework/contracts/database/orm"
|
|
"github.com/goravel/framework/facades"
|
|
|
|
apperrors "goravel/app/errors"
|
|
"goravel/app/http/requests/admin"
|
|
"goravel/app/models"
|
|
)
|
|
|
|
type ArticleService interface {
|
|
GetByID(id uint) (*models.Article, error)
|
|
GetList(filters ArticleFilters, page, pageSize int) ([]models.Article, int64, error)
|
|
|
|
Create(req *admin.ArticleCreate) (*models.Article, error)
|
|
|
|
Update(id uint, req *admin.ArticleUpdate) (*models.Article, error)
|
|
|
|
Delete(id uint) error
|
|
}
|
|
|
|
type ArticleFilters struct {
|
|
Name string
|
|
Status string
|
|
}
|
|
|
|
type ArticleServiceImpl struct{}
|
|
|
|
func NewArticleService() ArticleService {
|
|
return &ArticleServiceImpl{}
|
|
}
|
|
|
|
func BuildArticleQuery(filters ArticleFilters) orm.Query {
|
|
query := facades.Orm().Query().Model(&models.Article{})
|
|
|
|
if filters.Name != "" {
|
|
|
|
query = query.Where("name LIKE ?", "%"+filters.Name+"%")
|
|
|
|
}
|
|
if filters.Status != "" {
|
|
|
|
query = query.Where("status = ?", filters.Status)
|
|
|
|
}
|
|
|
|
return query
|
|
}
|
|
|
|
func (s *ArticleServiceImpl) GetByID(id uint) (*models.Article, error) {
|
|
var item models.Article
|
|
if err := facades.Orm().Query().Where("id", id).FirstOrFail(&item); err != nil {
|
|
return nil, apperrors.NewBusinessError("article_not_found", "Article not found").WithError(err)
|
|
}
|
|
return &item, nil
|
|
}
|
|
|
|
func (s *ArticleServiceImpl) GetList(filters ArticleFilters, page, pageSize int) ([]models.Article, int64, error) {
|
|
query := BuildArticleQuery(filters)
|
|
|
|
var list []models.Article
|
|
var total int64
|
|
if err := query.Order("id desc").Paginate(page, pageSize, &list, &total); err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
return list, total, nil
|
|
}
|
|
|
|
func (s *ArticleServiceImpl) Create(req *admin.ArticleCreate) (*models.Article, error) {
|
|
item := &models.Article{
|
|
|
|
Name: req.Name,
|
|
Status: req.Status,
|
|
}
|
|
|
|
if err := facades.Orm().Query().Create(item); err != nil {
|
|
return nil, apperrors.ErrCreateFailed.WithError(err)
|
|
}
|
|
|
|
return item, nil
|
|
}
|
|
|
|
func (s *ArticleServiceImpl) Update(id uint, req *admin.ArticleUpdate) (*models.Article, error) {
|
|
item, err := s.GetByID(id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if req.Name != nil {
|
|
item.Name = *req.Name
|
|
}
|
|
if req.Status != nil {
|
|
item.Status = *req.Status
|
|
}
|
|
|
|
if err := facades.Orm().Query().Save(item); err != nil {
|
|
return nil, apperrors.ErrUpdateFailed.WithError(err)
|
|
}
|
|
|
|
return item, nil
|
|
}
|
|
|
|
func (s *ArticleServiceImpl) Delete(id uint) error {
|
|
// 使用 Soft Delete
|
|
if _, err := facades.Orm().Query().Where("id", id).Delete(&models.Article{}); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|