feat: improve model catalog aggregation
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user