104 lines
3.0 KiB
Go
104 lines
3.0 KiB
Go
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
|
|
}
|