1- from pathlib import Path
2-
3- from fastapi import FastAPI , Request
4- from fastapi .responses import RedirectResponse
1+ from fastapi import FastAPI
52from fastapi .routing import APIRoute
6- from fastapi .templating import Jinja2Templates
7- from sqlmodel import Session
83from starlette .middleware .cors import CORSMiddleware
94
105from app .api .router import api_router
116from app .core .config import settings
12- from app .core .db import engine
13- from app .modules .shortener .service import ShortUrlService
14-
15-
16- # Setup Jinja2 templates
17- templates_dir = Path (__file__ ).parent / "templates"
18- templates = Jinja2Templates (directory = str (templates_dir ))
7+ from app .modules .shortener .redirect import redirect_router
198
209
2110def custom_generate_unique_id (route : APIRoute ) -> str :
@@ -39,58 +28,4 @@ def custom_generate_unique_id(route: APIRoute) -> str:
3928 )
4029
4130app .include_router (api_router , prefix = settings .API_V1_STR )
42-
43-
44- @app .get ("/s/{short_code}" , tags = ["redirect" ], response_model = None )
45- def redirect_to_url (request : Request , short_code : str ):
46- """
47- Redirect to the original URL based on the short code.
48- This endpoint is public and doesn't require authentication.
49- """
50- # Cache control headers to prevent browser caching
51- no_cache_headers = {
52- "Cache-Control" : "no-store, no-cache, must-revalidate, max-age=0" ,
53- "Pragma" : "no-cache" ,
54- "Expires" : "0" ,
55- }
56-
57- with Session (engine ) as session :
58- service = ShortUrlService (session )
59- short_url = service .get_short_url_by_code (short_code = short_code )
60-
61- if not short_url :
62- return templates .TemplateResponse (
63- request = request ,
64- name = "error.html" ,
65- context = {
66- "title" : "Link Not Found" ,
67- "message" : "The short URL you're looking for doesn't exist. It may have been deleted or never created." ,
68- "status_code" : 404 ,
69- "homepage_url" : settings .FRONTEND_HOST ,
70- },
71- status_code = 404 ,
72- headers = no_cache_headers ,
73- )
74-
75- if not short_url .is_active :
76- return templates .TemplateResponse (
77- request = request ,
78- name = "error.html" ,
79- context = {
80- "title" : "Link Deactivated" ,
81- "message" : "This short URL has been deactivated by its owner and is no longer available." ,
82- "status_code" : 410 ,
83- "homepage_url" : settings .FRONTEND_HOST ,
84- },
85- status_code = 410 ,
86- headers = no_cache_headers ,
87- )
88-
89- # Increment click count
90- service .increment_click_count (short_url = short_url )
91-
92- return RedirectResponse (
93- url = short_url .original_url ,
94- status_code = 307 ,
95- headers = no_cache_headers ,
96- )
31+ app .include_router (redirect_router )
0 commit comments