Files
SocialMediaApp/server.py
2026-01-30 20:52:12 +11:00

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...")