Compare commits

..

1 commit

Author SHA1 Message Date
Yael Monterrubio
90c2f4dc94
Merge 25dafcc24b into e8249154d9 2026-04-25 02:41:38 -07:00
9 changed files with 14 additions and 53 deletions

View file

@ -30,14 +30,5 @@ export async function POST(request: NextRequest) {
return rateLimit.sendResponse({ error: "Failed to update description" }, 500); return rateLimit.sendResponse({ error: "Failed to update description" }, 500);
} }
// Tell Cloudflare to purge cache
fetch(`https://api.cloudflare.com/client/v4/zones/${process.env.CLOUDFLARE_ZONE_ID}/purge_cache`, {
method: "POST",
headers: { Authorization: `Bearer ${process.env.CLOUDFLARE_API_TOKEN}`, "Content-Type": "application/json" },
body: JSON.stringify({
files: [`${process.env.NEXT_PUBLIC_BASE_URL}/api/profile/${session.user?.id}/info`],
}),
});
return rateLimit.sendResponse({ success: true }); return rateLimit.sendResponse({ success: true });
} }

View file

@ -33,14 +33,5 @@ export async function POST(request: NextRequest) {
return rateLimit.sendResponse({ error: "Failed to update name" }, 500); return rateLimit.sendResponse({ error: "Failed to update name" }, 500);
} }
// Tell Cloudflare to purge cache
fetch(`https://api.cloudflare.com/client/v4/zones/${process.env.CLOUDFLARE_ZONE_ID}/purge_cache`, {
method: "POST",
headers: { Authorization: `Bearer ${process.env.CLOUDFLARE_API_TOKEN}`, "Content-Type": "application/json" },
body: JSON.stringify({
files: [`${process.env.NEXT_PUBLIC_BASE_URL}/api/profile/${session.user.id}/info`],
}),
});
return rateLimit.sendResponse({ success: true }); return rateLimit.sendResponse({ success: true });
} }

View file

@ -81,17 +81,5 @@ export async function POST(request: NextRequest) {
return rateLimit.sendResponse({ error: "Failed to update profile picture" }, 500); return rateLimit.sendResponse({ error: "Failed to update profile picture" }, 500);
} }
// Tell Cloudflare to purge cache
fetch(`https://api.cloudflare.com/client/v4/zones/${process.env.CLOUDFLARE_ZONE_ID}/purge_cache`, {
method: "POST",
headers: { Authorization: `Bearer ${process.env.CLOUDFLARE_API_TOKEN}`, "Content-Type": "application/json" },
body: JSON.stringify({
files: [
`${process.env.NEXT_PUBLIC_BASE_URL}/api/profile/${session.user?.id}/info`,
`${process.env.NEXT_PUBLIC_BASE_URL}/profile/${session.user?.id}/picture`,
],
}),
});
return rateLimit.sendResponse({ success: true }); return rateLimit.sendResponse({ success: true });
} }

View file

@ -156,8 +156,6 @@ export async function POST(request: NextRequest, { params }: { params: Promise<{
if (quarantined && needsFixingReason && session.user?.id?.toString() !== process.env.NEXT_PUBLIC_ADMIN_USER_ID) if (quarantined && needsFixingReason && session.user?.id?.toString() !== process.env.NEXT_PUBLIC_ADMIN_USER_ID)
return rateLimit.sendResponse({ error: `You're not an admin!` }, 401); return rateLimit.sendResponse({ error: `You're not an admin!` }, 401);
const clearImages = formData.get("clearImages") === "true";
// Edit Mii in database // Edit Mii in database
const updateData: Prisma.MiiUpdateInput = {}; const updateData: Prisma.MiiUpdateInput = {};
if (name !== undefined) updateData.name = profanity.censor(name); // Censor potentially inappropriate words if (name !== undefined) updateData.name = profanity.censor(name); // Censor potentially inappropriate words
@ -170,9 +168,8 @@ export async function POST(request: NextRequest, { params }: { params: Promise<{
if (youtubeId !== undefined) updateData.youtubeId = youtubeId; if (youtubeId !== undefined) updateData.youtubeId = youtubeId;
if (instructions !== undefined) updateData.instructions = instructions; if (instructions !== undefined) updateData.instructions = instructions;
if (customImages.length > 0) updateData.imageCount = customImages.length; if (customImages.length > 0) updateData.imageCount = customImages.length;
else if (clearImages) updateData.imageCount = 0;
const imagesChanged = customImages.length > 0 || clearImages || miiPortraitImage || miiFeaturesImage; const imagesChanged = customImages.length > 0 || miiPortraitImage || miiFeaturesImage;
if (settings.queueEnabled && imagesChanged) updateData.in_queue = true; if (settings.queueEnabled && imagesChanged) updateData.in_queue = true;
if (Object.keys(updateData).length === 0) return rateLimit.sendResponse({ error: "Nothing was changed" }, 400); if (Object.keys(updateData).length === 0) return rateLimit.sendResponse({ error: "Nothing was changed" }, 400);
@ -195,7 +192,7 @@ export async function POST(request: NextRequest, { params }: { params: Promise<{
await fs.mkdir(miiUploadsDirectory, { recursive: true }); await fs.mkdir(miiUploadsDirectory, { recursive: true });
// Only touch files if new images were uploaded // Only touch files if new images were uploaded
if (customImages.length > 0 || clearImages) { if (customImages.length > 0) {
// Delete all custom images // Delete all custom images
const files = await fs.readdir(miiUploadsDirectory); const files = await fs.readdir(miiUploadsDirectory);
await Promise.all(files.filter((file) => file.startsWith("image")).map((file) => fs.unlink(path.join(miiUploadsDirectory, file)))); await Promise.all(files.filter((file) => file.startsWith("image")).map((file) => fs.unlink(path.join(miiUploadsDirectory, file))));
@ -269,12 +266,9 @@ export async function POST(request: NextRequest, { params }: { params: Promise<{
headers: { Authorization: `Bearer ${process.env.CLOUDFLARE_API_TOKEN}`, "Content-Type": "application/json" }, headers: { Authorization: `Bearer ${process.env.CLOUDFLARE_API_TOKEN}`, "Content-Type": "application/json" },
body: JSON.stringify({ body: JSON.stringify({
files: [ files: [
`${process.env.NEXT_PUBLIC_BASE_URL}/api/mii/${miiId}/info`, `${process.env.NEXT_PUBLIC_BASE_URL}/mii/${miiId}`,
`${process.env.NEXT_PUBLIC_BASE_URL}/mii/${miiId}/image?type=mii`, `${process.env.NEXT_PUBLIC_BASE_URL}/mii/${miiId}/image?type=mii`,
`${process.env.NEXT_PUBLIC_BASE_URL}/mii/${miiId}/image?type=features`, `${process.env.NEXT_PUBLIC_BASE_URL}/mii/${miiId}/image?type=features`,
`${process.env.NEXT_PUBLIC_BASE_URL}/mii/${miiId}/image?type=image0`,
`${process.env.NEXT_PUBLIC_BASE_URL}/mii/${miiId}/image?type=image1`,
`${process.env.NEXT_PUBLIC_BASE_URL}/mii/${miiId}/image?type=image2`,
], ],
}), }),
}).catch((err) => { }).catch((err) => {

View file

@ -9,7 +9,7 @@ export default async function RandomPage() {
const randomIndex = Math.floor(Math.random() * count); const randomIndex = Math.floor(Math.random() * count);
const randomMii = await prisma.mii.findFirst({ const randomMii = await prisma.mii.findFirst({
where: { in_queue: false, quarantined: false, needsFixing: null }, where: { in_queue: false, quarantined: false, needsFixing: { not: null } },
skip: randomIndex, skip: randomIndex,
take: 1, take: 1,
select: { id: true }, select: { id: true },

View file

@ -69,13 +69,7 @@ export default function Header() {
data-tooltip="Your Profile" data-tooltip="Your Profile"
> >
<img <img
src={ src={$session.user.image.startsWith("/profile") ? `${import.meta.env.VITE_API_URL}${$session.user.image}` : $session.user.image}
$session?.user?.image
? $session.user.image.startsWith("/profile")
? `${import.meta.env.VITE_API_URL}${$session.user.image}`
: $session.user.image
: "/guest.png"
}
onError={(e) => { onError={(e) => {
e.currentTarget.onerror = null; // Prevent infinite loops e.currentTarget.onerror = null; // Prevent infinite loops
e.currentTarget.src = "/guest.png"; e.currentTarget.src = "/guest.png";

View file

@ -87,9 +87,10 @@ export default function EditMiiPage() {
formData.append("instructions", JSON.stringify(instructions.current)); formData.append("instructions", JSON.stringify(instructions.current));
if (hasCustomImagesChanged.current) { if (hasCustomImagesChanged.current) {
// image1, image2, etc. files.forEach((file, index) => {
files.forEach((file, index) => formData.append(`image${index + 1}`, file)); // image1, image2, etc.
if (files.length === 0) formData.append("clearImages", "true"); formData.append(`image${index + 1}`, file);
});
} }
// Switch pictures // Switch pictures

View file

@ -51,7 +51,9 @@ export default function ProfileLayout() {
const joinDate = new Date(user.createdAt).toLocaleDateString("en-US", { month: "long", year: "numeric" }); const joinDate = new Date(user.createdAt).toLocaleDateString("en-US", { month: "long", year: "numeric" });
const metaTitle = `${user.name} - TomodachiShare`; const metaTitle = `${user.name} - TomodachiShare`;
const metaDescription = `View ${user.name}'s profile on TomodachiShare. Creator of ${user._count.miis} Miis. Member since ${joinDate}.`; const metaDescription = `View ${user.name}'s profile on TomodachiShare. Creator of ${user._count.miis} Miis. Member since ${joinDate}.`;
const metaImage = user.image ? (user.image.startsWith("/profile") ? `${import.meta.env.VITE_API_URL}${user.image}` : user.image) : "/guest.png"; const metaImage = user.image.startsWith("/profile")
? `${import.meta.env.VITE_API_URL}${user.image}`
: (user.image ?? `${import.meta.env.VITE_API_URL}/guest.png`);
return ( return (
<div> <div>
@ -79,7 +81,7 @@ export default function ProfileLayout() {
{/* Profile picture */} {/* Profile picture */}
<Link to={`/profile/${user.id}`} className="size-28 aspect-square"> <Link to={`/profile/${user.id}`} className="size-28 aspect-square">
<img <img
src={user.image ? (user.image.startsWith("/profile") ? `${import.meta.env.VITE_API_URL}${user.image}` : user.image) : "/guest.png"} src={user.image.startsWith("/profile") ? `${import.meta.env.VITE_API_URL}${user.image}` : user.image}
onError={(e) => { onError={(e) => {
e.currentTarget.onerror = null; // Prevent infinite loops e.currentTarget.onerror = null; // Prevent infinite loops
e.currentTarget.src = "/guest.png"; e.currentTarget.src = "/guest.png";

View file

@ -65,7 +65,7 @@ export default function ReportUserPage() {
<div className="bg-orange-100 rounded-xl border-2 border-orange-400 flex p-4 gap-4"> <div className="bg-orange-100 rounded-xl border-2 border-orange-400 flex p-4 gap-4">
<img <img
src={user.image ? (user.image.startsWith("/profile") ? `${import.meta.env.VITE_API_URL}${user.image}` : user.image) : "/guest.png"} src={user.image.startsWith("/profile") ? `${import.meta.env.VITE_API_URL}${user.image}` : user.image}
onError={(e) => { onError={(e) => {
e.currentTarget.onerror = null; // Prevent infinite loops e.currentTarget.onerror = null; // Prevent infinite loops
e.currentTarget.src = "/guest.png"; e.currentTarget.src = "/guest.png";