Merge pull request #6231 from Ocelot-Social-Community/add-further-event-params

feat(backend): add further event params
This commit is contained in:
Moriz Wahl 2023-04-20 14:41:28 +02:00 committed by GitHub
commit ef14b9355c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 130 additions and 0 deletions

View File

@ -38,8 +38,10 @@ export const createPostMutation = () => {
id id
} }
eventStart eventStart
eventEnd
eventLocationName eventLocationName
eventVenue eventVenue
eventIsOnline
eventLocation { eventLocation {
lng lng
lat lat

View File

@ -5,11 +5,16 @@ export const validateEventParams = (params) => {
const { eventInput } = params const { eventInput } = params
validateEventDate(eventInput.eventStart) validateEventDate(eventInput.eventStart)
params.eventStart = eventInput.eventStart params.eventStart = eventInput.eventStart
if (eventInput.eventEnd) {
validateEventEnd(eventInput.eventStart, eventInput.eventEnd)
params.eventEnd = eventInput.eventEnd
}
if (eventInput.eventLocation && !eventInput.eventVenue) { if (eventInput.eventLocation && !eventInput.eventVenue) {
throw new UserInputError('Event venue must be present if event location is given!') throw new UserInputError('Event venue must be present if event location is given!')
} }
params.eventVenue = eventInput.eventVenue params.eventVenue = eventInput.eventVenue
params.eventLocation = eventInput.eventLocation params.eventLocation = eventInput.eventLocation
params.eventIsOnline = !!eventInput.eventIsOnline
} }
delete params.eventInput delete params.eventInput
let locationName let locationName
@ -33,3 +38,12 @@ const validateEventDate = (dateString) => {
throw new UserInputError('Event start date must be in the future!') 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!')
}

View File

@ -416,6 +416,8 @@ export default {
'eventLocation', 'eventLocation',
'eventLocationName', 'eventLocationName',
'eventStart', 'eventStart',
'eventEnd',
'eventIsOnline',
], ],
hasMany: { hasMany: {
tags: '-[:TAGGED]->(related:Tag)', tags: '-[:TAGGED]->(related:Tag)',

View File

@ -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', () => { describe('event location is given but event venue is missing', () => {
it('throws an error', async () => { it('throws an error', async () => {
const now = new Date() const now = new Date()
@ -442,6 +549,7 @@ describe('CreatePost', () => {
CreatePost: { CreatePost: {
postType: ['Event'], postType: ['Event'],
eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(), eventStart: new Date(now.getFullYear(), now.getMonth() + 1).toISOString(),
eventIsOnline: false,
}, },
}, },
errors: undefined, errors: undefined,

View File

@ -179,6 +179,8 @@ type Post {
eventLocation: Location @cypher(statement: "MATCH (this)-[:IS_IN]->(l:Location) RETURN l") eventLocation: Location @cypher(statement: "MATCH (this)-[:IS_IN]->(l:Location) RETURN l")
eventVenue: String eventVenue: String
eventStart: String eventStart: String
eventEnd: String
eventIsOnline: Boolean
} }
input _PostInput { input _PostInput {
@ -189,6 +191,8 @@ input _EventInput {
eventStart: String! eventStart: String!
eventLocation: String eventLocation: String
eventVenue: String eventVenue: String
eventEnd: String
eventIsOnline: Boolean
} }
type Mutation { type Mutation {