diff --git a/app/main.py b/app/main.py index 7143b6d..fd4e333 100644 --- a/app/main.py +++ b/app/main.py @@ -15,6 +15,12 @@ from . import config import logging 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: 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 @@ -93,375 +99,20 @@ log.debug(config.settings) 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 -app.include_router( - ae_obj.router, - prefix='/ae_obj', - tags=['AE Object'], -) +# 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)'], - #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 diff --git a/app/middleware.py b/app/middleware.py new file mode 100644 index 0000000..cf3e699 --- /dev/null +++ b/app/middleware.py @@ -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 diff --git a/app/routers/registry.py b/app/routers/registry.py new file mode 100644 index 0000000..933faac --- /dev/null +++ b/app/routers/registry.py @@ -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'])