From 1cbab2a5c42fa935fed0dbd1c0d992c0266fcefa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20Sch=C3=A4fer?= Date: Sun, 24 Mar 2019 19:58:17 +0100 Subject: [PATCH] Implement #238 --- backend/src/middleware/dateTimeMiddleware.js | 57 ++++++------------- .../middleware/includedFieldsMiddleware.js | 4 +- backend/src/middleware/index.js | 4 +- backend/src/middleware/orderByMiddleware.js | 17 ++++++ ...ware.spec.js => orderByMiddleware.spec.js} | 24 +++++++- 5 files changed, 61 insertions(+), 45 deletions(-) create mode 100644 backend/src/middleware/orderByMiddleware.js rename backend/src/middleware/{dateTimeMiddleware.spec.js => orderByMiddleware.spec.js} (64%) diff --git a/backend/src/middleware/dateTimeMiddleware.js b/backend/src/middleware/dateTimeMiddleware.js index 473dbf444..58b18368e 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 6ed0955e8..57dd82025 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..d3ecf5b2b --- /dev/null +++ b/backend/src/middleware/orderByMiddleware.js @@ -0,0 +1,17 @@ +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: defaultOrderBy +} diff --git a/backend/src/middleware/dateTimeMiddleware.spec.js b/backend/src/middleware/orderByMiddleware.spec.js similarity index 64% rename from backend/src/middleware/dateTimeMiddleware.spec.js rename to backend/src/middleware/orderByMiddleware.spec.js index cae03db1f..0e2a1eace 100644 --- a/backend/src/middleware/dateTimeMiddleware.spec.js +++ b/backend/src/middleware/orderByMiddleware.spec.js @@ -25,18 +25,38 @@ afterEach(async () => { describe('Query', () => { describe('Post', () => { + beforeEach(() => { + query = '{ Post { title } }' + }) + describe('orderBy', () => { it('createdAt descending is default', async () => { - query = '{ Post { title } }' const posts = [ { title: 'last' }, { title: 'third' }, { title: 'second' }, { title: 'first' } ] - const expected = { data: { Post: posts } } + 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) + }) + }) }) }) })