@@ -3,6 +3,7 @@ package main
33import (
44 "context"
55 "database/sql"
6+ "flag"
67 "fmt"
78 "log"
89 "net/http"
@@ -19,17 +20,34 @@ import (
1920 "github.com/lucendex/backend/internal/store"
2021)
2122
23+ var (
24+ version = "dev"
25+ buildTime = "unknown"
26+ showVersion = flag .Bool ("version" , false , "Show version and exit" )
27+ )
28+
2229func main () {
23- ctx := context .Background ()
30+ flag .Parse ()
31+
32+ if * showVersion {
33+ fmt .Printf ("lucendex-api, build %s\n " , buildTime )
34+ return
35+ }
2436
25- dbHost := getEnv ("DB_HOST" , "localhost" )
26- dbPort := getEnv ("DB_PORT" , "5432" )
27- dbName := getEnv ("DB_NAME" , "lucendex" )
28- dbUser := getEnv ("DB_USER" , "api_ro" )
29- dbPassword := getEnv ("DB_PASSWORD" , "" )
37+ ctx := context .Background ()
3038
31- apiConnStr := fmt .Sprintf ("host=%s port=%s dbname=%s user=%s password=%s sslmode=disable" ,
32- dbHost , dbPort , dbName , dbUser , dbPassword )
39+ // Use DATABASE_URL if provided (for Docker), otherwise fall back to individual vars
40+ apiConnStr := getEnv ("DATABASE_URL" , "" )
41+ if apiConnStr == "" {
42+ dbHost := getEnv ("DB_HOST" , "localhost" )
43+ dbPort := getEnv ("DB_PORT" , "5432" )
44+ dbName := getEnv ("DB_NAME" , "lucendex" )
45+ dbUser := getEnv ("DB_USER" , "api_ro" )
46+ dbPassword := getEnv ("DB_PASSWORD" , "" )
47+ dbSSLMode := getEnv ("DB_SSLMODE" , "require" )
48+ apiConnStr = fmt .Sprintf ("host=%s port=%s dbname=%s user=%s password=%s sslmode=%s" ,
49+ dbHost , dbPort , dbName , dbUser , dbPassword , dbSSLMode )
50+ }
3351
3452 db , err := sql .Open ("postgres" , apiConnStr )
3553 if err != nil {
@@ -42,26 +60,26 @@ func main() {
4260 }
4361
4462 kvStore := kv .NewMemoryStore ()
63+ internalToken := getEnv ("INTERNAL_TOKEN" , "" )
4564
46- routerConnStr := fmt .Sprintf ("host=%s port=%s dbname=%s user=router_ro password=%s sslmode=disable" ,
47- dbHost , dbPort , dbName , getEnv ("ROUTER_PASSWORD" , "" ))
48- routerStore , err := store .NewRouterStore (routerConnStr )
65+ // Router uses same database for read-only access (reuse connection)
66+ routerStore , err := store .NewRouterStore (apiConnStr )
4967 if err != nil {
5068 log .Fatalf ("failed to create router store: %v" , err )
5169 }
5270 defer routerStore .Close ()
53-
71+
5472 validator := router .NewValidator ()
5573 pathfinder := router .NewPathfinder ([]router.AMMPool {}, []router.Offer {})
5674 breaker := router .NewCircuitBreaker (0.05 )
5775 quoteEngine := router .NewQuoteEngine (validator , pathfinder , breaker , kvStore , 20 )
58- r := router .NewRouter (quoteEngine , routerStore )
76+ r := router .NewRouter (quoteEngine , routerStore , kvStore )
5977
6078 apiStore := api .NewPostgresStore (db )
6179
6280 authMiddleware := api .NewAuthMiddleware (apiStore )
6381 rateLimiter := api .NewRateLimiter (kvStore , apiStore )
64- handlers := api .NewHandlers (r , apiStore , kvStore )
82+ handlers := api .NewHandlers (r , apiStore , kvStore , internalToken )
6583
6684 mux := http .NewServeMux ()
6785
@@ -72,6 +90,7 @@ func main() {
7290 partnerMux .HandleFunc ("/partner/v1/health" , handlers .HealthHandler )
7391
7492 mux .Handle ("/partner/" , rateLimiter .Middleware (authMiddleware .Middleware (partnerMux )))
93+ mux .HandleFunc ("/internal/v1/ledger" , handlers .LedgerUpdateHandler )
7594
7695 port := getEnv ("API_PORT" , "8080" )
7796 srv := & http.Server {
0 commit comments