109 lines
3.3 KiB
Python
109 lines
3.3 KiB
Python
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...")
|