-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.py
More file actions
72 lines (57 loc) · 2.26 KB
/
app.py
File metadata and controls
72 lines (57 loc) · 2.26 KB
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
from contextlib import asynccontextmanager
from datetime import timedelta
from typing import Annotated
from fastapi import Depends, FastAPI, HTTPException, Request
from fastapi.security import OAuth2PasswordRequestForm
from fastapi.staticfiles import StaticFiles
from slowapi import _rate_limit_exceeded_handler
from slowapi.middleware import SlowAPIMiddleware
from sqlmodel import Session, select
from .logger_settings import logger
from .rate_limiter import limiter
from .routes.client_routes import client_router
from .routes.gig_routes import gig_router
from .routes.ui_routes import ui_router
from .routes.user_routes import user_router
from .routes.venue_routes import venue_router
from .schema.base import create_db_and_tables, drop_db_and_tables, get_session, seed_db
from .schema.security import Token
from .schema.user import User
from .security import (
ACCESS_TOKEN_EXPIRE_MINUTES,
authenticate_user,
create_access_token,
)
@asynccontextmanager
async def lifespan(app: FastAPI):
create_db_and_tables()
seed_db()
yield
drop_db_and_tables()
app = FastAPI(lifespan=lifespan)
app.state.limiter = limiter
request: Request
app.add_exception_handler(429, _rate_limit_exceeded_handler) # type: ignore
app.add_middleware(SlowAPIMiddleware)
SessionDep = Annotated[Session, Depends(get_session)]
@app.post("/token", response_model=Token)
def login(
session: SessionDep,
form_data: Annotated[OAuth2PasswordRequestForm, Depends()],
):
user = session.exec(select(User).where(User.username == form_data.username)).first()
if not authenticate_user(user, form_data.password):
logger.info(f"User {form_data.username} failed to log in")
raise HTTPException(status_code=401, detail="Incorrect username or password")
assert user # for mypytype checking
access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
access_token = create_access_token(
data={"sub": user.username}, expires_delta=access_token_expires
)
return Token(access_token=access_token, token_type="bearer")
app.include_router(ui_router)
app.include_router(gig_router)
app.include_router(user_router)
app.include_router(client_router)
app.include_router(venue_router)
app.mount("/static", StaticFiles(directory="./static"), name="static")