diff --git a/backend/src/middleware/dateTimeMiddleware.js b/backend/src/middleware/dateTimeMiddleware.js index 473dbf444..73b75070c 100644 --- a/backend/src/middleware/dateTimeMiddleware.js +++ b/backend/src/middleware/dateTimeMiddleware.js @@ -1,44 +1,21 @@ +const setCreatedAt = (resolve, root, args, context, info) => { + args.createdAt = (new Date()).toISOString() + return resolve(root, args, context, info) +} +const setUpdatedAt = (resolve, root, args, context, info) => { + args.updatedAt = (new Date()).toISOString() + return resolve(root, args, context, info) +} + export default { Mutation: { - CreateUser: async (resolve, root, args, context, info) => { - args.createdAt = (new Date()).toISOString() - const result = await resolve(root, args, context, info) - return result - }, - CreatePost: async (resolve, root, args, context, info) => { - args.createdAt = (new Date()).toISOString() - const result = await resolve(root, args, context, info) - return result - }, - CreateComment: async (resolve, root, args, context, info) => { - args.createdAt = (new Date()).toISOString() - const result = await resolve(root, args, context, info) - return result - }, - CreateOrganization: async (resolve, root, args, context, info) => { - args.createdAt = (new Date()).toISOString() - const result = await resolve(root, args, context, info) - return result - }, - UpdateUser: async (resolve, root, args, context, info) => { - args.updatedAt = (new Date()).toISOString() - const result = await resolve(root, args, context, info) - return result - }, - UpdatePost: async (resolve, root, args, context, info) => { - args.updatedAt = (new Date()).toISOString() - const result = await resolve(root, args, context, info) - return result - }, - UpdateComment: async (resolve, root, args, context, info) => { - args.updatedAt = (new Date()).toISOString() - const result = await resolve(root, args, context, info) - return result - }, - UpdateOrganization: async (resolve, root, args, context, info) => { - args.updatedAt = (new Date()).toISOString() - const result = await resolve(root, args, context, info) - return result - } + CreateUser: setCreatedAt, + CreatePost: setCreatedAt, + CreateComment: setCreatedAt, + CreateOrganization: setCreatedAt, + UpdateUser: setUpdatedAt, + UpdatePost: setUpdatedAt, + UpdateComment: setUpdatedAt, + UpdateOrganization: setUpdatedAt } } diff --git a/backend/src/middleware/includedFieldsMiddleware.js b/backend/src/middleware/includedFieldsMiddleware.js index 6d8ccf8f1..5dd63cd3c 100644 --- a/backend/src/middleware/includedFieldsMiddleware.js +++ b/backend/src/middleware/includedFieldsMiddleware.js @@ -24,6 +24,6 @@ const includeFieldsRecursively = (includedFields) => { } export default { - Query: includeFieldsRecursively(['id', 'disabled', 'deleted']), - Mutation: includeFieldsRecursively(['id', 'disabled', 'deleted']) + Query: includeFieldsRecursively(['id', 'createdAt', 'disabled', 'deleted']), + Mutation: includeFieldsRecursively(['id', 'createdAt', 'disabled', 'deleted']) } diff --git a/backend/src/middleware/index.js b/backend/src/middleware/index.js index 8380316ff..8f86a88e6 100644 --- a/backend/src/middleware/index.js +++ b/backend/src/middleware/index.js @@ -9,6 +9,7 @@ import xssMiddleware from './xssMiddleware' import permissionsMiddleware from './permissionsMiddleware' import userMiddleware from './userMiddleware' import includedFieldsMiddleware from './includedFieldsMiddleware' +import orderByMiddleware from './orderByMiddleware' export default schema => { let middleware = [ @@ -20,7 +21,8 @@ export default schema => { fixImageUrlsMiddleware, softDeleteMiddleware, userMiddleware, - includedFieldsMiddleware + includedFieldsMiddleware, + orderByMiddleware ] // add permisions middleware at the first position (unless we're seeding) diff --git a/backend/src/middleware/orderByMiddleware.js b/backend/src/middleware/orderByMiddleware.js new file mode 100644 index 000000000..5f8aabb9e --- /dev/null +++ b/backend/src/middleware/orderByMiddleware.js @@ -0,0 +1,19 @@ +import cloneDeep from 'lodash/cloneDeep' + +const defaultOrderBy = (resolve, root, args, context, resolveInfo) => { + const copy = cloneDeep(resolveInfo) + const newestFirst = { + kind: 'Argument', + name: { kind: 'Name', value: 'orderBy' }, + value: { kind: 'EnumValue', value: 'createdAt_desc' } + } + const [fieldNode] = copy.fieldNodes + if (fieldNode) fieldNode.arguments.push(newestFirst) + return resolve(root, args, context, copy) +} + +export default { + Query: { + Post: defaultOrderBy + } +} diff --git a/backend/src/middleware/orderByMiddleware.spec.js b/backend/src/middleware/orderByMiddleware.spec.js new file mode 100644 index 000000000..2d85452e5 --- /dev/null +++ b/backend/src/middleware/orderByMiddleware.spec.js @@ -0,0 +1,62 @@ +import Factory from '../seed/factories' +import { host } from '../jest/helpers' +import { GraphQLClient } from 'graphql-request' + +let client +let headers +let query +const factory = Factory() + +beforeEach(async () => { + const userParams = { name: 'Author', email: 'author@example.org', password: '1234' } + await factory.create('User', userParams) + await factory.authenticateAs(userParams) + await factory.create('Post', { title: 'first' }) + await factory.create('Post', { title: 'second' }) + await factory.create('Post', { title: 'third' }) + await factory.create('Post', { title: 'last' }) + headers = {} + client = new GraphQLClient(host, { headers }) +}) + +afterEach(async () => { + await factory.cleanDatabase() +}) + +describe('Query', () => { + describe('Post', () => { + beforeEach(() => { + query = '{ Post { title } }' + }) + + describe('orderBy', () => { + it('createdAt descending is default', async () => { + const posts = [ + { title: 'last' }, + { title: 'third' }, + { title: 'second' }, + { title: 'first' } + ] + const expected = { Post: posts } + await expect(client.request(query)).resolves.toEqual(expected) + }) + + describe('(orderBy: createdAt_asc)', () => { + beforeEach(() => { + query = '{ Post(orderBy: createdAt_asc) { title } }' + }) + + it('orders by createdAt ascending', async () => { + const posts = [ + { title: 'first' }, + { title: 'second' }, + { title: 'third' }, + { title: 'last' } + ] + const expected = { Post: posts } + await expect(client.request(query)).resolves.toEqual(expected) + }) + }) + }) + }) +})