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 }