aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorParker <contact@pkrm.dev>2024-11-05 21:39:25 -0600
committerParker <contact@pkrm.dev>2024-11-05 21:39:25 -0600
commiteadc9289338e8537c1ee70274007eea2dc395bde (patch)
treeeefad8835a922eaaa58cb8b031aad82a9dce880d /app
parentddb984d0cde0458d8e2db9e5230b15d052a703bf (diff)
Re-add the link logging
Diffstat (limited to 'app')
-rw-r--r--app/main.py75
1 files changed, 39 insertions, 36 deletions
diff --git a/app/main.py b/app/main.py
index 2d13ae2..0ac6d09 100644
--- a/app/main.py
+++ b/app/main.py
@@ -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")
-
-# # 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)
+@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:
+ # 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}"},
- )