Implemented logging configuration
This commit is contained in:
+18
-2
@@ -1,20 +1,29 @@
|
|||||||
from fastapi import FastAPI, HTTPException
|
from fastapi import FastAPI, HTTPException
|
||||||
from fastapi.responses import RedirectResponse
|
from fastapi.responses import RedirectResponse
|
||||||
|
from contextlib import asynccontextmanager
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from app.utils import generate_short_code
|
from app.utils import generate_short_code
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
import os
|
import os
|
||||||
import sqlite3
|
import sqlite3
|
||||||
from contextlib import asynccontextmanager
|
import logging
|
||||||
|
|
||||||
|
# Set up logging configuration
|
||||||
|
logging.basicConfig(level=logging.INFO,
|
||||||
|
format="%(asctime)s - %(levelname)s - %(message)s")
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
# Database connection setup
|
||||||
@asynccontextmanager
|
@asynccontextmanager
|
||||||
async def lifespan(app: FastAPI):
|
async def lifespan(app: FastAPI):
|
||||||
conn = sqlite3.connect('urls.db')
|
conn = sqlite3.connect('urls.db')
|
||||||
conn.execute('''CREATE TABLE IF NOT EXISTS urls
|
conn.execute('''CREATE TABLE IF NOT EXISTS urls
|
||||||
(id INTEGER PRIMARY KEY, short_code TEXT, original_url TEXT, clicks INTEGER)''')
|
(id INTEGER PRIMARY KEY, short_code TEXT, original_url TEXT, clicks INTEGER)''')
|
||||||
conn.commit()
|
conn.commit()
|
||||||
|
logger.info("Database initialized or already exists.")
|
||||||
yield
|
yield
|
||||||
conn.close()
|
conn.close()
|
||||||
|
logger.info("Database connection closed.")
|
||||||
|
|
||||||
app = FastAPI(lifespan=lifespan)
|
app = FastAPI(lifespan=lifespan)
|
||||||
|
|
||||||
@@ -27,10 +36,12 @@ class URLRequest(BaseModel):
|
|||||||
|
|
||||||
@app.get("/")
|
@app.get("/")
|
||||||
def home():
|
def home():
|
||||||
|
logger.info("Home endpoint accessed.")
|
||||||
return {"message": "URL Shortener API"}
|
return {"message": "URL Shortener API"}
|
||||||
|
|
||||||
@app.post("/shorten")
|
@app.post("/shorten")
|
||||||
def shorten_url(request: URLRequest):
|
def shorten_url(request: URLRequest):
|
||||||
|
logger.info(f"Request received to shorten URL: {request.url}")
|
||||||
short_code = generate_short_code()
|
short_code = generate_short_code()
|
||||||
conn = get_db_connection()
|
conn = get_db_connection()
|
||||||
|
|
||||||
@@ -42,14 +53,18 @@ def shorten_url(request: URLRequest):
|
|||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
return {"short_url": f"{os.getenv('BASE_URL', 'http://localhost:8000')}/{short_code}"}
|
short_url = f"{os.getenv('BASE_URL', 'http://localhost:8000')}/{short_code}"
|
||||||
|
logger.info(f"Shortened URL created: {short_url}")
|
||||||
|
return {"short_url": short_url}
|
||||||
|
|
||||||
@app.get("/{short_code}")
|
@app.get("/{short_code}")
|
||||||
def redirect_to_url(short_code: str):
|
def redirect_to_url(short_code: str):
|
||||||
|
logger.info(f"Redirect request received for short_code: {short_code}")
|
||||||
conn = get_db_connection()
|
conn = get_db_connection()
|
||||||
url_data = conn.execute("SELECT original_url, clicks FROM urls WHERE short_code = ?", (short_code,)).fetchone()
|
url_data = conn.execute("SELECT original_url, clicks FROM urls WHERE short_code = ?", (short_code,)).fetchone()
|
||||||
|
|
||||||
if url_data is None:
|
if url_data is None:
|
||||||
|
logger.warning(f"Shortened URL for {short_code} not found.")
|
||||||
raise HTTPException(status_code=404, detail="Shortened URL not found")
|
raise HTTPException(status_code=404, detail="Shortened URL not found")
|
||||||
|
|
||||||
original_url, clicks = url_data
|
original_url, clicks = url_data
|
||||||
@@ -57,4 +72,5 @@ def redirect_to_url(short_code: str):
|
|||||||
conn.commit()
|
conn.commit()
|
||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
logger.info(f"Redirecting to {original_url}. Total clicks: {clicks + 1}")
|
||||||
return RedirectResponse(url=original_url)
|
return RedirectResponse(url=original_url)
|
||||||
+1
-3
@@ -1,12 +1,10 @@
|
|||||||
from fastapi.testclient import TestClient
|
from fastapi.testclient import TestClient
|
||||||
from app.main import app
|
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
|
|
||||||
# Add the 'app' folder to the sys.path
|
|
||||||
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
||||||
|
|
||||||
from app.main import app # Now this should work correctly
|
from app.main import app
|
||||||
|
|
||||||
client = TestClient(app)
|
client = TestClient(app)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user