From 3ac80eba8863acd29c0f3613b346d3ea5cba941d Mon Sep 17 00:00:00 2001 From: stinejs Date: Thu, 15 Oct 2026 17:11:44 +0200 Subject: [PATCH 1/2] Updated resolvers.ts to fix problem with photos --- server/src/graphQL/resolvers.ts | 84 +++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 31 deletions(-) diff --git a/server/src/graphQL/resolvers.ts b/server/src/graphQL/resolvers.ts index 3a68a47..09cb655 100644 --- a/server/src/graphQL/resolvers.ts +++ b/server/src/graphQL/resolvers.ts @@ -1,74 +1,95 @@ import { pool } from '../database/connection.js'; +// Hjelpefunksjon for å generere full bilde-URL for albumomslag +const formatCoverUrl = (filename: string | null) => { + if (!filename) return null; + + // Dersom databasen allerede inneholder en full URL (http/https), beholder vi den + if (filename.startsWith('http://') || filename.startsWith('https://')) { + return filename; + } + + // Bruk SERVER_URL fra .env eller standard VM-adresse + const baseUrl = process.env.SERVER_URL || 'http://it2810-05.idi.ntnu.no/project2'; + + // Fjerner eventuelle innledende skråstreker fra filnavnet + const cleanFilename = filename.replace(/^\/+/, ''); + + return `${baseUrl}/covers/${cleanFilename}`; +}; + export const resolvers = { Query: { albums: async (_: unknown, args: { search?: string; genre?: string; decade?: number; first?: number }) => { let sql = ` SELECT - a.id, - a.title, - a.artist, - a.release_year AS "releaseYear", - g.name AS genre, - a.cover_url AS "coverUrl" - FROM albums a - LEFT JOIN album_genres ag ON ag.album_id = a.id - LEFT JOIN genres g ON g.id = ag.genre_id + id, + title, + artist, + release_year AS "releaseYear", + genre, + cover_url AS "coverUrl" + FROM albums WHERE 1=1 `; const queryParams: (string | number)[] = []; - + // Søkefilter på tittel eller artist if (args.search) { queryParams.push(`%${args.search}%`); - sql += ` AND (LOWER(a.title) LIKE LOWER($${queryParams.length}) OR LOWER(a.artist) LIKE LOWER($${queryParams.length}))`; + sql += ` AND (LOWER(title) LIKE LOWER($${queryParams.length}) OR LOWER(artist) LIKE LOWER($${queryParams.length}))`; } - + // Sjangerfilter if (args.genre) { queryParams.push(args.genre); - sql += ` AND LOWER(g.name) = LOWER($${queryParams.length})`; + sql += ` AND LOWER(genre) = LOWER($${queryParams.length})`; } - + // Tiår-filter if (args.decade) { queryParams.push(args.decade); - sql += ` AND a.release_year >= $${queryParams.length} AND a.release_year < $${queryParams.length} + 10`; + sql += ` AND release_year >= $${queryParams.length} AND release_year < $${queryParams.length} + 10`; } const limit = args.first || 10; - + // Hent én mer enn grensen for å sjekke om det finnes en neste side (hasNextPage) queryParams.push(limit + 1); - sql += ` ORDER BY a.title ASC LIMIT $${queryParams.length}`; + sql += ` ORDER BY title ASC LIMIT $${queryParams.length}`; const { rows } = await pool.query(sql, queryParams); const hasNextPage = rows.length > limit; const sliced = hasNextPage ? rows.slice(0, limit) : rows; + // Formater coverUrl for alle albumene før de returneres + const formattedRows = sliced.map((album) => ({ + ...album, + coverUrl: formatCoverUrl(album.coverUrl), + })); + return { - edges: sliced, + edges: formattedRows, pageInfo: { - endCursor: sliced.length > 0 ? sliced[sliced.length - 1].id : null, + endCursor: formattedRows.length > 0 ? formattedRows[formattedRows.length - 1].id : null, hasNextPage, }, }; }, album: async (_: unknown, args: { id: string }) => { + // Hent albumet const albumSql = ` SELECT - a.id, - a.title, - a.artist, - a.release_year AS "releaseYear", - g.name AS genre, - a.cover_path AS "coverUrl" - FROM albums a - LEFT JOIN album_genres ag ON ag.album_id = a.id - LEFT JOIN genres g ON g.id = ag.genre_id - WHERE a.id = $1 + id, + title, + artist, + release_year AS "releaseYear", + genre, + cover_url AS "coverUrl" + FROM albums + WHERE id = $1 `; const { rows: albumRows } = await pool.query(albumSql, [args.id]); @@ -78,12 +99,12 @@ export const resolvers = { const album = albumRows[0]; - + // Hent sangene/sporene (tracks) tilhørende albumet const tracksSql = ` SELECT id, title, - duration_ms AS "duration" + duration FROM tracks WHERE album_id = $1 ORDER BY track_number ASC @@ -92,6 +113,7 @@ export const resolvers = { return { ...album, + coverUrl: formatCoverUrl(album.coverUrl), tracks: trackRows, }; }, From fe03b96249c8c36f97809c3c3a7e59bf9fdbe446 Mon Sep 17 00:00:00 2001 From: stinejs Date: Thu, 15 Oct 2026 17:24:32 +0200 Subject: [PATCH 2/2] Did some more changes --- server/src/graphQL/resolvers.ts | 64 +++++++++++++++------------------ 1 file changed, 29 insertions(+), 35 deletions(-) diff --git a/server/src/graphQL/resolvers.ts b/server/src/graphQL/resolvers.ts index 09cb655..32cd435 100644 --- a/server/src/graphQL/resolvers.ts +++ b/server/src/graphQL/resolvers.ts @@ -1,20 +1,12 @@ import { pool } from '../database/connection.js'; -// Hjelpefunksjon for å generere full bilde-URL for albumomslag const formatCoverUrl = (filename: string | null) => { if (!filename) return null; - - // Dersom databasen allerede inneholder en full URL (http/https), beholder vi den if (filename.startsWith('http://') || filename.startsWith('https://')) { return filename; } - - // Bruk SERVER_URL fra .env eller standard VM-adresse const baseUrl = process.env.SERVER_URL || 'http://it2810-05.idi.ntnu.no/project2'; - - // Fjerner eventuelle innledende skråstreker fra filnavnet const cleanFilename = filename.replace(/^\/+/, ''); - return `${baseUrl}/covers/${cleanFilename}`; }; @@ -23,47 +15,48 @@ export const resolvers = { albums: async (_: unknown, args: { search?: string; genre?: string; decade?: number; first?: number }) => { let sql = ` SELECT - id, - title, - artist, - release_year AS "releaseYear", - genre, - cover_url AS "coverUrl" - FROM albums + a.id, + a.title, + a.artist, + a.release_year AS "releaseYear", + g.name AS genre, + a.cover_path AS "coverUrl" + FROM albums a + LEFT JOIN album_genres ag ON ag.album_id = a.id + LEFT JOIN genres g ON g.id = ag.genre_id WHERE 1=1 `; const queryParams: (string | number)[] = []; - // Søkefilter på tittel eller artist + if (args.search) { queryParams.push(`%${args.search}%`); - sql += ` AND (LOWER(title) LIKE LOWER($${queryParams.length}) OR LOWER(artist) LIKE LOWER($${queryParams.length}))`; + sql += ` AND (LOWER(a.title) LIKE LOWER($${queryParams.length}) OR LOWER(a.artist) LIKE LOWER($${queryParams.length}))`; } - // Sjangerfilter + if (args.genre) { queryParams.push(args.genre); - sql += ` AND LOWER(genre) = LOWER($${queryParams.length})`; + sql += ` AND LOWER(g.name) = LOWER($${queryParams.length})`; } - // Tiår-filter + if (args.decade) { queryParams.push(args.decade); - sql += ` AND release_year >= $${queryParams.length} AND release_year < $${queryParams.length} + 10`; + sql += ` AND a.release_year >= $${queryParams.length} AND a.release_year < $${queryParams.length} + 10`; } const limit = args.first || 10; - // Hent én mer enn grensen for å sjekke om det finnes en neste side (hasNextPage) + queryParams.push(limit + 1); - sql += ` ORDER BY title ASC LIMIT $${queryParams.length}`; + sql += ` ORDER BY a.title ASC LIMIT $${queryParams.length}`; const { rows } = await pool.query(sql, queryParams); const hasNextPage = rows.length > limit; const sliced = hasNextPage ? rows.slice(0, limit) : rows; - // Formater coverUrl for alle albumene før de returneres const formattedRows = sliced.map((album) => ({ ...album, coverUrl: formatCoverUrl(album.coverUrl), @@ -79,17 +72,18 @@ export const resolvers = { }, album: async (_: unknown, args: { id: string }) => { - // Hent albumet const albumSql = ` SELECT - id, - title, - artist, - release_year AS "releaseYear", - genre, - cover_url AS "coverUrl" - FROM albums - WHERE id = $1 + a.id, + a.title, + a.artist, + a.release_year AS "releaseYear", + g.name AS genre, + a.cover_path AS "coverUrl" + FROM albums a + LEFT JOIN album_genres ag ON ag.album_id = a.id + LEFT JOIN genres g ON g.id = ag.genre_id + WHERE a.id = $1 `; const { rows: albumRows } = await pool.query(albumSql, [args.id]); @@ -99,12 +93,12 @@ export const resolvers = { const album = albumRows[0]; - // Hent sangene/sporene (tracks) tilhørende albumet + const tracksSql = ` SELECT id, title, - duration + duration_ms AS "duration" FROM tracks WHERE album_id = $1 ORDER BY track_number ASC