Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 53 additions & 31 deletions server/src/graphQL/resolvers.ts
Original file line number Diff line number Diff line change
@@ -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]);

Expand All @@ -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
Expand All @@ -92,6 +113,7 @@ export const resolvers = {

return {
...album,
coverUrl: formatCoverUrl(album.coverUrl),
tracks: trackRows,
};
},
Expand Down