Compare commits

..

2 Commits

4 changed files with 37 additions and 12 deletions

25
api.py
View File

@ -1,8 +1,9 @@
from fastapi import FastAPI, Response from fastapi import FastAPI, HTTPException
from fastapi.responses import RedirectResponse, FileResponse from fastapi.responses import RedirectResponse, FileResponse
from fastapi.staticfiles import StaticFiles from fastapi.staticfiles import StaticFiles
import couchdb import couchdb
import uuid import uuid
import validators
app = FastAPI() app = FastAPI()
app.mount("/static", StaticFiles(directory="static", html=True), name="static") app.mount("/static", StaticFiles(directory="static", html=True), name="static")
@ -26,29 +27,31 @@ async def read_urls():
return [ { id: db[id].get('full_url') } for id in db ] return [ { id: db[id].get('full_url') } for id in db ]
@app.get("/api/v1/urls/{url_id}") @app.get("/api/v1/urls/{url_id}")
async def read_url(url_id, response: Response): async def read_url(url_id):
db = couch["urls"] db = couch["urls"]
if url_id in db: if url_id in db:
return db[url_id] return db[url_id]
else: else:
response.status_code = 404 raise HTTPException(status_code=404, detail="Url not found")
return { "error": "Url not found" }
# TODO: Throttle # TODO: Throttle
# TODO: If user not found, generate a new JWT # TODO: If user not found, generate a new JWT
@app.put("/api/v1/urls") @app.put("/api/v1/urls")
async def create_url(body: dict): async def create_url(body: dict):
db = couch["urls"] if validators.url(body["url"]):
url_id = uuid.uuid4().hex[:6] db = couch["urls"]
db[url_id] = { "full_url": body["url"], "user_id": body["username"] } # TODO: Calculate how many unique IDs we are actually generating
return url_id = uuid.uuid4().hex[:6]
db[url_id] = { "full_url": body["url"], "user_id": body["username"] }
return { "shortenedUrl": "http://localhost:8000/" + url_id }
else:
raise HTTPException(status_code=400, detail="Url provided is invalid")
@app.delete("/api/v1/urls/{url_id}") @app.delete("/api/v1/urls/{url_id}")
async def delete_url(url_id, response: Response): async def delete_url(url_id):
db = couch["urls"] db = couch["urls"]
if url_id in db: if url_id in db:
del db[url_id] del db[url_id]
return { "message": "Url deleted" } return { "message": "Url deleted" }
else: else:
response.status_code = 404 raise HTTPException(status_code=404, detail="Url not found")
return { "error": "Url not found" }

View File

@ -2,3 +2,4 @@ fastapi
uvicorn uvicorn
couchdb couchdb
aiofiles aiofiles
validators

View File

@ -10,7 +10,8 @@
<h1>Zip My Link</h1> <h1>Zip My Link</h1>
<p>Type your long URL into the box and get a shorter URL back!</p> <p>Type your long URL into the box and get a shorter URL back!</p>
<input type="text" id="url-input" placeholder="Enter your URL here"> <input type="text" id="url-input" placeholder="Enter your URL here">
<button onclick="submitUrl()">Shorten Url</button> <button onclick="shortenUrl()" id="submit-btn">Shorten Url</button>
<p id="result"></p> <p id="result"></p>
<script src="static/main.js"></script>
</body> </body>
</html> </html>

View File

@ -0,0 +1,20 @@
async function shortenUrl() {
const url = document.getElementById("url-input").value;
const btn = document.getElementById("submit-btn").value;
// btn.enab
const response = await fetch("/api/v1/urls", {
method: 'PUT',
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ url: url, username: "anonymous" })
});
const data = await response.json();
const resultElement = document.getElementById("result");
if (response.ok) {
resultElement.textContent = `Shortened Url: ${data.shortenedUrl}`
resultElement.style.color = "black";
} else {
resultElement.textContent = `Error: ${data.detail}`
resultElement.style.color = "red";
}
}