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 }