This feature allows API Keys to have their own quota limits and expiration times, independent of the user's balance. Backend: - Add quota, quota_used, expires_at fields to api_key schema - Implement IsExpired() and IsQuotaExhausted() checks in middleware - Add ResetQuota and ClearExpiration API endpoints - Integrate quota billing in gateway handlers (OpenAI, Anthropic, Gemini) - Include quota/expiration fields in auth cache for performance - Expiration check returns 403, quota exhausted returns 429 Frontend: - Add quota and expiration inputs to key create/edit dialog - Add quick-select buttons for expiration (+7, +30, +90 days) - Add reset quota confirmation dialog - Add expires_at column to keys list - Add i18n translations for new features (en/zh) Migration: - Add 045_add_api_key_quota.sql for new columns
21 lines
1.0 KiB
SQL
21 lines
1.0 KiB
SQL
-- Migration: Add quota fields to api_keys table
|
|
-- This migration adds independent quota and expiration support for API keys
|
|
|
|
-- Add quota limit field (0 = unlimited)
|
|
ALTER TABLE api_keys ADD COLUMN IF NOT EXISTS quota DECIMAL(20, 8) NOT NULL DEFAULT 0;
|
|
|
|
-- Add used quota amount field
|
|
ALTER TABLE api_keys ADD COLUMN IF NOT EXISTS quota_used DECIMAL(20, 8) NOT NULL DEFAULT 0;
|
|
|
|
-- Add expiration time field (NULL = never expires)
|
|
ALTER TABLE api_keys ADD COLUMN IF NOT EXISTS expires_at TIMESTAMPTZ;
|
|
|
|
-- Add indexes for efficient quota queries
|
|
CREATE INDEX IF NOT EXISTS idx_api_keys_quota_quota_used ON api_keys(quota, quota_used) WHERE deleted_at IS NULL;
|
|
CREATE INDEX IF NOT EXISTS idx_api_keys_expires_at ON api_keys(expires_at) WHERE deleted_at IS NULL;
|
|
|
|
-- Comment on columns for documentation
|
|
COMMENT ON COLUMN api_keys.quota IS 'Quota limit in USD for this API key (0 = unlimited)';
|
|
COMMENT ON COLUMN api_keys.quota_used IS 'Used quota amount in USD';
|
|
COMMENT ON COLUMN api_keys.expires_at IS 'Expiration time for this API key (null = never expires)';
|