@@ -23,7 +23,8 @@ type config struct {
2323 port int
2424 apiKey string
2525 db struct {
26- dsn string
26+ dsn string
27+ redis string
2728 }
2829}
2930
@@ -32,10 +33,12 @@ func loadConfig() config {
3233
3334 defaultAPIKey := os .Getenv ("GEMINI_API_KEY" )
3435 defaultDSN := os .Getenv ("DATABASE_URL" )
36+ defaultRedisUrl := os .Getenv ("REDIS_URL" )
3537
3638 flag .IntVar (& cfg .port , "port" , 8080 , "API server port" )
3739 flag .StringVar (& cfg .apiKey , "apikey" , defaultAPIKey , "Gemini API Key" )
3840 flag .StringVar (& cfg .db .dsn , "db-dsn" , defaultDSN , "PostgreSQL DSN" )
41+ flag .StringVar (& cfg .db .redis , "redis" , defaultRedisUrl , "Redis instance URL" )
3942 flag .Parse ()
4043
4144 return cfg
@@ -64,13 +67,26 @@ func main() {
6467 defer dbpool .Close ()
6568 logger .Info ("Connected to PostgreSQL" )
6669
70+ var embedder embed.Embedder
71+
6772 // Embedding client
68- embedder , err := embed .NewGeminiEmbedder (ctx , logger , cfg .apiKey )
73+ baseEmbedder , err := embed .NewGeminiEmbedder (ctx , logger , cfg .apiKey )
6974 if err != nil {
7075 logger .Error ("Failed to initialize embedder" , "error" , err )
7176 os .Exit (1 )
7277 }
7378
79+ if cfg .db .redis != "" {
80+ redisClient := db .NewRedisClient (cfg .db .redis , logger )
81+ embedder = & embed.CachedEmbedder {
82+ Base : baseEmbedder ,
83+ Redis : redisClient ,
84+ Logger : logger ,
85+ }
86+ } else {
87+ embedder = baseEmbedder
88+ }
89+
7490 // Services and handlers
7591 repo := repository .New (dbpool )
7692 bookService := & service.BookService {
@@ -87,7 +103,7 @@ func main() {
87103 e .Use (middleware .Logger ())
88104 e .Use (middleware .Recover ())
89105 e .Use (middleware .TimeoutWithConfig (middleware.TimeoutConfig {
90- Timeout : 5 * time .Second ,
106+ Timeout : 5 * time .Second ,
91107 ErrorMessage : "Request timed out." ,
92108 OnTimeoutRouteErrorHandler : func (err error , c echo.Context ) {
93109 logger .Warn ("Timeout on route" , "path" , c .Path (), "error" , err )
0 commit comments