summaryrefslogtreecommitdiff
path: root/internal/controlplane/queries.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--internal/controlplane/queries.go35
1 files changed, 26 insertions, 9 deletions
diff --git a/internal/controlplane/queries.go b/internal/controlplane/queries.go
index 48610c7..6a5ff0b 100644
--- a/internal/controlplane/queries.go
+++ b/internal/controlplane/queries.go
@@ -85,12 +85,17 @@ func (s *Store) ListAPIKeys(ctx context.Context) ([]APIKey, error) {
}
func (s *Store) ListAPIKeysFor(ctx context.Context, tenantID string) ([]APIKey, error) {
- periodStart := time.Date(time.Now().UTC().Year(), time.Now().UTC().Month(), 1, 0, 0, 0, 0, time.UTC)
+ now := time.Now().UTC()
+ periodStart := time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, time.UTC)
periodEnd := periodStart.AddDate(0, 1, 0)
+ dayStart := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC)
+ dayEnd := dayStart.AddDate(0, 0, 1)
query := `
- SELECT k.id::text, k.tenant_id::text, k.project_id::text, k.name, k.key_prefix, k.scopes,
- k.tags, k.monthly_spend_micros, k.status, k.expires_at, k.last_used_at, k.created_at,
+ SELECT k.id::text, k.tenant_id::text, k.project_id::text, k.name, k.key_prefix, k.key_suffix, k.scopes,
+ k.tags, k.monthly_spend_micros, k.daily_spend_micros, k.requests_per_minute, k.tokens_per_minute,
+ k.status, k.expires_at, k.last_used_at, k.created_at,
usage.month_spend, usage.month_requests, pending.month_reserved,
+ daily.day_spend, daily.day_requests, daily_pending.day_reserved,
COALESCE((
SELECT jsonb_agg(m.public_id ORDER BY m.public_id)
FROM api_key_model_restrictions r
@@ -107,10 +112,20 @@ func (s *Store) ListAPIKeysFor(ctx context.Context, tenantID string) ([]APIKey,
FROM billing_reservations b
WHERE b.key_id = k.id AND b.status IN ('pending', 'metering_failed')
AND b.created_at >= $1 AND b.created_at < $2
- ) pending`
- args := []any{periodStart, periodEnd}
+ ) pending
+ CROSS JOIN LATERAL (
+ SELECT COALESCE(SUM(u.cost_micros), 0)::bigint AS day_spend, COUNT(*)::bigint AS day_requests
+ FROM usage_events u WHERE u.key_id = k.id AND u.started_at >= $3 AND u.started_at < $4
+ ) daily
+ CROSS JOIN LATERAL (
+ SELECT COALESCE(SUM(b.reserved_micros), 0)::bigint AS day_reserved
+ FROM billing_reservations b
+ WHERE b.key_id = k.id AND b.status IN ('pending', 'metering_failed')
+ AND b.created_at >= $3 AND b.created_at < $4
+ ) daily_pending`
+ args := []any{periodStart, periodEnd, dayStart, dayEnd}
if tenantID != "" {
- query += ` WHERE k.tenant_id=$3`
+ query += ` WHERE k.tenant_id=$5`
args = append(args, tenantID)
}
query += ` ORDER BY k.created_at DESC`
@@ -123,10 +138,12 @@ func (s *Store) ListAPIKeysFor(ctx context.Context, tenantID string) ([]APIKey,
for rows.Next() {
var item APIKey
var scopesJSON, tagsJSON, allowedModelsJSON []byte
- if err := rows.Scan(&item.ID, &item.TenantID, &item.ProjectID, &item.Name, &item.KeyPrefix,
- &scopesJSON, &tagsJSON, &item.MonthlySpendMicros, &item.Status, &item.ExpiresAt,
+ if err := rows.Scan(&item.ID, &item.TenantID, &item.ProjectID, &item.Name, &item.KeyPrefix, &item.KeySuffix,
+ &scopesJSON, &tagsJSON, &item.MonthlySpendMicros, &item.DailySpendMicros, &item.RequestsPerMinute,
+ &item.TokensPerMinute, &item.Status, &item.ExpiresAt,
&item.LastUsedAt, &item.CreatedAt, &item.CurrentMonthSpendMicros, &item.CurrentMonthRequests,
- &item.CurrentMonthReservedMicros, &allowedModelsJSON); err != nil {
+ &item.CurrentMonthReservedMicros, &item.CurrentDaySpendMicros, &item.CurrentDayRequests,
+ &item.CurrentDayReservedMicros, &allowedModelsJSON); err != nil {
return nil, fmt.Errorf("scan API key: %w", err)
}
if err := json.Unmarshal(scopesJSON, &item.Scopes); err != nil {