diff --git a/server/src/graphQL/mockAlbums.ts b/server/src/graphQL/mockAlbums.ts new file mode 100644 index 0000000..b4b5d3d --- /dev/null +++ b/server/src/graphQL/mockAlbums.ts @@ -0,0 +1,53 @@ +export interface Track { + title: string; + duration: number; +} + +export interface Album { + id: string; + title: string; + artist: string; + releaseYear: number; + genre: string; + coverUrl: string | null; + tracks: Track[]; +} + +export const MOCK_ALBUMS: Album[] = [ + { + id: '1', + title: 'Abbey Road', + artist: 'The Beatles', + releaseYear: 1969, + genre: 'Rock', + coverUrl: 'https://upload.wikimedia.org/wikipedia/en/4/42/Beatles_-_Abbey_Road.jpg', + tracks: [ + { title: 'Come Together', duration: 259000 }, + { title: 'Something', duration: 182000 }, + ], + }, + { + id: '2', + title: 'The Dark Side of the Moon', + artist: 'Pink Floyd', + releaseYear: 1973, + genre: 'Rock', + coverUrl: null, // Test at nullable coverUrl fungerer + tracks: [ + { title: 'Money', duration: 382000 }, + { title: 'Time', duration: 413000 }, + ], + }, + { + id: '3', + title: 'Thriller', + artist: 'Michael Jackson', + releaseYear: 1982, + genre: 'Pop', + coverUrl: 'https://upload.wikimedia.org/wikipedia/en/5/55/Michael_Jackson_-_Thriller.png', + tracks: [ + { title: 'Billie Jean', duration: 294000 }, + { title: 'Beat It', duration: 258000 }, + ], + }, +]; \ No newline at end of file diff --git a/server/src/graphQL/resolvers.ts b/server/src/graphQL/resolvers.ts new file mode 100644 index 0000000..3d26963 --- /dev/null +++ b/server/src/graphQL/resolvers.ts @@ -0,0 +1,49 @@ +import { MOCK_ALBUMS } from './mockAlbums.js'; + +export const resolvers = { + Query: { + albums: (_: unknown, args: { search?: string; genre?: string; decade?: number; first?: number }) => { + let filtered = [...MOCK_ALBUMS]; + + // Søkefilter på tittel eller artist + if (args.search) { + const query = args.search.toLowerCase(); + filtered = filtered.filter( + (album) => + album.title.toLowerCase().includes(query) || + album.artist.toLowerCase().includes(query) + ); + } + + // Sjangerfilter + if (args.genre) { + filtered = filtered.filter( + (album) => album.genre.toLowerCase() === args.genre?.toLowerCase() + ); + } + + // Tiår-filter (f.eks. 1970 for 70-tallet) + if (args.decade) { + filtered = filtered.filter( + (album) => + album.releaseYear >= args.decade! && album.releaseYear < args.decade! + 10 + ); + } + + const limit = args.first || 10; + const sliced = filtered.slice(0, limit); + + return { + edges: sliced, + pageInfo: { + endCursor: sliced.length > 0 ? sliced[sliced.length - 1].id : null, + hasNextPage: filtered.length > limit, + }, + }; + }, + + album: (_: unknown, args: { id: string }) => { + return MOCK_ALBUMS.find((album) => album.id === args.id) || null; + }, + }, +}; \ No newline at end of file diff --git a/server/src/graphQL/schema.ts b/server/src/graphQL/schema.ts new file mode 100644 index 0000000..70734f9 --- /dev/null +++ b/server/src/graphQL/schema.ts @@ -0,0 +1,39 @@ +export const typeDefs = `#graphql + type Track { + title: String! + duration: Int + } + + type Album { + id: ID! + title: String! + artist: String! + releaseYear: Int! + genre: String! + coverUrl: String + tracks: [Track!] + } + + type PageInfo { + endCursor: String + hasNextPage: Boolean! + } + + type AlbumConnection { + edges: [Album!]! + pageInfo: PageInfo! + } + + type Query { + albums( + search: String + genre: String + decade: Int + sortBy: String + first: Int = 10 + after: String + ): AlbumConnection! + + album(id: ID!): Album + } +`; \ No newline at end of file diff --git a/server/src/server.ts b/server/src/server.ts index 2f6e5b7..91bf1d4 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -1,24 +1,13 @@ import { ApolloServer } from '@apollo/server'; import { startStandaloneServer } from '@apollo/server/standalone'; import dotenv from 'dotenv'; +import { typeDefs } from './graphQL/schema.js'; +import { resolvers } from './graphQL/resolvers.js'; dotenv.config(); const PORT = parseInt(process.env.PORT || '3001', 10); -// Et midlertidig minimalt skjema for at serveren skal kunne starte -const typeDefs = `#graphql - type Query { - healthCheck: String - } -`; - -const resolvers = { - Query: { - healthCheck: () => 'Apollo Server kjører feilfritt!', - }, -}; - const server = new ApolloServer({ typeDefs, resolvers, @@ -28,7 +17,7 @@ async function main() { const { url } = await startStandaloneServer(server, { listen: { port: PORT }, }); - console.log(`🚀 Apollo Server er klar på: ${url}`); + console.log(`🚀 Apollo Server med mock-data kjører på: ${url}`); } main().catch((err) => {