From 8c0a833d0bcef3d231700f6f87f636ad4d9c5e95 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Wed, 19 Apr 2023 09:09:08 +0200 Subject: [PATCH] feat(backend): further event params --- backend/src/graphql/posts.js | 2 + .../src/schema/resolvers/helpers/events.js | 14 +++ backend/src/schema/resolvers/posts.js | 2 + backend/src/schema/resolvers/posts.spec.js | 108 ++++++++++++++++++ backend/src/schema/types/type/Post.gql | 4 + 5 files changed, 130 insertions(+) diff --git a/backend/src/graphql/posts.js b/backend/src/graphql/posts.js index f1b62a286..7d57b8510 100644 --- a/backend/src/graphql/posts.js +++ b/backend/src/graphql/posts.js @@ -38,8 +38,10 @@ export const createPostMutation = () => { id } eventStart + eventEnd eventLocationName eventVenue + eventIsOnline eventLocation { lng lat diff --git a/backend/src/schema/resolvers/helpers/events.js b/backend/src/schema/resolvers/helpers/events.js index b2f204f1d..6f3eda3d4 100644 --- a/backend/src/schema/resolvers/helpers/events.js +++ b/backend/src/schema/resolvers/helpers/events.js @@ -5,11 +5,16 @@ export const validateEventParams = (params) => { const { eventInput } = params validateEventDate(eventInput.eventStart) params.eventStart = eventInput.eventStart + if (eventInput.eventEnd) { + validateEventEnd(eventInput.eventStart, eventInput.eventEnd) + params.eventEnd = eventInput.eventEnd + } if (eventInput.eventLocation && !eventInput.eventVenue) { throw new UserInputError('Event venue must be present if event location is given!') } params.eventVenue = eventInput.eventVenue params.eventLocation = eventInput.eventLocation + params.eventIsOnline = !!eventInput.eventIsOnline } delete params.eventInput let locationName @@ -33,3 +38,12 @@ const validateEventDate = (dateString) => { throw new UserInputError('Event start date must be in the future!') } } + +const validateEventEnd = (start, end) => { + const endDate = new Date(end) + if (endDate.toString() === 'Invalid Date') + throw new UserInputError('Event end date must be a valid date!') + const startDate = new Date(start) + if (endDate < startDate) + throw new UserInputError('Event end date must be a after event start date!') +} diff --git a/backend/src/schema/resolvers/posts.js b/backend/src/schema/resolvers/posts.js index 42a755e8f..ac8267281 100644 --- a/backend/src/schema/resolvers/posts.js +++ b/backend/src/schema/resolvers/posts.js @@ -416,6 +416,8 @@ export default { 'eventLocation', 'eventLocationName', 'eventStart', + 'eventEnd', + 'eventIsOnline', ], hasMany: { tags: '-[:TAGGED]->(related:Tag)', diff --git a/backend/src/schema/resolvers/posts.spec.js b/backend/src/schema/resolvers/posts.spec.js index b3dd28f38..d3936d034 100644 --- a/backend/src/schema/resolvers/posts.spec.js +++ b/backend/src/schema/resolvers/posts.spec.js @@ -398,6 +398,113 @@ describe('CreatePost', () => { }) }) + describe('with valid start date and invalid end date', () => { + it('throws an error', async () => { + const now = new Date() + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + ...variables, + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventEnd: 'not-valid', + }, + }, + }), + ).resolves.toMatchObject({ + errors: [ + { + message: 'Event end date must be a valid date!', + }, + ], + }) + }) + }) + + describe('with valid start date and end date before start date', () => { + it('throws an error', async () => { + const now = new Date() + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + ...variables, + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth() + 2).toISOString(), + eventEnd: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + }, + }, + }), + ).resolves.toMatchObject({ + errors: [ + { + message: 'Event end date must be a after event start date!', + }, + ], + }) + }) + }) + + describe('with valid start date and valid end date', () => { + it('creates the event', async () => { + const now = new Date() + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + ...variables, + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventEnd: new Date(now.getFullYear(), now.getMonth() + 2).toISOString(), + }, + }, + }), + ).resolves.toMatchObject({ + data: { + CreatePost: { + postType: ['Event'], + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventEnd: new Date(now.getFullYear(), now.getMonth() + 2).toISOString(), + eventIsOnline: false, + }, + }, + errors: undefined, + }) + }) + }) + + describe('with valid start date and event is online', () => { + it('creates the event', async () => { + const now = new Date() + await expect( + mutate({ + mutation: createPostMutation(), + variables: { + ...variables, + postType: 'Event', + eventInput: { + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventIsOnline: true, + }, + }, + }), + ).resolves.toMatchObject({ + data: { + CreatePost: { + postType: ['Event'], + eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventIsOnline: true, + }, + }, + errors: undefined, + }) + }) + }) + describe('event location is given but event venue is missing', () => { it('throws an error', async () => { const now = new Date() @@ -442,6 +549,7 @@ describe('CreatePost', () => { CreatePost: { postType: ['Event'], eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), + eventIsOnline: false, }, }, errors: undefined, diff --git a/backend/src/schema/types/type/Post.gql b/backend/src/schema/types/type/Post.gql index c35ee7054..22d7c1d5c 100644 --- a/backend/src/schema/types/type/Post.gql +++ b/backend/src/schema/types/type/Post.gql @@ -179,6 +179,8 @@ type Post { eventLocation: Location @cypher(statement: "MATCH (this)-[:IS_IN]->(l:Location) RETURN l") eventVenue: String eventStart: String + eventEnd: String + eventIsOnline: Boolean } input _PostInput { @@ -189,6 +191,8 @@ input _EventInput { eventStart: String! eventLocation: String eventVenue: String + eventEnd: String + eventIsOnline: Boolean } type Mutation {