mengstack-api/internal/modules/settings/infrastructure/setting_repo.go
MengStack Dev 0eb6a96057 feat(settings): M5 配置管理模块
DB-backed runtime settings with global/tenant scope, key-value store,
type support (string/number/bool/json), tenant-level overrides with
global fallback.
2026-10-03 01:02:53 +08:00

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
}