Compare commits

...

2 commits

Author SHA1 Message Date
Guillem Borrell 04351888a8 Refactored endpoints
Some checks failed
ci/woodpecker/push/woodpecker Pipeline failed
2024-06-10 23:02:15 +02:00
Guillem Borrell 832623044f Refactored endpoints 2024-06-10 23:02:07 +02:00
6 changed files with 88 additions and 79 deletions

View file

@ -1,30 +1,19 @@
import json
from pathlib import Path
from fastapi import FastAPI, status
from fastapi.responses import RedirectResponse, HTMLResponse
from fastapi import FastAPI
from fastapi.responses import HTMLResponse, RedirectResponse
from fastapi.staticfiles import StaticFiles
from starlette.middleware.sessions import SessionMiddleware
from starlette.requests import Request
from authlib.integrations.starlette_client import OAuth, OAuthError
from pydantic import BaseModel
import json
import hellocomputer
from .routers import analysis, files, sessions
from .config import settings
from .routers import analysis, auth, files, sessions, health
static_path = Path(hellocomputer.__file__).parent / "static"
oauth = OAuth()
oauth.register(
"auth0",
client_id=settings.auth0_client_id,
client_secret=settings.auth0_client_secret,
client_kwargs={"scope": "openid profile email", "verify": False},
server_metadata_url=f"https://{settings.auth0_domain}/.well-known/openid-configuration",
)
app = FastAPI()
app.add_middleware(SessionMiddleware, secret_key=settings.app_secret_key)
@ -40,69 +29,11 @@ async def homepage(request: Request):
return HTMLResponse(f.read())
@app.route("/login")
async def login(request: Request):
return await oauth.auth0.authorize_redirect(
request,
redirect_uri=f"{settings.base_url}/callback",
)
@app.route("/callback", methods=["GET", "POST"])
async def callback(request: Request):
try:
token = await oauth.auth0.authorize_access_token(request)
except OAuthError as error:
return HTMLResponse(f"<h1>{error.error}</h1>")
user = token.get("userinfo")
if user:
request.session["user"] = dict(user)
return RedirectResponse(url="/app")
@app.route("/logout")
async def logout(request: Request):
request.session.pop("user", None)
return RedirectResponse(url="/")
@app.route("/user")
async def user(request: Request):
user = request.session.get("user")
return user
class HealthCheck(BaseModel):
"""Response model to validate and return when performing a health check."""
status: str = "OK"
@app.get(
"/health",
tags=["healthcheck"],
summary="Perform a Health Check",
response_description="Return HTTP Status Code 200 (OK)",
status_code=status.HTTP_200_OK,
response_model=HealthCheck,
)
def get_health() -> HealthCheck:
"""
## Perform a Health Check
Endpoint to perform a healthcheck on. This endpoint can primarily be used Docker
to ensure a robust container orchestration and management is in place. Other
services which rely on proper functioning of the API service will not deploy if this
endpoint returns any other HTTP status code except 200 (OK).
Returns:
HealthCheck: Returns a JSON response with the health status
"""
return HealthCheck(status="OK")
app.include_router(health.router)
app.include_router(sessions.router)
app.include_router(files.router)
app.include_router(analysis.router)
app.include_router(auth.router)
app.mount(
"/app",
StaticFiles(directory=static_path, html=True),

View file

@ -1,5 +1,3 @@
import os
from fastapi import APIRouter
from fastapi.responses import PlainTextResponse

View file

@ -0,0 +1,50 @@
from authlib.integrations.starlette_client import OAuth, OAuthError
from fastapi import APIRouter
from fastapi.responses import HTMLResponse, RedirectResponse
from starlette.requests import Request
from ..config import settings
router = APIRouter()
oauth = OAuth()
oauth.register(
"auth0",
client_id=settings.auth0_client_id,
client_secret=settings.auth0_client_secret,
client_kwargs={"scope": "openid profile email", "verify": False},
server_metadata_url=f"https://{settings.auth0_domain}/.well-known/openid-configuration",
)
@router.get("/login")
async def login(request: Request):
return await oauth.auth0.authorize_redirect(
request,
redirect_uri=f"{settings.base_url}/callback",
)
@router.route("/callback", methods=["GET", "POST"])
async def callback(request: Request):
try:
token = await oauth.auth0.authorize_access_token(request)
except OAuthError as error:
return HTMLResponse(f"<h1>{error.error}</h1>")
user = token.get("userinfo")
if user:
request.session["user"] = dict(user)
return RedirectResponse(url="/app")
@router.get("/logout")
async def logout(request: Request):
request.session.pop("user", None)
return RedirectResponse(url="/")
@router.get("/user")
async def user(request: Request):
user = request.session.get("user")
return user

View file

@ -0,0 +1,31 @@
from fastapi import APIRouter, status
from pydantic import BaseModel
router = APIRouter()
class HealthCheck(BaseModel):
"""Response model to validate and return when performing a health check."""
status: str = "OK"
@router.get(
"/health",
tags=["healthcheck"],
summary="Perform a Health Check",
response_description="Return HTTP Status Code 200 (OK)",
status_code=status.HTTP_200_OK,
response_model=HealthCheck,
)
def get_health() -> HealthCheck:
"""
## Perform a Health Check
Endpoint to perform a healthcheck on. This endpoint can primarily be used Docker
to ensure a robust container orchestration and management is in place. Other
services which rely on proper functioning of the API service will not deploy if this
endpoint returns any other HTTP status code except 200 (OK).
Returns:
HealthCheck: Returns a JSON response with the health status
"""
return HealthCheck(status="OK")

View file

@ -1,9 +1,8 @@
from uuid import uuid4
from fastapi import APIRouter
from starlette.requests import Request
from fastapi.responses import PlainTextResponse
from starlette.requests import Request
# Scheme for the Authorization header