const apollo = new ApolloServer({
resolvers,
typeDefs,
uploads: false,
context: async ({ req }) => {
return { loggedInUser: await getUser(req.headers.token) };
},
});
Query, Mutation, computed fields를 처리해주는 resolvers와 typeDefs을 넣어준다.(resolvers와 typeDefs는 schema.js에서 export된 것 으로, 존재하는 모든 resolver와 typeDef들을 불러온 후, merged 된 형태이다.)
uploads는 apollo server에서 파일 업로드를 위해 기본으로 제공되는 건데 오류를 많이 일으켜서 false로 설정하고, grapql-upload 모듈을 따로 설치해서 이용한다.
context는 모든 resolver에서 접근 할 수 있는 변수로 활용이 가능하다. 이것을 login에 활용하면, user가 login할 때 backend는 token을 발급하고, frontend에서 이 token을 http header에 token이라는 변수로 backend에 보내면 따로 정의한 getUser() 함수로 user를 식별한다.
스키마에 정의한 것과 같이, User를 이렇게 정의해주었다.
type User {
id: Int!
name: String!
username: String!
email: String!
password: String!
bio: String
avatar: String
isMe: Boolean!
createdAt: String!
updatedAt: String!
}
여기서 isMe는 로그인된 유저가 어떤 유저의 정보를 볼 때 본인인지(본인이라면 프로필이나 게시물을 수정 가능) 아닌지 구분하기 위한 computed fields로, 실제 db에 저장되는 것은 아니다.
따라서 따로 resolver를 만들어 isMe가 어떻게 계산될 것인지 정의해주는데, 이와 같이 정의했다.
User: {
isMe: ({ id }, _, { loggedInUser }) => {
if (loggedInUser) return id === loggedInUser.id;
else return false;
},
},
createAccount(
username: String!
email: String!
password: String!
name: String!
avatar: Upload
bio: String
): MutationResult!
type MutationResult {
ok: Boolean!
error: String
}
mutation이 성공적이면 ok : true, 실패하면 ok : false, error: "에러 내용"을 return 한다.
resolver는 일단 username과 email을 검색해서 이미 사용중이면 Error를 던진다.
-> 사용중이 아니라면 ?
const uglyPassword = await bcrypt.hash(password, 10);
bcrypt로 password를 hashing한다. 그리고,
await client.user.create({
data: {
username,
email,
name,
bio,
password: uglyPassword,
},
});
prisma client로 새로운 유저 생성!(password는 반드시 hashing된 password로 저장) 그리고 ok: true를 return하면 끝이다!
-> 만약 문제가 생겼다면 ?
catch (e) {
return {
ok: false,
error: "Can't create account.",
};
}
에러를 catch하고 에러 메시지를 return 해준다.