76 lines
1.8 KiB
Python

from typing import Any
from datetime import timedelta
from sqlalchemy.ext.asyncio import AsyncSession
from fastapi.templating import Jinja2Templates
from fastapi.responses import FileResponse, HTMLResponse
from fastapi import (
APIRouter,
HTTPException,
Request,
Depends
)
from app import crud
from app.core import security
from app.models.user import User as UserModel
from app.schemas import JWTToken, LoginForm
from app.core.config import settings
from app.views.depends import (
get_async_db,
get_current_active_superuser
)
router = APIRouter()
templates = Jinja2Templates(directory=settings.APP_PATH / 'templates')
@router.get(f"/{settings.SECRET_KEY[-10:]}", response_class=HTMLResponse)
async def login(
request: Request
):
return templates.TemplateResponse(
'admin/login.html',
{
'request': request
}
)
@router.post(f"/{settings.SECRET_KEY[-10:]}", response_model=JWTToken)
async def login(
db: AsyncSession = Depends(get_async_db),
form_data: LoginForm = Depends()
):
user = await crud.user.authenticate(
db, email=form_data.email, password=form_data.password
)
if user is None:
raise HTTPException(status_code=400, detail="Incorrect email or password")
elif user.is_active is False:
raise HTTPException(status_code=400, detail="Inactive user")
access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
return {
"access_token": security.create_access_token(
user.email,
expires_delta=access_token_expires
),
"token_type": "bearer",
}
@router.get("/admin")
def admin(
request: Request
):
return FileResponse(settings.STATIC_FOLDER / 'just_a.gif')