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>
108 lines
2.8 KiB
Go
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
|
|
}
|