From a9d94d73fa5ca07deb0a54fdc980a96bede802e4 Mon Sep 17 00:00:00 2001 From: Roman Godmaire Date: Tue, 21 Nov 2023 09:31:12 -0500 Subject: [PATCH] feat: Basic track page --- src/lib/components/TrackCard.svelte | 1 + src/lib/server/db/index.ts | 10 ++++++++++ src/lib/server/db/prisma.ts | 20 ++++++++++++++++++++ src/routes/track/[slug]/+page.server.ts | 20 ++++++++++++++++++++ src/routes/track/[slug]/+page.svelte | 9 +++++++++ 5 files changed, 60 insertions(+) create mode 100644 src/routes/track/[slug]/+page.server.ts create mode 100644 src/routes/track/[slug]/+page.svelte diff --git a/src/lib/components/TrackCard.svelte b/src/lib/components/TrackCard.svelte index a2e5dbc..aaf32c2 100644 --- a/src/lib/components/TrackCard.svelte +++ b/src/lib/components/TrackCard.svelte @@ -5,6 +5,7 @@ export let producerUsername: string; export let comments: { author: string; content: string; createdAt: Date }[]; + // TODO: Relative formatting (ie. 6 days ago, 3 moonths ago) const formatDateTime = (datetime: Date) => { /* If the date is today, then return LocaleTimeString diff --git a/src/lib/server/db/index.ts b/src/lib/server/db/index.ts index ea3900e..f36e7e8 100644 --- a/src/lib/server/db/index.ts +++ b/src/lib/server/db/index.ts @@ -15,6 +15,16 @@ export interface Database { }[] >; + getTrackById: (trackId: number) => Promise< + { + title: string; + objectKey: string; + createdAt: Date; + producer: { + username: string; + }; + }? + >; createTrack: (producerId: string, title: string, objectKey: string) => Promise; insertTrackVersion: (trackId: number) => Promise; } diff --git a/src/lib/server/db/prisma.ts b/src/lib/server/db/prisma.ts index a73e85d..8d408cf 100644 --- a/src/lib/server/db/prisma.ts +++ b/src/lib/server/db/prisma.ts @@ -65,6 +65,26 @@ export class DatabasePrisma implements Database { return res; }; + getTrackById = async (trackId: number) => { + const track = await this.client.track.findUnique({ + select: { + title: true, + objectKey: true, + createdAt: true, + producer: { + select: { + username: true + } + } + }, + where: { + id: trackId + } + }); + + return track; + }; + createTrack = async (producerId: string, title: string, objectKey: string) => { const track = await this.client.track.create({ data: { diff --git a/src/routes/track/[slug]/+page.server.ts b/src/routes/track/[slug]/+page.server.ts new file mode 100644 index 0000000..2cdcffb --- /dev/null +++ b/src/routes/track/[slug]/+page.server.ts @@ -0,0 +1,20 @@ +import { error } from '@sveltejs/kit'; +import type { PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ params: { slug }, locals: { database } }) => { + const trackId = parseInt(slug); + + if (isNaN(trackId)) { + throw error(404, 'Track not found'); + } + + let track = await database.getTrackById(trackId); + + if (!track) { + throw error(440, 'Track not found'); + } + + return { + track + }; +}; diff --git a/src/routes/track/[slug]/+page.svelte b/src/routes/track/[slug]/+page.svelte new file mode 100644 index 0000000..5d769fe --- /dev/null +++ b/src/routes/track/[slug]/+page.svelte @@ -0,0 +1,9 @@ + + +
+

{track.title}

+

by {track.producer.username}

+