diff --git a/api/src/routes/artists/[slug]/+server.ts b/api/src/routes/artists/[slug]/+server.ts index 96953c5..e5e31e1 100644 --- a/api/src/routes/artists/[slug]/+server.ts +++ b/api/src/routes/artists/[slug]/+server.ts @@ -1,8 +1,8 @@ import { TABLES } from '../../../../../shared/config'; import { handlePostgrestQuery, supabase } from '$lib/server/supabase'; -import type { Artist } from '../../../../../shared/types/core'; import type { ArtistHydrated } from '../../../../../shared/types/hydrated'; import { json } from '@sveltejs/kit'; +import { pinata } from '$lib/server/pinata'; export async function GET({ params }) { return handlePostgrestQuery( @@ -12,8 +12,38 @@ export async function GET({ params }) { } export async function PATCH({ request, params }) { - const body: Partial = await request.json(); - const { error } = await supabase.from(TABLES.artists).update(body).eq('id', params.slug); + const formData = await request.formData(); + + const artistImageNew = formData.get('artistImageNew') as File; + const artistName = formData.get('artistName') as string; + const artistBio = formData.get('artistBio') as string; + const artistWebsite = formData.get('artistWebsite') as string; + + let imageCid: string | undefined; + + if (artistImageNew && artistImageNew.size > 0) { + const pinataFileName = `${artistName} profile image`; + const upload = await pinata.upload.public + .file(artistImageNew) + .name(pinataFileName) + .group(import.meta.env.PINATA_ARTIST_IMAGES_GROUP); + + if (!upload || !upload.cid) { + console.error('Error uploading artist image to Pinata:', upload); + } + // TODO: Delete old artist image if it exists + imageCid = upload.cid; + } + + const { error } = await supabase + .from(TABLES.artists) + .update({ + name: artistName, + bio: artistBio, + website_url: artistWebsite, + image_ipfs_cid: imageCid + }) + .eq('id', params.slug); if (error) { return json({ error: 'Failed to update artist details' }, { status: 500 }); } diff --git a/dashboard/src/lib/config.ts b/dashboard/src/lib/config.ts index 3346fb2..ae05df8 100644 --- a/dashboard/src/lib/config.ts +++ b/dashboard/src/lib/config.ts @@ -8,9 +8,6 @@ import { export const PUBLIC_SUPABASE_URL = import.meta.env.VITE_SUPABASE_URL; export const PUBLIC_SUPABASE_ANON_KEY = import.meta.env.VITE_SUPABASE_ANON_KEY; -export const PINATA_ARTIST_IMAGES_GROUP = import.meta.env.PINATA_ARTIST_IMAGES_GROUP; - -export const POWER_USER_ID = import.meta.env.VITE_POWER_USER_ID; export const API_BASE = dev ? `http://localhost:${API_LOCAL_PORT}` : API_DOMAIN; diff --git a/dashboard/src/lib/remote-functions/artist.remote.ts b/dashboard/src/lib/remote-functions/artist.remote.ts index e238d4c..6573619 100644 --- a/dashboard/src/lib/remote-functions/artist.remote.ts +++ b/dashboard/src/lib/remote-functions/artist.remote.ts @@ -1,8 +1,6 @@ import { form, getRequestEvent, query } from '$app/server'; -import { API_BASE, PINATA_ARTIST_IMAGES_GROUP, REQUEST_HEADER_BOILERPLATE } from '$lib/config'; +import { API_BASE, DOMAIN_BASE } from '$lib/config'; import * as z from 'zod'; -import { pinata } from '$lib/server/pinata'; -import { fail, redirect } from '@sveltejs/kit'; const ArtistDetailsForm = z.object({ artistId: z.string(), @@ -13,33 +11,20 @@ const ArtistDetailsForm = z.object({ }); export const updateArtistDetails = form(ArtistDetailsForm, async (data) => { - let imageCid: string | undefined; - if (data.artistImageNew && data.artistImageNew.size > 0) { - const pinataFileName = `${data.artistName} profile image`; - const upload = await pinata.upload.public - .file(data.artistImageNew) - .name(pinataFileName) - .group(PINATA_ARTIST_IMAGES_GROUP); - - if (!upload || !upload.cid) { - console.error('Error uploading artist image to Pinata:', upload); - return fail(500, { - error: true, - message: 'Failed to upload artist image to Pinata' - }); - } - // TODO: Delete old artist image if it exists - imageCid = upload.cid; + const formData = new FormData(); + if (data.artistImageNew) { + formData.append('artistImageNew', data.artistImageNew); } + formData.append('artistName', data.artistName); + formData.append('artistId', data.artistId); + formData.append('artistBio', data.artistBio || ''); + formData.append('artistWebsite', data.artistWebsite || ''); await fetch(`${API_BASE}/artists/${data.artistId}`, { method: 'PATCH', - headers: REQUEST_HEADER_BOILERPLATE, - body: JSON.stringify({ - id: data.artistId, - image_ipfs_cid: imageCid, - bio: data.artistBio, - website_url: data.artistWebsite - }) + headers: { + origin: DOMAIN_BASE + }, + body: formData }); }); diff --git a/dashboard/src/lib/remote-functions/music.remote.ts b/dashboard/src/lib/remote-functions/music.remote.ts index 91819cc..563ae37 100644 --- a/dashboard/src/lib/remote-functions/music.remote.ts +++ b/dashboard/src/lib/remote-functions/music.remote.ts @@ -31,9 +31,7 @@ export const addRelease = form(AddReleaseForm, async (data) => { formData.append('releaseArtwork', data.releaseArtwork); formData.append('releaseName', data.releaseName); formData.append('releaseType', data.releaseType); - if (data.releaseDate) { - formData.append('releaseDate', data.releaseDate); - } + formData.append('releaseDate', data.releaseDate); await fetch(`${API_BASE}/releases`, { method: 'POST', headers: { diff --git a/dashboard/src/lib/server/pinata.ts b/dashboard/src/lib/server/pinata.ts deleted file mode 100644 index 7c775cb..0000000 --- a/dashboard/src/lib/server/pinata.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { PinataSDK } from 'pinata'; -import { PINATA_JWT } from '$env/static/private'; -import { PUBLIC_GATEWAY_URL } from '$env/static/public'; - -export const pinata = new PinataSDK({ - pinataJwt: `${PINATA_JWT}`, - pinataGateway: `${PUBLIC_GATEWAY_URL}` -}); diff --git a/dashboard/src/routes/+layout.server.ts b/dashboard/src/routes/+layout.server.ts index 73adf58..8e066de 100644 --- a/dashboard/src/routes/+layout.server.ts +++ b/dashboard/src/routes/+layout.server.ts @@ -3,7 +3,6 @@ import { supabase } from '$lib/server/supabase'; import type { StreamLog } from '../../../shared/types/core'; import { sortReleasesByDate } from '../../../shared/utils'; import type { LayoutServerLoad } from './$types'; -import { POWER_USER_ID } from '$lib/config'; import type { Artist, Track } from '../../../shared/types/core'; import type { ReleaseHydrated } from '../../../shared/types/hydrated'; import { TABLES } from '../../../shared/config'; @@ -38,24 +37,20 @@ export const load: LayoutServerLoad = async ({ locals: { safeGetSession }, cooki return fail(500, { error: 'Failed to fetch user data' }); } - // Get all artist IDs for the user, unless they are a power user - // in which case fetch all artists + // Get all artist IDs for the user const { data: connectedArtists, error: artistsError }: { data: Artist[] | null; error: Error | null; - } = - userID === POWER_USER_ID - ? await supabase.from(TABLES.artists).select('*') - : await supabase - .from(TABLES.artists) - .select('*') - .in( - 'id', - userData.map((u) => u.artist_id) - ); + } = await supabase + .from(TABLES.artists) + .select('*') + .in( + 'id', + userData.map((u) => u.artist_id) + ); if (artistsError || !connectedArtists) { console.error('Error fetching artists:', artistsError); diff --git a/dashboard/src/routes/+page.svelte b/dashboard/src/routes/+page.svelte index 5784a71..2aa5852 100644 --- a/dashboard/src/routes/+page.svelte +++ b/dashboard/src/routes/+page.svelte @@ -1,9 +1,8 @@