From a09b3cb56debd69e245548a796581112c597867e Mon Sep 17 00:00:00 2001 From: trafficlunar Date: Fri, 31 Oct 2025 14:39:39 +0000 Subject: [PATCH] feat: improve mii metadata images --- src/app/api/mii/[id]/edit/route.ts | 18 +++++++++--------- src/app/api/report/route.ts | 13 ++++++++++--- src/app/api/submit/route.ts | 2 +- src/app/mii/[id]/image/route.ts | 16 ++++++++++++---- src/lib/images.tsx | 25 ++++++++++++++++--------- src/types.d.ts | 10 ---------- 6 files changed, 48 insertions(+), 36 deletions(-) diff --git a/src/app/api/mii/[id]/edit/route.ts b/src/app/api/mii/[id]/edit/route.ts index 6e42dc8..0e26890 100644 --- a/src/app/api/mii/[id]/edit/route.ts +++ b/src/app/api/mii/[id]/edit/route.ts @@ -44,13 +44,6 @@ export async function PATCH(request: NextRequest, { params }: { params: Promise< where: { id: miiId, }, - include: { - user: { - select: { - username: true, - }, - }, - }, }); if (!mii) return rateLimit.sendResponse({ error: "Mii not found" }, 404); @@ -102,11 +95,18 @@ export async function PATCH(request: NextRequest, { params }: { params: Promise< if (images.length > 0) updateData.imageCount = images.length; if (Object.keys(updateData).length == 0) return rateLimit.sendResponse({ error: "Nothing was changed" }, 400); - await prisma.mii.update({ + const updatedMii = await prisma.mii.update({ where: { id: miiId, }, data: updateData, + include: { + user: { + select: { + name: true, + }, + }, + }, }); // Only touch files if new images were uploaded @@ -136,7 +136,7 @@ export async function PATCH(request: NextRequest, { params }: { params: Promise< } } else if (description === undefined) { // If images or description were not changed, regenerate the metadata image - await generateMetadataImage(mii, mii.user.username!); + await generateMetadataImage(updatedMii, updatedMii.user.name!); } return rateLimit.sendResponse({ success: true }); diff --git a/src/app/api/report/route.ts b/src/app/api/report/route.ts index 7f065d0..f3249a1 100644 --- a/src/app/api/report/route.ts +++ b/src/app/api/report/route.ts @@ -1,11 +1,10 @@ import { NextRequest, NextResponse } from "next/server"; import { z } from "zod"; -import { ReportReason, ReportType } from "@prisma/client"; +import { Prisma, ReportReason, ReportType } from "@prisma/client"; import { auth } from "@/lib/auth"; import { prisma } from "@/lib/prisma"; import { RateLimit } from "@/lib/rate-limit"; -import { MiiWithUsername } from "@/types"; const reportSchema = z.object({ id: z.coerce.number({ error: "ID must be a number" }).int({ error: "ID must be an integer" }).positive({ error: "ID must be valid" }), @@ -30,7 +29,15 @@ export async function POST(request: NextRequest) { if (!parsed.success) return rateLimit.sendResponse({ error: parsed.error.issues[0].message }, 400); const { id, type, reason, notes } = parsed.data; - let mii: MiiWithUsername | null = null; + let mii: Prisma.MiiGetPayload<{ + include: { + user: { + select: { + username: true; + }; + }; + }; + }> | null = null; // Check if the Mii or User exists if (type === "mii") { diff --git a/src/app/api/submit/route.ts b/src/app/api/submit/route.ts index fa611ed..039832c 100644 --- a/src/app/api/submit/route.ts +++ b/src/app/api/submit/route.ts @@ -160,7 +160,7 @@ export async function POST(request: NextRequest) { const codeFileLocation = path.join(miiUploadsDirectory, "qr-code.webp"); await fs.writeFile(codeFileLocation, codeWebpBuffer); - await generateMetadataImage(miiRecord, session.user.username!); + await generateMetadataImage(miiRecord, session.user.name!); } catch (error) { // Clean up if something went wrong await prisma.mii.delete({ where: { id: miiRecord.id } }); diff --git a/src/app/mii/[id]/image/route.ts b/src/app/mii/[id]/image/route.ts index 5fa4526..50e23df 100644 --- a/src/app/mii/[id]/image/route.ts +++ b/src/app/mii/[id]/image/route.ts @@ -1,4 +1,5 @@ import { NextRequest } from "next/server"; +import { Prisma } from "@prisma/client"; import fs from "fs/promises"; import path from "path"; @@ -8,7 +9,6 @@ import { idSchema } from "@/lib/schemas"; import { RateLimit } from "@/lib/rate-limit"; import { generateMetadataImage } from "@/lib/images"; import { prisma } from "@/lib/prisma"; -import { MiiWithUsername } from "@/types"; const searchParamsSchema = z.object({ type: z @@ -37,7 +37,15 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{ let buffer: Buffer | undefined; // Only find Mii if image type is 'metadata' - let mii: MiiWithUsername | null = null; + let mii: Prisma.MiiGetPayload<{ + include: { + user: { + select: { + name: true; + }; + }; + }; + }> | null = null; if (imageType === "metadata") { mii = await prisma.mii.findUnique({ @@ -47,7 +55,7 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{ include: { user: { select: { - username: true, + name: true, }, }, }, @@ -66,7 +74,7 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{ if (imageType === "metadata" && mii) { // Metadata images were added after 1274 Miis were submitted, so we generate it on-the-fly console.log(`Metadata image not found for mii ID ${miiId}, generating metadata image...`); - const { buffer: metadataBuffer, error, status } = await generateMetadataImage(mii, mii.user.username!); + const { buffer: metadataBuffer, error, status } = await generateMetadataImage(mii, mii.user.name!); if (error) { return rateLimit.sendResponse({ error }, status); diff --git a/src/lib/images.tsx b/src/lib/images.tsx index 7ee2b25..2e0fee8 100644 --- a/src/lib/images.tsx +++ b/src/lib/images.tsx @@ -162,22 +162,29 @@ export async function generateMetadataImage(mii: Mii, author: string): Promise<{ {mii.name} {/* Tags */} -
- {mii.tags.map((tag) => ( - - {tag} - - ))} +
+
+ {mii.tags.map((tag) => ( + + {tag} + + ))} +
+ +
{/* Author */} -
- By: @{author} +
+ By{" "} + + {author} +
{/* Watermark */}
- + {/* I tried using text-orange-400 but it wasn't correct..? */} TomodachiShare diff --git a/src/types.d.ts b/src/types.d.ts index c00b6a1..6e6497e 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -12,13 +12,3 @@ declare module "next-auth" { username?: string; } } - -type MiiWithUsername = Prisma.MiiGetPayload<{ - include: { - user: { - select: { - username: true; - }; - }; - }; -}>;