[halfapi] now inherits from Starlette class. Uses a dict to store HalfDomain instances

This commit is contained in:
Maxime Alves LIRMM 2021-12-13 12:43:26 +01:00
parent 76e942ab91
commit bdbad9e296

View File

@ -43,9 +43,7 @@ from .logging import logger, config_logging
from .half_domain import HalfDomain from .half_domain import HalfDomain
from halfapi import __version__ from halfapi import __version__
class HalfAPI(Starlette):
class HalfAPI:
def __init__(self, config, def __init__(self, config,
d_routes=None): d_routes=None):
config_logging(logging.DEBUG) config_logging(logging.DEBUG)
@ -58,9 +56,6 @@ class HalfAPI:
self.PRODUCTION = PRODUCTION self.PRODUCTION = PRODUCTION
self.SECRET = SECRET self.SECRET = SECRET
self.__application = None
# Domains # Domains
""" HalfAPI routes (if not PRODUCTION, includes debug routes) """ HalfAPI routes (if not PRODUCTION, includes debug routes)
@ -91,7 +86,7 @@ class HalfAPI:
HalfAPI.wait_quit() HalfAPI.wait_quit()
) )
self.__application = Starlette( super().__init__(
debug=not PRODUCTION, debug=not PRODUCTION,
routes=routes, routes=routes,
exception_handlers={ exception_handlers={
@ -106,6 +101,8 @@ class HalfAPI:
schemas = [] schemas = []
self.__domains = {}
for key, domain in self.config.get('domain', {}).items(): for key, domain in self.config.get('domain', {}).items():
if not isinstance(domain, dict): if not isinstance(domain, dict):
continue continue
@ -123,30 +120,26 @@ class HalfAPI:
logger.debug('Mounting domain %s on %s', domain.get('name'), path) logger.debug('Mounting domain %s on %s', domain.get('name'), path)
half_domain = HalfDomain( domain_key = domain.get('name', key)
domain.get('name', key),
domain.get('router'),
domain.get('config', {}),
self.application
)
schemas.append(half_domain.schema()) self.add_domain(domain_key, domain.get('router'), path)
self.__application.mount(path, half_domain) schemas.append(self.__domains[domain_key].schema())
self.__application.add_route('/', JSONRoute(schemas))
self.__application.add_middleware( self.add_route('/', JSONRoute(schemas))
self.add_middleware(
AuthenticationMiddleware, AuthenticationMiddleware,
backend=JWTAuthenticationBackend() backend=JWTAuthenticationBackend()
) )
if not PRODUCTION: if not PRODUCTION:
self.__application.add_middleware( self.add_middleware(
TimingMiddleware, TimingMiddleware,
client=HTimingClient(), client=HTimingClient(),
metric_namer=StarletteScopeToName(prefix="halfapi", metric_namer=StarletteScopeToName(prefix="halfapi",
starlette_app=self.__application) starlette_app=self)
) )
@ -160,7 +153,7 @@ class HalfAPI:
@property @property
def application(self): def application(self):
return self.__application return self
def halfapi_routes(self): def halfapi_routes(self):
""" Halfapi default routes """ Halfapi default routes
@ -238,3 +231,21 @@ class HalfAPI:
return ORJSONResponse(res) return ORJSONResponse(res)
return wrapped return wrapped
@property
def domains(self):
return self.__domains
def add_domain(self, name, router=None, path='/', config=None):
if config:
self.config['domain'][name] = config
self.__domains[name] = HalfDomain(
name,
router,
self
)
self.mount(path, self.__domains[name])
return self.__domains[name]