This commit is contained in:
2026-01-25 21:59:00 +08:00
parent 7fd537bef3
commit 4cad3f0250
118 changed files with 30473 additions and 0 deletions

View File

@@ -0,0 +1,103 @@
package repository
import (
"errors"
"fmt"
"accounting-app/internal/models"
"gorm.io/gorm"
)
// Common user settings repository errors
var (
ErrUserSettingsNotFound = errors.New("user settings not found")
)
// UserSettingsRepository handles database operations for user settings
type UserSettingsRepository struct {
db *gorm.DB
}
// NewUserSettingsRepository creates a new UserSettingsRepository instance
func NewUserSettingsRepository(db *gorm.DB) *UserSettingsRepository {
return &UserSettingsRepository{db: db}
}
// GetOrCreate retrieves user settings or creates default settings if not found
func (r *UserSettingsRepository) GetOrCreate(userID uint) (*models.UserSettings, error) {
var settings models.UserSettings
// Try to get existing settings
err := r.db.Where("user_id = ?", userID).First(&settings).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
// Create default settings
settings = models.UserSettings{
UserID: &userID,
PreciseTimeEnabled: true,
IconLayout: string(models.IconLayoutFive),
ImageCompression: string(models.ImageCompressionMedium),
ShowReimbursementBtn: true,
ShowRefundBtn: true,
CurrentLedgerID: nil,
}
if err := r.db.Create(&settings).Error; err != nil {
return nil, fmt.Errorf("failed to create default settings: %w", err)
}
return &settings, nil
}
return nil, fmt.Errorf("failed to get settings: %w", err)
}
return &settings, nil
}
// Update updates existing user settings
func (r *UserSettingsRepository) Update(settings *models.UserSettings) error {
if err := r.db.Save(settings).Error; err != nil {
return fmt.Errorf("failed to update settings: %w", err)
}
return nil
}
// GetWithDefaultAccounts retrieves user settings with preloaded default account relationships
// Feature: financial-core-upgrade
// Validates: Requirements 5.1, 5.2
// GetWithDefaultAccounts retrieves user settings with preloaded default account relationships
// Feature: financial-core-upgrade
// Validates: Requirements 5.1, 5.2
func (r *UserSettingsRepository) GetWithDefaultAccounts(userID uint) (*models.UserSettings, error) {
var settings models.UserSettings
err := r.db.Where("user_id = ?", userID).
Preload("DefaultExpenseAccount").
Preload("DefaultIncomeAccount").
First(&settings).Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
// Create default settings
settings = models.UserSettings{
UserID: &userID,
PreciseTimeEnabled: true,
IconLayout: string(models.IconLayoutFive),
ImageCompression: string(models.ImageCompressionMedium),
ShowReimbursementBtn: true,
ShowRefundBtn: true,
CurrentLedgerID: nil,
}
if err := r.db.Create(&settings).Error; err != nil {
return nil, fmt.Errorf("failed to create default settings: %w", err)
}
return &settings, nil
}
return nil, fmt.Errorf("failed to get settings with default accounts: %w", err)
}
return &settings, nil
}