Files
ragflow/internal/dao/system_settings.go
Jake Armstrong 93d3deb5e4 Fix admin CLI system variable commands (#14956)
## What

Fixes #12409.

Implements admin CLI support for:

- `list vars;`
- `show var <name-or-prefix>;`
- `set var <name> <value>;`

## Changes

- Wire Go CLI variable commands to the admin API.
- Support integer and quoted string values in `SET VAR`.
- Return variable rows as `data_type`, `name`, `setting_type`, and
`value`.
- Add exact-name lookup with prefix fallback for `SHOW VAR`.
- Validate values by stored data type: `string`, `integer`, `bool`, and
`json`.
- Keep the legacy Python admin CLI/server behavior aligned.
- Update admin CLI docs and add focused tests.

## Verification

- `go test -count=1 ./internal/cli`
- `python3.12 -m py_compile admin/server/services.py
admin/server/routes.py api/db/services/system_settings_service.py
admin/client/parser.py admin/client/ragflow_client.py`
- Python admin CLI parser smoke test for `SET VAR`, quoted values, `SHOW
VAR`, and `LIST VARS`.
- Attempted `./run_go_tests.sh`; local environment is missing native
tokenizer/linker artifacts:
  - `internal/cpp/cmake-build-release/librag_tokenizer_c_api.a`
  - `-lstdc++`

Co-authored-by: Jin Hai <haijin.chn@gmail.com>
2026-05-18 19:08:45 +08:00

174 lines
5.2 KiB
Go

//
// Copyright 2026 The InfiniFlow Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
package dao
import (
"errors"
"ragflow/internal/entity"
"gorm.io/gorm"
)
// SystemSettingsDAO system settings data access object
type SystemSettingsDAO struct{}
// NewSystemSettingsDAO create system settings DAO instance
func NewSystemSettingsDAO() *SystemSettingsDAO {
return &SystemSettingsDAO{}
}
// GetAll get all system settings
// Returns all system settings records from database
func (d *SystemSettingsDAO) GetAll() ([]entity.SystemSettings, error) {
var settings []entity.SystemSettings
err := DB.Order("name ASC").Find(&settings).Error
if err != nil {
return nil, err
}
return settings, nil
}
// GetByName get system settings by name
// Returns settings records that match the given name
func (d *SystemSettingsDAO) GetByName(name string) ([]entity.SystemSettings, error) {
var settings []entity.SystemSettings
err := DB.Where("name = ?", name).Order("name ASC").Find(&settings).Error
if err != nil {
return nil, err
}
return settings, nil
}
// GetByNamePrefix get system settings by name prefix
// Returns settings records whose names start with the given prefix.
func (d *SystemSettingsDAO) GetByNamePrefix(namePrefix string) ([]entity.SystemSettings, error) {
var settings []entity.SystemSettings
err := DB.Where("name LIKE ?", namePrefix+"%").Order("name ASC").Find(&settings).Error
if err != nil {
return nil, err
}
return settings, nil
}
// UpdateByName update system settings by name
// Updates the setting with the given name using the provided data
func (d *SystemSettingsDAO) UpdateByName(name string, setting *entity.SystemSettings) error {
return DB.Model(&entity.SystemSettings{}).
Where("name = ?", name).
Updates(map[string]interface{}{
"value": setting.Value,
"source": setting.Source,
"data_type": setting.DataType,
}).Error
}
// Create create a new system setting
// Inserts a new system setting record into database
func (d *SystemSettingsDAO) Create(setting *entity.SystemSettings) error {
return DB.Create(setting).Error
}
// SaveOrCreate update existing setting or create new one
// If setting exists, updates it; otherwise creates a new record
func (d *SystemSettingsDAO) SaveOrCreate(name string, value string, source string, dataType string) error {
settings, err := d.GetByName(name)
if err != nil {
return err
}
if len(settings) == 1 {
setting := &settings[0]
setting.Value = value
setting.Source = source
setting.DataType = dataType
return d.UpdateByName(name, setting)
} else if len(settings) > 1 {
return errors.New("can't update more than 1 setting: " + name)
}
newSetting := &entity.SystemSettings{
Name: name,
Value: value,
Source: source,
DataType: dataType,
}
return d.Create(newSetting)
}
// Count get total count of system settings
func (d *SystemSettingsDAO) Count() (int64, error) {
var count int64
err := DB.Model(&entity.SystemSettings{}).Count(&count).Error
return count, err
}
// DeleteByName delete system setting by name
func (d *SystemSettingsDAO) DeleteByName(name string) error {
return DB.Where("name = ?", name).Delete(&entity.SystemSettings{}).Error
}
// Exists check if setting exists by name
func (d *SystemSettingsDAO) Exists(name string) (bool, error) {
var count int64
err := DB.Model(&entity.SystemSettings{}).Where("name = ?", name).Count(&count).Error
if err != nil {
return false, err
}
return count > 0, nil
}
// GetBySource get system settings by source
func (d *SystemSettingsDAO) GetBySource(source string) ([]entity.SystemSettings, error) {
var settings []entity.SystemSettings
err := DB.Where("source = ?", source).Find(&settings).Error
if err != nil {
return nil, err
}
return settings, nil
}
// GetByDataType get system settings by data type
func (d *SystemSettingsDAO) GetByDataType(dataType string) ([]entity.SystemSettings, error) {
var settings []entity.SystemSettings
err := DB.Where("data_type = ?", dataType).Find(&settings).Error
if err != nil {
return nil, err
}
return settings, nil
}
// Transaction execute operations in a transaction
func (d *SystemSettingsDAO) Transaction(fn func(tx *gorm.DB) error) error {
return DB.Transaction(fn)
}
// CreateWithTx create setting within transaction
func (d *SystemSettingsDAO) CreateWithTx(tx *gorm.DB, setting *entity.SystemSettings) error {
return tx.Create(setting).Error
}
// UpdateByNameWithTx update setting within transaction
func (d *SystemSettingsDAO) UpdateByNameWithTx(tx *gorm.DB, name string, setting *entity.SystemSettings) error {
return tx.Model(&entity.SystemSettings{}).
Where("name = ?", name).
Updates(map[string]interface{}{
"value": setting.Value,
"source": setting.Source,
"data_type": setting.DataType,
}).Error
}