aboutsummaryrefslogtreecommitdiffstats
path: root/backend/__init__.py
blob: 67015d725a41a06bd5b4a059d4fa15ebb823318b (plain) (blame)
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
import sentry_sdk
from sentry_sdk.integrations.asgi import SentryAsgiMiddleware
from starlette.applications import Starlette
from starlette.middleware import Middleware
from starlette.middleware.authentication import AuthenticationMiddleware
from starlette.middleware.cors import CORSMiddleware

from backend import constants
from backend.authentication import JWTAuthenticationBackend
from backend.middleware import DatabaseMiddleware, ProtectedDocsMiddleware
from backend.route_manager import create_route_map
from backend.validation import api

ORIGINS = [
    r"(https://[^.?#]*--pydis-forms\.netlify\.app)",  # Netlify Previews
    r"(https?://[^.?#]*.forms-frontend.pages.dev)",  # Cloudflare Previews
]

if not constants.PRODUCTION:
    # Allow all hosts on non-production deployments
    ORIGINS.append(r"(.*)")

ALLOW_ORIGIN_REGEX = "|".join(ORIGINS)

SENTRY_RELEASE = f"forms-backend@{constants.GIT_SHA}"
sentry_sdk.init(
    dsn=constants.FORMS_BACKEND_DSN,
    send_default_pii=True,
    release=SENTRY_RELEASE,
    environment=SENTRY_RELEASE,
)

middleware = [
    Middleware(
        CORSMiddleware,
        allow_origins=["https://forms.pythondiscord.com"],
        allow_origin_regex=ALLOW_ORIGIN_REGEX,
        allow_headers=[
            "Content-Type",
        ],
        allow_methods=["*"],
        allow_credentials=True,
    ),
    Middleware(DatabaseMiddleware),
    Middleware(AuthenticationMiddleware, backend=JWTAuthenticationBackend()),
    Middleware(SentryAsgiMiddleware),
    Middleware(ProtectedDocsMiddleware),
]

app = Starlette(routes=create_route_map(), middleware=middleware)
api.register(app)