60 lines
1.2 KiB
Go
60 lines
1.2 KiB
Go
package repository
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"xorm.io/xorm"
|
|
)
|
|
|
|
// IRepository 仓库接口
|
|
type IRepository[T any] interface {
|
|
Create(item *T) error
|
|
Update(userID int, item *T) error
|
|
FindOne(userID int) (*T, error)
|
|
Exist(userID int) bool
|
|
}
|
|
|
|
// Repository 仓库实现
|
|
var _ IRepository[any] = (*Repository[any])(nil)
|
|
|
|
// Repository 仓库实现
|
|
type Repository[T any] struct {
|
|
db *xorm.Engine
|
|
}
|
|
|
|
// NewRepository 创建仓库实例
|
|
func NewRepository[T any](db *xorm.Engine) *Repository[T] {
|
|
return &Repository[T]{db: db}
|
|
}
|
|
|
|
// Create 创建记录
|
|
func (r *Repository[T]) Create(item *T) error {
|
|
_, err := r.db.Insert(item)
|
|
return err
|
|
}
|
|
|
|
// Update 更新记录
|
|
func (r *Repository[T]) Update(userID int, item *T) error {
|
|
_, err := r.db.Where("user_id = ?", userID).AllCols().Update(item)
|
|
return err
|
|
}
|
|
|
|
// Exist 检查记录是否存在
|
|
func (r *Repository[T]) Exist(userID int) bool {
|
|
has, _ := r.db.Where("user_id = ?", userID).Exist(new(T))
|
|
return has
|
|
}
|
|
|
|
// FindOne 获取记录
|
|
func (r *Repository[T]) FindOne(userID int) (*T, error) {
|
|
item := new(T)
|
|
has, err := r.db.Where("user_id = ?", userID).Get(item)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if !has {
|
|
return nil, errors.New("item not found")
|
|
}
|
|
return item, nil
|
|
}
|