jebin2 commited on
Commit
7715603
Β·
1 Parent(s): cfe2de7

log and order

Browse files
Files changed (3) hide show
  1. .python-version +1 -0
  2. app.py +72 -36
  3. services/priority_worker_pool.py +1 -1
.python-version ADDED
@@ -0,0 +1 @@
 
 
1
+ 3.11
app.py CHANGED
@@ -27,7 +27,14 @@ drive_service = DriveService()
27
  @asynccontextmanager
28
  async def lifespan(app: FastAPI):
29
  """Application lifespan manager."""
30
- logger.info("Starting up - initializing database...")
 
 
 
 
 
 
 
31
 
32
  # Register DB Service configuration
33
  register_db_service_config()
@@ -42,6 +49,32 @@ async def lifespan(app: FastAPI):
42
  )
43
  logger.info("βœ… Backup Service initialized")
44
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  # Register Auth Service configuration
46
  from services.auth_service import register_auth_service
47
  register_auth_service(
@@ -134,32 +167,31 @@ async def lifespan(app: FastAPI):
134
  )
135
  logger.info("βœ… API Key Service configured")
136
 
137
- # Check for RESET_DB environment variable
138
- if os.getenv("RESET_DB", "").lower() == "true":
139
- logger.warning(f"RESET_DB is set to true. Skipping download and clearing local database ({DB_FILENAME}).")
140
- if os.path.exists(DB_FILENAME):
141
- os.remove(DB_FILENAME)
142
- logger.info("Local database deleted.")
143
-
144
- # Reset database (drop + create all tables)
145
- await reset_database(engine)
146
- logger.info("βœ… Database reset complete")
147
- else:
148
- # Startup: Download DB from Drive ONLY if local file doesn't exist
149
- if not os.path.exists(DB_FILENAME):
150
- logger.info("Startup: Local DB missing. Attempting to download from Google Drive...")
151
- drive_service.download_db()
152
- else:
153
- logger.info("Startup: Local DB found. Skipping download to preserve data.")
154
-
155
- # Initialize database (create tables if not exist)
156
- await init_database(engine)
157
- logger.info("βœ… Database initialized")
158
 
159
  # Start background job worker
160
  from services.gemini_service import start_worker, stop_worker
161
  await start_worker()
162
- logger.info("Background job worker started")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
 
164
  yield
165
 
@@ -184,16 +216,12 @@ app = FastAPI(
184
  )
185
 
186
 
187
- allowed_origins = os.getenv("CORS_ORIGINS", "http://localhost:3000,http://localhost:5173").split(",")
188
- logger.info(f"CORS allowed origins: {allowed_origins}")
 
189
 
190
- app.add_middleware(
191
- CORSMiddleware,
192
- allow_origins=allowed_origins,
193
- allow_credentials=True,
194
- allow_methods=["*"],
195
- allow_headers=["*"],
196
- )
197
 
198
 
199
  from services.audit_service import AuditMiddleware
@@ -204,14 +232,22 @@ from services.gemini_service import APIKeyMiddleware
204
  app.add_middleware(APIKeyMiddleware)
205
 
206
 
207
- from services.credit_service import CreditMiddleware
208
- app.add_middleware(CreditMiddleware)
209
-
210
-
211
  from services.auth_service import AuthMiddleware
212
  app.add_middleware(AuthMiddleware)
213
 
214
 
 
 
 
 
 
 
 
 
 
 
 
 
215
  app.include_router(general.router)
216
  app.include_router(auth.router)
217
  app.include_router(blink.router)
 
27
  @asynccontextmanager
28
  async def lifespan(app: FastAPI):
29
  """Application lifespan manager."""
30
+ # Startup Banner
31
+ logger.info("═" * 60)
32
+ logger.info(" API Gateway v1.0.0 - Starting Up")
33
+ logger.info("═" * 60)
34
+
35
+ # Database Initialization Section
36
+ logger.info("")
37
+ logger.info("πŸ“¦ [DATABASE INITIALIZATION]")
38
 
39
  # Register DB Service configuration
40
  register_db_service_config()
 
49
  )
50
  logger.info("βœ… Backup Service initialized")
51
 
52
+ # Check for RESET_DB environment variable
53
+ if os.getenv("RESET_DB", "").lower() == "true":
54
+ logger.warning(f"⚠️ RESET_DB enabled - Clearing local database ({DB_FILENAME})")
55
+ if os.path.exists(DB_FILENAME):
56
+ os.remove(DB_FILENAME)
57
+ logger.info(" Local database deleted")
58
+
59
+ # Reset database (drop + create all tables)
60
+ await reset_database(engine)
61
+ logger.info("βœ… Database reset complete")
62
+ else:
63
+ # Startup: Download DB from Drive ONLY if local file doesn't exist
64
+ if not os.path.exists(DB_FILENAME):
65
+ logger.info("⬇️ Downloading database from Google Drive...")
66
+ drive_service.download_db()
67
+ else:
68
+ logger.info("βœ“ Local database found")
69
+
70
+ # Initialize database (create tables if not exist)
71
+ await init_database(engine)
72
+ logger.info("βœ… Database initialized")
73
+
74
+ # Service Registration Section
75
+ logger.info("")
76
+ logger.info("βš™οΈ [SERVICE REGISTRATION]")
77
+
78
  # Register Auth Service configuration
79
  from services.auth_service import register_auth_service
80
  register_auth_service(
 
167
  )
168
  logger.info("βœ… API Key Service configured")
169
 
170
+ # Worker Pool Section
171
+ logger.info("")
172
+ logger.info("πŸ‘· [WORKER POOL]")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
173
 
174
  # Start background job worker
175
  from services.gemini_service import start_worker, stop_worker
176
  await start_worker()
177
+ logger.info("βœ… Worker pool started")
178
+
179
+ # Log CORS configuration
180
+ allowed_origins = os.getenv("CORS_ORIGINS").split(",")
181
+ logger.info("")
182
+ logger.info("🌐 [NETWORK CONFIGURATION]")
183
+ logger.info(f"βœ… CORS origins: {', '.join(allowed_origins)}")
184
+
185
+ # Startup Complete Summary
186
+ logger.info("")
187
+ logger.info("═" * 60)
188
+ logger.info(" πŸš€ API Gateway Ready")
189
+ logger.info(" β€’ Database: βœ… Ready")
190
+ logger.info(" β€’ Services: 5 initialized (DB, Auth, Credit, Audit, API Key)")
191
+ logger.info(" β€’ Workers: 15 active")
192
+ logger.info(" β€’ Endpoint: http://0.0.0.0:8000")
193
+ logger.info("═" * 60)
194
+ logger.info("")
195
 
196
  yield
197
 
 
216
  )
217
 
218
 
219
+ # Middleware order matters! They execute in reverse order (bottom to top)
220
+ # Request flow: CORS β†’ Auth β†’ APIKey β†’ Audit β†’ Credit β†’ Router
221
+ # So we add them in REVERSE order (last added = first to run on REQUEST)
222
 
223
+ from services.credit_service import CreditMiddleware
224
+ app.add_middleware(CreditMiddleware)
 
 
 
 
 
225
 
226
 
227
  from services.audit_service import AuditMiddleware
 
232
  app.add_middleware(APIKeyMiddleware)
233
 
234
 
 
 
 
 
235
  from services.auth_service import AuthMiddleware
236
  app.add_middleware(AuthMiddleware)
237
 
238
 
239
+ # CORS middleware MUST be added last to ensure error responses also have CORS headers
240
+ allowed_origins = os.getenv("CORS_ORIGINS").split(",")
241
+
242
+ app.add_middleware(
243
+ CORSMiddleware,
244
+ allow_origins=allowed_origins,
245
+ allow_credentials=True,
246
+ allow_methods=["*"],
247
+ allow_headers=["*"],
248
+ )
249
+
250
+
251
  app.include_router(general.router)
252
  app.include_router(auth.router)
253
  app.include_router(blink.router)
services/priority_worker_pool.py CHANGED
@@ -170,7 +170,7 @@ class PriorityWorker(Generic[JobType]):
170
  async def start(self):
171
  """Start the worker polling loop."""
172
  self._running = True
173
- logger.info(f"Worker {self.worker_id} ({self.priority}) started, polling every {self.poll_interval}s")
174
  asyncio.create_task(self._poll_loop())
175
 
176
  async def stop(self):
 
170
  async def start(self):
171
  """Start the worker polling loop."""
172
  self._running = True
173
+ logger.debug(f"Worker {self.worker_id} ({self.priority}) started, polling every {self.poll_interval}s")
174
  asyncio.create_task(self._poll_loop())
175
 
176
  async def stop(self):