- 20 Go source files, single 16MB binary - SQLite + FTS5 full-text search (pure Go, no CGO) - BCB integration: Selic, CDI, IPCA, USD/BRL, EUR/BRL - CVM integration: 2,524 companies from registry - Fiber v2 REST API with 42 handlers - Auto-seeds on first run (~5s for BCB + CVM) - Token bucket rate limiter, optional API key auth - Periodic sync scheduler (configurable) - Graceful shutdown, structured logging (slog) - All endpoints tested with real data
41 lines
1.5 KiB
Go
41 lines
1.5 KiB
Go
package db
|
|
|
|
func (d *DB) SearchCompanies(query string, limit int) ([]Company, error) {
|
|
rows, err := d.Conn.Query(`
|
|
SELECT c.id, COALESCE(c.ticker,''), c.name, c.cnpj, COALESCE(c.cvm_code,''), COALESCE(c.sector,''), c.status, c.created_at, c.updated_at
|
|
FROM companies_fts f JOIN companies c ON f.rowid = c.id
|
|
WHERE companies_fts MATCH ? LIMIT ?`, query, limit)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var out []Company
|
|
for rows.Next() {
|
|
var c Company
|
|
rows.Scan(&c.ID, &c.Ticker, &c.Name, &c.CNPJ, &c.CVMCode, &c.Sector, &c.Status, &c.CreatedAt, &c.UpdatedAt)
|
|
out = append(out, c)
|
|
}
|
|
return out, nil
|
|
}
|
|
|
|
func (d *DB) SearchFilings(query string, limit int) ([]Filing, error) {
|
|
rows, err := d.Conn.Query(`
|
|
SELECT fi.id, fi.external_id, fi.company_id, fi.cnpj, fi.category, COALESCE(fi.type,''), COALESCE(fi.species,''),
|
|
COALESCE(fi.subject,''), COALESCE(fi.reference_date,''), fi.delivery_date, COALESCE(fi.protocol,''),
|
|
COALESCE(fi.version,''), COALESCE(fi.download_url,''), fi.importance, fi.created_at
|
|
FROM filings_fts f JOIN filings fi ON f.rowid = fi.id
|
|
WHERE filings_fts MATCH ? LIMIT ?`, query, limit)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var out []Filing
|
|
for rows.Next() {
|
|
var f Filing
|
|
rows.Scan(&f.ID, &f.ExternalID, &f.CompanyID, &f.CNPJ, &f.Category, &f.Type, &f.Species,
|
|
&f.Subject, &f.ReferenceDate, &f.DeliveryDate, &f.Protocol, &f.Version, &f.DownloadURL, &f.Importance, &f.CreatedAt)
|
|
out = append(out, f)
|
|
}
|
|
return out, nil
|
|
}
|