export const protectedResolver =
(ourResolver) => (root, args, context, info) => {
const { loggedInUser } = context;
if (!loggedInUser) {
const query = info.operation.operation === "query";
if (query) {
return null;
}
return {
ok: false,
error: "User's not logged in",
};
}
return ourResolver(root, args, context, info);
};
실제 Mutation에서 실행될 Resolver가 작동하기 전에, protecedResolver 함수가 작동한다.
먼저 Apollo Server에서 http header의 token을 해석해서(이것은 jwt를 이용) loggedInUser라는 이름으로 context에 들어간 상태이다.
protecedResolver 함수는 context를 읽고 loggedInUser가 존재하지 않는 경우(token이 손상됐거나 비로그인 상태인 경우), info에서 client가 어떤 요청을 했는지(Query or Mutation)보고, query면 null을 return하고 mutation이면 ok: false와 에러 메시지를 return 한다.
loggedInUser가 존재하면 실제 Mutation에서 실행될 Resolver(ourResolver)함수를 실행해준다.
user가 자신의 정보를 수정하고 싶다. 이 경우에 loggedInUser가 자신이라는 것을 잘 식별해줘야 하기 때문에 protectedResolver를 활용해야한다.
editProfile: protectedResolver(
async (
_,
{ email, password: newPassword, name, avatar, bio },
{ loggedInUser }
) => {
try {
{코드 생략...}
await client.user.update({
where: {
id: loggedInUser.id,
},
data: {
email,
name,
...(newAvatar && { avatar: newAvatar }),
bio,
...(uglyPassword && { password: uglyPassword }),
},
});
return {
ok: true,
};
} catch (e) {
return {
ok: false,
error: e.message,
};
}
}
),