Initial commit. API already works
This commit is contained in:
		
						commit
						78848e062f
					
				
							
								
								
									
										1
									
								
								.dir-locals.el
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.dir-locals.el
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
			
		||||
((nil . ((eval . (set-frame-name "Zip My Link")))))
 | 
			
		||||
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
/target
 | 
			
		||||
venv
 | 
			
		||||
__pycache__
 | 
			
		||||
							
								
								
									
										48
									
								
								api.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								api.py
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										50
									
								
								api.restclient
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										16
									
								
								client/index.html
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										3
									
								
								client/main.css
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
body {
 | 
			
		||||
    margin: 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										0
									
								
								client/main.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								client/main.js
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										3
									
								
								requirements.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								requirements.txt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,3 @@
 | 
			
		||||
fastapi
 | 
			
		||||
uvicorn
 | 
			
		||||
couchdb
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user