Files
sentinela-go/internal/db/schema.go
Rainbow a2b0db8f3f feat: tiered API plans (Free/Bronze/Gold/Platinum)
- Free: $0, 30 req/min, market data only
- Bronze: $29/mo, 100 req/min, + companies & search
- Gold: $99/mo, 500 req/min, + filings & historical
- Platinum: $299/mo, 2000 req/min, all features + priority
- Plan-aware rate limiting per API key (or per IP for free)
- Usage tracking with daily aggregation
- GET /api/v1/plans — plan listing
- POST /api/v1/plans/register — instant free API key
- GET /api/v1/plans/usage — usage stats
- /pricing — dark-themed HTML pricing page
- X-RateLimit-* and X-Plan headers on every response
- Restricted endpoints return upgrade prompt
- Updated OpenAPI spec with security scheme
- 53 handlers, compiles clean
2026-02-10 12:55:45 -03:00

108 lines
2.8 KiB
Go

package db
const schema = `
CREATE TABLE IF NOT EXISTS companies (
id INTEGER PRIMARY KEY AUTOINCREMENT,
ticker TEXT,
name TEXT NOT NULL,
cnpj TEXT UNIQUE NOT NULL,
cvm_code TEXT,
sector TEXT,
status TEXT NOT NULL DEFAULT 'ATIVO',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS filings (
id INTEGER PRIMARY KEY AUTOINCREMENT,
external_id TEXT UNIQUE NOT NULL,
company_id INTEGER REFERENCES companies(id),
cnpj TEXT NOT NULL,
category TEXT NOT NULL,
type TEXT,
species TEXT,
subject TEXT,
reference_date TEXT,
delivery_date DATETIME NOT NULL,
protocol TEXT,
version TEXT,
download_url TEXT,
importance INTEGER DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS selic_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
date TEXT UNIQUE NOT NULL,
daily_rate REAL NOT NULL,
annual_rate REAL,
target_rate REAL
);
CREATE TABLE IF NOT EXISTS cdi_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
date TEXT UNIQUE NOT NULL,
daily_rate REAL NOT NULL,
annual_rate REAL
);
CREATE TABLE IF NOT EXISTS ipca_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
date TEXT UNIQUE NOT NULL,
monthly_rate REAL NOT NULL,
accumulated_12m REAL
);
CREATE TABLE IF NOT EXISTS fx_rates (
id INTEGER PRIMARY KEY AUTOINCREMENT,
date TEXT NOT NULL,
pair TEXT NOT NULL,
rate REAL NOT NULL,
UNIQUE(date, pair)
);
CREATE VIRTUAL TABLE IF NOT EXISTS companies_fts USING fts5(
name, ticker, sector, cnpj,
content='companies', content_rowid='id'
);
CREATE VIRTUAL TABLE IF NOT EXISTS filings_fts USING fts5(
subject, category, type,
content='filings', content_rowid='id'
);
CREATE TABLE IF NOT EXISTS api_keys (
id INTEGER PRIMARY KEY AUTOINCREMENT,
key TEXT UNIQUE NOT NULL,
name TEXT NOT NULL,
email TEXT NOT NULL,
plan TEXT NOT NULL DEFAULT 'free',
rate_limit INTEGER NOT NULL DEFAULT 30,
requests_today INTEGER DEFAULT 0,
requests_month INTEGER DEFAULT 0,
last_request_at DATETIME,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
expires_at DATETIME,
active INTEGER DEFAULT 1
);
CREATE TABLE IF NOT EXISTS usage_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
api_key_id INTEGER REFERENCES api_keys(id),
endpoint TEXT NOT NULL,
method TEXT NOT NULL,
status_code INTEGER,
response_time_ms INTEGER,
ip TEXT,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS usage_daily (
id INTEGER PRIMARY KEY AUTOINCREMENT,
api_key_id INTEGER REFERENCES api_keys(id),
date TEXT NOT NULL,
requests INTEGER DEFAULT 0,
UNIQUE(api_key_id, date)
);
`