DB-backed runtime settings with global/tenant scope, key-value store, type support (string/number/bool/json), tenant-level overrides with global fallback.
73 lines
1.8 KiB
Go
73 lines
1.8 KiB
Go
package infrastructure
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
"mengstack/internal/modules/settings/domain"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type settingRepo struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewSettingRepository(db *gorm.DB) domain.SettingRepository {
|
|
return &settingRepo{db: db}
|
|
}
|
|
|
|
func (r *settingRepo) Upsert(ctx context.Context, setting *domain.Setting) error {
|
|
var existing domain.Setting
|
|
err := r.db.WithContext(ctx).
|
|
Where("tenant_id = ? AND key = ?", setting.TenantID, setting.Key).
|
|
First(&existing).Error
|
|
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return r.db.WithContext(ctx).Create(setting).Error
|
|
}
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return r.db.WithContext(ctx).
|
|
Model(&existing).
|
|
Updates(map[string]interface{}{
|
|
"value": setting.Value,
|
|
"type": setting.Type,
|
|
"updated_by": setting.UpdatedBy,
|
|
}).Error
|
|
}
|
|
|
|
func (r *settingRepo) FindByKey(ctx context.Context, tenantID, key string) (*domain.Setting, error) {
|
|
var setting domain.Setting
|
|
err := r.db.WithContext(ctx).
|
|
Where("tenant_id = ? AND key = ?", tenantID, key).
|
|
First(&setting).Error
|
|
return &setting, err
|
|
}
|
|
|
|
func (r *settingRepo) FindByTenant(ctx context.Context, tenantID string) ([]domain.Setting, error) {
|
|
var settings []domain.Setting
|
|
err := r.db.WithContext(ctx).
|
|
Where("tenant_id = ?", tenantID).
|
|
Order("key").
|
|
Find(&settings).Error
|
|
return settings, err
|
|
}
|
|
|
|
func (r *settingRepo) FindGlobal(ctx context.Context) ([]domain.Setting, error) {
|
|
var settings []domain.Setting
|
|
err := r.db.WithContext(ctx).
|
|
Where("tenant_id = ''").
|
|
Order("key").
|
|
Find(&settings).Error
|
|
return settings, err
|
|
}
|
|
|
|
func (r *settingRepo) Delete(ctx context.Context, tenantID, key string) error {
|
|
return r.db.WithContext(ctx).
|
|
Where("tenant_id = ? AND key = ?", tenantID, key).
|
|
Delete(&domain.Setting{}).Error
|
|
}
|