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.staticfiles import StaticFiles
import couchdb
import uuid
import validators
app = FastAPI()
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 ]
@app.get("/api/v1/urls/{url_id}")
async def read_url(url_id, response: Response):
async def read_url(url_id):
db = couch["urls"]
if url_id in db:
return db[url_id]
else:
response.status_code = 404
return { "error": "Url not found" }
raise HTTPException(status_code=404, detail="Url not found")
# TODO: Throttle
# TODO: If user not found, generate a new JWT
@app.put("/api/v1/urls")
async def create_url(body: dict):
db = couch["urls"]
url_id = uuid.uuid4().hex[:6]
db[url_id] = { "full_url": body["url"], "user_id": body["username"] }
return
if validators.url(body["url"]):
db = couch["urls"]
# TODO: Calculate how many unique IDs we are actually generating
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}")
async def delete_url(url_id, response: Response):
async def delete_url(url_id):
db = couch["urls"]
if url_id in db:
del db[url_id]
return { "message": "Url deleted" }
else:
response.status_code = 404
return { "error": "Url not found" }
raise HTTPException(status_code=404, detail="Url not found")

View File

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

View File

@ -10,7 +10,8 @@
<h1>Zip My Link</h1>
<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">
<button onclick="submitUrl()">Shorten Url</button>
<button onclick="shortenUrl()" id="submit-btn">Shorten Url</button>
<p id="result"></p>
<script src="static/main.js"></script>
</body>
</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";
}
}