Skip to content

Commit 30d9bf7

Browse files
authored
fix(ai-proxy): avoid reserved key column in setting query (#6759)
* fix(ai-proxy): avoid reserved key column in setting query * refactor(ai-proxy): simplify setting key query * test(ai-proxy): cover reserved key column query * test(ai-proxy): relax reserved key query assertion
1 parent 3324dc3 commit 30d9bf7

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

internal/apps/ai-proxy/models/setting/dbclient.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func (dbClient *DBClient) CreateOrUpdate(ctx context.Context, item *Setting) err
3636

3737
var existing Setting
3838
err := dbClient.DB.WithContext(ctx).
39-
Where("namespace = ? AND key = ?", item.Namespace, item.Key).
39+
Where(&Setting{Namespace: item.Namespace, Key: item.Key}).
4040
First(&existing).Error
4141
if err == nil {
4242
existing.Value = item.Value
@@ -54,7 +54,7 @@ func (dbClient *DBClient) CreateOrUpdate(ctx context.Context, item *Setting) err
5454
func (dbClient *DBClient) GetByNamespaceKey(ctx context.Context, namespace, key string) (*Setting, error) {
5555
var item Setting
5656
err := dbClient.DB.WithContext(ctx).
57-
Where("namespace = ? AND key = ?", namespace, key).
57+
Where(&Setting{Namespace: namespace, Key: key}).
5858
First(&item).Error
5959
if err != nil {
6060
return nil, err
@@ -69,7 +69,7 @@ func (dbClient *DBClient) GetByNamespaceKeys(ctx context.Context, namespace stri
6969

7070
var items []*Setting
7171
if err := dbClient.DB.WithContext(ctx).
72-
Where("namespace = ? AND key IN ?", namespace, keys).
72+
Where("namespace = ? AND `key` IN (?)", namespace, keys).
7373
Find(&items).Error; err != nil {
7474
return nil, err
7575
}

internal/apps/ai-proxy/models/setting/dbclient_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ import (
1919
"fmt"
2020
"testing"
2121

22+
"github.com/DATA-DOG/go-sqlmock"
2223
"github.com/stretchr/testify/assert"
2324
"github.com/stretchr/testify/require"
25+
"gorm.io/driver/mysql"
2426
"gorm.io/driver/sqlite"
2527
"gorm.io/gorm"
2628

@@ -120,6 +122,30 @@ func TestDBClient_CreateConflict(t *testing.T) {
120122
require.Equal(t, "claude;;;codex", got.Value)
121123
}
122124

125+
func TestDBClient_GetByNamespaceKeys_QuotesReservedKeyColumn(t *testing.T) {
126+
sqlDB, mock, err := sqlmock.New()
127+
require.NoError(t, err)
128+
defer func() {
129+
_ = sqlDB.Close()
130+
}()
131+
132+
db, err := gorm.Open(mysql.New(mysql.Config{
133+
Conn: sqlDB,
134+
SkipInitializeWithVersion: true,
135+
}), &gorm.Config{})
136+
require.NoError(t, err)
137+
138+
mock.ExpectQuery("`key` IN").
139+
WithArgs("blacklist_user_agent", "general.headers", "general.prompts", sqlmock.AnyArg()).
140+
WillReturnRows(sqlmock.NewRows([]string{"id", "created_at", "updated_at", "deleted_at", "namespace", "key", "value"}))
141+
142+
client := &DBClient{DB: db}
143+
got, err := client.GetByNamespaceKeys(context.Background(), "blacklist_user_agent", "general.headers", "general.prompts")
144+
require.NoError(t, err)
145+
require.Empty(t, got)
146+
require.NoError(t, mock.ExpectationsWereMet())
147+
}
148+
123149
func prepareSQLiteSettingTable(db *gorm.DB) error {
124150
return db.Exec(`
125151
CREATE TABLE ai_proxy_setting (

0 commit comments

Comments
 (0)