Merge branch 'fix-post-type-on-notifications' into 6044-Add-create-New-Event

This commit is contained in:
ogerly 2023-04-25 13:21:51 +02:00
commit 04d642a4da
7 changed files with 14 additions and 135 deletions

View File

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

View File

@ -5,16 +5,11 @@ 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
@ -38,12 +33,3 @@ 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

@ -51,7 +51,7 @@ export default {
OPTIONAL MATCH (resource)<-[membership:MEMBER_OF]-(relatedUser) OPTIONAL MATCH (resource)<-[membership:MEMBER_OF]-(relatedUser)
WITH user, notification, resource, membership, relatedUser, WITH user, notification, resource, membership, relatedUser,
[(resource)<-[:WROTE]-(author:User) | author {.*}] AS authors, [(resource)<-[:WROTE]-(author:User) | author {.*}] AS authors,
[(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post {.*, author: properties(author)} ] AS posts [(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post {.*, author: properties(author), postType: filter(l IN labels(post) WHERE NOT l = "Post")} ] AS posts
WITH resource, user, notification, authors, posts, relatedUser, membership, WITH resource, user, notification, authors, posts, relatedUser, membership,
resource {.*, resource {.*,
__typename: labels(resource)[0], __typename: labels(resource)[0],
@ -90,7 +90,7 @@ export default {
SET notification.read = TRUE SET notification.read = TRUE
WITH user, notification, resource, WITH user, notification, resource,
[(resource)<-[:WROTE]-(author:User) | author {.*}] AS authors, [(resource)<-[:WROTE]-(author:User) | author {.*}] AS authors,
[(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post{.*, author: properties(author)} ] AS posts [(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post{.*, author: properties(author), postType: filter(l IN labels(post) WHERE NOT l = "Post")} ] AS posts
OPTIONAL MATCH (resource)<-[membership:MEMBER_OF]-(user) OPTIONAL MATCH (resource)<-[membership:MEMBER_OF]-(user)
WITH resource, user, notification, authors, posts, membership, WITH resource, user, notification, authors, posts, membership,
resource {.*, __typename: labels(resource)[0], author: authors[0], post: posts[0], myRole: membership.role } AS finalResource resource {.*, __typename: labels(resource)[0], author: authors[0], post: posts[0], myRole: membership.role } AS finalResource
@ -120,7 +120,7 @@ export default {
SET notification.read = TRUE SET notification.read = TRUE
WITH user, notification, resource, WITH user, notification, resource,
[(resource)<-[:WROTE]-(author:User) | author {.*}] AS authors, [(resource)<-[:WROTE]-(author:User) | author {.*}] AS authors,
[(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post{.*, author: properties(author)} ] AS posts [(resource)-[:COMMENTS]->(post:Post)<-[:WROTE]-(author:User) | post{.*, author: properties(author), postType: filter(l IN labels(post) WHERE NOT l = "Post")} ] AS posts
OPTIONAL MATCH (resource)<-[membership:MEMBER_OF]-(user) OPTIONAL MATCH (resource)<-[membership:MEMBER_OF]-(user)
WITH resource, user, notification, authors, posts, membership, WITH resource, user, notification, authors, posts, membership,
resource {.*, __typename: labels(resource)[0], author: authors[0], post: posts[0], myRole: membership.role} AS finalResource resource {.*, __typename: labels(resource)[0], author: authors[0], post: posts[0], myRole: membership.role} AS finalResource

View File

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

View File

@ -398,113 +398,6 @@ 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()
@ -549,7 +442,6 @@ 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

@ -22,7 +22,7 @@ const locales = ['en', 'de', 'fr', 'nl', 'it', 'es', 'pt', 'pl', 'ru']
const createLocation = async (session, mapboxData) => { const createLocation = async (session, mapboxData) => {
const data = { const data = {
id: mapboxData.id, id: mapboxData.id + (mapboxData.address ? `-${mapboxData.address}` : ''),
nameEN: mapboxData.text_en, nameEN: mapboxData.text_en,
nameDE: mapboxData.text_de, nameDE: mapboxData.text_de,
nameFR: mapboxData.text_fr, nameFR: mapboxData.text_fr,
@ -33,6 +33,7 @@ const createLocation = async (session, mapboxData) => {
namePL: mapboxData.text_pl, namePL: mapboxData.text_pl,
nameRU: mapboxData.text_ru, nameRU: mapboxData.text_ru,
type: mapboxData.id.split('.')[0].toLowerCase(), type: mapboxData.id.split('.')[0].toLowerCase(),
address: mapboxData.address,
lng: mapboxData.center && mapboxData.center.length ? mapboxData.center[0] : null, lng: mapboxData.center && mapboxData.center.length ? mapboxData.center[0] : null,
lat: mapboxData.center && mapboxData.center.length ? mapboxData.center[1] : null, lat: mapboxData.center && mapboxData.center.length ? mapboxData.center[1] : null,
} }
@ -54,6 +55,10 @@ const createLocation = async (session, mapboxData) => {
if (data.lat && data.lng) { if (data.lat && data.lng) {
mutation += ', l.lat = $lat, l.lng = $lng' mutation += ', l.lat = $lat, l.lng = $lng'
} }
if (data.address) {
mutation += ', l.address = $address'
}
mutation += ' RETURN l.id' mutation += ' RETURN l.id'
await session.writeTransaction((transaction) => { await session.writeTransaction((transaction) => {
@ -72,7 +77,7 @@ export const createOrUpdateLocations = async (nodeLabel, nodeId, locationName, s
locationName, locationName,
)}.json?access_token=${ )}.json?access_token=${
CONFIG.MAPBOX_TOKEN CONFIG.MAPBOX_TOKEN
}&types=region,place,country&language=${locales.join(',')}`, }&types=region,place,country,address&language=${locales.join(',')}`,
) )
debug(res) debug(res)
@ -103,6 +108,10 @@ export const createOrUpdateLocations = async (nodeLabel, nodeId, locationName, s
let parent = data let parent = data
if (parent.address) {
parent.id += `-${parent.address}`
}
if (data.context) { if (data.context) {
await asyncForEach(data.context, async (ctx) => { await asyncForEach(data.context, async (ctx) => {
await createLocation(session, ctx) await createLocation(session, ctx)

View File

@ -179,8 +179,6 @@ 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 {
@ -191,8 +189,6 @@ input _EventInput {
eventStart: String! eventStart: String!
eventLocation: String eventLocation: String
eventVenue: String eventVenue: String
eventEnd: String
eventIsOnline: Boolean
} }
type Mutation { type Mutation {