feat: Sentinela v0.2.0 — Brazilian Financial Data API in Go
- 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
This commit is contained in:
40
internal/db/search.go
Normal file
40
internal/db/search.go
Normal file
@@ -0,0 +1,40 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user