72 lines
1.6 KiB
Python
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
|