Files
goalfylearning-admin/internal/storage/user_project_quota_storage.go

76 lines
2.1 KiB
Go

package storage
import (
"goalfymax-admin/internal/models"
"gorm.io/gorm"
)
type UserProjectQuotaFilter struct {
UserID string
Enabled *bool
Page int
Size int
}
type UserProjectQuotaStorage interface {
Create(q *models.UserProjectQuota) error
Update(q *models.UserProjectQuota) error
Delete(id uint) error
GetByID(id uint) (*models.UserProjectQuota, error)
GetByUserID(userID string) (*models.UserProjectQuota, error)
List(filter UserProjectQuotaFilter) ([]models.UserProjectQuota, int64, error)
}
type userProjectQuotaStorage struct{ db *gorm.DB }
func NewUserProjectQuotaStorage() UserProjectQuotaStorage { return &userProjectQuotaStorage{db: DB} }
func (s *userProjectQuotaStorage) Create(q *models.UserProjectQuota) error {
return s.db.Create(q).Error
}
func (s *userProjectQuotaStorage) Update(q *models.UserProjectQuota) error { return s.db.Save(q).Error }
func (s *userProjectQuotaStorage) Delete(id uint) error {
return s.db.Delete(&models.UserProjectQuota{}, id).Error
}
func (s *userProjectQuotaStorage) GetByID(id uint) (*models.UserProjectQuota, error) {
var out models.UserProjectQuota
if err := s.db.First(&out, id).Error; err != nil {
return nil, err
}
return &out, nil
}
func (s *userProjectQuotaStorage) GetByUserID(userID string) (*models.UserProjectQuota, error) {
var out models.UserProjectQuota
if err := s.db.Where("user_id = ?", userID).First(&out).Error; err != nil {
return nil, err
}
return &out, nil
}
func (s *userProjectQuotaStorage) List(filter UserProjectQuotaFilter) ([]models.UserProjectQuota, int64, error) {
var (
items []models.UserProjectQuota
total int64
)
q := s.db.Model(&models.UserProjectQuota{})
if filter.UserID != "" {
q = q.Where("user_id LIKE ?", "%"+filter.UserID+"%")
}
if filter.Enabled != nil {
q = q.Where("enabled = ?", *filter.Enabled)
}
if err := q.Count(&total).Error; err != nil {
return nil, 0, err
}
page, size := filter.Page, filter.Size
if page <= 0 {
page = 1
}
if size <= 0 || size > 200 {
size = 20
}
if err := q.Order("id DESC").Offset((page - 1) * size).Limit(size).Find(&items).Error; err != nil {
return nil, 0, err
}
return items, total, nil
}