Created
June 15, 2022 10:09
-
-
Save rahul-yr/70c1a305f5fba52ba9df78ae8f95270b to your computer and use it in GitHub Desktop.
Here is the snippet for url shorteners
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import secrets | |
import string | |
from fastapi import APIRouter | |
from url_shortener.models import CreateUrlShortener, CreateUrlShortenerResponse | |
from url_shortener.database import MockDBOperations | |
from starlette.responses import RedirectResponse | |
# Create the router | |
url_shortener = APIRouter() | |
# Create the database | |
mock_db_operations = MockDBOperations() | |
# Create the short url | |
# This function is used to generate the short url | |
# returns the CreatedUrlShortenerResponse | |
@url_shortener.post("/create", response_model=CreateUrlShortenerResponse) | |
async def create(shortner : CreateUrlShortener): | |
# Generate a random string of 7 characters | |
short_url_length = 7 | |
# Generate a random string of 7 characters | |
res = ''.join(secrets.choice(string.ascii_uppercase + string.digits) | |
for i in range(short_url_length)) | |
# Convert the url to string | |
short_url = str(res) | |
# Add the url to the database | |
status = await mock_db_operations.add_data_to_db(url=shortner.url, short_url=short_url) | |
# If the url is added to the database, return the short url | |
if status: | |
return CreateUrlShortenerResponse(short_url=short_url, url=shortner.url) | |
else: | |
# If the url is not added to the database, return the error message | |
return CreateUrlShortenerResponse(short_url="", url="") | |
# Get the urls from the database | |
@url_shortener.get("/list", response_model=list[CreateUrlShortenerResponse]) | |
async def list(): | |
# Get the data from the database | |
data = await mock_db_operations.fetch_all_data() | |
# Create a list of CreateUrlShortenerResponse | |
arr = [] | |
# Loop through the data | |
for key, value in data.items(): | |
# Add the data to the list | |
arr.append(CreateUrlShortenerResponse(short_url=key, url=value)) | |
# Return the list | |
return arr | |
# Delete the url from the database | |
@url_shortener.delete("/delete/{short_url}") | |
async def delete_short_url(short_url : str): | |
# Delete the url from the database | |
status = await mock_db_operations.delete_data_from_db(short_url = short_url) | |
# If the url is deleted from the database, return the status | |
if status: | |
return {"message": "Successfully deleted"} | |
else: | |
# If the url is not deleted from the database, return the error message | |
return {"message": "Failed to delete"} | |
# Redirect the user to the original url | |
@url_shortener.get("/test/{short_url}") | |
async def test(short_url : str): | |
# Get the url from the database | |
data = await mock_db_operations.fetch_all_data() | |
# Check if the url exists in the database | |
if short_url in data: | |
# redirect to this url | |
url = data[short_url] | |
# return the redirect response | |
response = RedirectResponse(url=url) | |
return response | |
else: | |
# return the error message | |
return {"message": "Failed to fetch"} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment