From 1f5313ef813c7baf62f34af26a8d6cc3cf9bd7c7 Mon Sep 17 00:00:00 2001 From: heatherngyvn Date: Mon, 20 Jul 2026 01:30:40 -0700 Subject: [PATCH 1/3] added personal sqlite-revisited folder of paste API code --- sqlite-revisited/server.py | 74 ++++++++++++++++++++++++++++++++++++++ sqlite-revisited/sqlite.py | 12 +++++++ 2 files changed, 86 insertions(+) create mode 100644 sqlite-revisited/server.py create mode 100644 sqlite-revisited/sqlite.py diff --git a/sqlite-revisited/server.py b/sqlite-revisited/server.py new file mode 100644 index 0000000..8321a43 --- /dev/null +++ b/sqlite-revisited/server.py @@ -0,0 +1,74 @@ +from fastapi import FastAPI +import sqlite3 +import uuid + +app = FastAPI() +DATABASE = "pastes.db" + +def database_setup(): + connection = sqlite3.connect(DATABASE) + cursor = connection.cursor() + + cursor.execute("""CREATE TABLE IF NOT EXISTS pastes (name TEXT, filename TEXT)""") + + connection.commit() + connection.close() + +database_setup() + +@app.get("/paste/list") +def pastes_list(): + connection = sqlite3.connect(DATABASE) + cursor = connection.cursor() + + cursor.execute("SELECT * FROM pastes") + rows = cursor.fetchall() + + connection.close() + + return rows + +@app.post("/paste/create") +def create_paste(data: dict): + name = data["name"] + content = data["content"] + + connection = sqlite3.connect(DATABASE) + cursor = connection.cursor() + + filename = str(uuid.uuid4()) + ".txt" + + with open(filename, "w") as file: + file.write(content) + + cursor.execute("INSERT INTO pastes (name, filename) VALUES (?, ?)", + (name, filename) +) + + connection.commit() + connection.close() + + return {"name": name, "content": content} + +@app.get("/paste/view/{name}") +def check_paste_exist(name: str): + connection = sqlite3.connect(DATABASE) + cursor = connection.cursor() + + cursor.execute("SELECT filename FROM pastes WHERE name = ?", + (name,) +) + paste = cursor.fetchone() + + connection.close() + + if paste: + filename = paste[0] + + with open(filename, "r") as file: + content = file.read() + + return content + + return "no!" + diff --git a/sqlite-revisited/sqlite.py b/sqlite-revisited/sqlite.py new file mode 100644 index 0000000..c02d941 --- /dev/null +++ b/sqlite-revisited/sqlite.py @@ -0,0 +1,12 @@ +import sqlite3 + +connection = sqlite3.connect("pastes.db") +cursor = connection.cursor() + +cursor.execute("SELECT * FROM pastes") + +rows = cursor.fetchall() + +print(rows) + +connection.close() From 4303a191533f4eb269ccdc5d1d6752a9aa83bdd3 Mon Sep 17 00:00:00 2001 From: evan Date: Fri, 28 Aug 2026 08:49:09 -0700 Subject: [PATCH 2/3] im heather and i lint python code --- server.py | 68 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/server.py b/server.py index 9b59a76..5fe527e 100644 --- a/server.py +++ b/server.py @@ -1,6 +1,11 @@ from typing import Optional from fastapi import FastAPI, Request, HTTPException, Response -from fastapi.responses import RedirectResponse, HTMLResponse, FileResponse, PlainTextResponse +from fastapi.responses import ( + RedirectResponse, + HTMLResponse, + FileResponse, + PlainTextResponse, +) from fastapi.middleware.cors import CORSMiddleware import logging import time @@ -46,11 +51,11 @@ DATABASE_FILE = args.database_file_path sqlite_helpers.maybe_create_table(DATABASE_FILE) qr_code_cache = QRCode( - base_url=args.qr_code_base_url, - qr_cache_path=args.qr_code_cache_path, - max_size=args.qr_code_cache_size, - cache_state_file=args.qr_code_cache_state_file, - qr_image_path=args.qr_code_center_image_path, + base_url=args.qr_code_base_url, + qr_cache_path=args.qr_code_cache_path, + max_size=args.qr_code_cache_size, + cache_state_file=args.qr_code_cache_state_file, + qr_image_path=args.qr_code_center_image_path, ) @@ -166,12 +171,15 @@ async def delete_url(alias: str): else: raise HTTPException(status_code=HttpResponse.NOT_FOUND.code) + @app.post("/paste/create") async def create_paste(request: Request): api_key = request.headers.get("x-api-key") if CLEEZY_PASTE_API_KEY is None: - logging.warning("CLEEZY_PASTE_API_KEY isn't set, skipping api key check for /paste/create") + logging.warning( + "CLEEZY_PASTE_API_KEY isn't set, skipping api key check for /paste/create" + ) elif api_key != CLEEZY_PASTE_API_KEY: raise HTTPException(status_code=401, detail=f"Invalid API Key '{api_key}'") @@ -180,32 +188,30 @@ async def create_paste(request: Request): except Exception: logging.exception("/paste/create couldnt parse json") raise HTTPException( - status_code=HttpResponse.BAD_REQUEST.code, - detail="Invalid JSON payload" + status_code=HttpResponse.BAD_REQUEST.code, detail="Invalid JSON payload" ) text_bytes = payload.get("text", "").encode("utf-8") if len(text_bytes) > MAX_PASTE_SIZE_BYTES: raise HTTPException( status_code=HttpResponse.REQUEST_TOO_LARGE, - detail="Paste content exceeds the maximum allowed size of 10MB." + detail="Paste content exceeds the maximum allowed size of 10MB.", ) - paste_id = generate_alias(len(payload.get('text'))) + paste_id = generate_alias(len(payload.get("text"))) - success = sqlite_helpers.insert_paste(DATABASE_FILE, paste_id, payload.get('title', 'Untitled Paste')) + success = sqlite_helpers.insert_paste( + DATABASE_FILE, paste_id, payload.get("title", "Untitled Paste") + ) if not success: raise HTTPException( status_code=HttpResponse.INTERNAL_SERVER_ERROR, - detail="Failed to save paste metadata." + detail="Failed to save paste metadata.", ) paste_path = PASTES_DIR / str(paste_id) paste_path.write_bytes(text_bytes) - return { - "id": paste_id, - "size_bytes": len(text_bytes) - } + return {"id": paste_id, "size_bytes": len(text_bytes)} @app.get("/paste/{paste_id}") @@ -216,7 +222,7 @@ async def view_paste(paste_id: str): paste_title = sqlite_helpers.get_paste(DATABASE_FILE, paste_id) return HTMLResponse( - f""" + f""" {paste_title} @@ -224,28 +230,31 @@ async def view_paste(paste_id: str):
{paste_path.read_text(encoding="utf-8")}
-""") +""" + ) + -@app.get("/qr/{alias}") +@app.get("/qr/{alias}") async def qr(alias: str): logging.debug(f"/qr code generation called with alias: {alias}") with MetricsHandler.query_time.labels("qr").time(): maybe_image_data = qr_code_cache.find(alias) if maybe_image_data is not None: return FileResponse( - maybe_image_data, - media_type='image/jpeg', + maybe_image_data, + media_type="image/jpeg", ) - + url_output = sqlite_helpers.get_url(DATABASE_FILE, alias) if url_output is None: raise HTTPException(status_code=HttpResponse.NOT_FOUND.code) image_data = qr_code_cache.add(alias) return FileResponse( image_data, - media_type='image/jpeg', + media_type="image/jpeg", ) + @app.exception_handler(HTTPException) async def http_exception_handler(request, exc): if exc.status_code not in http_code_to_enum: @@ -259,8 +268,7 @@ async def http_exception_handler(request, exc): original_url = request.headers.get("x-original-url", request.url) base_url = request.headers.get("x-base-url", request.base_url) content = content.format( - requested_url=str(original_url), - base_url=str(base_url) + requested_url=str(original_url), base_url=str(base_url) ) if status_code_enum == HttpResponse.REQUEST_TOO_LARGE: request_size = "Unknown" @@ -274,9 +282,7 @@ async def http_exception_handler(request, exc): request_size=request_size, max_size=MAX_PASTE_SIZE_BYTES, ) - return HTMLResponse( - content=content, status_code=status_code_enum.code - ) + return HTMLResponse(content=content, status_code=status_code_enum.code) @app.get("/metrics") @@ -286,14 +292,16 @@ def get_metrics(): content=prometheus_client.generate_latest(), ) + # write qr-codes to json file on shutdown if cache state file arg is specified @app.on_event("shutdown") def signal_handler(): if args.qr_code_cache_state_file is None: return qr_code_cache.clear() - + qr_code_cache.write_cache_state() + logging.Formatter.converter = time.gmtime logging.basicConfig( From e7f22f55bd70d349f2743f3a91b32e398fec1463 Mon Sep 17 00:00:00 2001 From: evan Date: Fri, 28 Aug 2026 08:49:39 -0700 Subject: [PATCH 3/3] yeah --- sqlite-revisited/server.py | 74 -------------------------------------- sqlite-revisited/sqlite.py | 12 ------- 2 files changed, 86 deletions(-) delete mode 100644 sqlite-revisited/server.py delete mode 100644 sqlite-revisited/sqlite.py diff --git a/sqlite-revisited/server.py b/sqlite-revisited/server.py deleted file mode 100644 index 8321a43..0000000 --- a/sqlite-revisited/server.py +++ /dev/null @@ -1,74 +0,0 @@ -from fastapi import FastAPI -import sqlite3 -import uuid - -app = FastAPI() -DATABASE = "pastes.db" - -def database_setup(): - connection = sqlite3.connect(DATABASE) - cursor = connection.cursor() - - cursor.execute("""CREATE TABLE IF NOT EXISTS pastes (name TEXT, filename TEXT)""") - - connection.commit() - connection.close() - -database_setup() - -@app.get("/paste/list") -def pastes_list(): - connection = sqlite3.connect(DATABASE) - cursor = connection.cursor() - - cursor.execute("SELECT * FROM pastes") - rows = cursor.fetchall() - - connection.close() - - return rows - -@app.post("/paste/create") -def create_paste(data: dict): - name = data["name"] - content = data["content"] - - connection = sqlite3.connect(DATABASE) - cursor = connection.cursor() - - filename = str(uuid.uuid4()) + ".txt" - - with open(filename, "w") as file: - file.write(content) - - cursor.execute("INSERT INTO pastes (name, filename) VALUES (?, ?)", - (name, filename) -) - - connection.commit() - connection.close() - - return {"name": name, "content": content} - -@app.get("/paste/view/{name}") -def check_paste_exist(name: str): - connection = sqlite3.connect(DATABASE) - cursor = connection.cursor() - - cursor.execute("SELECT filename FROM pastes WHERE name = ?", - (name,) -) - paste = cursor.fetchone() - - connection.close() - - if paste: - filename = paste[0] - - with open(filename, "r") as file: - content = file.read() - - return content - - return "no!" - diff --git a/sqlite-revisited/sqlite.py b/sqlite-revisited/sqlite.py deleted file mode 100644 index c02d941..0000000 --- a/sqlite-revisited/sqlite.py +++ /dev/null @@ -1,12 +0,0 @@ -import sqlite3 - -connection = sqlite3.connect("pastes.db") -cursor = connection.cursor() - -cursor.execute("SELECT * FROM pastes") - -rows = cursor.fetchall() - -print(rows) - -connection.close()