Squashed commit of the following:
commit 68032dc55a07565ccd17a188407d9ac2537b62e6
Author: Maxime Alves LIRMM <maxime.alves@lirmm.fr>
Date: Thu Jul 23 15:40:26 2020 +0200
[release][0.1.0] First HalfAPI release
commit a046a81114a3ae22bbc84a53f1e85217a0954dbc
Author: Maxime Alves LIRMM <maxime.alves@lirmm.fr>
Date: Thu Jul 23 15:26:15 2020 +0200
[doc] màj du readme
commit ed45b3011125c071aa53df8087d28bfa1150b373
Author: Maxime Alves LIRMM <maxime.alves@lirmm.fr>
Date: Thu Jul 23 11:03:17 2020 +0200
[wip] rm apidb
commit 7df4b9bacf3d26f09ea07856587505f74284cab4
Author: Maxime Alves LIRMM <maxime.alves@lirmm.fr>
Date: Thu Jul 23 10:58:46 2020 +0200
[db] forgot foreign key router->domain
commit 604b9a90f405121725e4b2126d73a5a83eec398f
Author: Maxime Alves LIRMM <maxime.alves@lirmm.fr>
Date: Thu Jul 23 10:51:01 2020 +0200
[wip] routes mounting fixed
commit c50a5572633d7dcc3cad48ef79c5ea1ca098284d
Author: Maxime Alves LIRMM <maxime.alves@lirmm.fr>
Date: Thu Jul 23 10:29:09 2020 +0200
[wip][db][nf] http_verb, fct_name are in api.route
commit 2b5b78db2f9c280dd5eb9d8bafc9174d9afc092f
Author: Maxime Alves LIRMM <maxime.alves@lirmm.fr>
Date: Wed Jul 22 17:37:21 2020 +0200
[wip] refactor du 22 juillet 2222
commit d019b7e333ab37f106895c84521cef1bfe768caa
Author: Maxime Alves LIRMM <maxime.alves@lirmm.fr>
Date: Wed Jul 22 14:48:51 2020 +0200
[wip] remove "version" from app
commit 98ccd61dcf369b8c4aac817a0c8409b6fed00f50
Author: Joël Maïzi <joel.maizi@lirmm.fr>
Date: Wed Jul 22 14:45:28 2020 +0200
Remove api.version from database.
commit aa0d4f8dbba8b8ec878835bb58b69facff7e675e
Author: Maxime Alves LIRMM@home <maxime.alves@lirmm.fr>
Date: Tue Jul 21 21:46:22 2020 +0200
[db] added router as api.acl primary_key part
commit a97984e9de0e6a00bddca7dece0c715c9c16cbe1
Author: Maxime Alves LIRMM@home <maxime.alves@lirmm.fr>
Date: Tue Jul 21 21:41:31 2020 +0200
[wip] moved all acl treatment to acl_caller_middleware, fix route mounting, fix typo in logs
commit 3dd310e80aaf6cb32f6c4ac23c1e2a924cebfde1
Author: Maxime Alves LIRMM <maxime.alves@lirmm.fr>
Date: Tue Jul 21 13:10:26 2020 +0200
[wip][nf] gestion des routes avec routers
commit c2687c4a24126fbc3e57257bf23c267b334df522
Author: Maxime Alves LIRMM <maxime.alves@lirmm.fr>
Date: Tue Jul 21 12:39:53 2020 +0200
[db] ajout de la table api.router
commit 9a10f76cf7790f75f23b72e19b0a58978752565c
Author: Maxime Alves LIRMM <maxime.alves@lirmm.fr>
Date: Tue Jul 21 12:19:53 2020 +0200
[db] renommage des champs d'acl
commit c4e8c26a24835559d2e9b251df0eb462fe7e667d
Author: Maxime Alves LIRMM <maxime.alves@lirmm.fr>
Date: Tue Jul 21 12:13:38 2020 +0200
[wip][nf] modification du systeme de montage des routes
commit b7e8352ba1e427e9883797a44bb0f3da5edd576d
Author: Maxime Alves LIRMM <maxime.alves@lirmm.fr>
Date: Tue Jul 21 11:15:30 2020 +0200
[wip][dbupdate] insertion des routes au nouveau format
commit 28947444c4c062e6ced74f9bfdef11a36ddc438b
Author: Maxime Alves LIRMM <maxime.alves@lirmm.fr>
Date: Tue Jul 21 10:32:57 2020 +0200
[wip][dbupdate] Suppression des routes hors domaine
167 lines
3.7 KiB
Python
Executable File
167 lines
3.7 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
from halfapi import (PROJECT_NAME, HOST, PORT,
|
|
PRODUCTION,
|
|
BASE_DIR,
|
|
Domain,
|
|
APIRouter,
|
|
APIRoute,
|
|
AclFunction,
|
|
Acl)
|
|
|
|
# builtins
|
|
import click
|
|
import uvicorn
|
|
import os
|
|
import sys
|
|
import importlib
|
|
from pprint import pprint
|
|
|
|
CONTEXT_SETTINGS={
|
|
'default_map':{'run': {}}
|
|
}
|
|
|
|
@click.group(invoke_without_command=True, context_settings=CONTEXT_SETTINGS)
|
|
@click.pass_context
|
|
def cli(ctx):
|
|
if ctx.invoked_subcommand is None:
|
|
return run()
|
|
|
|
|
|
@click.option('--host', default=HOST)
|
|
@click.option('--port', default=PORT)
|
|
@cli.command()
|
|
def run(host, port):
|
|
debug = reload = not PRODUCTION
|
|
log_level = 'info' if PRODUCTION else 'debug'
|
|
|
|
click.echo('Launching application')
|
|
|
|
sys.path.insert(0, BASE_DIR)
|
|
click.echo(f'current python_path : {sys.path}')
|
|
|
|
uvicorn.run('halfapi.app:app',
|
|
host=host,
|
|
port=int(port),
|
|
log_level=log_level,
|
|
reload=reload)
|
|
|
|
|
|
def delete_domain(domain):
|
|
d = Domain(name=domain)
|
|
if len(d) != 1:
|
|
return False
|
|
|
|
d.delete(delete_all=True)
|
|
return True
|
|
|
|
|
|
@click.option('--domain', default=None)
|
|
@cli.command()
|
|
def dbupdate(domain):
|
|
|
|
def add_acl_fct(fct):
|
|
acl = AclFunction()
|
|
acl.domain = domain
|
|
acl.name = fct.__name__
|
|
if len(acl) == 0:
|
|
acl.insert()
|
|
|
|
|
|
def add_acls(acls, **route):
|
|
route.pop('fct_name')
|
|
acl = Acl(**route)
|
|
|
|
for fct in acls:
|
|
acl.acl_fct_name = fct.__name__
|
|
|
|
if len(acl) == 0:
|
|
if fct is not None:
|
|
add_acl_fct(fct)
|
|
|
|
acl.insert()
|
|
|
|
elif fct is None:
|
|
acl.delete()
|
|
|
|
|
|
def get_fct_name(http_verb, path):
|
|
if path[0] != '/':
|
|
raise Exception('Malformed path')
|
|
|
|
elts = path[1:].split('/')
|
|
|
|
fct_name = [http_verb.lower()]
|
|
for elt in elts:
|
|
if elt[0] == '{':
|
|
fct_name.append(elt[1:-1].split(':')[0].upper())
|
|
else:
|
|
fct_name.append(elt)
|
|
|
|
return '_'.join(fct_name)
|
|
|
|
|
|
def add_router(name):
|
|
router = APIRouter()
|
|
router.name = name
|
|
router.domain = domain
|
|
|
|
if len(router) == 0:
|
|
router.insert()
|
|
|
|
|
|
def add_route(http_verb, path, router, acls):
|
|
click.echo(f'Adding route /{domain}/{router}{path}')
|
|
route = APIRoute()
|
|
route.http_verb = http_verb
|
|
route.path = path
|
|
route.fct_name = get_fct_name(http_verb, path)
|
|
route.router = router
|
|
route.domain = domain
|
|
|
|
if len(route) == 0:
|
|
route.insert()
|
|
|
|
add_acls(acls, **route.to_dict())
|
|
|
|
|
|
def add_domain():
|
|
new_domain = Domain(name=domain)
|
|
if len(new_domain) == 0:
|
|
click.echo(f'New domain {domain}')
|
|
new_domain.insert()
|
|
|
|
sys.path.insert(0, BASE_DIR)
|
|
|
|
delete_domain(domain)
|
|
|
|
acl_set = set()
|
|
|
|
try:
|
|
|
|
# module retrieval
|
|
dom_mod = importlib.import_module(domain)
|
|
|
|
add_domain()
|
|
|
|
# add sub routers
|
|
ROUTERS = dom_mod.ROUTERS
|
|
|
|
for router_name in dom_mod.ROUTERS:
|
|
router_mod = importlib.import_module(f'.routers.{router_name}', domain)
|
|
add_router(router_name)
|
|
|
|
pprint(router_mod.ROUTES)
|
|
for route_path, route_params in router_mod.ROUTES.items():
|
|
for http_verb, acls in route_params.items():
|
|
add_route(http_verb, route_path, router_name, acls)
|
|
|
|
|
|
except ImportError:
|
|
click.echo(f'The domain {domain} has no *ROUTES* variable', err=True)
|
|
except Exception as e:
|
|
click.echo(e, err=True)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
cli()
|