-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.py
89 lines (73 loc) · 2.46 KB
/
index.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
from typing import List, Union
from molten import (
App, Component, ResponseRendererMiddleware, Middleware, SettingsComponent
)
from molten import Route, Include
from molten import URLEncodingParser, MultiPartParser
from molten.contrib.sqlalchemy import (
SQLAlchemyEngineComponent, SQLAlchemyMiddleware,
SQLAlchemySessionComponent, EngineData)
from molten.openapi import HTTPSecurityScheme, Metadata, OpenAPIHandler, OpenAPIUIHandler
from api.comment.views import list_comments, create_comment, get_comment, delete_comment
from api.user.views import list_users, create_user, get_user, delete_user
from custom import JSONParser, JSONRenderer
from db import Base
import settings
get_docs = OpenAPIUIHandler()
get_schema = OpenAPIHandler(
metadata=Metadata(
title="Molten-Boilerplate API",
description="An API for Molten-Boilerplate.",
version="0.0.0",
),
security_schemes=[
HTTPSecurityScheme("default", "bearer"),
],
default_security_scheme="default",
)
components: List[Component] = [
# TOMLSettingsComponent(),
SQLAlchemyEngineComponent(),
SQLAlchemySessionComponent(),
SettingsComponent(settings.SETTINGS)
]
middleware: List[Middleware] = [
ResponseRendererMiddleware(),
SQLAlchemyMiddleware(),
]
routes: List[Union[Route, Include]] = [
Include("/api/v1/users", [
Route("", list_users),
Route("", create_user, method="POST"),
Route("/{user_id}", delete_user, method="DELETE"),
Route("/{user_id}", get_user),
]),
Include("/api/v1/comments", [
Route("", list_comments),
Route("", create_comment, method="POST"),
Route("/{comment_id}", delete_comment, method="DELETE"),
Route("/{comment_id}", get_comment),
]),
Route("/_docs", get_docs),
Route("/_schema", get_schema),
]
def init_db(engine_data: EngineData):
Base.metadata.create_all(engine_data.engine)
def setup_db(app):
# Initialize the DB by injecting EngineData into init_db and calling it.
resolver = app.injector.get_resolver()
resolver.resolve(init_db)()
def create_app(_components=None, _middleware=None, _routes=None):
app = App(
components=_components or components,
middleware=_middleware or middleware,
routes=_routes or routes,
parsers=[
JSONParser(),
URLEncodingParser(),
MultiPartParser(),
],
renderers=[JSONRenderer()]
)
setup_db(app)
return app