diff --git a/.github/workflows/client.yml b/.github/workflows/client.yml index ed0a9dc7d..aa2b7909d 100644 --- a/.github/workflows/client.yml +++ b/.github/workflows/client.yml @@ -69,11 +69,11 @@ jobs: VITE_RECAPTCHA_KEY: "6LcsYbIpAAAAAEJffjIXmbQcxj_SBZG7BnSPjF4L" VITE_SERVER_URL: "https://v3-boku.tachi.ac" VITE_DISCORD: "https://discord.gg/E4n8ZZF5ES" - VITE_CDN_URL: "https://cdn-v3-boku.tachi.ac" + VITE_CDN_URL: "https://cdn-boku.tachi.ac" TACHI_NAME: "Bokutachi" BUILD_OUT_DIR: /tmp/boku - - name: Build Kamaitachi (v3) + - name: Build Kamaitachi run: bun run --filter tachi-client build env: VITE_MANDATE_LOGIN: true @@ -83,7 +83,7 @@ jobs: VITE_MIN_CLIENT_ID: "A0DBDBB063CD800530EF01C6488B282137E0191E" VITE_DISCORD: "https://discord.gg/NNgGJbpQUj" VITE_TCHIC_MODE: "kamai" - VITE_CDN_URL: "https://cdn-v3-kamai.tachi.ac" + VITE_CDN_URL: "https://cdn-kamai.tachi.ac" VITE_GIT_REPO: "GitHub:zkldi/Tachi" VITE_RECAPTCHA_KEY: "6LcsYbIpAAAAAEJffjIXmbQcxj_SBZG7BnSPjF4L" TACHI_NAME: "Kamaitachi" diff --git a/db/migrations/20260517120000_clear_showcase_orphan_refs.sql b/db/migrations/20260517120000_clear_showcase_orphan_refs.sql new file mode 100644 index 000000000..99d5e32b3 --- /dev/null +++ b/db/migrations/20260517120000_clear_showcase_orphan_refs.sql @@ -0,0 +1,38 @@ +-- Remove showcase entries that reference deleted charts or folders (slug + game). +-- `game_profile.showcase` is a JSONB array; chart entries use mode "chart" + chartID; +-- folder entries use mode "folder" + slug, scoped to game_profile.game. + +UPDATE game_profile AS gp +SET showcase = cleaned.new_showcase +FROM ( + SELECT + gp_inner.user_id, + gp_inner.game, + COALESCE( + ( + SELECT jsonb_agg(t.elem ORDER BY t.ordinality) + FROM jsonb_array_elements(gp_inner.showcase) WITH ORDINALITY AS t(elem, ordinality) + WHERE CASE t.elem->>'mode' + WHEN 'chart' THEN EXISTS ( + SELECT 1 + FROM chart AS c + WHERE c.id = t.elem->>'chartID' + ) + WHEN 'folder' THEN EXISTS ( + SELECT 1 + FROM folder AS f + WHERE f.game = gp_inner.game + AND f.slug = t.elem->>'slug' + ) + ELSE TRUE + END + ), + '[]'::jsonb + ) AS new_showcase + FROM game_profile AS gp_inner + WHERE jsonb_typeof(gp_inner.showcase) = 'array' + AND jsonb_array_length(gp_inner.showcase) > 0 +) AS cleaned +WHERE gp.user_id = cleaned.user_id + AND gp.game = cleaned.game + AND gp.showcase IS DISTINCT FROM cleaned.new_showcase;