feat: improve model catalog aggregation

This commit is contained in:
2026-05-11 17:44:57 +08:00
parent ec87816c95
commit 0431cb8157
41 changed files with 4745 additions and 550 deletions
+96 -13
View File
@@ -11,13 +11,35 @@ import (
"github.com/jackc/pgx/v5/pgconn"
)
func (s *Store) ListTasks(ctx context.Context, user *auth.User, limit int) ([]GatewayTask, error) {
if limit <= 0 {
limit = 50
type TaskListFilter struct {
Query string
ModelType string
CreatedFrom *time.Time
CreatedTo *time.Time
Page int
PageSize int
}
type TaskListResult struct {
Items []GatewayTask
Total int
Page int
PageSize int
}
func (s *Store) ListTasks(ctx context.Context, user *auth.User, filter TaskListFilter) (TaskListResult, error) {
page := filter.Page
if page <= 0 {
page = 1
}
if limit > 100 {
limit = 100
pageSize := filter.PageSize
if pageSize <= 0 {
pageSize = 50
}
if pageSize > 100 {
pageSize = 100
}
offset := (page - 1) * pageSize
gatewayUserID := localGatewayUserID(user)
apiKeyID := ""
userID := ""
@@ -26,11 +48,22 @@ func (s *Store) ListTasks(ctx context.Context, user *auth.User, limit int) ([]Ga
userID = strings.TrimSpace(user.ID)
}
if gatewayUserID == "" && userID == "" {
return nil, ErrLocalUserRequired
return TaskListResult{}, ErrLocalUserRequired
}
rows, err := s.pool.Query(ctx, `
SELECT `+gatewayTaskColumns+`
FROM gateway_tasks
queryPattern := ""
if query := strings.TrimSpace(filter.Query); query != "" {
queryPattern = "%" + query + "%"
}
args := []any{
gatewayUserID,
userID,
apiKeyID,
queryPattern,
strings.TrimSpace(filter.ModelType),
nullableTaskListTime(filter.CreatedFrom),
nullableTaskListTime(filter.CreatedTo),
}
whereSQL := `
WHERE (
(
NULLIF($1, '')::uuid IS NOT NULL
@@ -46,10 +79,45 @@ WHERE (
NULLIF($3, '') IS NULL
OR api_key_id = $3
)
AND (
NULLIF($4, '') IS NULL
OR id::text ILIKE $4
OR COALESCE(request_id, '') ILIKE $4
OR kind ILIKE $4
OR model ILIKE $4
OR COALESCE(requested_model, '') ILIKE $4
OR COALESCE(resolved_model, '') ILIKE $4
OR COALESCE(api_key_id, '') ILIKE $4
OR COALESCE(api_key_name, '') ILIKE $4
OR COALESCE(api_key_prefix, '') ILIKE $4
OR status ILIKE $4
OR COALESCE(model_type, '') ILIKE $4
)
AND (
NULLIF($5, '') IS NULL
OR model_type = $5
)
AND (
$6::timestamptz IS NULL
OR created_at >= $6::timestamptz
)
AND (
$7::timestamptz IS NULL
OR created_at <= $7::timestamptz
)`
var total int
if err := s.pool.QueryRow(ctx, `SELECT count(*) FROM gateway_tasks `+whereSQL, args...).Scan(&total); err != nil {
return TaskListResult{}, err
}
queryArgs := append(args, pageSize, offset)
rows, err := s.pool.Query(ctx, `
SELECT `+gatewayTaskColumns+`
FROM gateway_tasks
`+whereSQL+`
ORDER BY created_at DESC
LIMIT $4`, gatewayUserID, userID, apiKeyID, limit)
LIMIT $8 OFFSET $9`, queryArgs...)
if err != nil {
return nil, err
return TaskListResult{}, err
}
defer rows.Close()
@@ -57,11 +125,26 @@ LIMIT $4`, gatewayUserID, userID, apiKeyID, limit)
for rows.Next() {
task, err := scanGatewayTask(rows)
if err != nil {
return nil, err
return TaskListResult{}, err
}
items = append(items, task)
}
return items, rows.Err()
if err := rows.Err(); err != nil {
return TaskListResult{}, err
}
return TaskListResult{
Items: items,
Total: total,
Page: page,
PageSize: pageSize,
}, nil
}
func nullableTaskListTime(value *time.Time) any {
if value == nil {
return nil
}
return *value
}
func (s *Store) MarkTaskRunning(ctx context.Context, taskID string, modelType string, normalizedRequest map[string]any) error {