Initial commit. API already works

This commit is contained in:
Joseph Ferano 2023-05-17 16:08:33 +07:00
commit 78848e062f
8 changed files with 124 additions and 0 deletions

1
.dir-locals.el Normal file
View File

@ -0,0 +1 @@
((nil . ((eval . (set-frame-name "Zip My Link")))))

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
/target
venv
__pycache__

48
api.py Normal file
View File

@ -0,0 +1,48 @@
from fastapi import FastAPI, Response
from fastapi.responses import RedirectResponse
import couchdb
import uuid
app = FastAPI()
couch = couchdb.Server("http://admin:password@127.0.0.1:5984")
@app.get("/{url_id}", status_code=301)
async def redirect_urls(url_id):
target_url = couch["urls"][url_id].get('full_url')
return RedirectResponse(target_url)
# TODO: Get JWT tokens working and use that to return only the user's urls
# TODO: Look into how FastAPI handles the Authentication header
@app.get("/api/v1/urls")
async def read_urls():
db = couch["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):
db = couch["urls"]
if url_id in db:
return db[url_id]
else:
response.status_code = 404
return { "error": "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
@app.delete("/api/v1/urls/{url_id}")
async def delete_url(url_id, response: Response):
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" }

50
api.restclient Normal file
View File

@ -0,0 +1,50 @@
:headers = <<
Content-Type: application/json
#
:host = http://localhost:8000
:api = api/v1
# TODO: Check if urls should be singular or plural
# Get all urls
GET :host/:api/urls
:headers
# Get a url
GET :host/:api/urls/eecd98
# TODO: Change to POST
# Add a url
PUT :host/:api/urls
:headers
{ "username": "Joe" , "url": "https://ferano.io" }
# Delete a url
DELETE :host/:api/urls/4485fe
# Redirect
GET :host/eecd98
:headers
###
# Talk directly to CouchDB
###
# Get value from key
GET http://admin:password@127.0.0.1:5984/urls/_all_docs?include_docs=true
:headers
# Add a key/value pair
PUT http://admin:password@127.0.0.1:5984/urls/a28d530a
:headers
{ "user_id": "Joe", "full_url": "https://ferano.io" }
# Delete a key/value pair
PUT http://admin:password@127.0.0.1:5984/urls
:headers
# Delete a key/value pair
DELETE http://admin:password@127.0.0.1:5984/urls
:headers

16
client/index.html Normal file
View File

@ -0,0 +1,16 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Zip My Link</title>
<link rel="stylesheet" href="main.css">
</head>
<body>
<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>
<p id="result"></p>
</body>
</html>

3
client/main.css Normal file
View File

@ -0,0 +1,3 @@
body {
margin: 0;
}

0
client/main.js Normal file
View File

3
requirements.txt Normal file
View File

@ -0,0 +1,3 @@
fastapi
uvicorn
couchdb