Schema
type User {
id: ID!
email: String!
createdAt: String!
token: String
issues: [Issue]! # add issues field
}
input IssuesFilterInput {
statuses: [IssueStatus]
}
type Query {
me: User
issues(input: IssuesFilterInput): [Issue]! # add issues query
}
Resolvers
const resolvers = {
User: {
issues: (user, args, ctx) => {
if (!ctx.user)
throw new GraphQLError('UNAUTHORIZED', { extensions: { code: 401 } })
return db.query.issues.findMany({
where: eq(issues.userId, user.id),
})
},
},
Query: {
issues: async (
_,
{
input,
}: {
input?: {
statuses?: SelectIssues['status'][]
projects?: SelectIssues['projectId'][]
}
},
ctx: GQLContext
) => {
if (!ctx.user)
throw new GraphQLError('UNAUTHORIZED', { extensions: { code: 401 } })
const andFilters = [eq(issues.userId, ctx.user.id)]
if (input && input.statuses && input.statuses.length) {
const statusFilters = input.statuses.map((status) =>
eq(issues.status, status)
)
andFilters.push(or(...statusFilters))
}
const data = await db.query.issues.findMany({
where: and(...andFilters),
orderBy: [
asc(sql`case ${issues.status}
when "backlog" then 1
when "inprogress" then 2
when "done" then 3
end`),
desc(issues.createdAt),
],
})
return data
},
}
}