@@ -215,12 +215,20 @@ def on_shutdown() -> None:
215215def read_root () -> RootResponse :
216216 return RootResponse (message = "Veritix Service is running. Check /health for status." )
217217
218-
219-
220218@app .get ("/metrics" , response_class = PlainTextResponse , response_model = str )
221- async def metrics_endpoint () -> PlainTextResponse :
222- """Prometheus metrics endpoint."""
223- log_info ("Metrics endpoint requested" )
219+ async def metrics_endpoint (_ : str = Depends (require_admin_key )) -> PlainTextResponse :
220+ """Prometheus metrics endpoint (ADMIN)."""
221+ settings = get_settings ()
222+
223+ # Return 503 if ADMIN_API_KEY is still the default value
224+ if settings .ADMIN_API_KEY == "default_admin_secret_change_me" :
225+ return PlainTextResponse (
226+ content = "503 Service Unavailable: ADMIN_API_KEY not configured. Please set a secure ADMIN_API_KEY environment variable to access metrics." ,
227+ status_code = 503 ,
228+ media_type = "text/plain"
229+ )
230+
231+ log_info ("Metrics endpoint requested (authenticated)" )
224232 return PlainTextResponse (content = get_metrics (), media_type = get_metrics_content_type ())
225233
226234
@@ -331,48 +339,119 @@ def get_analytics_stats(query: Annotated[AnalyticsStatsQuery, Query()]) -> Any:
331339
332340@app .get ("/stats/scans" , response_model = AnalyticsScansResponse )
333341def get_recent_scans (query : Annotated [AnalyticsListQuery , Query ()]) -> AnalyticsScansResponse :
334- """Get recent scan records for an event."""
335- event_id = query .event_id
336- limit = query .limit
337- log_info ("Recent scans requested" , {"event_id" : event_id , "limit" : limit })
342+ """Get recent scan records for an event with date filtering and pagination."""
343+ log_info ("Recent scans requested" , {
344+ "event_id" : query .event_id ,
345+ "from_ts" : query .from_ts .isoformat () if query .from_ts else None ,
346+ "to_ts" : query .to_ts .isoformat () if query .to_ts else None ,
347+ "page" : query .page ,
348+ "limit" : query .limit
349+ })
338350 try :
339- scans = analytics_service .get_recent_scans (event_id , limit )
340- log_info ("Recent scans retrieved" , {"event_id" : event_id , "scan_count" : len (scans )})
341- return AnalyticsScansResponse (event_id = event_id , scans = scans , count = len (scans ))
351+ result = analytics_service .get_recent_scans (
352+ event_id = query .event_id ,
353+ from_ts = query .from_ts ,
354+ to_ts = query .to_ts ,
355+ page = query .page ,
356+ limit = query .limit
357+ )
358+ log_info ("Recent scans retrieved" , {
359+ "event_id" : query .event_id ,
360+ "total" : result ["total" ],
361+ "page" : result ["page" ],
362+ "limit" : result ["limit" ]
363+ })
364+ return AnalyticsScansResponse (
365+ event_id = query .event_id ,
366+ data = result ["data" ],
367+ total = result ["total" ],
368+ page = result ["page" ],
369+ limit = result ["limit" ],
370+ from_ts = query .from_ts ,
371+ to_ts = query .to_ts
372+ )
342373 except Exception as exc :
343- log_error ("Failed to retrieve recent scans" , {"event_id" : event_id , "error" : str (exc )})
374+ log_error ("Failed to retrieve recent scans" , {"event_id" : query . event_id , "error" : str (exc )})
344375 raise HTTPException (status_code = 500 , detail = f"Failed to retrieve recent scans: { exc } " )
345376
346377
347378@app .get ("/stats/transfers" , response_model = AnalyticsTransfersResponse )
348379def get_recent_transfers (
349380 query : Annotated [AnalyticsListQuery , Query ()]
350381) -> AnalyticsTransfersResponse :
351- """Get recent transfer records for an event."""
352- event_id = query .event_id
353- limit = query .limit
354- log_info ("Recent transfers requested" , {"event_id" : event_id , "limit" : limit })
382+ """Get recent transfer records for an event with date filtering and pagination."""
383+ log_info ("Recent transfers requested" , {
384+ "event_id" : query .event_id ,
385+ "from_ts" : query .from_ts .isoformat () if query .from_ts else None ,
386+ "to_ts" : query .to_ts .isoformat () if query .to_ts else None ,
387+ "page" : query .page ,
388+ "limit" : query .limit
389+ })
355390 try :
356- transfers = analytics_service .get_recent_transfers (event_id , limit )
357- return AnalyticsTransfersResponse (event_id = event_id , transfers = transfers , count = len (transfers ))
391+ result = analytics_service .get_recent_transfers (
392+ event_id = query .event_id ,
393+ from_ts = query .from_ts ,
394+ to_ts = query .to_ts ,
395+ page = query .page ,
396+ limit = query .limit
397+ )
398+ log_info ("Recent transfers retrieved" , {
399+ "event_id" : query .event_id ,
400+ "total" : result ["total" ],
401+ "page" : result ["page" ],
402+ "limit" : result ["limit" ]
403+ })
404+ return AnalyticsTransfersResponse (
405+ event_id = query .event_id ,
406+ data = result ["data" ],
407+ total = result ["total" ],
408+ page = result ["page" ],
409+ limit = result ["limit" ],
410+ from_ts = query .from_ts ,
411+ to_ts = query .to_ts
412+ )
358413 except Exception as exc :
359- log_error ("Failed to retrieve recent transfers" , {"event_id" : event_id , "error" : str (exc )})
414+ log_error ("Failed to retrieve recent transfers" , {"event_id" : query . event_id , "error" : str (exc )})
360415 raise HTTPException (status_code = 500 , detail = f"Failed to retrieve recent transfers: { exc } " )
361416
362417
363418@app .get ("/stats/invalid-attempts" , response_model = AnalyticsInvalidAttemptsResponse )
364419def get_invalid_attempts (
365420 query : Annotated [AnalyticsListQuery , Query ()]
366421) -> AnalyticsInvalidAttemptsResponse :
367- """Get recent invalid scan attempt records for an event."""
368- event_id = query .event_id
369- limit = query .limit
370- log_info ("Invalid attempts requested" , {"event_id" : event_id , "limit" : limit })
422+ """Get recent invalid scan attempt records for an event with date filtering and pagination."""
423+ log_info ("Invalid attempts requested" , {
424+ "event_id" : query .event_id ,
425+ "from_ts" : query .from_ts .isoformat () if query .from_ts else None ,
426+ "to_ts" : query .to_ts .isoformat () if query .to_ts else None ,
427+ "page" : query .page ,
428+ "limit" : query .limit
429+ })
371430 try :
372- attempts = analytics_service .get_invalid_attempts (event_id , limit )
373- return AnalyticsInvalidAttemptsResponse (event_id = event_id , attempts = attempts , count = len (attempts ))
431+ result = analytics_service .get_invalid_attempts (
432+ event_id = query .event_id ,
433+ from_ts = query .from_ts ,
434+ to_ts = query .to_ts ,
435+ page = query .page ,
436+ limit = query .limit
437+ )
438+ log_info ("Invalid attempts retrieved" , {
439+ "event_id" : query .event_id ,
440+ "total" : result ["total" ],
441+ "page" : result ["page" ],
442+ "limit" : result ["limit" ]
443+ })
444+ return AnalyticsInvalidAttemptsResponse (
445+ event_id = query .event_id ,
446+ data = result ["data" ],
447+ total = result ["total" ],
448+ page = result ["page" ],
449+ limit = result ["limit" ],
450+ from_ts = query .from_ts ,
451+ to_ts = query .to_ts
452+ )
374453 except Exception as exc :
375- log_error ("Failed to retrieve invalid attempts" , {"event_id" : event_id , "error" : str (exc )})
454+ log_error ("Failed to retrieve invalid attempts" , {"event_id" : query . event_id , "error" : str (exc )})
376455 raise HTTPException (status_code = 500 , detail = f"Failed to retrieve invalid attempts: { exc } " )
377456
378457
0 commit comments