From 802b755d29e9c4e36868a92b4588d3d644124ed6 Mon Sep 17 00:00:00 2001 From: Radiquum Date: Mon, 5 May 2025 20:46:49 +0500 Subject: [PATCH] refactor: api routes --- gui/api/ENDPOINTS.ts | 43 +++++++++++++++++++++++++++-------- gui/app/pack/new/page.tsx | 6 ++--- src/api/__init__.py | 4 +++- src/api/pack.py | 48 ++++++++------------------------------- src/api/packs.py | 41 +++++++++++++++++++++++++++++++++ src/main.py | 8 +++++-- 6 files changed, 95 insertions(+), 55 deletions(-) create mode 100644 src/api/packs.py diff --git a/gui/api/ENDPOINTS.ts b/gui/api/ENDPOINTS.ts index f17e920..c6df4e5 100644 --- a/gui/api/ENDPOINTS.ts +++ b/gui/api/ENDPOINTS.ts @@ -1,22 +1,45 @@ const API = process.env.NEXT_PUBLIC_API_URL || "/api"; -export const ENDPOINTS = { - createPack: `${API}/pack/new`, - getAllPacks: `${API}/pack/all`, -}; - -type PACK_IMG_ENDPOINTS = { +type _PACK_ENDPOINT = { + getPack: string; getPackImage: string; editPackImage: string; }; -export const PACK_IMG_ENDPOINTS = function ( - endpoint: keyof PACK_IMG_ENDPOINTS, - id: string -) { +type _PACKS_ENDPOINT = { + getPacks: string; + createPack: string; + deletePack: string; +}; + +export const PACK_ENDPOINT = (endpoint: keyof _PACK_ENDPOINT, id: string) => { + if (!id) { + console.error(`ENDPOINT "${endpoint}" REQUIRES A PACK ID`); + return ""; + } + const _endpoints = { + getPack: `${API}/pack/${id}`, getPackImage: `${API}/pack/${id}/image`, editPackImage: `${API}/pack/${id}/image/edit`, }; return _endpoints[endpoint]; }; + +export const PACKS_ENDPOINT = ( + endpoint: keyof _PACKS_ENDPOINT, + id?: string | null +) => { + const requireID: string[] = ["deletePack"]; + if (requireID.includes(endpoint) && !id) { + console.error(`ENDPOINT "${endpoint}" REQUIRES A PACK ID`); + return ""; + } + + const _endpoints = { + getPacks: `${API}/packs/all`, + createPack: `${API}/packs/new`, + deletePack: `${API}/packs/${id}/delete`, + }; + return _endpoints[endpoint]; +}; diff --git a/gui/app/pack/new/page.tsx b/gui/app/pack/new/page.tsx index f1e2b21..3a741a9 100644 --- a/gui/app/pack/new/page.tsx +++ b/gui/app/pack/new/page.tsx @@ -8,7 +8,7 @@ import { Button } from "flowbite-react"; import { useRouter } from "next/navigation"; import mc from "../../../api/mc_version.json"; -import { ENDPOINTS, PACK_IMG_ENDPOINTS } from "@/api/ENDPOINTS"; +import { PACKS_ENDPOINT, PACK_ENDPOINT } from "@/api/ENDPOINTS"; import { toast } from "react-toastify"; const mcr = mc.reverse(); @@ -52,7 +52,7 @@ export default function PackNew() { async function _submit() { const tid = toast.loading(`Creating Pack "${packInfo.title}"`) - const res = await fetch(`${ENDPOINTS.createPack}`, { + const res = await fetch(PACKS_ENDPOINT("createPack"), { method: "POST", body: JSON.stringify(packInfo), headers: { @@ -68,7 +68,7 @@ export default function PackNew() { } if (image) { - await fetch(`${PACK_IMG_ENDPOINTS("editPackImage", data.id)}`, { + await fetch(`${PACK_ENDPOINT("editPackImage", data.id)}`, { method: "POST", body: JSON.stringify({ image: image, diff --git a/src/api/__init__.py b/src/api/__init__.py index 09ebb9d..193cde3 100644 --- a/src/api/__init__.py +++ b/src/api/__init__.py @@ -1,5 +1,7 @@ from flask import Blueprint -api = Blueprint("api", __name__, url_prefix="/api/pack") +apiPack = Blueprint("pack", __name__, url_prefix="/api/pack") +apiPacks = Blueprint("packs", __name__, url_prefix="/api/packs") from . import pack +from . import packs diff --git a/src/api/pack.py b/src/api/pack.py index b2836fc..ef4174b 100644 --- a/src/api/pack.py +++ b/src/api/pack.py @@ -1,53 +1,23 @@ import os import re -from . import api -from flask import request, jsonify +from . import apiPack +from flask import request, jsonify, send_file, redirect from config import PACKS_FOLDER, IMG_ALLOWED_MIME -import json from PIL import Image from io import BytesIO import base64 -@api.route("/new", methods=["POST"]) -def APIPackNew(): - pack = { - "formatVersion": 0, - "modpackVersion": 0, - "title": request.json.get("title"), - "author": request.json.get("author"), - "version": request.json.get("version"), - "modloader": request.json.get("modloader"), - "updateURL": "", - "mods": [], - } - title = pack.get("title").replace(" ", "_") +@apiPack.route("//image", methods=["GET"]) +def getPackImage(id): + if not os.path.exists(f"{PACKS_FOLDER}/{id}/packicon.png"): + return redirect("/favicon.ico") - if os.path.exists(f"{PACKS_FOLDER}/{title}"): - return jsonify({"status": "error", "message": "pack already exists"}) - - os.makedirs(f"{PACKS_FOLDER}/{title}", exist_ok=True) - - with open( - os.path.abspath(f"{PACKS_FOLDER}/{title}/packfile.json"), - mode="w", - encoding="utf-8", - ) as fp: - json.dump(pack, fp) - fp.close() - - return jsonify( - { - "status": "ok", - "message": f"pack {pack.get('title')} created", - "id": title, - } - ) + return send_file(f"{PACKS_FOLDER}/{id}/packicon.png") -@api.route("//image/edit", methods=["POST"]) -def APIPackImageEdit(id): - +@apiPack.route("//image/edit", methods=["POST"]) +def editPackImage(id): image_string = request.json.get("image") image_mime = request.json.get("mimetype") if image_string == None: diff --git a/src/api/packs.py b/src/api/packs.py new file mode 100644 index 0000000..590befd --- /dev/null +++ b/src/api/packs.py @@ -0,0 +1,41 @@ +import os +from . import apiPacks +from flask import request, jsonify +from config import PACKS_FOLDER +import json + + +@apiPacks.route("/new", methods=["POST"]) +def createPack(): + pack = { + "formatVersion": 0, + "modpackVersion": 0, + "title": request.json.get("title"), + "author": request.json.get("author"), + "version": request.json.get("version"), + "modloader": request.json.get("modloader"), + "updateURL": "", + "mods": [], + } + title = pack.get("title").replace(" ", "_") + + if os.path.exists(f"{PACKS_FOLDER}/{title}"): + return jsonify({"status": "error", "message": "pack already exists"}) + + os.makedirs(f"{PACKS_FOLDER}/{title}", exist_ok=True) + + with open( + os.path.abspath(f"{PACKS_FOLDER}/{title}/packfile.json"), + mode="w", + encoding="utf-8", + ) as fp: + json.dump(pack, fp) + fp.close() + + return jsonify( + { + "status": "ok", + "message": f"pack {pack.get('title')} created", + "id": title, + } + ) diff --git a/src/main.py b/src/main.py index 032d101..6e8cb3e 100644 --- a/src/main.py +++ b/src/main.py @@ -5,7 +5,8 @@ import os import sys -from api import api +from api import apiPack +from api import apiPacks def resource_path(relative_path): @@ -21,7 +22,10 @@ app = Flask( ) -app.register_blueprint(api) +app.register_blueprint(apiPack) +app.register_blueprint(apiPacks) + + if os.getenv("is_dev") == "True": from flask_cors import CORS