api: use zod for request schema validation

This commit is contained in:
dumbmoron
2024-08-08 16:34:54 +00:00
parent b510cbf9e0
commit f32f624916
7 changed files with 62 additions and 70 deletions

View File

@@ -1,26 +1,7 @@
import ipaddr from "ipaddr.js";
import { normalizeURL } from "./url.js";
import { createStream } from "../stream/manage.js";
import { verifyLanguageCode } from "../misc/utils.js";
const apiRequest = {
option: {
audioFormat: ["best", "mp3", "ogg", "wav", "opus"],
downloadMode: ["auto", "audio", "mute"],
filenameStyle: ["classic", "pretty", "basic", "nerdy"],
videoQuality: ["max", "4320", "2160", "1440", "1080", "720", "480", "360", "240", "144"],
youtubeVideoCodec: ["h264", "av1", "vp9"],
},
boolean: [
"disableMetadata",
"tiktokFullAudio",
"tiktokH265",
"twitterGif",
"youtubeDubBrowserLang",
"youtubeDubLang"
]
}
import { apiSchema } from "./schema.js";
export function createResponse(responseType, responseData) {
const internalError = (code) => {
@@ -91,49 +72,7 @@ export function createResponse(responseType, responseData) {
}
export function normalizeRequest(request) {
try {
let template = {
audioFormat: "mp3",
url: normalizeURL(decodeURIComponent(request.url)),
youtubeVideoCodec: "h264",
videoQuality: "720",
filenameStyle: "classic",
downloadMode: "auto",
tiktokFullAudio: false,
disableMetadata: false,
youtubeDubBrowserLang: false,
youtubeDubLang: false,
twitterGif: false,
tiktokH265: false
}
const requestKeys = Object.keys(request);
const templateKeys = Object.keys(template);
if (requestKeys.length > templateKeys.length + 1 || !request.url) {
return false;
}
for (const i in requestKeys) {
const key = requestKeys[i];
const item = request[key];
if (String(key) !== "url" && templateKeys.includes(key)) {
if (apiRequest.boolean.includes(key)) {
template[key] = !!item;
} else if (apiRequest.option[key] && apiRequest.option[key].includes(item)) {
template[key] = String(item)
}
}
}
if (template.youtubeDubBrowserLang)
template.youtubeDubLang = verifyLanguageCode(request.youtubeDubLang);
return template
} catch {
return false
}
return apiSchema.safeParseAsync(request).catch(() => ({ success: false }));
}
export function getIP(req) {