From fd72c81fa5039a824e40923587a136bfff1a6747 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9rald=20Lbn?= Date: Thu, 12 Feb 2026 09:56:00 +0100 Subject: [PATCH 1/8] refactor: use slug instead of userId --- src/lib/startgg/queries.ts | 21 +++++++++++-------- src/routes/(app)/user/[slug]/+page.server.ts | 14 +++++++++++++ .../user/{[userId] => [slug]}/+page.svelte | 4 ++-- .../(app)/user/[userId]/+page.server.ts | 13 ------------ 4 files changed, 28 insertions(+), 24 deletions(-) create mode 100644 src/routes/(app)/user/[slug]/+page.server.ts rename src/routes/(app)/user/{[userId] => [slug]}/+page.svelte (98%) delete mode 100644 src/routes/(app)/user/[userId]/+page.server.ts diff --git a/src/lib/startgg/queries.ts b/src/lib/startgg/queries.ts index 4fe47a4..f6be945 100644 --- a/src/lib/startgg/queries.ts +++ b/src/lib/startgg/queries.ts @@ -16,6 +16,7 @@ export const searchPlayerByGamerTag = graphql(` gamerTag user { id + slug location { country } @@ -33,17 +34,18 @@ export const searchPlayerByGamerTag = graphql(` } `); -export const getUserById = graphql(` - query GetUserById($id: ID!) { - user(id: $id) { +export const getUserBySlug = graphql(` + query GetUserBySlug($slug: String!) { + user(slug: $slug) { id + slug } } `); export const getTournamentsEventsPageInfo = graphql(` - query GetTournamentsEventsPageInfo($userId: ID!) { - user(id: $userId) { + query GetTournamentsEventsPageInfo($slug: String!) { + user(slug: $slug) { events( query: { filter: { videogameId: [1386], eventType: 1, past: true, upcoming: false } @@ -60,8 +62,8 @@ export const getTournamentsEventsPageInfo = graphql(` `); export const getPaginatedTournamentsEventsStartAt = graphql(` - query GetTournamentsEventsStartAt($userId: ID!, $page: Int!) { - user(id: $userId) { + query GetTournamentsEventsStartAt($slug: String!, $page: Int!) { + user(slug: $slug) { events( query: { filter: { videogameId: [1386], eventType: 1 } @@ -79,8 +81,9 @@ export const getPaginatedTournamentsEventsStartAt = graphql(` `); export const getUserInfo = graphql(` - query GetUserInfo($userId: ID!) { - user(id: $userId) { + query GetUserInfo($slug: String!) { + user(slug: $slug) { + id images(type: "profile") { url } diff --git a/src/routes/(app)/user/[slug]/+page.server.ts b/src/routes/(app)/user/[slug]/+page.server.ts new file mode 100644 index 0000000..5f75742 --- /dev/null +++ b/src/routes/(app)/user/[slug]/+page.server.ts @@ -0,0 +1,14 @@ +import { fetchStartGG } from '$lib/startgg/fetch'; +import { getUserBySlug } from '$lib/startgg/queries'; +import { redirect } from '@sveltejs/kit'; + +export const load = async ({ params }) => { + const slug = `user/${params.slug}`; + const { + data: { user } + } = await fetchStartGG(getUserBySlug, { slug }); + + if (!user || !user.slug) throw redirect(302, '/'); + + return { userSlug: user.slug }; +}; diff --git a/src/routes/(app)/user/[userId]/+page.svelte b/src/routes/(app)/user/[slug]/+page.svelte similarity index 98% rename from src/routes/(app)/user/[userId]/+page.svelte rename to src/routes/(app)/user/[slug]/+page.svelte index 188e45b..a51b659 100644 --- a/src/routes/(app)/user/[userId]/+page.svelte +++ b/src/routes/(app)/user/[slug]/+page.svelte @@ -24,7 +24,7 @@ let renderingProgress = $state(undefined); let downloadButtonProps = $state(); - let userId = $derived(data.userId); + let userSlug = $derived(data.userSlug); let shareUrl = $derived(page.url.href); let isDebug = $derived(page.url.searchParams.get('debug') === 'true'); @@ -68,7 +68,7 @@ const checkProgress = async () => { const progressReq = await fetch('/api/render/progress', { method: 'POST', - body: JSON.stringify({ renderId, bucketName, userId: data.userId, year }) + body: JSON.stringify({ renderId, bucketName, userId: userSlug, year }) }); if (!progressReq.ok) { diff --git a/src/routes/(app)/user/[userId]/+page.server.ts b/src/routes/(app)/user/[userId]/+page.server.ts deleted file mode 100644 index a3ed9a2..0000000 --- a/src/routes/(app)/user/[userId]/+page.server.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { fetchStartGG } from '$lib/startgg/fetch'; -import { getUserById } from '$lib/startgg/queries'; -import { redirect } from '@sveltejs/kit'; - -export const load = async ({ params }) => { - const { - data: { user } - } = await fetchStartGG(getUserById, { id: params.userId }); - - if (!user || !user.id) throw redirect(302, '/'); - - return { userId: parseInt(user.id) }; -}; From 3333c41c8fe1c708add44cd69318aa239be004a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9rald=20Lbn?= Date: Thu, 12 Feb 2026 09:56:55 +0100 Subject: [PATCH 2/8] refactor: replace ids with slugs for featured profiles --- src/lib/components/FeaturedProfiles.svelte | 56 +++++++++++++--------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/src/lib/components/FeaturedProfiles.svelte b/src/lib/components/FeaturedProfiles.svelte index 537526b..04dc224 100644 --- a/src/lib/components/FeaturedProfiles.svelte +++ b/src/lib/components/FeaturedProfiles.svelte @@ -6,35 +6,47 @@ const mobile = new IsMobile(); const players = [ - { name: 'ドラ右 (Doramigi)', id: 1815290, imageUrl: '/images/recaps/ドラ右.webp' }, - { name: 'Miya', id: 1002311, imageUrl: '/images/recaps/Miya.webp' }, - { name: 'あcola (acola)', id: 1787719, imageUrl: '/images/recaps/あcola.webp' }, - { name: 'Hurt', id: 836465, imageUrl: '/images/recaps/Hurt.webp' }, - { name: 'Sparg0', id: 94369, imageUrl: '/images/recaps/Sparg0.webp' }, - { name: 'Sonix', id: 165614, imageUrl: '/images/recaps/Sonix.webp' }, - { name: 'Syrup', id: 767151, imageUrl: '/images/recaps/Syrup.webp' }, - { name: 'Zomba', id: 252388, imageUrl: '/images/recaps/Zomba.webp' }, - { name: 'カルメロ (Carmelo)', id: 2262042, imageUrl: '/images/recaps/カルメロ.webp' }, - { name: 'らる (Raru)', id: 1787715, imageUrl: '/images/recaps/らる.webp' }, - { name: 'Shuton', id: 134839, imageUrl: '/images/recaps/Shuton.webp' }, - { name: 'Tweek', id: 10213, imageUrl: '/images/recaps/Tweek.webp' }, - { name: 'Glutonny', id: 2613, imageUrl: '/images/recaps/Glutonny.webp' }, - { name: 'MkLeo', id: 41259, imageUrl: '/images/recaps/MkLeo.webp' }, + { + name: 'ドラ右 (Doramigi)', + slug: '82f63ee2', + imageUrl: '/images/recaps/ドラ右.webp' + }, + { name: 'Miya', slug: 'd8016ec8', imageUrl: '/images/recaps/Miya.webp' }, + { + name: 'あcola (acola)', + slug: '830dec1e', + imageUrl: '/images/recaps/あcola.webp' + }, + { name: 'Hurt', slug: '9b4e3c26', imageUrl: '/images/recaps/Hurt.webp' }, + { name: 'Sparg0', slug: 'b5230de8', imageUrl: '/images/recaps/Sparg0.webp' }, + { name: 'Sonix', slug: '0301d9f0', imageUrl: '/images/recaps/Sonix.webp' }, + { name: 'Syrup', slug: '0f333fd3', imageUrl: '/images/recaps/Syrup.webp' }, + { name: 'Zomba', slug: '880cbc79', imageUrl: '/images/recaps/Zomba.webp' }, + { + name: 'カルメロ (Carmelo)', + slug: '9e3d38c6', + imageUrl: '/images/recaps/カルメロ.webp' + }, + { name: 'らる (Raru)', slug: '50b1e9a9', imageUrl: '/images/recaps/らる.webp' }, + { name: 'Shuton', slug: '993a6b60', imageUrl: '/images/recaps/Shuton.webp' }, + { name: 'Tweek', slug: '0d650c15', imageUrl: '/images/recaps/Tweek.webp' }, + { name: 'Glutonny', slug: '7611d833', imageUrl: '/images/recaps/Glutonny.webp' }, + { name: 'MkLeo', slug: '3f297e74', imageUrl: '/images/recaps/MkLeo.webp' }, { name: 'たまPだいふく (TamaPDaifuku)', - id: 1816581, + slug: 'f2633635', imageUrl: '/images/recaps/たまPだいふく.webp' }, - { name: 'Light', id: 95011, imageUrl: '/images/recaps/Light.webp' }, - { name: 'Peabnut', id: 37364, imageUrl: '/images/recaps/Peabnut.webp' }, - { name: 'Asimo', id: 964831, imageUrl: '/images/recaps/Asimo.webp' }, - { name: 'Wrath', id: 52384, imageUrl: '/images/recaps/Wrath.webp' }, - { name: 'Tea', id: 399160, imageUrl: '/images/recaps/Tea.webp' } + { name: 'Light', slug: 'e2974569', imageUrl: '/images/recaps/Light.webp' }, + { name: 'Peabnut', slug: '9160966b', imageUrl: '/images/recaps/Peabnut.webp' }, + { name: 'Asimo', slug: 'ffa84c87', imageUrl: '/images/recaps/Asimo.webp' }, + { name: 'Wrath', slug: '9e90ab19', imageUrl: '/images/recaps/Wrath.webp' }, + { name: 'Tea', slug: 'ab90c078', imageUrl: '/images/recaps/Tea.webp' } ]; type FeaturedProfile = (typeof players)[number]; - const urlToRecap = (player: FeaturedProfile) => `/user/${player.id}`; + const urlToRecap = (player: FeaturedProfile) => `/user/${player.slug}`;