Files
OpenFlare/backend/openflare/plugins/server/kernel/repository/db.go
T

141 lines
3.9 KiB
Go

// Copyright 2026 Arctel.net
// SPDX-License-Identifier: Apache-2.0
package repository
import (
"context"
"strconv"
"sync"
"Wavelet/core/contracts"
"Wavelet/openflare/plugins/server/kernel/repository/logstore"
"gorm.io/gorm"
)
var (
dbMu sync.RWMutex
dbSvc contracts.DBService
)
// SetDBService injects the platform DBService.
func SetDBService(s contracts.DBService) {
dbMu.Lock()
defer dbMu.Unlock()
dbSvc = s
if s != nil {
logstore.SetDBResolver(s.DB)
} else {
logstore.SetDBResolver(nil)
}
}
type dbServiceAdapter struct {
db *gorm.DB
}
func (a *dbServiceAdapter) DB(ctx context.Context) *gorm.DB {
if a.db == nil {
return nil
}
return a.db.WithContext(ctx)
}
func (a *dbServiceAdapter) GORM() *gorm.DB {
return a.db
}
func (a *dbServiceAdapter) Named(string) *gorm.DB {
return a.db
}
type defaultGormConfigService struct {
db *gorm.DB
}
func (s *defaultGormConfigService) GetByKey(ctx context.Context, key string) (contracts.SystemConfigDTO, error) {
var cfg contracts.SystemConfigDTO
err := s.db.WithContext(ctx).Table("w_system_configs").Where("key = ?", key).First(&cfg).Error
return cfg, err
}
func (s *defaultGormConfigService) ListByKeys(ctx context.Context, keys []string) (map[string]contracts.SystemConfigDTO, error) {
var cfgs []contracts.SystemConfigDTO
if err := s.db.WithContext(ctx).Table("w_system_configs").Where("key IN ?", keys).Find(&cfgs).Error; err != nil {
return nil, err
}
res := make(map[string]contracts.SystemConfigDTO, len(cfgs))
for _, c := range cfgs {
res[c.Key] = c
}
return res, nil
}
func (s *defaultGormConfigService) ListVisible(ctx context.Context) ([]contracts.SystemConfigDTO, error) {
var cfgs []contracts.SystemConfigDTO
err := s.db.WithContext(ctx).Table("w_system_configs").Where("visibility = ?", 1).Find(&cfgs).Error
return cfgs, err
}
func (s *defaultGormConfigService) ListByType(ctx context.Context, configType string) ([]contracts.SystemConfigDTO, error) {
var cfgs []contracts.SystemConfigDTO
err := s.db.WithContext(ctx).Table("w_system_configs").Where("type = ?", configType).Find(&cfgs).Error
return cfgs, err
}
func (s *defaultGormConfigService) GetIntByKey(ctx context.Context, key string) (int, error) {
var cfg contracts.SystemConfigDTO
if err := s.db.WithContext(ctx).Table("w_system_configs").Where("key = ?", key).First(&cfg).Error; err != nil {
return 0, err
}
return strconv.Atoi(cfg.Value)
}
func (s *defaultGormConfigService) GetBoolByKey(ctx context.Context, key string) (bool, error) {
var cfg contracts.SystemConfigDTO
if err := s.db.WithContext(ctx).Table("w_system_configs").Where("key = ?", key).First(&cfg).Error; err != nil {
return false, err
}
return strconv.ParseBool(cfg.Value)
}
func (s *defaultGormConfigService) SaveOrUpdate(ctx context.Context, key, value string) error {
var cfg contracts.SystemConfigDTO
if err := s.db.WithContext(ctx).Table("w_system_configs").Where("key = ?", key).First(&cfg).Error; err != nil {
cfg = contracts.SystemConfigDTO{Key: key, Value: value, Type: "system"}
return s.db.WithContext(ctx).Table("w_system_configs").Create(&cfg).Error
}
return s.db.WithContext(ctx).Table("w_system_configs").Where("key = ?", key).Update("value", value).Error
}
func (s *defaultGormConfigService) InvalidateCache(ctx context.Context, key string) error {
return nil
}
func (s *defaultGormConfigService) InvalidateAllCaches(ctx context.Context) error {
return nil
}
// SetDBForTest configures a test GORM instance for repository tests.
func SetDBForTest(db *gorm.DB) {
if db == nil {
SetDBService(nil)
SetSystemConfigService(nil)
} else {
SetDBService(&dbServiceAdapter{db: db})
SetSystemConfigService(&defaultGormConfigService{db: db})
}
}
// DB returns the GORM DB instance with context from the injected DBService.
func DB(ctx context.Context) *gorm.DB {
dbMu.RLock()
s := dbSvc
dbMu.RUnlock()
if s != nil {
return s.DB(ctx)
}
return nil
}