From 37e3b40120e7b2cd7912aea9202471b62fe8c3d9 Mon Sep 17 00:00:00 2001 From: Mari Zhevagin Date: Thu, 15 Oct 2026 11:59:29 +0200 Subject: [PATCH] fikset forfatter av oppskrift og at det kommer opp i min side --- client/src/graphql/profile.ts | 15 ++++++++++ client/src/routes/ProfilePage.tsx | 37 +++++++++++++++++-------- client/src/routes/RegisterPage.tsx | 2 +- client/src/routes/TestUserLoginPage.tsx | 2 +- server/src/schema/resolvers/recipe.ts | 12 ++++++-- server/src/schema/resolvers/user.ts | 9 ++++++ server/src/schema/typeDefs/user.graphql | 2 ++ 7 files changed, 63 insertions(+), 16 deletions(-) create mode 100644 client/src/graphql/profile.ts diff --git a/client/src/graphql/profile.ts b/client/src/graphql/profile.ts new file mode 100644 index 0000000..e885df6 --- /dev/null +++ b/client/src/graphql/profile.ts @@ -0,0 +1,15 @@ +import { gql, type TypedDocumentNode } from '@apollo/client'; +import type { Recipe } from '../types/recipe'; + +// oppskriftene innlogget bruker har laget +export const MY_RECIPES: TypedDocumentNode<{ myRecipes: Recipe[] }> = gql` + query MyRecipes { + myRecipes { + id + imageUrl + title + prepTimeMinutes + servings + } + } +`; diff --git a/client/src/routes/ProfilePage.tsx b/client/src/routes/ProfilePage.tsx index 98d8c9a..649c85c 100644 --- a/client/src/routes/ProfilePage.tsx +++ b/client/src/routes/ProfilePage.tsx @@ -3,6 +3,9 @@ import { Link, useNavigate } from 'react-router'; import { Button } from '../components/ui/Button'; import { PreferencesForm } from '../components/profile/PreferencesForm'; import { useCurrentUser } from '../lib/useCurrentUser'; +import { useQuery } from '@apollo/client/react'; +import { RecipeList } from '../components/recipe/RecipeList'; +import { MY_RECIPES } from '../graphql/profile'; type Tab = 'preferences' | 'favorites' | 'shared' | 'sharedWithMe'; type RecipeTab = Exclude; @@ -37,10 +40,16 @@ export default function ProfilePage() { const navigate = useNavigate(); const [activeTab, setActiveTab] = useState('preferences'); + // oppskriftene brukeren har laget og den henter på nytt hver gang siden åpnes på nytt + const { data: myRecipesData } = useQuery(MY_RECIPES, { + fetchPolicy: 'cache-and-network', + }); + // RequireAuth sørger for at user finnes if (!user) return null; const isGuest = user.authProvider === 'GUEST'; + const myRecipes = myRecipesData?.myRecipes ?? []; // på desktop vises preferanser alltid til venstre, så høyre side viser favoritter i stedet const desktopTab: RecipeTab = @@ -80,7 +89,7 @@ export default function ProfilePage() { {/* TODO: hent ekte tall fra backend */}
    {[ - { count: 0, label: 'mine oppskrifter' }, + { count: myRecipes.length, label: 'mine oppskrifter' }, { count: 0, label: 'favoritter' }, { count: 0, label: 'delte' }, { count: 0, label: 'delt med deg' }, @@ -199,17 +208,21 @@ export default function ProfilePage() { ))} -
    -

    {RECIPE_TABS[desktopTab].empty}

    - {desktopTab === 'favorites' && ( - - Utforsk oppskrifter - - )} -
    + {desktopTab === 'shared' && myRecipes.length > 0 ? ( + + ) : ( +
    +

    {RECIPE_TABS[desktopTab].empty}

    + {desktopTab === 'favorites' && ( + + Utforsk oppskrifter + + )} +
    + )} ); diff --git a/client/src/routes/RegisterPage.tsx b/client/src/routes/RegisterPage.tsx index 7d00bd4..4bca1ec 100644 --- a/client/src/routes/RegisterPage.tsx +++ b/client/src/routes/RegisterPage.tsx @@ -113,7 +113,7 @@ export default function RegisterPage() { {error && ( -

    +

    {error}

    )} diff --git a/client/src/routes/TestUserLoginPage.tsx b/client/src/routes/TestUserLoginPage.tsx index 8bf2729..6302fd6 100644 --- a/client/src/routes/TestUserLoginPage.tsx +++ b/client/src/routes/TestUserLoginPage.tsx @@ -83,7 +83,7 @@ export default function TestUserLoginPage() { {error && ( -

    +

    {error}

    )} diff --git a/server/src/schema/resolvers/recipe.ts b/server/src/schema/resolvers/recipe.ts index cc71891..0fcda32 100644 --- a/server/src/schema/resolvers/recipe.ts +++ b/server/src/schema/resolvers/recipe.ts @@ -1,4 +1,6 @@ import { prisma } from '../../db/client'; +import { GraphQLError } from 'graphql'; +import type { Context } from '../../auth/session'; export const recipeResolvers = { Query: { @@ -24,13 +26,19 @@ export const recipeResolvers = { }, }, Mutation: { - createRecipe: async (_: unknown, args: { input: any }) => { + createRecipe: async (_: unknown, args: { input: any }, context: Context) => { + // gjøre sånn at bare innloggede brukere og gjestebrukere kan lage oppskrift + if (!context.userId) { + throw new GraphQLError('Du må være logget inn for å lage oppskrift.', { + extensions: { code: 'UNAUTHENTICATED' }, + }); + } const { ingredients, steps, tagNames, ...rest } = args.input; return prisma.recipe.create({ data: { ...rest, status: 'PUBLISHED', - authorId: 'dev-user', // bytt ut når Person 2 har auth klart + authorId: context.userId, ingredients: { create: ingredients }, steps: { create: steps }, tags: tagNames diff --git a/server/src/schema/resolvers/user.ts b/server/src/schema/resolvers/user.ts index e454e67..edd70d4 100644 --- a/server/src/schema/resolvers/user.ts +++ b/server/src/schema/resolvers/user.ts @@ -20,6 +20,15 @@ export const userResolvers = { if (!context.userId) return null; return prisma.user.findUnique({ where: { id: context.userId } }); }, + // oppskriftenen innlogget bruker har laget, der nyest vises først + myRecipes: async (_: unknown, __: unknown, context: Context) => { + if (!context.userId) return []; + return prisma.recipe.findMany({ + where: { authorId: context.userId }, + orderBy: { createdAt: 'desc' }, + include: { ingredients: true, steps: true, tags: true }, + }); + }, }, Mutation: { diff --git a/server/src/schema/typeDefs/user.graphql b/server/src/schema/typeDefs/user.graphql index ebeb36c..c60f6d9 100644 --- a/server/src/schema/typeDefs/user.graphql +++ b/server/src/schema/typeDefs/user.graphql @@ -10,6 +10,8 @@ type User { extend type Query { # innlogget bruker og null hvis ingen er logget inn me: User + # oppskrifter innlogget bruker har laget + myRecipes: [Recipe!]! } extend type Mutation {