Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Typescriptで始めるGraphQL入門_LG勉強会.pdf

 Typescriptで始めるGraphQL入門_LG勉強会.pdf

Avatar for るりいろぼうや

るりいろぼうや

July 10, 2025
Tweet

More Decks by るりいろぼうや

Other Decks in Technology

Transcript

  1. ۩ମతͳҧ͍ • ΫϥΠΞϯτओಋͰඞཁͳ৘ใ͚ͩΛऔಘ • RailsͷREST APIͩͱɺ/users/1 → ݻఆͷJSON͕ؼͬͯ͘Δͷʹରͯ͠GraphQL͸ΫϥΠ Ξϯτ͕{ user(id:1)

    { id, name, posts { title } } } ͷΑ͏ʹɺʮͲͷϑΟʔϧυ͕΄͍͔͠ʯ Λࣗ༝ʹهड़Ͱ͖Δ • ୯ҰΤϯυϙΠϯτ & ౷Ұతͳૢ࡞Ϟσϧ • Rails ͷίϯτϩʔϥ×HTTPϝιουʢGET/POST/PUT/DELETEʣͰଟ਺ͷΤϯυϙΠϯ τΛ؅ཧ͢Δ୅ΘΓʹɺGraphQL ͸جຊతʹ /graphql 1͚ͭͩ
  2. PrismaͷεΩʔϚ model Todo { id Int @id @default(autoincrement()) title String

    completed Boolean @default(false) createdAt DateTime @default(now()) }
  3. GraphQL εΩʔϚఆٛ export const schema = ` type Todo {

    id: Int! title: String! completed: Boolean! createdAt: String! } type Query { todos: [Todo!]! } type Mutation { addTodo(title: String!): Todo! toggleTodo(id: Int!): Todo! deleteTodo(id: Int!): Boolean! } `; ɾʮʂʯ͸ඞਢΧϥϜ ɾܕఆٛͱ۩ମతͳૢ࡞Λ QueryͱMutationͰఆٛ
  4. QueryͱMutationͱ͸ • Query • CRUDͷRʢREADʣΛ୲౰ • RESTͰ͍͏ͱGET • Mutation •

    CRUDͷCʢCreateʣ, UʢUpdateʣ, DʢDELETEʣΛ୲౰ • RESTͰ͍͏ͱPOST/PUT/PATCH/DELETE͋ͨΓ • Subscription • αʔόʔͷߋ৽ΛϦΞϧλΠϜͰ௨஌ʢྫɿଞਓͷૢ࡞Λଈ࣌มߋʣ • ࠓճ͸࢖Θͳ͍
  5. ۩ମతͳ࣮૷ const rootResolver: RootResolver = () => ({ todos: async

    () => { const todos = await prisma.todo.findMany({ orderBy: { createdAt: 'desc' } }); return todos.map(todo => ({ ...todo, createdAt: formatDate(todo.createdAt), })); }, addTodo: async ({ title }: { title: string }) => { const todo = await prisma.todo.create({ data: { title } }); return { ...todo, createdAt: formatDate(todo.createdAt), }; }, toggleTodo: async ({ id }: { id: number }) => { const todo = await prisma.todo.findUnique({ where: { id } }); if (!todo) throw new Error('Not found'); const updated = await prisma.todo.update({ where: { id }, data: { completed: !todo.completed }, }); return { ...updated, createdAt: formatDate(updated.createdAt), }; }, deleteTodo: async ({ id }: { id: number }) => { const todo = await prisma.todo.findUnique({ where: { id } }); if (!todo) return false; await prisma.todo.delete({ where: { id } }); return true; }, });