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 }