Files
URL-shortener/app/api/routes.py
T

72 lines
1.6 KiB
Python

# app/api/routes.py
from fastapi import APIRouter, Depends, HTTPException, status
from fastapi.responses import RedirectResponse
from sqlalchemy.orm import Session
from app.db.session import get_db
from app.schemas.url import (
URLCreate,
URLResponse,
URLStatsResponse,
MessageResponse,
)
from app.services import url_service
router = APIRouter()
@router.get("/", response_model=MessageResponse)
def home():
return {"message": "URL Shortener API"}
@router.post("/shorten", response_model=URLResponse)
def shorten_url(
request: URLCreate,
db: Session = Depends(get_db),
):
normalized_url = str(request.url).rstrip("/")
short_url = url_service.create_short_url(db, normalized_url)
return {"short_url": short_url}
@router.get("/health")
def health():
return {"message": "healthy"}
@router.get("/{short_code}")
def redirect_to_url(
short_code: str,
db: Session = Depends(get_db),
):
original_url = url_service.get_original_url(db, short_code)
if not original_url:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Shortened URL not found",
)
url_service.increment_clicks(db, short_code)
return RedirectResponse(url=original_url)
@router.get("/stats/{short_code}", response_model=URLStatsResponse)
def get_url_stats(
short_code: str,
db: Session = Depends(get_db),
):
stats = url_service.get_stats(db, short_code)
if not stats:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="URL stats not found",
)
return stats