Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions src/schema.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ const {
UserConnection, UserFieldFilter, UserFieldOrder, UserMutations, User,
} = require('./schema/user');
const {
Post, PostMutations,
PostFieldFilter, PostFieldOrder, Post, PostConnection, PostMutations,
} = require('./schema/post');
const {
CommentFieldFilter, CommentFieldOrder, Comment, CommentConnection,
Expand Down Expand Up @@ -60,8 +60,16 @@ const queryType = new GraphQLObjectType({
},
resolve: (_, args) => resolveQuery({ table: 'users', args }),
},
// TODO: TASK 2. posts query
// posts: {}
posts: {
type: PostConnection,
args: {
filters: { type: new GraphQLList(PostFieldFilter) },
order: { type: PostFieldOrder },
limit: { type: GraphQLInt },
offset: { type: GraphQLInt },
},
resolve: (_, args) => resolveQuery({ table: 'posts', args }),
},
comments: {
type: CommentConnection,
args: {
Expand Down
27 changes: 13 additions & 14 deletions src/schema/comment.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ const { get } = require('lodash');

const { resolveQuery } = require('../fetcher');
const {
Node, PageInfo, FilterOperation, OrderDirection,
Node, PageInfo, FilterOperation, OrderDirection, Datetime,
} = require('./common');

const CommentArgField = new GraphQLEnumType({
Expand Down Expand Up @@ -41,14 +41,13 @@ const CommentFieldOrder = new GraphQLInputObjectType({
},
});

// TODO: TASK 2. uncomment post when TASK 2. is finished
const Comment = new GraphQLObjectType({
name: 'Comment',
interfaces: [Node],
isTypeOf: (value) => value instanceof Object,
fields: () => {
const { User } = require('./user');
// const { Post } = require('./post');
const { Post } = require('./post');
return {
id: { type: GraphQLID },
content: { type: GraphQLString },
Expand All @@ -62,17 +61,17 @@ const Comment = new GraphQLObjectType({
return get(resp, 'edges[0].node', {});
},
},
// post: {
// type: Post,
// resolve: async (parent) => {
// const resp = await resolveQuery({
// table: 'posts',
// args: { filters: [{ field: 'id', operation: '=', value: parent.post }] },
// });
// return get(resp, 'edges[0].node', {});
// },
// },
// timestamp: { type: Datetime },
post: {
type: Post,
resolve: async (parent) => {
const resp = await resolveQuery({
table: 'posts',
args: { filters: [{ field: 'id', operation: '=', value: parent.post }] },
});
return get(resp, 'edges[0].node', {});
},
},
timestamp: { type: Datetime },
};
},
});
Expand Down
100 changes: 92 additions & 8 deletions src/schema/post.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,108 @@ const {
GraphQLObjectType,
GraphQLString,
GraphQLID,
GraphQLInt,
GraphQLEnumType,
GraphQLList,
GraphQLInputObjectType,
GraphQLNonNull,
} = require('graphql');
const { get } = require('lodash');

const { createPost } = require('../fetcher');
const { resolveQuery, createPost } = require('../fetcher');
const {
Node, PageInfo, FilterOperation, OrderDirection, Datetime,
} = require('./common');
const { CommentConnection, CommentFieldFilter, CommentFieldOrder } = require('./comment');

const PostArgField = new GraphQLEnumType({
name: 'PostArgField',
values: {
id: { value: 'id' },
content: { value: 'content' },
title: { value: 'title' },
description: { value: 'description' },
author: { value: 'author' },
timestamp: { value: 'timestamp' },
},
});

const PostFieldFilter = new GraphQLInputObjectType({
name: 'PostFieldFilter',
fields: {
value: { type: GraphQLString },
field: { type: PostArgField },
operation: { type: FilterOperation },
},
});

const PostFieldOrder = new GraphQLInputObjectType({
name: 'PostFieldOrder',
fields: {
field: { type: PostArgField },
direction: { type: OrderDirection },
},
});

// TODO: TASK 2. Post schemas
const PostArgField = {};
const PostFieldFilter = {};
const PostFieldOrder = {};
const Post = new GraphQLObjectType({
name: 'Post',
interfaces: [Node],
isTypeOf: (value) => value instanceof Object,
fields: () => {
const { User } = require('./user');
return {
id: { type: GraphQLID },
title: { type: GraphQLString },
description: { type: GraphQLString },
content: { type: GraphQLString },
author: {
type: User,
resolve: async (parent) => {
const resp = await resolveQuery({
table: 'users',
args: { filters: [{ field: 'email', operation: '=', value: parent.author }] },
});
return get(resp, 'edges[0].node', {});
},
},
timestamp: { type: Datetime },
comments: {
type: CommentConnection,
args: {
filters: { type: new GraphQLList(CommentFieldFilter) },
order: { type: CommentFieldOrder },
limit: { type: GraphQLInt },
offset: { type: GraphQLInt },
},
resolve: (parent, args) => resolveQuery({
table: 'comments',
args: {
...args,
filters: [
...get(args, 'filters', []).filter((filter) => filter.field !== 'post'),
{ field: 'post', operation: '=', value: parent.id },
],
},
}),
},
};
},
});

const PostEdge = new GraphQLObjectType({
name: 'PostEdge',
fields: {
node: { type: Post },
},
});

const PostConnection = new GraphQLObjectType({
name: 'PostConnection',
fields: {
id: { type: GraphQLID },
pageInfo: { type: PageInfo },
edges: { type: new GraphQLList(PostEdge) },
},
});
const PostEdge = {};
const PostConnection = {};

const CreatePostInput = new GraphQLInputObjectType({
name: 'CreatePostInput',
Expand Down
41 changes: 20 additions & 21 deletions src/schema/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const { resolveQuery, createUser } = require('../fetcher');
const {
Node, PageInfo, FilterOperation, OrderDirection,
} = require('./common');
// const { PostConnection, PostFieldFilter, PostFieldOrder } = require('./post');
const { PostConnection, PostFieldFilter, PostFieldOrder } = require('./post');
const { CommentConnection, CommentFieldFilter, CommentFieldOrder } = require('./comment');

const UserArgField = new GraphQLEnumType({
Expand Down Expand Up @@ -44,7 +44,6 @@ const UserFieldOrder = new GraphQLInputObjectType({
},
});

// TODO: TASK 2. uncomment posts when TASK 2. is finished
const User = new GraphQLObjectType({
name: 'User',
interfaces: [Node],
Expand All @@ -54,25 +53,25 @@ const User = new GraphQLObjectType({
name: { type: GraphQLString },
username: { type: GraphQLString },
email: { type: GraphQLString },
// posts: {
// type: PostConnection,
// args: {
// filters: { type: new GraphQLList(PostFieldFilter) },
// order: { type: PostFieldOrder },
// limit: { type: GraphQLInt },
// offset: { type: GraphQLInt },
// },
// resolve: (parent, args) => resolveQuery({
// table: 'posts',
// args: {
// ...args,
// filters: [
// ...get(args, 'filters', []).filter((filter) => filter.field !== 'author'),
// { field: 'author', operation: '=', value: parent.email },
// ],
// },
// }),
// },
posts: {
type: PostConnection,
args: {
filters: { type: new GraphQLList(PostFieldFilter) },
order: { type: PostFieldOrder },
limit: { type: GraphQLInt },
offset: { type: GraphQLInt },
},
resolve: (parent, args) => resolveQuery({
table: 'posts',
args: {
...args,
filters: [
...get(args, 'filters', []).filter((filter) => filter.field !== 'author'),
{ field: 'author', operation: '=', value: parent.email },
],
},
}),
},
comments: {
type: CommentConnection,
args: {
Expand Down
6 changes: 3 additions & 3 deletions src/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ const cors = require('cors');
const db = require('./db');

// Graphql Types - cut rootValue from graphqlHTTP when used
// const schema = require('./schema');
const schema = require('./schema');
const config = require('./config');

// Raw Graphql schema language - add rootValue from graphqlHTTP when used
const { schema, rootValue } = require('./gqlSchema');
// const { schema, rootValue } = require('./gqlSchema');

const app = express();

Expand All @@ -26,7 +26,7 @@ app.use(cors({

app.use('/graphql', graphqlHTTP(async () => ({
schema,
rootValue,
// rootValue,
graphiql: true,
customFormatErrorFn: (error) => {
// eslint-disable-next-line no-console
Expand Down