Skip to content

Commit

Permalink
codegen update
Browse files Browse the repository at this point in the history
  • Loading branch information
gilgardosh committed Nov 11, 2024
1 parent 2b5ebfb commit ddbd3e9
Show file tree
Hide file tree
Showing 16 changed files with 412 additions and 261 deletions.
2 changes: 2 additions & 0 deletions examples/hackernews/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,5 @@ node_modules
.env
prisma/migrations/migration_lock.toml
prisma/*.db*
# Ignore codegen auto-generated files
*.generated.*
File renamed without changes.
14 changes: 9 additions & 5 deletions examples/hackernews/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,26 @@
"keywords": [],
"scripts": {
"check": "tsc --pretty --noEmit",
"codegen": "graphql-codegen",
"dev": "cross-env NODE_ENV=development ts-node-dev --exit-child --respawn src/main.ts",
"migrate": "prisma migrate dev",
"postinstall": "prisma generate",
"postinstall": "pnpm run prisma:generate && pnpm run codegen",
"precheck": "pnpm run codegen",
"prisma:generate": "prisma generate",
"start": "ts-node src/main.ts"
},
"dependencies": {
"graphql": "16.6.0",
"graphql-yoga": "workspace:*"
},
"devDependencies": {
"@prisma/client": "5.13.0",
"@prisma/internals": "5.13.0",
"@prisma/migrate": "5.13.0",
"@eddeee888/gcg-typescript-resolver-files": "0.10.4",
"@graphql-codegen/cli": "5.0.2",
"@prisma/client": "5.20.0",
"@prisma/migrate": "5.20.0",
"@types/node": "20.14.12",
"cross-env": "7.0.3",
"prisma": "5.13.0",
"prisma": "5.20.0",
"ts-node": "10.9.1",
"ts-node-dev": "2.0.0",
"typescript": "5.5.4"
Expand Down
178 changes: 3 additions & 175 deletions examples/hackernews/src/schema.ts
Original file line number Diff line number Diff line change
@@ -1,181 +1,9 @@
import { createSchema } from 'graphql-yoga';
import { Prisma, type Link } from '@prisma/client';
import type { GraphQLContext } from './context';
import { GraphQLError } from 'graphql';
import { resolvers } from './schema/resolvers.generated';
import { typeDefs } from './schema/typeDefs.generated';

const typeDefinitions = /* GraphQL */ `
type Link {
id: ID!
description: String!
url: String!
comments: [Comment!]!
}
type Comment {
id: ID!
body: String!
link: Link
}
type Query {
info: String!
feed(filterNeedle: String, skip: Int, take: Int): [Link!]!
comment(id: ID!): Comment
link(id: ID!): Link
}
type Mutation {
postLink(url: String!, description: String!): Link!
postCommentOnLink(linkId: ID!, body: String!): Comment!
}
`;

const parseIntSafe = (value: string): number | null => {
if (/^(\d+)$/.test(value)) {
return parseInt(value, 10);
}
return null;
};

const applySkipConstraints = (value: number) => {
if (value < 0) {
throw new GraphQLError(`'skip' argument value '${value}' is invalid, value must be positive.`);
}
return value;
};

const applyTakeConstraints = (params: { min: number; max: number; value: number }) => {
if (params.value < params.min || params.value > params.max) {
throw new GraphQLError(
`'take' argument value '${params.value}' is outside the valid range of '${params.min}' to '${params.max}'.`,
);
}
return params.value;
};

const resolvers = {
Query: {
info: () => `This is the API of a Hackernews Clone`,
feed: async (
parent: unknown,
args: { filterNeedle?: string; skip?: number; take?: number },
context: GraphQLContext,
) => {
const where = args.filterNeedle
? {
OR: [
{ description: { contains: args.filterNeedle } },
{ url: { contains: args.filterNeedle } },
],
}
: {};

const take = applyTakeConstraints({
min: 1,
max: 50,
value: args.take ?? 30,
});

const skip = applySkipConstraints(args.skip ?? 0);

return context.prisma.link.findMany({
where,
skip,
take,
});
},
comment: async (parent: unknown, args: { id: string }, context: GraphQLContext) => {
return context.prisma.comment.findUnique({
where: { id: parseInt(args.id) },
});
},
link: async (parent: unknown, args: { id: string }, context: GraphQLContext) => {
return context.prisma.link.findUnique({
where: { id: parseInt(args.id) },
});
}
},
Link: {
id: (parent: Link) => parent.id,
description: (parent: Link) => parent.description,
url: (parent: Link) => parent.url,
comments: (parent: Link, _: unknown, context: GraphQLContext) => {
return context.prisma.comment.findMany({
where: {
linkId: parent.id,
},
});
},
},
Mutation: {
postLink: async (
parent: unknown,
args: { description: string; url: string },
context: GraphQLContext,
) => {
const newLink = await context.prisma.link.create({
data: {
url: args.url,
description: args.description,
},
});
return newLink;
},
postCommentOnLink: async (
parent: unknown,
args: { linkId: string; body: string },
context: GraphQLContext,
) => {
const linkId = parseIntSafe(args.linkId);
if (linkId === null) {
return Promise.reject(
new GraphQLError(`Cannot post common on non-existing link with id '${args.linkId}'.`),
);
}

if (!args.body || args.body.trim().length === 0) {
return Promise.reject(new GraphQLError(`Comment body cannot be empty.`));
}

const newComment = await context.prisma.comment
.create({
data: {
body: args.body,
linkId,
},
})
.catch((err: unknown) => {
if (err instanceof Prisma.PrismaClientKnownRequestError && err.code === 'P2003') {
return Promise.reject(
new GraphQLError(
`Cannot post common on non-existing link with id '${args.linkId}'.`,
),
);
}
return Promise.reject(err);
});

return newComment;
},
},
Comment: {
id: (parent: { id: number }) => parent.id,
body: (parent: { body: string }) => parent.body,
link: async (parent: { linkId: number }, _: unknown, context: GraphQLContext) => {
if (!parent.linkId) {
return null;
}

return context.prisma.link.findUnique({
where: {
id: parent.linkId,
},
});
},
}
};

export const schema = createSchema({
resolvers: [resolvers],
typeDefs: [typeDefinitions],
typeDefs: [typeDefs],
});
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@ export const Comment: CommentResolvers = {
id: parent.linkId,
},
});
},
}
};
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@ export const Link: LinkResolvers = {
linkId: parent.id,
},
});
},
}
};
File renamed without changes.
Loading

0 comments on commit ddbd3e9

Please sign in to comment.