From 975d55bd19b329b1042458cf9192678fadeb46f1 Mon Sep 17 00:00:00 2001 From: trafficlunar Date: Thu, 2 Apr 2026 13:46:12 +0100 Subject: [PATCH] feat: add miis with alleged inappropriate images to queue --- src/app/api/submit/route.ts | 13 ++++++------- src/app/mii/[id]/page.tsx | 12 +++++++++++- src/lib/images.tsx | 7 ------- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/app/api/submit/route.ts b/src/app/api/submit/route.ts index 1bd95aa..1737cd8 100644 --- a/src/app/api/submit/route.ts +++ b/src/app/api/submit/route.ts @@ -153,6 +153,7 @@ export async function POST(request: NextRequest) { const description = uncensoredDescription && profanity.censor(uncensoredDescription); // Validate image files + let wasImagesModerated = false; const customImages: File[] = []; for (const img of [image1, image2, image3]) { @@ -162,7 +163,7 @@ export async function POST(request: NextRequest) { if (imageValidation.valid) { customImages.push(img); } else { - return rateLimit.sendResponse({ error: `Failed to verify custom image: ${imageValidation.error}` }, imageValidation.status ?? 400); + wasImagesModerated = true; } } @@ -170,10 +171,8 @@ export async function POST(request: NextRequest) { if (platform === "SWITCH") { const portraitValidation = await validateImage(miiPortraitImage); const featuresValidation = await validateImage(miiFeaturesImage); - if (!portraitValidation.valid) - return rateLimit.sendResponse({ error: `Failed to verify portrait: ${portraitValidation.error}` }, portraitValidation.status ?? 400); - if (!featuresValidation.valid) - return rateLimit.sendResponse({ error: `Failed to verify features: ${featuresValidation.error}` }, featuresValidation.status ?? 400); + if (!portraitValidation.valid) wasImagesModerated = true; + if (!featuresValidation.valid) wasImagesModerated = true; } const qrBytes = new Uint8Array(qrBytesRaw ?? []); @@ -198,7 +197,7 @@ export async function POST(request: NextRequest) { tags, description, gender: gender ?? "MALE", - in_queue: settings.queueEnabled, + in_queue: wasImagesModerated || settings.queueEnabled, // Automatically detect certain information if on 3DS ...(platform === "THREE_DS" @@ -335,5 +334,5 @@ export async function POST(request: NextRequest) { return rateLimit.sendResponse({ error: "Failed to store user images" }, 500); } - return rateLimit.sendResponse({ success: true, id: miiRecord.id }); + return rateLimit.sendResponse({ success: true, id: miiRecord.id, inQueue: wasImagesModerated }); } diff --git a/src/app/mii/[id]/page.tsx b/src/app/mii/[id]/page.tsx index 491944b..1f45b45 100644 --- a/src/app/mii/[id]/page.tsx +++ b/src/app/mii/[id]/page.tsx @@ -19,6 +19,7 @@ import Description from "@/components/description"; import MiiInstructions from "@/components/mii/instructions"; import { SwitchMiiInstructions } from "@/types"; +import { settings } from "@/lib/settings"; interface Props { params: Promise<{ id: string }>; @@ -128,6 +129,15 @@ export default async function MiiPage({ params }: Props) {

This Mii is flagged as controversial and only appears when the filter is enabled

)} + {mii.in_queue && ( +
+ +

+ This Mii is waiting to be manually reviewed {!settings.queueEnabled && "due to inappropriate images "} + and is hidden from the main page. +

+
+ )}
{/* Mii Image */} @@ -335,7 +345,7 @@ export default async function MiiPage({ params }: Props) { {/* Author and Created date */}
- + By {mii.user.name}

diff --git a/src/lib/images.tsx b/src/lib/images.tsx index 949425d..8f351a6 100644 --- a/src/lib/images.tsx +++ b/src/lib/images.tsx @@ -60,13 +60,6 @@ export async function validateImage(file: File): Promise<{ valid: boolean; error formData.append("image", blob); const moderationResponse = await fetch("https://api.trafficlunar.net/moderate/image", { method: "POST", body: formData }); - - if (!moderationResponse.ok) { - console.error("Moderation API error"); - Sentry.captureException("Moderation API error", { extra: { stage: "moderation-api-response", status: moderationResponse.status } }); - return { valid: false, error: "Content moderation check failed", status: 500 }; - } - const result = await moderationResponse.json(); if (result.error) { return { valid: false, error: result.error };