import logging import os from datetime import datetime from fastapi import Depends, FastAPI from fastapi.middleware.cors import CORSMiddleware from starlette.requests import Request from app.models.user import User from app.services.user_service import current_active_verified_user from app.api.auth import router as auth_router from app.api.categories import router as categories_router from app.api.transactions import router as transactions_router from app.services.user_service import auth_backend, current_active_verified_user, fastapi_users, get_oauth_provider fastApi = FastAPI() # CORS for frontend dev server fastApi.add_middleware( CORSMiddleware, allow_origins=[ "http://localhost:5173", "http://127.0.0.1:5173", os.getenv("FRONTEND_DOMAIN_SCHEME", "") ], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) fastApi.include_router(auth_router) fastApi.include_router(categories_router) fastApi.include_router(transactions_router) logging.basicConfig(filename='app.log', level=logging.INFO, format='%(asctime)s %(message)s') @fastApi.middleware("http") async def log_traffic(request: Request, call_next): start_time = datetime.now() response = await call_next(request) process_time = (datetime.now() - start_time).total_seconds() client_host = request.client.host log_params = { "request_method": request.method, "request_url": str(request.url), "request_size": request.headers.get("content-length"), "request_headers": dict(request.headers), "response_status": response.status_code, "response_size": response.headers.get("content-length"), "response_headers": dict(response.headers), "process_time": process_time, "client_host": client_host } logging.info(str(log_params)) return response fastApi.include_router( fastapi_users.get_oauth_router( get_oauth_provider("MojeID"), auth_backend, "SECRET", associate_by_email=True, ), prefix="/auth/mojeid", tags=["auth"], ) fastApi.include_router( fastapi_users.get_oauth_router( get_oauth_provider("BankID"), auth_backend, "SECRET", associate_by_email=True, ), prefix="/auth/bankid", tags=["auth"], ) # Liveness/root endpoint @fastApi.get("/", include_in_schema=False) async def root(): return {"status": "ok"} @fastApi.get("/authenticated-route") async def authenticated_route(user: User = Depends(current_active_verified_user)): return {"message": f"Hello {user.email}!"}