diff --git a/main.py b/main.py index 9867437..095f618 100644 --- a/main.py +++ b/main.py @@ -1,9 +1,27 @@ from fastapi import FastAPI +from .models import UrlPayload +from .utils import generate_shortcode app = FastAPI() -@app.get("/") -def read_root(): - return { - "Hello": "World" - } \ No newline at end of file +# temporary data store +url_mapping = {} + +@app.get("/{shortcode}") +async def get_original_url(shortcode: str): + if shortcode in url_mapping: + return {"original_url": url_mapping[shortcode]} + else: + raise HTTPException(status_code=404, detail="Shortcode not found") + + +@app.post("/shorten/") +async def create_short_url(url_payload: UrlPayload): + original_url = url_payload.url + shortcode = generate_shortcode() + + if shortcode in url_mapping: + raise HTTPException(status_code=409, detail="Shortcode already in use") + + url_mapping[shortcode] = str(original_url) + return {"shortcode": shortcode, "original_url": original_url} \ No newline at end of file diff --git a/models.py b/models.py new file mode 100644 index 0000000..b494ee9 --- /dev/null +++ b/models.py @@ -0,0 +1,4 @@ +from pydantic import BaseModel, HttpUrl + +class UrlPayload(BaseModel): + url: HttpUrl \ No newline at end of file diff --git a/utils.py b/utils.py new file mode 100644 index 0000000..9767ef5 --- /dev/null +++ b/utils.py @@ -0,0 +1,6 @@ +import string +import random + +def generate_shortcode(length=6) -> str: + characters = string.ascii_letters + string.digits + return ''.join(random.choice(characters) for _ in range(length)) \ No newline at end of file