import os from typing import Annotated import django from django.conf import settings as django_settings from fastapi import Cookie, Depends, FastAPI, Header from fastapi.responses import HTMLResponse, RedirectResponse from sqlalchemy.orm import Session from starlette.requests import Request from redirect.db.curd import LinkNotFoundException, get_link_by_slug from redirect.db.dependency import get_db from redirect.settings import settings os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local") django.setup() app = FastAPI() from akarpov.tools.shortener.tasks import ( # noqa: This has to be imported strictly AFTER django setup save_view_meta, ) settings.relative_base = django_settings.SHORTENER_REDIRECT_TO @app.exception_handler(LinkNotFoundException) async def unicorn_exception_handler(request: Request, exc: LinkNotFoundException): return HTMLResponse( status_code=404, # language=HTML content=""" Unknown Link

Such link doesn't exist or has been revoked

""", ) @app.get("/{slug}") def redirect( slug: str, request: Request, db: Session = Depends(get_db), user_agent: Annotated[str | None, Header()] = None, sessionid: Annotated[str | None, Cookie()] = None, ) -> RedirectResponse: """Main route that redirects to a page based on the slug.""" if "+" in slug: return RedirectResponse(url=f'/tools/shortener/p/{slug.replace("+", "")}') link_id, link_target = get_link_by_slug(db, slug) save_view_meta.apply_async( kwargs={ "pk": link_id, "ip": request.client.host, "user_agent": user_agent, "user_id": sessionid, }, ) return RedirectResponse( url=(settings.relative_base + link_target) if link_target.startswith("/") else link_target )