单二进制三角色 + Dock 适配器 + Swarm stack 达到可部署态;mgr1 实测订阅经 central-proxy bootstrap,探活 alive=41/52。 Co-authored-by: Cursor <cursoragent@cursor.com>
48 lines
1.3 KiB
Go
48 lines
1.3 KiB
Go
// storeglue.go:gateway 对 store 的扩展查询(新增文件,禁改 W1 既有字段)。
|
||
package gateway
|
||
|
||
import (
|
||
"errors"
|
||
|
||
"onesvm.com/onesvm/browser-server/internal/store"
|
||
)
|
||
|
||
// storeErrNotFound 镜像 store.ErrNotFound。
|
||
var storeErrNotFound = store.ErrNotFound
|
||
|
||
// KeysAll 全量密钥列表(admin 列表用;禁 SELECT *,显式列名)。
|
||
func (d *DBGlue) KeysAll() ([]*store.ApiKey, error) {
|
||
rows, err := d.Raw().Query(
|
||
`SELECT id, consumer_id, prefix, name, hash, salt, scopes, rpm,
|
||
daily_quota, monthly_quota, concurrent_sessions, status, expires_at, created_at
|
||
FROM api_keys ORDER BY id ASC`)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
defer rows.Close()
|
||
var out []*store.ApiKey
|
||
for rows.Next() {
|
||
k, err := scanKeyPublic(rows)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
out = append(out, k)
|
||
}
|
||
return out, rows.Err()
|
||
}
|
||
|
||
// ConsumerByName 按名查消费者(不存在返回 store.ErrNotFound)。
|
||
func (d *DBGlue) ConsumerByName(name string) (int64, error) {
|
||
var id int64
|
||
err := d.Raw().QueryRow(`SELECT id FROM consumers WHERE name = ?`, name).Scan(&id)
|
||
if err != nil {
|
||
if errors.Is(err, errNoRows) {
|
||
return 0, store.ErrNotFound
|
||
}
|
||
return 0, err
|
||
}
|
||
return id, nil
|
||
}
|
||
|
||
// errNoRows 镜像 sql.ErrNoRows。
|
||
var errNoRows = errors.New("sql: no rows in result set")
|