11import os
22from datetime import datetime , timezone
3- from pathlib import Path
43from typing import Optional
54from app .utils .cache import list_cache_clean , clear_cache
65from fastapi import (
2221from fastapi .templating import Jinja2Templates
2322from pydantic import BaseModel , Field
2423
24+
2525from app import __version__
2626from app .utils import db
2727from app .utils .cache import (
3434 remove_cache_key ,
3535 rev_cache ,
3636)
37- from app .utils .config import DOMAIN , MAX_RECENT_URLS , CACHE_PURGE_TOKEN
37+ from app .utils .config import DOMAIN , MAX_RECENT_URLS , CACHE_PURGE_TOKEN , QR_DIR
3838from app .utils .helper import generate_code , is_valid_url , sanitize_url , format_date
3939from app .utils .qr import generate_qr_with_logo
4040
41- BASE_DIR = Path (__file__ ).resolve ().parent
42- templates = Jinja2Templates (directory = str (BASE_DIR / "templates" ))
43-
41+ # templates = Jinja2Templates(directory=str(BASE_DIR / "templates"))
42+ templates = Jinja2Templates (directory = "app/templates" )
4443# Routers
4544ui_router = APIRouter ()
4645api_router = APIRouter ()
@@ -67,10 +66,8 @@ async def index(request: Request):
6766 if qr_enabled and new_short_url and short_code :
6867 qr_data = new_short_url
6968 qr_filename = f"{ short_code } .png"
70- qr_dir = BASE_DIR / "static" / "qr"
71- qr_dir .mkdir (parents = True , exist_ok = True )
72- generate_qr_with_logo (qr_data , str (qr_dir / qr_filename ))
73- qr_image = f"/static/qr/{ qr_filename } "
69+ generate_qr_with_logo (qr_data , str (QR_DIR / qr_filename ))
70+ qr_image = f"/qr/{ qr_filename } "
7471
7572 recent_urls = db .get_recent_urls (MAX_RECENT_URLS ) or get_recent_from_cache (
7673 MAX_RECENT_URLS
@@ -137,7 +134,7 @@ async def create_short_url(
137134 return RedirectResponse ("/" , status_code = status .HTTP_303_SEE_OTHER )
138135
139136
140- @ui_router .get ("/recent " , response_class = HTMLResponse )
137+ @ui_router .get ("/history " , response_class = HTMLResponse )
141138async def recent_urls (request : Request ):
142139 recent_urls_list = db .get_recent_urls (MAX_RECENT_URLS ) or get_recent_from_cache (
143140 MAX_RECENT_URLS
@@ -222,17 +219,19 @@ def redirect_short_ui(short_code: str, background_tasks: BackgroundTasks):
222219 set_cache_pair (short_code , original_url )
223220 return RedirectResponse (original_url )
224221
225- return PlainTextResponse ("Invalid short URL" , status_code = 404 )
222+ # return PlainTextResponse("Invalid short URL", status_code=404)
223+ raise HTTPException (status_code = 404 , detail = "Page not found" )
226224
227225
228- @ui_router .delete ("/recent /{short_code}" )
226+ @ui_router .delete ("/history /{short_code}" )
229227def delete_recent_api (short_code : str ):
230228 recent = get_recent_from_cache (MAX_RECENT_URLS ) or []
231229 removed_from_cache = False
232230
233231 for i , item in enumerate (recent ):
234232 code = item .get ("short_code" ) or item .get ("code" )
235233 if code == short_code :
234+ recent .pop (i ) # remove from cache
236235 removed_from_cache = True
237236 break
238237
@@ -242,7 +241,6 @@ def delete_recent_api(short_code: str):
242241 if db_available :
243242 db_deleted = db .delete_by_short_code (short_code )
244243
245- # ✅ If nothing was deleted anywhere → 404
246244 if not removed_from_cache and not db_deleted :
247245 raise HTTPException (
248246 status_code = 404 , detail = f"short_code '{ short_code } ' not found"
0 commit comments