Chapter 09

Queryのリゾルバを実装する

Eringi_V3
Eringi_V3
2021.09.20に更新

次にQueryのリゾルバを実装していきます。

GetTodoById

src/resolvers/query/getTodoById.ts
import { prisma } from '../../lib/prisma';
import { QueryResolvers } from '../../types/generated/graphql';

export const getTodoById: QueryResolvers['getTodoById'] = async (
  parent,
  args,
  context,
  info
) => {
  const todo = await prisma.todo.findUnique({
    where: {
      id: args.id,
    },
    include: {
      user: true,
    },
  });
  if (!todo) {
    throw new Error('Not Found Todo.');
  }
  return { ...todo };
};

GetTodos

src/resolvers/query/getTodos.ts
import { prisma } from '../../lib/prisma';
import { QueryResolvers } from '../../types/generated/graphql';

export const getTodos: QueryResolvers['getTodos'] = async (
  parent,
  args,
  context,
  info
) => {
  const todos = await prisma.todo.findMany({
    where: {
      userId: context.user?.id,
    },
    include: {
      user: true,
    },
  });
  return todos;
};

GetUser

src/resolvers/query/getUser.ts
import { prisma } from '../../../src/lib/prisma';
import { QueryResolvers } from '../../types/generated/graphql';

export const getUser: QueryResolvers['getUser'] = async (
  parent,
  args,
  context,
  info
) => {
  const user = await prisma.user.findUnique({
    where: {
      id: context.user?.id,
    },
  });
  return user;
};

mutationと同様に、まとめて再exportします。

src/resolvers/query/index.ts
export { getTodoById } from './getTodoById';
export { getTodos } from './getTodos';
export { getUser } from './getUser';
src/resolvers/index.ts
import { Resolvers } from '../types/generated/graphql';
import * as mutation from './mutation';
import * as query from './query';
import { dateScalar } from './scalar/date';

const resolvers: Resolvers = {
  Query: query,
  Mutation: mutation,
  Date: dateScalar,
};

export default resolvers;

これでQueryのリゾルバの実装まで完了しました!
アプリケーションとしてはこれで完成となります。

フロントエンドからTodoを操作してみましょう。
データが永続化され、アプリケーションとして完成されていることが確認できます。

完成時点のソースコード

https://github.com/EringiV3/apollo-server-prisma-todo-app