Smail/plugins/pmail_telegram_push/db/repository/repository.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
}