in src/main.py [0:0]
def __call__(self):
from lambdas.modular_api_handler.handler import HANDLER
filename = self.deployment_resources
if filename.is_file() and filename.exists():
with open(filename, 'r') as file:
data = json.load(file)
else:
data = {}
api = data.setdefault(self.api_name, {
'resource_type': 'api_gateway',
'deploy_stage': 'dev',
'resources': {},
'dependencies': [],
'models': {}
})
resources = api.setdefault('resources', {})
for endpoint in HANDLER.iter_endpoint():
method_data = resources.setdefault(endpoint.path, {
'policy_statement_singleton': True,
'enable_cors': True,
}).setdefault(endpoint.method.value, {
'enable_proxy': True,
'integration_type': 'lambda',
'lambda_alias': '${lambdas_alias_name}',
'authorization_type': 'authorizer' if endpoint.auth else 'NONE',
'lambda_name': self.lambda_name
})
method_data.pop('method_request_models', None)
method_data.pop('responses', None)
method_data.pop('method_request_parameters', None)
if model := endpoint.request_model:
match endpoint.method:
case HTTPMethod.GET:
params = {}
for name, info in model.model_fields.items():
params[f'method.request.querystring.{name}'] = info.is_required()
method_data['method_request_parameters'] = params
case _:
name = model.__name__
method_data['method_request_models'] = {
'application/json': name
}
schema = model.model_json_schema()
dereference_json(schema)
schema.pop('$defs', None)
api.setdefault('models', {})[name] = {
'content_type': 'application/json',
'schema': schema
}
responses = []
for st, m, _ in endpoint.responses:
resp: dict[str, Any] = {'status_code': str(st.value)}
if m:
resp['response_models'] = {'application/json': m.__name__}
responses.append(resp)
method_data['responses'] = responses
with open(filename, 'w') as file:
json.dump(data, file, indent=2)
_LOG.info(f'{filename} has been updated')