Coverage for backend/app/eis/routers.py: 48%

27 statements  

« prev     ^ index     » next       coverage.py v7.10.7, created at 2025-09-22 15:38 +0000

1"""FastAPI routers for the email ingestion service (EIS) endpoints. 

2 

3Provides REST API endpoints for managing job alert emails, scraped job postings, 

4and service execution logs with CRUD operations and admin access controls.""" 

5 

6from datetime import datetime, timedelta 

7 

8from fastapi import APIRouter, Depends, HTTPException, Query, status 

9from sqlalchemy.orm import Session 

10 

11from app.models import User 

12from app.eis import models, schemas 

13from app.routers import generate_data_table_crud_router 

14from app.database import get_db 

15from app.oauth2 import get_current_user 

16 

17 

18# Job Alert Email router 

19email_router = generate_data_table_crud_router( 

20 table_model=models.JobAlertEmail, 

21 create_schema=schemas.JobAlertEmailCreate, 

22 update_schema=schemas.JobAlertEmailUpdate, 

23 out_schema=schemas.JobAlertEmailOut, 

24 endpoint="jobalertemails", 

25 not_found_msg="Job alert email not found", 

26) 

27 

28 

29# Scraped Job router 

30scrapedjob_router = generate_data_table_crud_router( 

31 table_model=models.ScrapedJob, 

32 create_schema=schemas.ScrapedJobCreate, 

33 update_schema=schemas.ScrapedJobUpdate, 

34 out_schema=schemas.ScrapedJobOut, 

35 endpoint="scrapedjobs", 

36 not_found_msg="Scraped job not found", 

37) 

38 

39 

40# Email Ingestion Service Log router 

41eis_servicelog_router = APIRouter(prefix="/servicelogs", tags=["servicelogs"]) 

42 

43 

44@eis_servicelog_router.get("/", response_model=list[schemas.EisServiceLogOut]) 

45def get_service_logs_by_date_range( 

46 start_date: datetime | None = Query(None, description="Start date for filtering (ISO format)"), 

47 end_date: datetime | None = Query(None, description="End date for filtering (ISO format)"), 

48 delta_days: int | None = Query(None, description="Number of days to go back in time"), 

49 limit: int | None = Query(None, description="Maximum number of logs to return"), 

50 current_user: User = Depends(get_current_user), 

51 db: Session = Depends(get_db), 

52): 

53 """Get service logs within a specified date range. Admin access required. 

54 :param start_date: Optional start date filter (inclusive) 

55 :param end_date: Optional end date filter (inclusive) 

56 :param limit: Optional limit for number of logs to return 

57 :param delta_days: Optional number of days to go back in time 

58 :param current_user: Current authenticated admin user 

59 :param db: Database session 

60 :return: list of service logs within the date range ordered by run_datetime descending""" 

61 

62 if not current_user.is_admin: 

63 raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Admin access required") 

64 

65 query = db.query(models.EisServiceLog) 

66 

67 # Apply date filters 

68 if start_date: 

69 query = query.filter(models.EisServiceLog.run_datetime >= start_date) 

70 if end_date: 

71 query = query.filter(models.EisServiceLog.run_datetime <= end_date) 

72 if delta_days: 

73 start_date = datetime.now() - timedelta(days=delta_days) 

74 query = query.filter(models.EisServiceLog.run_datetime >= start_date) 

75 

76 # Order by run_datetime descending (most recent first) 

77 query = query.order_by(models.EisServiceLog.run_datetime.desc()) 

78 

79 # Apply limit if specified 

80 if limit: 

81 query = query.limit(limit) 

82 

83 return query.all()