health-apps-backend/main.py

105 lines
2.7 KiB
Python

import os
import dotenv
dotenv.load_dotenv()
from fastapi import FastAPI
from contextlib import asynccontextmanager
import logging
from fastapi.middleware.cors import CORSMiddleware
from fastapi.security import HTTPBearer
import stripe
# db
from database import Base, engine
# routers
from apis import api_router
# middleware
from middleware.ErrorHandlerMiddleware import ErrorHandlerMiddleware, configure_exception_handlers
from middleware.CustomRequestTypeMiddleware import TextPlainMiddleware
from services.emailService import EmailService
# Configure logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
)
logger = logging.getLogger(__name__)
STRIPE_SECRET_KEY = os.getenv("STRIPE_SECRET_KEY")
STRIPE_WEBHOOK_SECRET = os.getenv("STRIPE_WEBHOOK_SECRET")
@asynccontextmanager
async def lifespan(app: FastAPI):
logger.info("Starting application")
try:
Base.metadata.create_all(bind=engine)
logger.info("Created database tables")
if STRIPE_SECRET_KEY is None or STRIPE_WEBHOOK_SECRET is None:
raise ValueError("Stripe API key or webhook secret is not set")
stripe.api_key = STRIPE_SECRET_KEY
stripe.api_version = "2025-04-30.basil"
logger.info("Stripe API key set")
# Test Stripe connection
try:
account = stripe.Account.retrieve()
logger.info(f"Stripe connection verified - Account ID: {account.id}")
except stripe.error.AuthenticationError as e:
logger.error(f"Stripe authentication failed: {e}")
raise
except stripe.error.StripeError as e:
logger.error(f"Stripe connection test failed: {e}")
raise
except Exception as e:
logger.error(f"Error creating database tables: {e}")
raise e
yield
logger.info("Stopping application")
# Define the security scheme
bearer_scheme = HTTPBearer(scheme_name="Bearer Authentication")
app = FastAPI(
lifespan=lifespan,
title="Twillio Voice API",
description="API for Twillio Voice application",
version="1.0.0",
swagger_ui_parameters={"defaultModelsExpandDepth": -1}
)
# CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
expose_headers=["*"],
)
# Custom request type middleware
app.add_middleware(TextPlainMiddleware)
# Error handler middleware
app.add_middleware(ErrorHandlerMiddleware)
# Configure exception handlers
configure_exception_handlers(app)
@app.get("/")
async def hello_world():
# email_service = EmailService()
# email_service.createTemplate()
return {"Hello": "World"}
# Routes
app.include_router(api_router, prefix="/api")