Files
honeyDueAPI/internal/repositories/admin_repo.go
Trey t 4976eafc6c Rebrand from Casera/MyCrib to honeyDue
Total rebrand across all Go API source files:
- Go module path: casera-api -> honeydue-api
- All imports updated (130+ files)
- Docker: containers, images, networks renamed
- Email templates: support email, noreply, icon URL
- Domains: casera.app/mycrib.treytartt.com -> honeyDue.treytartt.com
- Bundle IDs: com.tt.casera -> com.tt.honeyDue
- IAP product IDs updated
- Landing page, admin panel, config defaults
- Seeds, CI workflows, Makefile, docs
- Database table names preserved (no migration needed)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 06:33:38 -06:00

108 lines
2.8 KiB
Go

package repositories
import (
"errors"
"time"
"gorm.io/gorm"
"github.com/treytartt/honeydue-api/internal/models"
)
var (
ErrAdminNotFound = errors.New("admin user not found")
ErrAdminExists = errors.New("admin user already exists")
)
// AdminRepository handles admin user database operations
type AdminRepository struct {
db *gorm.DB
}
// NewAdminRepository creates a new admin repository
func NewAdminRepository(db *gorm.DB) *AdminRepository {
return &AdminRepository{db: db}
}
// FindByID finds an admin user by ID
func (r *AdminRepository) FindByID(id uint) (*models.AdminUser, error) {
var admin models.AdminUser
if err := r.db.First(&admin, id).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, ErrAdminNotFound
}
return nil, err
}
return &admin, nil
}
// FindByEmail finds an admin user by email (case-insensitive)
func (r *AdminRepository) FindByEmail(email string) (*models.AdminUser, error) {
var admin models.AdminUser
if err := r.db.Where("LOWER(email) = LOWER(?)", email).First(&admin).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, ErrAdminNotFound
}
return nil, err
}
return &admin, nil
}
// Create creates a new admin user
func (r *AdminRepository) Create(admin *models.AdminUser) error {
// Check if email already exists
var count int64
if err := r.db.Model(&models.AdminUser{}).Where("LOWER(email) = LOWER(?)", admin.Email).Count(&count).Error; err != nil {
return err
}
if count > 0 {
return ErrAdminExists
}
return r.db.Create(admin).Error
}
// Update updates an admin user
func (r *AdminRepository) Update(admin *models.AdminUser) error {
return r.db.Save(admin).Error
}
// Delete deletes an admin user
func (r *AdminRepository) Delete(id uint) error {
return r.db.Delete(&models.AdminUser{}, id).Error
}
// UpdateLastLogin updates the last login timestamp
func (r *AdminRepository) UpdateLastLogin(id uint) error {
now := time.Now()
return r.db.Model(&models.AdminUser{}).Where("id = ?", id).Update("last_login", now).Error
}
// List returns all admin users with pagination
func (r *AdminRepository) List(page, pageSize int) ([]models.AdminUser, int64, error) {
var admins []models.AdminUser
var total int64
// Get total count
if err := r.db.Model(&models.AdminUser{}).Count(&total).Error; err != nil {
return nil, 0, err
}
// Get paginated results
offset := (page - 1) * pageSize
if err := r.db.Order("created_at DESC").Offset(offset).Limit(pageSize).Find(&admins).Error; err != nil {
return nil, 0, err
}
return admins, total, nil
}
// ExistsByEmail checks if an admin user with the given email exists
func (r *AdminRepository) ExistsByEmail(email string) (bool, error) {
var count int64
if err := r.db.Model(&models.AdminUser{}).Where("LOWER(email) = LOWER(?)", email).Count(&count).Error; err != nil {
return false, err
}
return count > 0, nil
}