feat: 添加种子数据初始化功能,重构多个处理程序以简化错误响应和用户验证
This commit is contained in:
82
internal/repository/helpers.go
Normal file
82
internal/repository/helpers.go
Normal file
@@ -0,0 +1,82 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"carrotskin/pkg/database"
|
||||
"errors"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// getDB 获取数据库连接(内部使用)
|
||||
func getDB() *gorm.DB {
|
||||
return database.MustGetDB()
|
||||
}
|
||||
|
||||
// IsNotFound 检查是否为记录未找到错误
|
||||
func IsNotFound(err error) bool {
|
||||
return errors.Is(err, gorm.ErrRecordNotFound)
|
||||
}
|
||||
|
||||
// HandleNotFound 处理记录未找到的情况,未找到时返回 nil, nil
|
||||
func HandleNotFound[T any](result *T, err error) (*T, error) {
|
||||
if err != nil {
|
||||
if IsNotFound(err) {
|
||||
return nil, nil
|
||||
}
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
// Paginate 创建分页查询
|
||||
func Paginate(page, pageSize int) func(db *gorm.DB) *gorm.DB {
|
||||
return func(db *gorm.DB) *gorm.DB {
|
||||
if page < 1 {
|
||||
page = 1
|
||||
}
|
||||
if pageSize < 1 {
|
||||
pageSize = 20
|
||||
}
|
||||
if pageSize > 100 {
|
||||
pageSize = 100
|
||||
}
|
||||
offset := (page - 1) * pageSize
|
||||
return db.Offset(offset).Limit(pageSize)
|
||||
}
|
||||
}
|
||||
|
||||
// PaginatedQuery 执行分页查询,返回列表和总数
|
||||
func PaginatedQuery[T any](
|
||||
baseQuery *gorm.DB,
|
||||
page, pageSize int,
|
||||
orderBy string,
|
||||
preloads ...string,
|
||||
) ([]T, int64, error) {
|
||||
var items []T
|
||||
var total int64
|
||||
|
||||
// 获取总数
|
||||
if err := baseQuery.Count(&total).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
// 分页查询
|
||||
query := baseQuery.Scopes(Paginate(page, pageSize))
|
||||
|
||||
// 添加排序
|
||||
if orderBy != "" {
|
||||
query = query.Order(orderBy)
|
||||
}
|
||||
|
||||
// 添加预加载
|
||||
for _, preload := range preloads {
|
||||
query = query.Preload(preload)
|
||||
}
|
||||
|
||||
if err := query.Find(&items).Error; err != nil {
|
||||
return nil, 0, err
|
||||
}
|
||||
|
||||
return items, total, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user