refactor: api routes

This commit is contained in:
Kentai Radiquum 2025-05-05 20:46:49 +05:00
parent c74170a14d
commit 802b755d29
Signed by: Radiquum
GPG key ID: 858E8EE696525EED
6 changed files with 95 additions and 55 deletions

View file

@ -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];
};

View file

@ -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,

View file

@ -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

View file

@ -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("/<id>/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("/<id>/image/edit", methods=["POST"])
def APIPackImageEdit(id):
@apiPack.route("/<id>/image/edit", methods=["POST"])
def editPackImage(id):
image_string = request.json.get("image")
image_mime = request.json.get("mimetype")
if image_string == None:

41
src/api/packs.py Normal file
View file

@ -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,
}
)

View file

@ -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