From aa600b666ae733de8662f1c15cfcaebaa13dca06 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Fri, 1 Mar 2024 04:17:12 -0800 Subject: feat(badges): migrate category mode --- src/lib/Database/userBadges.ts | 7 ++++ src/routes/api/badges/+server.ts | 11 ++++- src/routes/user/[user]/badges/+page.svelte | 67 ++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) diff --git a/src/lib/Database/userBadges.ts b/src/lib/Database/userBadges.ts index 1f4b5b5b..4ee47685 100644 --- a/src/lib/Database/userBadges.ts +++ b/src/lib/Database/userBadges.ts @@ -68,3 +68,10 @@ export const renameCategory = async (userId: number, oldName: string, newName: s export const removeAllUserBadges = async (userId: number) => await supabase.from('user_badges').delete().eq('user_id', userId); + +export const migrateCategory = async (userId: number, oldName: string, newName: string) => + await supabase + .from('user_badges') + .update({ category: newName }) + .eq('category', oldName) + .eq('user_id', userId); diff --git a/src/routes/api/badges/+server.ts b/src/routes/api/badges/+server.ts index 9cfc49fc..20777845 100644 --- a/src/routes/api/badges/+server.ts +++ b/src/routes/api/badges/+server.ts @@ -5,7 +5,8 @@ import { updateUserBadge, getUserBadges, addUserBadge, - type Badge + type Badge, + migrateCategory } from '$lib/Database/userBadges'; const unauthorised = new Response('Unauthorised', { status: 401 }); @@ -61,6 +62,14 @@ export const PUT = async ({ cookies, url, request }) => { (await request.json()).map(async (badge: Badge) => await addUserBadge(identity.id, badge)) ); + return await badges(identity.id); + } else if (url.searchParams.get('migrate') || undefined) { + await migrateCategory( + identity.id, + url.searchParams.get('original') || '', + url.searchParams.get('new') || '' + ); + return await badges(identity.id); } diff --git a/src/routes/user/[user]/badges/+page.svelte b/src/routes/user/[user]/badges/+page.svelte index 03c9af50..ba02679c 100644 --- a/src/routes/user/[user]/badges/+page.svelte +++ b/src/routes/user/[user]/badges/+page.svelte @@ -49,6 +49,7 @@ let importCategory = ''; let importReplies = false; let badger: Partial; + let migrateMode = false; // $: downloadDisabled = badgeCount > 20; @@ -376,6 +377,21 @@ importMode = false; importImages = undefined; }); + + const migrateCategory = () => { + badgesPromise = fetch( + `/api/badges?migrate=true&original=${encodeURIComponent( + (document.querySelector('#migrate_original') as HTMLInputElement).value + )}&new=${encodeURIComponent( + (document.querySelector('#migrate_new') as HTMLInputElement).value + )}`, + { + method: 'PUT' + } + ); + + migrateMode = false; + }; @@ -490,6 +506,16 @@ ? $locale().user.badges.importMode.disable : $locale().user.badges.importMode.enable} + + {#if editMode && isOwner} {@const groups = groupedBadges @@ -767,6 +793,47 @@ {/if} + (migrateMode = false)} show={migrateMode}> + Migrate Category + +

+ + + + + Leave original category empty to migrate all uncategorised badges. + + +

+ + + + +