From 44e0d9f44ca3ba48c624292c0d770c3db2c47dd3 Mon Sep 17 00:00:00 2001 From: Mat12143 Date: Sat, 2 Aug 2025 03:54:26 +0200 Subject: [PATCH] feat: refactoring api logic --- frontend/src/lib/components/Error.svelte | 8 ++- .../src/lib/components/QueueSlider.svelte | 8 +-- frontend/src/lib/types.ts | 5 ++ frontend/src/lib/utils.ts | 69 +++++++++++++++++++ frontend/src/routes/admin/[id]/+page.svelte | 64 +++++++++-------- frontend/src/routes/admin/[id]/+page.ts | 11 +++ frontend/src/routes/room/[id]/+page.svelte | 59 ++++++---------- 7 files changed, 150 insertions(+), 74 deletions(-) create mode 100644 frontend/src/lib/utils.ts create mode 100644 frontend/src/routes/admin/[id]/+page.ts diff --git a/frontend/src/lib/components/Error.svelte b/frontend/src/lib/components/Error.svelte index 47e6a19..414657e 100644 --- a/frontend/src/lib/components/Error.svelte +++ b/frontend/src/lib/components/Error.svelte @@ -1,8 +1,10 @@
-

Error {code}

-

{message}

+

Error {returnError.code}

+

{returnError.message}

diff --git a/frontend/src/lib/components/QueueSlider.svelte b/frontend/src/lib/components/QueueSlider.svelte index 430a9bc..ec5a647 100644 --- a/frontend/src/lib/components/QueueSlider.svelte +++ b/frontend/src/lib/components/QueueSlider.svelte @@ -1,12 +1,12 @@ diff --git a/frontend/src/lib/types.ts b/frontend/src/lib/types.ts index 3f10d61..7de4960 100644 --- a/frontend/src/lib/types.ts +++ b/frontend/src/lib/types.ts @@ -35,3 +35,8 @@ export const parseSuggestion = async function (sugg: any): Promise { let resp = await SuggestionSchema.parseAsync(sugg) return resp } + +export type FetchError = { + code: number + message: string +} diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts new file mode 100644 index 0000000..1babeb9 --- /dev/null +++ b/frontend/src/lib/utils.ts @@ -0,0 +1,69 @@ +import { parseSong, parseSuggestion, type FetchError, type Song, type Suggestion } from "./types" + +export const joinRoom = async function (roomId: string): Promise<[FetchError | null, string]> { + let resp = await fetch("/api/join?room=" + roomId) + + if (resp.status != 200) { + return [{ code: 400, message: "Cannot join the room" }, ""] + } + + return [null, "test"] +} + +export const getSuggestions = async function (roomId: string): Promise<[FetchError | null, Suggestion[]]> { + let resp = await fetch("/api/room/suggestions?room=" + roomId) + + if (resp.status != 200) { + return [{ code: 400, message: "Failed to retrieve suggestions" }, []] + } + + let json = await resp.json() + let suggestions: Suggestion[] = [] + + json["songs"].forEach(async (i: any) => { + suggestions.push(await parseSuggestion(i)) + }) + + suggestions = suggestions.sort((a, b) => { + return a.upvote - b.upvote + }) + + return [null, suggestions] +} + +export const getQueueSongs = async function (roomId: string): Promise<[FetchError | null, Song[], number]> { + let resp = await fetch("/api/queue?room=" + roomId) + if (resp.status != 200) { + return [{ code: 400, message: "Failed to load queue songs" }, [], 0] + } + + let json = await resp.json() + let songs: Song[] = [] + + json["queue"].forEach(async (i: any) => { + songs.push(await parseSong(i)) + }) + + let playingId = json["index"] + + return [null, songs, playingId] +} + +export const triggerPlayNext = async function (roomId: string): Promise<[FetchError | null, Song[], number]> { + let resp = await fetch("/api/queue/next?room=" + roomId, { method: "POST" }) + + if (resp.status != 200) { + return [{ code: 400, message: "Failed to trigger next song playback" }, [], 0] + } + + let json = await resp.json() + + let songs: Song[] = [] + + if (json["ended"]) { + json["queue"].forEach(async (i: any) => { + songs.push(await parseSong(i)) + }) + } + return [null, songs, json["index"]] +} diff --git a/frontend/src/routes/admin/[id]/+page.svelte b/frontend/src/routes/admin/[id]/+page.svelte index 7573aa2..55d93a5 100644 --- a/frontend/src/routes/admin/[id]/+page.svelte +++ b/frontend/src/routes/admin/[id]/+page.svelte @@ -1,37 +1,43 @@ +{returnError} +
- + +
diff --git a/frontend/src/routes/admin/[id]/+page.ts b/frontend/src/routes/admin/[id]/+page.ts new file mode 100644 index 0000000..216a08b --- /dev/null +++ b/frontend/src/routes/admin/[id]/+page.ts @@ -0,0 +1,11 @@ +import { error } from "@sveltejs/kit" +import type { PageLoad } from "../../room/[id]/$types" + +export const load: PageLoad = function ({ params }) { + if (params.id) { + return { + roomId: params.id, + } + } + error(400, "Please provide a room id") +} diff --git a/frontend/src/routes/room/[id]/+page.svelte b/frontend/src/routes/room/[id]/+page.svelte index f3905e6..b238e40 100644 --- a/frontend/src/routes/room/[id]/+page.svelte +++ b/frontend/src/routes/room/[id]/+page.svelte @@ -2,71 +2,54 @@ import QueueSlider from "$lib/components/QueueSlider.svelte" import SuggestionInput from "$lib/components/SuggestionInput.svelte" import Error from "$lib/components/Error.svelte" - import { parseSong, parseSuggestion, type Suggestion, type Song } from "$lib/types.js" + import { type Suggestion, type Song } from "$lib/types.js" import { onMount } from "svelte" import SuggestionList from "$lib/components/SuggestionList.svelte" + import { getQueueSongs, getSuggestions, joinRoom } from "$lib/utils.js" + import type { FetchError } from "$lib/types.js" let { data } = $props() - let songs = $state([]) - let playing = $state(0) + let queueSongs = $state([]) + let playingIndex = $state(0) let suggestions = $state([]) - let error = $state({ code: 0, message: "" }) + let returnError = $state() + + let wsUrl = "" onMount(async () => { // Join the room - let resp = await fetch("/api/join?room=" + data.roomId) - if (resp.status != 200) { - error = { code: 400, message: "Failed to join the room. Maybe wrong code or location?" } + let sugg, queue, index + ;[returnError, wsUrl] = await joinRoom(data.roomId) + if (returnError) { return } - // Setup websocket connection - - // Get room suggestions - - resp = await fetch("/api/room/suggestions?room=" + data.roomId) - - if (resp.status != 200) { - error = { code: 500, message: "Failed to retrive suggestions" } + ;[returnError, sugg] = await getSuggestions(data.roomId) + if (returnError) { return } - let json = await resp.json() - - json["songs"].forEach(async (i: any) => { - suggestions.push(await parseSuggestion(i)) - }) - - suggestions = suggestions.sort((a, b) => { - return a.upvote - b.upvote - }) - - // Get the room queue - - resp = await fetch("/api/queue?room=" + data.roomId) - if (resp.status != 200) { - error = { code: 404, message: "Room not found" } + ;[returnError, queue, index] = await getQueueSongs(data.roomId) + if (returnError) { return } - json = await resp.json() - json["queue"].forEach(async (i: any) => { - songs.push(await parseSong(i)) - }) - console.log(songs) + queueSongs = queue + suggestions = sugg + playingIndex = index }) -{#if error.code != 0} - +{#if returnError} + {:else}
- +