- 新增界面截图与 CONTRIBUTING.md - README 以三栏布局、暗色主题、移动端等视觉亮点为主 - go module 迁移至 git.iioio.com/freefire/jiang13-forum Co-authored-by: Cursor <cursoragent@cursor.com>
67 lines
1.7 KiB
Go
67 lines
1.7 KiB
Go
package service
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"git.iioio.com/freefire/jiang13-forum/model"
|
|
)
|
|
|
|
type BoardService struct{}
|
|
|
|
func NewBoardService() *BoardService {
|
|
return &BoardService{}
|
|
}
|
|
|
|
// BoardWithStats 板块及帖子数量
|
|
type BoardWithStats struct {
|
|
model.Board
|
|
PostCount int `json:"post_count"`
|
|
}
|
|
|
|
func (s *BoardService) List() ([]model.Board, error) {
|
|
var boards []model.Board
|
|
err := model.DB.Order("sort_order asc, id asc").Find(&boards).Error
|
|
return boards, err
|
|
}
|
|
|
|
func (s *BoardService) ListWithStats() ([]BoardWithStats, error) {
|
|
boards, err := s.List()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
result := make([]BoardWithStats, len(boards))
|
|
for i, b := range boards {
|
|
var count int64
|
|
model.DB.Model(&model.Post{}).Where("board_id = ?", b.ID).Count(&count)
|
|
result[i] = BoardWithStats{Board: b, PostCount: int(count)}
|
|
}
|
|
return result, nil
|
|
}
|
|
func (s *BoardService) GetByID(id uint) (*model.Board, error) {
|
|
var board model.Board
|
|
if err := model.DB.First(&board, id).Error; err != nil {
|
|
return nil, ErrBoardNotFound
|
|
}
|
|
return &board, nil
|
|
}
|
|
|
|
func (s *BoardService) Create(name, desc string, sortOrder int) (*model.Board, error) {
|
|
board := &model.Board{Name: name, Description: desc, SortOrder: sortOrder}
|
|
return board, model.DB.Create(board).Error
|
|
}
|
|
|
|
func (s *BoardService) Update(id uint, name, desc string, sortOrder int) error {
|
|
return model.DB.Model(&model.Board{}).Where("id = ?", id).Updates(map[string]interface{}{
|
|
"name": name, "description": desc, "sort_order": sortOrder,
|
|
}).Error
|
|
}
|
|
|
|
func (s *BoardService) Delete(id uint) error {
|
|
var count int64
|
|
model.DB.Model(&model.Post{}).Where("board_id = ?", id).Count(&count)
|
|
if count > 0 {
|
|
return errors.New("该板块下还有帖子,无法删除")
|
|
}
|
|
return model.DB.Delete(&model.Board{}, id).Error
|
|
}
|