Refactor: Modularize middleware and router registration in app/main.py
This commit is contained in:
379
app/main.py
379
app/main.py
@@ -15,6 +15,12 @@ from . import config
|
|||||||
import logging
|
import logging
|
||||||
import app.log
|
import app.log
|
||||||
|
|
||||||
|
# Baby step: Import the new registry module
|
||||||
|
from app.routers.registry import setup_routers
|
||||||
|
|
||||||
|
# Import middleware with alias to avoid shadowing 'app' FastAPI instance
|
||||||
|
from app.middleware import add_process_time_header as process_time_middleware
|
||||||
|
|
||||||
# Import the routers here first:
|
# Import the routers here first:
|
||||||
from app.routers import ae_obj, aether_cfg, api_crud, api_crud_v2, api_crud_v3, api, importing, sql, account, activity_log, address, archive, archive_content, contact, data_store, event, event_abstract, event_badge, event_badge_importing, event_badge_template, event_device, event_exhibit, event_exhibit_tracking, event_file, event_importing, event_location, event_person, event_person_detail, event_person_tracking, event_presentation, event_presenter, event_registration, event_session, flask_cfg, fundraising, grant, hosted_file, log_client_viewing, lookup, membership_cfg, membership_group, membership_person_group, membership_person, membership_person_profile, membership_type, membership_person_type, order, order_v3, order_line, order_cart, organization, page, person, person_user, post, post_comment, product, qr, site, site_domain, user, util_email, websockets_redis, e_confex, e_cvent, e_impexium, e_stripe
|
from app.routers import ae_obj, aether_cfg, api_crud, api_crud_v2, api_crud_v3, api, importing, sql, account, activity_log, address, archive, archive_content, contact, data_store, event, event_abstract, event_badge, event_badge_importing, event_badge_template, event_device, event_exhibit, event_exhibit_tracking, event_file, event_importing, event_location, event_person, event_person_detail, event_person_tracking, event_presentation, event_presenter, event_registration, event_session, flask_cfg, fundraising, grant, hosted_file, log_client_viewing, lookup, membership_cfg, membership_group, membership_person_group, membership_person, membership_person_profile, membership_type, membership_person_type, order, order_v3, order_line, order_cart, organization, page, person, person_user, post, post_comment, product, qr, site, site_domain, user, util_email, websockets_redis, e_confex, e_cvent, e_impexium, e_stripe
|
||||||
# from app.routers import agent_bridge
|
# from app.routers import agent_bridge
|
||||||
@@ -93,375 +99,20 @@ log.debug(config.settings)
|
|||||||
app.mount('/static', StaticFiles(directory='static'), name='static')
|
app.mount('/static', StaticFiles(directory='static'), name='static')
|
||||||
|
|
||||||
|
|
||||||
|
# Register all application routes
|
||||||
|
setup_routers(app)
|
||||||
|
|
||||||
|
# Legacy registration block being removed...
|
||||||
# Set up each route once the router has been imported
|
# Set up each route once the router has been imported
|
||||||
app.include_router(
|
# app.include_router(
|
||||||
ae_obj.router,
|
# ae_obj.router,
|
||||||
prefix='/ae_obj',
|
# prefix='/ae_obj',
|
||||||
tags=['AE Object'],
|
# tags=['AE Object'],
|
||||||
)
|
# )
|
||||||
app.include_router(
|
app.include_router(
|
||||||
aether_cfg.router,
|
aether_cfg.router,
|
||||||
tags=['Aether Config'],
|
tags=['Aether Config'],
|
||||||
)
|
)
|
||||||
app.include_router(
|
|
||||||
api_crud.router,
|
|
||||||
prefix='/crud',
|
|
||||||
tags=['CRUD v1.2 (Legacy)'],
|
|
||||||
#dependencies=[Depends(get_token_header)],
|
|
||||||
#dependencies=[Depends(get_account_header)],
|
|
||||||
#responses={404: {'description': 'Not found'}},
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
api_crud_v2.router,
|
|
||||||
prefix='/v2/crud',
|
|
||||||
tags=['CRUD v2.5'],
|
|
||||||
#dependencies=[Depends(get_token_header)],
|
|
||||||
#dependencies=[Depends(get_account_header)],
|
|
||||||
#responses={404: {'description': 'Not found'}},
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
api_crud_v3.router,
|
|
||||||
prefix='/v3/crud',
|
|
||||||
tags=['CRUD v3'],
|
|
||||||
)
|
|
||||||
|
|
||||||
# Deferred import to avoid circular dependencies and ensure environment is ready
|
|
||||||
# from app.routers import agent_bridge
|
|
||||||
# app.include_router(
|
|
||||||
# agent_bridge.router,
|
|
||||||
# prefix='/agent',
|
|
||||||
# tags=['Agent Bridge'],
|
|
||||||
# )
|
|
||||||
|
|
||||||
app.include_router(
|
|
||||||
api.router,
|
|
||||||
prefix='/api',
|
|
||||||
tags=['API'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
flask_cfg.router,
|
|
||||||
prefix='/flask_cfg',
|
|
||||||
tags=['Flask CFG'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
importing.router,
|
|
||||||
prefix='/importing',
|
|
||||||
tags=['Importing'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
sql.router,
|
|
||||||
# prefix='/sql',
|
|
||||||
tags=['SQL'],
|
|
||||||
)
|
|
||||||
# # app.include_router(
|
|
||||||
# # flask_cfg.router,
|
|
||||||
# # prefix='/redis',
|
|
||||||
# # tags=['Redis'],
|
|
||||||
# # )
|
|
||||||
|
|
||||||
app.include_router(
|
|
||||||
account.router,
|
|
||||||
# prefix='/account',
|
|
||||||
tags=['Account'],
|
|
||||||
)
|
|
||||||
# app.include_router(
|
|
||||||
# activity_log.router,
|
|
||||||
# prefix='/activity_log',
|
|
||||||
# tags=['Activity Log'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# address.router,
|
|
||||||
# prefix='/address',
|
|
||||||
# tags=['Address'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# archive.router,
|
|
||||||
# # prefix='/archive',
|
|
||||||
# tags=['Archive'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# archive_content.router,
|
|
||||||
# prefix='/archive/content',
|
|
||||||
# tags=['Archive Content'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# contact.router,
|
|
||||||
# prefix='/contact',
|
|
||||||
# tags=['Contact'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# cont_edu_cert.router,
|
|
||||||
# tags=['Cont Edu Cert'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# cont_edu_cert_person.router,
|
|
||||||
# tags=['Cont Edu Cert Person'],
|
|
||||||
# )
|
|
||||||
app.include_router(
|
|
||||||
data_store.router,
|
|
||||||
# prefix='/data_store',
|
|
||||||
tags=['Data Store'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
event.router,
|
|
||||||
# prefix='/event',
|
|
||||||
tags=['Event'],
|
|
||||||
)
|
|
||||||
# app.include_router(
|
|
||||||
# event_abstract.router,
|
|
||||||
# tags=['Event Abstract'],
|
|
||||||
# )
|
|
||||||
app.include_router(
|
|
||||||
event_badge.router,
|
|
||||||
tags=['Event Badge'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
event_badge_importing.router,
|
|
||||||
tags=['Event Badge Importing'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
event_badge_template.router,
|
|
||||||
# prefix='/event/badge/template',
|
|
||||||
tags=['Event Badge Template'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
event_device.router,
|
|
||||||
# prefix='/event/device',
|
|
||||||
tags=['Event Device'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
event_exhibit.router,
|
|
||||||
# prefix='/event/exhibit',
|
|
||||||
tags=['Event Exhibit'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
event_exhibit_tracking.router,
|
|
||||||
# prefix='/event/exhibit/tracking',
|
|
||||||
tags=['Event Exhibit Tracking'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
event_file.router,
|
|
||||||
# prefix='/event/file',
|
|
||||||
tags=['Event File'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
event_importing.router,
|
|
||||||
# prefix='/event/importing',
|
|
||||||
tags=['Event Importing'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
event_location.router,
|
|
||||||
# prefix='/event/location',
|
|
||||||
tags=['Event Location'],
|
|
||||||
)
|
|
||||||
# app.include_router(
|
|
||||||
# event_person.router,
|
|
||||||
# # prefix='/event/person',
|
|
||||||
# tags=['Event Person'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# event_person.router,
|
|
||||||
# prefix='/event/person/detail',
|
|
||||||
# tags=['Event Person Detail'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# event_person_tracking.router,
|
|
||||||
# tags=['Event Person Tracking'],
|
|
||||||
# )
|
|
||||||
app.include_router(
|
|
||||||
event_presentation.router,
|
|
||||||
# prefix='/event/presentation',
|
|
||||||
tags=['Event Presentation'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
event_presenter.router,
|
|
||||||
prefix='/event/presenter',
|
|
||||||
tags=['Event Presenter'],
|
|
||||||
)
|
|
||||||
# app.include_router(
|
|
||||||
# event_registration.router,
|
|
||||||
# prefix='/event/registration',
|
|
||||||
# tags=['Event Registration'],
|
|
||||||
# )
|
|
||||||
app.include_router(
|
|
||||||
event_session.router,
|
|
||||||
# prefix='/event/session',
|
|
||||||
tags=['Event Session'],
|
|
||||||
)
|
|
||||||
# app.include_router(
|
|
||||||
# fundraising.router,
|
|
||||||
# tags=['Fundraising'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# grant.router,
|
|
||||||
# tags=['Grant'],
|
|
||||||
# )
|
|
||||||
app.include_router(
|
|
||||||
hosted_file.router,
|
|
||||||
prefix='/hosted_file',
|
|
||||||
tags=['Hosted File'],
|
|
||||||
)
|
|
||||||
# app.include_router(
|
|
||||||
# journal.router,
|
|
||||||
# prefix='/journal',
|
|
||||||
# tags=['Journal'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# journal_entry.router,
|
|
||||||
# # prefix='/journal/entry',
|
|
||||||
# tags=['Journal Entry'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# log_client_viewing.router,
|
|
||||||
# # prefix='/log/client_viewing',
|
|
||||||
# tags=['Log Client Viewing'],
|
|
||||||
# )
|
|
||||||
app.include_router(
|
|
||||||
lookup.router,
|
|
||||||
prefix='/lu',
|
|
||||||
tags=['Lookup'],
|
|
||||||
)
|
|
||||||
# app.include_router(
|
|
||||||
# membership_cfg.router,
|
|
||||||
# tags=['Membership Config'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# membership_group.router,
|
|
||||||
# tags=['Membership Group'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# membership_person_group.router,
|
|
||||||
# tags=['Membership Group Person'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# membership_person_profile.router,
|
|
||||||
# tags=['Membership Person Profile'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# membership_person.router,
|
|
||||||
# tags=['Membership Person'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# membership_type.router,
|
|
||||||
# tags=['Membership Type'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# membership_person_type.router,
|
|
||||||
# tags=['Membership Type Person'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# order.router,
|
|
||||||
# # prefix='/order',
|
|
||||||
# tags=['Order'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# order_v3.router,
|
|
||||||
# # prefix='/order',
|
|
||||||
# tags=['Order v3'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# order_line.router,
|
|
||||||
# # prefix='/order',
|
|
||||||
# tags=['Order Line'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# order_cart.router,
|
|
||||||
# prefix='/order/cart',
|
|
||||||
# tags=['Order Cart'],
|
|
||||||
# )
|
|
||||||
app.include_router(
|
|
||||||
organization.router,
|
|
||||||
prefix='/organization',
|
|
||||||
tags=['Organization'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
page.router,
|
|
||||||
prefix='/page',
|
|
||||||
tags=['Page'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
person.router,
|
|
||||||
tags=['Person'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
person_user.router,
|
|
||||||
prefix='/person_user',
|
|
||||||
tags=['Person User'],
|
|
||||||
)
|
|
||||||
# app.include_router(
|
|
||||||
# post.router,
|
|
||||||
# # prefix='/post',
|
|
||||||
# tags=['Post'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# post_comment.router,
|
|
||||||
# prefix='/post/comment',
|
|
||||||
# tags=['Post Comment'],
|
|
||||||
# )
|
|
||||||
# app.include_router(
|
|
||||||
# product.router,
|
|
||||||
# # prefix='/product',
|
|
||||||
# tags=['Product'],
|
|
||||||
# )
|
|
||||||
app.include_router(
|
|
||||||
qr.router,
|
|
||||||
tags=['QR'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
site.router,
|
|
||||||
# prefix='/site',
|
|
||||||
tags=['Site'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
site_domain.router,
|
|
||||||
# prefix='/site/domain',
|
|
||||||
tags=['Site Domain'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
user.router,
|
|
||||||
tags=['User'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
util_email.router,
|
|
||||||
tags=['Utility: Email'],
|
|
||||||
)
|
|
||||||
# app.include_router(
|
|
||||||
# websockets.router,
|
|
||||||
# # prefix='/websocket',
|
|
||||||
# tags=['Websockets'],
|
|
||||||
# # dependencies=[Depends(get_token_header)],
|
|
||||||
# # responses={404: {'description': 'Not found'}},
|
|
||||||
# )
|
|
||||||
app.include_router(
|
|
||||||
websockets_redis.router,
|
|
||||||
tags=['Websockets (Redis)'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
e_confex.router,
|
|
||||||
prefix='/e/confex',
|
|
||||||
tags=['External Service: Confex'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
e_cvent.router,
|
|
||||||
prefix='/e/cvent',
|
|
||||||
tags=['External Service: Cvent'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
e_impexium.router,
|
|
||||||
prefix='/e/impexium',
|
|
||||||
tags=['External Service: Impexium'],
|
|
||||||
)
|
|
||||||
app.include_router(
|
|
||||||
e_stripe.router,
|
|
||||||
prefix='/e/stripe',
|
|
||||||
tags=['External Service: Stripe'],
|
|
||||||
)
|
|
||||||
|
|
||||||
# app.include_router(
|
|
||||||
# c_idaa.router,
|
|
||||||
# prefix='/c/idaa',
|
|
||||||
# tags=['Client: IDAA'],
|
|
||||||
# )
|
|
||||||
|
|
||||||
|
|
||||||
# BEGIN: CORS
|
# BEGIN: CORS
|
||||||
|
|||||||
12
app/middleware.py
Normal file
12
app/middleware.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import time
|
||||||
|
from fastapi import Request
|
||||||
|
|
||||||
|
async def add_process_time_header(request: Request, call_next):
|
||||||
|
"""
|
||||||
|
Middleware to add the processing time to the response header.
|
||||||
|
"""
|
||||||
|
start_time = time.time()
|
||||||
|
response = await call_next(request)
|
||||||
|
process_time = time.time() - start_time
|
||||||
|
response.headers['X-Process-Time'] = str(process_time)
|
||||||
|
return response
|
||||||
68
app/routers/registry.py
Normal file
68
app/routers/registry.py
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
from fastapi import FastAPI
|
||||||
|
from app.routers import (
|
||||||
|
ae_obj, aether_cfg, api_crud, api_crud_v2, api_crud_v3, api, importing, sql,
|
||||||
|
account, activity_log, address, archive, archive_content, contact, data_store,
|
||||||
|
event, event_abstract, event_badge, event_badge_importing, event_badge_template,
|
||||||
|
event_device, event_exhibit, event_exhibit_tracking, event_file, event_importing,
|
||||||
|
event_location, event_person, event_person_detail, event_person_tracking,
|
||||||
|
event_presentation, event_presenter, event_registration, event_session,
|
||||||
|
flask_cfg, fundraising, grant, hosted_file, log_client_viewing, lookup,
|
||||||
|
membership_cfg, membership_group, membership_person_group, membership_person,
|
||||||
|
membership_person_profile, membership_type, membership_person_type,
|
||||||
|
order, order_v3, order_line, order_cart, organization, page, person,
|
||||||
|
person_user, post, post_comment, product, qr, site, site_domain, user,
|
||||||
|
util_email, websockets_redis, e_confex, e_cvent, e_impexium, e_stripe
|
||||||
|
)
|
||||||
|
|
||||||
|
def setup_routers(app: FastAPI):
|
||||||
|
"""
|
||||||
|
Registers all application routers with their respective prefixes and tags.
|
||||||
|
"""
|
||||||
|
app.include_router(ae_obj.router, prefix='/ae_obj', tags=['AE Object'])
|
||||||
|
app.include_router(aether_cfg.router, tags=['Aether Config'])
|
||||||
|
app.include_router(api_crud.router, prefix='/crud', tags=['CRUD v1.2 (Legacy)'])
|
||||||
|
app.include_router(api_crud_v2.router, prefix='/v2/crud', tags=['CRUD v2.5'])
|
||||||
|
app.include_router(api_crud_v3.router, prefix='/v3/crud', tags=['CRUD v3'])
|
||||||
|
|
||||||
|
app.include_router(api.router, prefix='/api', tags=['API'])
|
||||||
|
app.include_router(flask_cfg.router, prefix='/flask_cfg', tags=['Flask CFG'])
|
||||||
|
app.include_router(importing.router, prefix='/importing', tags=['Importing'])
|
||||||
|
app.include_router(sql.router, tags=['SQL'])
|
||||||
|
app.include_router(account.router, tags=['Account'])
|
||||||
|
|
||||||
|
app.include_router(data_store.router, tags=['Data Store'])
|
||||||
|
app.include_router(event.router, tags=['Event'])
|
||||||
|
app.include_router(event_badge.router, tags=['Event Badge'])
|
||||||
|
app.include_router(event_badge_importing.router, tags=['Event Badge Importing'])
|
||||||
|
app.include_router(event_badge_template.router, tags=['Event Badge Template'])
|
||||||
|
|
||||||
|
app.include_router(event_device.router, tags=['Event Device'])
|
||||||
|
app.include_router(event_exhibit.router, tags=['Event Exhibit'])
|
||||||
|
app.include_router(event_exhibit_tracking.router, tags=['Event Exhibit Tracking'])
|
||||||
|
app.include_router(event_file.router, tags=['Event File'])
|
||||||
|
app.include_router(event_importing.router, tags=['Event Importing'])
|
||||||
|
app.include_router(event_location.router, tags=['Event Location'])
|
||||||
|
|
||||||
|
app.include_router(event_presentation.router, tags=['Event Presentation'])
|
||||||
|
app.include_router(event_presenter.router, prefix='/event/presenter', tags=['Event Presenter'])
|
||||||
|
app.include_router(event_session.router, tags=['Event Session'])
|
||||||
|
|
||||||
|
app.include_router(hosted_file.router, prefix='/hosted_file', tags=['Hosted File'])
|
||||||
|
app.include_router(lookup.router, prefix='/lu', tags=['Lookup'])
|
||||||
|
|
||||||
|
app.include_router(organization.router, prefix='/organization', tags=['Organization'])
|
||||||
|
app.include_router(page.router, prefix='/page', tags=['Page'])
|
||||||
|
app.include_router(person.router, tags=['Person'])
|
||||||
|
app.include_router(person_user.router, prefix='/person_user', tags=['Person User'])
|
||||||
|
|
||||||
|
app.include_router(qr.router, tags=['QR'])
|
||||||
|
app.include_router(site.router, tags=['Site'])
|
||||||
|
app.include_router(site_domain.router, tags=['Site Domain'])
|
||||||
|
app.include_router(user.router, tags=['User'])
|
||||||
|
app.include_router(util_email.router, tags=['Utility: Email'])
|
||||||
|
app.include_router(websockets_redis.router, tags=['Websockets (Redis)'])
|
||||||
|
|
||||||
|
app.include_router(e_confex.router, prefix='/e/confex', tags=['External Service: Confex'])
|
||||||
|
app.include_router(e_cvent.router, prefix='/e/cvent', tags=['External Service: Cvent'])
|
||||||
|
app.include_router(e_impexium.router, prefix='/e/impexium', tags=['External Service: Impexium'])
|
||||||
|
app.include_router(e_stripe.router, prefix='/e/stripe', tags=['External Service: Stripe'])
|
||||||
Reference in New Issue
Block a user