AccountsAndCrossPlatformLogin
This commit is contained in:
108
server.py
Normal file
108
server.py
Normal file
@@ -0,0 +1,108 @@
|
||||
import http.server
|
||||
import socketserver
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
from urllib.parse import urlparse, parse_qs
|
||||
|
||||
PORT = 8000
|
||||
DB_FILE = 'database.json'
|
||||
|
||||
def load_db():
|
||||
if not os.path.exists(DB_FILE):
|
||||
return {"users": [], "posts": []}
|
||||
try:
|
||||
with open(DB_FILE, 'r') as f:
|
||||
return json.load(f)
|
||||
except:
|
||||
return {"users": [], "posts": []}
|
||||
|
||||
def save_db(data):
|
||||
with open(DB_FILE, 'w') as f:
|
||||
json.dump(data, f, indent=2)
|
||||
|
||||
class CustomHandler(http.server.SimpleHTTPRequestHandler):
|
||||
def do_GET(self):
|
||||
parsed = urlparse(self.path)
|
||||
if parsed.path == '/api/users':
|
||||
self.send_response(200)
|
||||
self.send_header('Content-type', 'application/json')
|
||||
self.send_header('Cache-Control', 'no-store, no-cache, must-revalidate')
|
||||
self.end_headers()
|
||||
db = load_db()
|
||||
self.wfile.write(json.dumps(db.get("users", [])).encode())
|
||||
return
|
||||
elif parsed.path == '/api/posts':
|
||||
self.send_response(200)
|
||||
self.send_header('Content-type', 'application/json')
|
||||
self.send_header('Cache-Control', 'no-store, no-cache, must-revalidate')
|
||||
self.end_headers()
|
||||
db = load_db()
|
||||
self.wfile.write(json.dumps(db.get("posts", [])).encode())
|
||||
return
|
||||
|
||||
# Default behavior (serve files)
|
||||
super().do_GET()
|
||||
|
||||
def do_POST(self):
|
||||
parsed = urlparse(self.path)
|
||||
length = int(self.headers.get('Content-Length', 0))
|
||||
body = self.rfile.read(length).decode('utf-8')
|
||||
try:
|
||||
payload = json.loads(body)
|
||||
except:
|
||||
payload = None
|
||||
|
||||
if parsed.path == '/api/users/add':
|
||||
db = load_db()
|
||||
db["users"].append(payload)
|
||||
save_db(db)
|
||||
self.success(payload)
|
||||
return
|
||||
|
||||
elif parsed.path == '/api/posts/add':
|
||||
db = load_db()
|
||||
# New posts go to top
|
||||
db["posts"].insert(0, payload)
|
||||
save_db(db)
|
||||
self.success(payload)
|
||||
return
|
||||
|
||||
elif parsed.path == '/api/posts/update':
|
||||
# Expects full post object, finds by ID and replaces
|
||||
db = load_db()
|
||||
posts = db.get("posts", [])
|
||||
for i, p in enumerate(posts):
|
||||
if p["id"] == payload["id"]:
|
||||
posts[i] = payload
|
||||
break
|
||||
db["posts"] = posts
|
||||
save_db(db)
|
||||
self.success(payload)
|
||||
return
|
||||
|
||||
elif parsed.path == '/api/posts/delete':
|
||||
# Expects { "id": "..." }
|
||||
db = load_db()
|
||||
posts = db.get("posts", [])
|
||||
db["posts"] = [p for p in posts if p["id"] != payload["id"]]
|
||||
save_db(db)
|
||||
self.success({"deleted": True})
|
||||
return
|
||||
|
||||
self.send_error(404, "API Endpoint not found")
|
||||
|
||||
def success(self, data):
|
||||
self.send_response(200)
|
||||
self.send_header('Content-type', 'application/json')
|
||||
self.end_headers()
|
||||
self.wfile.write(json.dumps(data).encode())
|
||||
|
||||
# Support binding to all interfaces
|
||||
Handler = CustomHandler
|
||||
with socketserver.TCPServer(("0.0.0.0", PORT), Handler) as httpd:
|
||||
print(f"Serving at http://0.0.0.0:{PORT}")
|
||||
try:
|
||||
httpd.serve_forever()
|
||||
except KeyboardInterrupt:
|
||||
print("\nStopping server...")
|
||||
Reference in New Issue
Block a user