Re-add the link logging

This commit is contained in:
Parker M. 2024-11-05 21:39:25 -06:00
parent ddb984d0cd
commit eadc928933
Signed by: parker
GPG Key ID: 505ED36FC12B5D5E

View File

@ -1,4 +1,4 @@
from fastapi import FastAPI, Depends, Request
from fastapi import FastAPI, Depends, Request, Path
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import RedirectResponse, JSONResponse
from fastapi.templating import Jinja2Templates
@ -10,11 +10,15 @@ from fastapi.exceptions import HTTPException
from starlette.status import HTTP_404_NOT_FOUND
from app.util.authentication import get_current_user_from_cookie
from app.util.db_dependency import get_db
from app.util.log import log
from app.schemas.auth_schemas import User
from models import Link
app = FastAPI(
title="LinkLogger API",
version="1.0",
version="2.0",
summary="Public API for a combined link shortener and IP logger",
license_info={
"name": "The Unlicense",
@ -63,32 +67,32 @@ async def dashboard(
)
# @app.get("/{link}")
# async def log_redirect(
# link: Annotated[str, Path(title="Redirect link")],
# request: Request,
# db=Depends(get_db),
# ):
# link = link.upper()
# # If `link` is not exactly 5 characters, return redirect to base url
# if len(link) != 5:
# return RedirectResponse(url="/login")
@app.get("/c/{link}")
async def log_redirect(
link: Annotated[str, Path(title="Redirect link")],
request: Request,
db=Depends(get_db),
):
link = link.upper()
# Links must be 5 characters long
if len(link) != 5:
return RedirectResponse(url="/login")
# # Make sure the link exists in the database
# link_record: Link = db.query(Link).filter(Link.link == link).first()
# if not link_record:
# db.close()
# return RedirectResponse(url="/login")
# else:
# # Log the visit
# if request.headers.get("X-Real-IP"):
# ip = request.headers.get("X-Real-IP").split(",")[0]
# else:
# ip = request.client.host
# user_agent = request.headers.get("User-Agent")
# log(link, ip, user_agent)
# db.close()
# return RedirectResponse(url=link_record.redirect_link)
# Make sure the link exists in the database
link_record: Link = db.query(Link).filter(Link.link == link).first()
if not link_record:
db.close()
return RedirectResponse(url="/login")
else:
# Get the IP and log the request
if request.headers.get("X-Real-IP"):
ip = request.headers.get("X-Real-IP").split(",")[0]
else:
ip = request.client.host
user_agent = request.headers.get("User-Agent")
log(link, ip, user_agent)
db.close()
return RedirectResponse(url=link_record.redirect_link)
# Redirect /api -> /api/docs
@ -100,12 +104,11 @@ async def redirect_to_docs():
# Custom handler for 404 errors
@app.exception_handler(HTTP_404_NOT_FOUND)
async def custom_404_handler(request: Request, exc: HTTPException):
# If the request is from /api, return a JSON response
if request.url.path.startswith("/api"):
return JSONResponse(
status_code=404,
content={"message": "Resource not found"},
)
# Otherwise, redirect to the login page
return RedirectResponse(url="/login")
@app.exception_handler(HTTPException)
async def http_exception_handler(request, exc):
return JSONResponse(
status_code=exc.status_code,
content={"detail": f"{exc.detail}"},
)