2024-04-09 08:28:18 +00:00
|
|
|
package database
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
|
2024-04-11 02:51:50 +00:00
|
|
|
"github.com/sirupsen/logrus"
|
2024-04-09 08:28:18 +00:00
|
|
|
"gorm.io/gorm"
|
|
|
|
)
|
|
|
|
|
|
|
|
type BaseDAO[T any] struct{}
|
|
|
|
|
|
|
|
func (b BaseDAO[T]) Migrate(db *gorm.DB, e T) error {
|
|
|
|
return db.Set("gorm:table_options", "CHARSET=utf8mb4").AutoMigrate(e)
|
|
|
|
}
|
|
|
|
|
2024-04-11 02:51:50 +00:00
|
|
|
func (BaseDAO[T]) GetAll(db *gorm.DB, e T, cond ...T) ([]T, error) {
|
2024-04-09 08:28:18 +00:00
|
|
|
var r []T
|
2024-04-11 02:51:50 +00:00
|
|
|
tx := db
|
|
|
|
for _, c := range cond {
|
|
|
|
tx = tx.Where(c)
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := tx.Find(&r, e).Error; err != nil {
|
2024-04-09 08:28:18 +00:00
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return r, nil
|
|
|
|
}
|
|
|
|
|
2024-04-11 02:51:50 +00:00
|
|
|
func (BaseDAO[T]) GetOne(db *gorm.DB, e T, cond ...T) (T, error) {
|
2024-04-09 08:28:18 +00:00
|
|
|
var r T
|
2024-04-11 02:51:50 +00:00
|
|
|
tx := db
|
|
|
|
for _, c := range cond {
|
|
|
|
tx = tx.Where(c)
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := tx.First(&r, e).Error; err != nil {
|
2024-04-09 08:28:18 +00:00
|
|
|
return r, err
|
|
|
|
}
|
|
|
|
return r, nil
|
|
|
|
}
|
|
|
|
|
2024-04-11 02:51:50 +00:00
|
|
|
func (BaseDAO[T]) GetSome(db *gorm.DB, e T, limit, offset int, cond ...T) ([]T, error) {
|
2024-04-09 08:28:18 +00:00
|
|
|
var r []T
|
2024-04-11 02:51:50 +00:00
|
|
|
tx := db
|
|
|
|
for _, c := range cond {
|
|
|
|
tx = tx.Where(c)
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := tx.Find(&r, e).Limit(limit).Offset(offset).Error; err != nil {
|
2024-04-09 08:28:18 +00:00
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return r, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (BaseDAO[T]) Create(db *gorm.DB, e T) (T, error) {
|
2024-04-11 02:51:50 +00:00
|
|
|
if err := db.Create(e).Error; err != nil {
|
2024-04-09 08:28:18 +00:00
|
|
|
return e, err
|
|
|
|
}
|
|
|
|
return e, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (BaseDAO[T]) FirstOrCreate(db *gorm.DB, e T) (T, error) {
|
|
|
|
if err := db.FirstOrCreate(&e).Error; err != nil {
|
|
|
|
return e, err
|
|
|
|
}
|
|
|
|
return e, nil
|
|
|
|
}
|
|
|
|
|
2024-04-11 02:51:50 +00:00
|
|
|
func (BaseDAO[T]) Update(db *gorm.DB, e T, cond ...T) (T, error) {
|
|
|
|
tx := db.Model(e)
|
|
|
|
for _, c := range cond {
|
|
|
|
tx = tx.Where(c)
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := tx.Updates(&e).Error; err != nil {
|
2024-04-09 08:28:18 +00:00
|
|
|
return e, err
|
|
|
|
}
|
|
|
|
return e, nil
|
|
|
|
}
|
|
|
|
|
2024-04-11 02:51:50 +00:00
|
|
|
func (b BaseDAO[T]) UpdateOrCreate(db *gorm.DB, e T, cond ...T) (T, error) {
|
|
|
|
logrus.Debugf("got %v %v %v", db, e, cond)
|
|
|
|
e, err := b.Update(db, e, cond...)
|
2024-04-09 08:28:18 +00:00
|
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
2024-04-11 02:51:50 +00:00
|
|
|
logrus.Debug("will create it")
|
2024-04-09 08:28:18 +00:00
|
|
|
return b.Create(db, e)
|
|
|
|
}
|
2024-04-11 02:51:50 +00:00
|
|
|
logrus.Debugf("return %v %v", e, err)
|
2024-04-09 08:28:18 +00:00
|
|
|
return e, err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (BaseDAO[T]) Delete(db *gorm.DB, e T) error {
|
|
|
|
if err := db.Delete(e).Error; err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type IBaseDAO interface {
|
|
|
|
Migrate()
|
|
|
|
|
|
|
|
GetAll()
|
|
|
|
GetOne()
|
|
|
|
GetSome()
|
|
|
|
|
|
|
|
Create()
|
|
|
|
FirstOrCreate()
|
|
|
|
|
|
|
|
Update()
|
|
|
|
UpdateOrCreate()
|
|
|
|
|
|
|
|
Delete()
|
|
|
|
}
|