feat: indie status page MVP -- FastAPI + SQLite
- 8 DB models (services, incidents, monitors, subscribers, etc.) - Full CRUD API for services, incidents, monitors - Public status page with live data - Incident detail page with timeline - API key authentication - Uptime monitoring scheduler - 13 tests passing - TECHNICAL_DESIGN.md with full spec
This commit is contained in:
commit
902133edd3
4655 changed files with 1342691 additions and 0 deletions
|
|
@ -0,0 +1 @@
|
|||
from starlette.middleware import Middleware as Middleware
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
from contextlib import AsyncExitStack
|
||||
|
||||
from starlette.types import ASGIApp, Receive, Scope, Send
|
||||
|
||||
|
||||
# Used mainly to close files after the request is done, dependencies are closed
|
||||
# in their own AsyncExitStack
|
||||
class AsyncExitStackMiddleware:
|
||||
def __init__(
|
||||
self, app: ASGIApp, context_name: str = "fastapi_middleware_astack"
|
||||
) -> None:
|
||||
self.app = app
|
||||
self.context_name = context_name
|
||||
|
||||
async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
|
||||
async with AsyncExitStack() as stack:
|
||||
scope[self.context_name] = stack
|
||||
await self.app(scope, receive, send)
|
||||
|
|
@ -0,0 +1 @@
|
|||
from starlette.middleware.cors import CORSMiddleware as CORSMiddleware # noqa
|
||||
|
|
@ -0,0 +1 @@
|
|||
from starlette.middleware.gzip import GZipMiddleware as GZipMiddleware # noqa
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
from starlette.middleware.httpsredirect import ( # noqa
|
||||
HTTPSRedirectMiddleware as HTTPSRedirectMiddleware,
|
||||
)
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
from starlette.middleware.trustedhost import ( # noqa
|
||||
TrustedHostMiddleware as TrustedHostMiddleware,
|
||||
)
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
from starlette.middleware.wsgi import (
|
||||
WSGIMiddleware as WSGIMiddleware,
|
||||
) # pragma: no cover # noqa
|
||||
Loading…
Add table
Add a link
Reference in a new issue