diff --git a/app/(api)/_actions/handleApolloRequest.ts b/app/(api)/_actions/handleApolloRequest.ts index 1182a67..bd372b3 100644 --- a/app/(api)/_actions/handleApolloRequest.ts +++ b/app/(api)/_actions/handleApolloRequest.ts @@ -1,13 +1,10 @@ 'use server'; -import { revalidatePath, revalidateTag } from 'next/cache'; - import handler from '@datalib/apolloServer'; export default async function handleApolloRequest( query: string, - variables: object, - revalidateCache?: { path?: string; type?: 'page' | 'layout'; tag?: string } + variables: object ) { const headers = { 'Content-Type': 'application/json', @@ -25,12 +22,5 @@ export default async function handleApolloRequest( const res = await handler(req); - if (revalidateCache?.path) { - revalidatePath(revalidateCache.path, revalidateCache.type); - } - if (revalidateCache?.tag) { - revalidateTag(revalidateCache.tag); - } - return res.json(); } diff --git a/app/(api)/_actions/revalidateCache.ts b/app/(api)/_actions/revalidateCache.ts new file mode 100644 index 0000000..16a5966 --- /dev/null +++ b/app/(api)/_actions/revalidateCache.ts @@ -0,0 +1,12 @@ +'use server'; + +import { revalidatePath } from 'next/cache'; +import revalidationPaths, { RevalidationKey } from '@cache/revalidationPaths'; + +export default async function revalidateCache(keys: RevalidationKey[]) { + for (const key of keys) { + for (const path of revalidationPaths[key]) { + revalidatePath(path); + } + } +} diff --git a/app/(api)/_cache/revalidationPaths.ts b/app/(api)/_cache/revalidationPaths.ts new file mode 100644 index 0000000..6a4242c --- /dev/null +++ b/app/(api)/_cache/revalidationPaths.ts @@ -0,0 +1,9 @@ +export type RevalidationKey = 'users' | 'playlists' | 'songs'; + +const revalidationPaths = { + users: ['/'], + playlists: ['/'], + songs: ['/'], +}; + +export default revalidationPaths; diff --git a/app/(api)/_datalib/_services/Playlists.ts b/app/(api)/_datalib/_services/Playlists.ts index 00c7a1a..d44be9c 100644 --- a/app/(api)/_datalib/_services/Playlists.ts +++ b/app/(api)/_datalib/_services/Playlists.ts @@ -1,5 +1,6 @@ import prisma from '../_prisma/client'; import { PlaylistInput } from '@datatypes/Playlist'; +import revalidateCache from '@actions/revalidateCache'; export default class Playlists { // CREATE @@ -11,6 +12,7 @@ export default class Playlists { name, }, }); + revalidateCache(['playlists']); return playlist; } @@ -32,6 +34,7 @@ export default class Playlists { songId, }, }); + revalidateCache(['playlists', 'songs']); return true; } catch (e) { return false; @@ -54,7 +57,7 @@ export default class Playlists { }, }, }); - + revalidateCache(['playlists', 'songs']); return songs; } } diff --git a/app/(api)/_datalib/_services/Songs.ts b/app/(api)/_datalib/_services/Songs.ts index 369c543..46950bc 100644 --- a/app/(api)/_datalib/_services/Songs.ts +++ b/app/(api)/_datalib/_services/Songs.ts @@ -1,5 +1,6 @@ import prisma from '../_prisma/client'; import { SongInput } from '@datatypes/Song'; +import revalidateCache from '@actions/revalidateCache'; export default class Songs { // CREATE @@ -10,6 +11,7 @@ export default class Songs { name, }, }); + revalidateCache(['songs']); return song; } diff --git a/app/(api)/_datalib/_services/Users.ts b/app/(api)/_datalib/_services/Users.ts index 44ab747..a5bcf7d 100644 --- a/app/(api)/_datalib/_services/Users.ts +++ b/app/(api)/_datalib/_services/Users.ts @@ -1,5 +1,6 @@ import { UserInput } from '@datatypes/User'; import prisma from '../_prisma/client'; +import revalidateCache from '@actions/revalidateCache'; export default class Users { // CREATE @@ -10,6 +11,7 @@ export default class Users { name, }, }); + revalidateCache(['users']); return user; } @@ -42,6 +44,7 @@ export default class Users { }, data: input, }); + revalidateCache(['users']); return user; } catch (e) { return null; @@ -56,6 +59,7 @@ export default class Users { id, }, }); + revalidateCache(['users']); return true; } catch (e) { return false; diff --git a/app/(pages)/_utils/sendApolloRequest.ts b/app/(pages)/_utils/sendApolloRequest.ts index ccd2c7d..74c00cd 100644 --- a/app/(pages)/_utils/sendApolloRequest.ts +++ b/app/(pages)/_utils/sendApolloRequest.ts @@ -4,8 +4,7 @@ import handleApolloRequest from '@actions/handleApolloRequest'; export default async function sendApolloRequest( query: DocumentNode, - variables: object, - revalidateCache?: { path?: string; type?: 'page' | 'layout'; tag?: string } + variables: object ) { - return handleApolloRequest(print(query), variables, revalidateCache); + return handleApolloRequest(print(query), variables); } diff --git a/app/(pages)/graphql-example/_components/Example/ExampleClientComponent.tsx b/app/(pages)/graphql-example/_components/Example/ExampleClientComponent.tsx index fde0275..1cf7889 100644 --- a/app/(pages)/graphql-example/_components/Example/ExampleClientComponent.tsx +++ b/app/(pages)/graphql-example/_components/Example/ExampleClientComponent.tsx @@ -16,9 +16,9 @@ const query = gql` // Example IDs const variables = { ids: [ - '7bae85c0-7862-4d8e-b991-41c73d51936d', - '9e327de1-38f1-4324-9427-48ec9a670ca3', - '47ca283a-2178-4760-814f-7f847f580af3', + // '7bae85c0-7862-4d8e-b991-41c73d51936d', + // '9e327de1-38f1-4324-9427-48ec9a670ca3', + // '47ca283a-2178-4760-814f-7f847f580af3', ], }; diff --git a/app/(pages)/graphql-example/_components/Example/ExampleServerComponent.tsx b/app/(pages)/graphql-example/_components/Example/ExampleServerComponent.tsx index af4e658..369691c 100644 --- a/app/(pages)/graphql-example/_components/Example/ExampleServerComponent.tsx +++ b/app/(pages)/graphql-example/_components/Example/ExampleServerComponent.tsx @@ -13,9 +13,9 @@ const query = gql` // Example IDs const variables = { ids: [ - '7bae85c0-7862-4d8e-b991-41c73d51936d', - '9e327de1-38f1-4324-9427-48ec9a670ca3', - '47ca283a-2178-4760-814f-7f847f580af3', + // '7bae85c0-7862-4d8e-b991-41c73d51936d', + // '9e327de1-38f1-4324-9427-48ec9a670ca3', + // '47ca283a-2178-4760-814f-7f847f580af3', ], }; diff --git a/tsconfig.json b/tsconfig.json index 0655406..48a6eb0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -29,6 +29,7 @@ "@actions/*": ["./app/(api)/_actions/*"], "@datalib/*": ["./app/(api)/_datalib/*"], "@datatypes/*": ["./app/(api)/_types/*"], + "@cache/*": ["./app/(api)/_cache/*"], } }, "include": ["nextEnv.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],