新增语言学习后台服务
- 分类管理:支持分类的增删改查 - 单词管理:支持单词的增删改查,包含音标、释义、例句等字段 - 更新 README 项目说明 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/fish/language/backend/internal/models"
|
||||
"github.com/fish/language/backend/internal/repository/queries"
|
||||
)
|
||||
|
||||
// CategoryService handles business logic for categories.
|
||||
type CategoryService struct {
|
||||
q *queries.Queries
|
||||
}
|
||||
|
||||
// NewCategoryService creates a new CategoryService.
|
||||
func NewCategoryService(q *queries.Queries) *CategoryService {
|
||||
return &CategoryService{q: q}
|
||||
}
|
||||
|
||||
// List returns all categories ordered by sort_order.
|
||||
func (s *CategoryService) List(ctx context.Context) ([]models.Category, error) {
|
||||
rows, err := s.q.ListCategories(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out := make([]models.Category, len(rows))
|
||||
for i, r := range rows {
|
||||
out[i] = toCategory(r)
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// Get returns a single category by id.
|
||||
func (s *CategoryService) Get(ctx context.Context, id int32) (models.Category, error) {
|
||||
row, err := s.q.GetCategory(ctx, id)
|
||||
if err != nil {
|
||||
return models.Category{}, err
|
||||
}
|
||||
return toCategory(row), nil
|
||||
}
|
||||
|
||||
// Create creates a new category.
|
||||
func (s *CategoryService) Create(ctx context.Context, req models.CreateCategoryRequest) (models.Category, error) {
|
||||
row, err := s.q.CreateCategory(ctx, queries.CreateCategoryParams{
|
||||
Name: req.Name,
|
||||
SortOrder: req.SortOrder,
|
||||
})
|
||||
if err != nil {
|
||||
return models.Category{}, err
|
||||
}
|
||||
return toCategory(row), nil
|
||||
}
|
||||
|
||||
// Update updates an existing category.
|
||||
func (s *CategoryService) Update(ctx context.Context, id int32, req models.UpdateCategoryRequest) (models.Category, error) {
|
||||
row, err := s.q.UpdateCategory(ctx, queries.UpdateCategoryParams{
|
||||
ID: id,
|
||||
Name: req.Name,
|
||||
SortOrder: req.SortOrder,
|
||||
})
|
||||
if err != nil {
|
||||
return models.Category{}, err
|
||||
}
|
||||
return toCategory(row), nil
|
||||
}
|
||||
|
||||
// Delete removes a category by id.
|
||||
func (s *CategoryService) Delete(ctx context.Context, id int32) error {
|
||||
return s.q.DeleteCategory(ctx, id)
|
||||
}
|
||||
|
||||
func toCategory(c queries.Category) models.Category {
|
||||
return models.Category{
|
||||
ID: c.ID,
|
||||
Name: c.Name,
|
||||
SortOrder: c.SortOrder,
|
||||
CreatedAt: c.CreatedAt,
|
||||
UpdatedAt: c.UpdatedAt,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user