-- API Tokens Table CREATE TABLE IF NOT EXISTS api_tokens ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, token VARCHAR(255) UNIQUE NOT NULL, description TEXT, user_id INTEGER REFERENCES users(id) ON DELETE CASCADE, active BOOLEAN DEFAULT true, rate_limit INTEGER DEFAULT 100, -- requests per minute allowed_endpoints TEXT[], -- null = all endpoints allowed expires_at TIMESTAMP, last_used_at TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- API Token Usage Tracking CREATE TABLE IF NOT EXISTS api_token_usage ( id SERIAL PRIMARY KEY, token_id INTEGER REFERENCES api_tokens(id) ON DELETE CASCADE, endpoint VARCHAR(255) NOT NULL, method VARCHAR(10) NOT NULL, status_code INTEGER, response_time_ms INTEGER, request_size INTEGER, -- bytes response_size INTEGER, -- bytes ip_address INET, user_agent TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Indexes for performance CREATE INDEX IF NOT EXISTS idx_api_tokens_token ON api_tokens(token); CREATE INDEX IF NOT EXISTS idx_api_tokens_active ON api_tokens(active); CREATE INDEX IF NOT EXISTS idx_api_token_usage_token_id ON api_token_usage(token_id); CREATE INDEX IF NOT EXISTS idx_api_token_usage_created_at ON api_token_usage(created_at); CREATE INDEX IF NOT EXISTS idx_api_token_usage_endpoint ON api_token_usage(endpoint); -- Function to update updated_at timestamp CREATE OR REPLACE FUNCTION update_api_token_updated_at() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = CURRENT_TIMESTAMP; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER api_tokens_updated_at BEFORE UPDATE ON api_tokens FOR EACH ROW EXECUTE FUNCTION update_api_token_updated_at();