mirror of
https://github.com/IT4Change/Ocelot-Social.git
synced 2025-12-13 07:45:56 +00:00
142 lines
3.8 KiB
JavaScript
142 lines
3.8 KiB
JavaScript
export default {
|
|
Mutation: {
|
|
report: async (_parent, params, { driver, _req, user }, _resolveInfo) => {
|
|
const { resourceId, reasonCategory, reasonDescription } = params
|
|
|
|
const session = driver.session()
|
|
const reportProperties = {
|
|
createdAt: new Date().toISOString(),
|
|
reasonCategory,
|
|
reasonDescription,
|
|
}
|
|
|
|
const reportQueryRes = await session.run(
|
|
`
|
|
MATCH (:User {id:$submitterId})-[:REPORTED]->(resource {id:$resourceId})
|
|
RETURN labels(resource)[0] as label
|
|
`,
|
|
{
|
|
resourceId,
|
|
submitterId: user.id,
|
|
},
|
|
)
|
|
const [rep] = reportQueryRes.records.map(record => {
|
|
return {
|
|
label: record.get('label'),
|
|
}
|
|
})
|
|
|
|
if (rep) {
|
|
throw new Error(rep.label)
|
|
}
|
|
|
|
const res = await session.run(
|
|
`
|
|
MATCH (submitter:User {id: $submitterId})
|
|
MATCH (resource {id: $resourceId})
|
|
WHERE resource:User OR resource:Comment OR resource:Post
|
|
CREATE (resource)<-[report:REPORTED {createdAt: $createdAt, reasonCategory: $reasonCategory, reasonDescription: $reasonDescription}]-(submitter)
|
|
RETURN report, submitter, resource, labels(resource)[0] as type
|
|
`,
|
|
{
|
|
resourceId,
|
|
submitterId: user.id,
|
|
createdAt: reportProperties.createdAt,
|
|
reasonCategory: reportProperties.reasonCategory,
|
|
reasonDescription: reportProperties.reasonDescription,
|
|
},
|
|
)
|
|
|
|
session.close()
|
|
|
|
const [dbResponse] = res.records.map(r => {
|
|
return {
|
|
report: r.get('report'),
|
|
submitter: r.get('submitter'),
|
|
resource: r.get('resource'),
|
|
type: r.get('type'),
|
|
}
|
|
})
|
|
if (!dbResponse) return null
|
|
|
|
const { report, submitter, resource, type } = dbResponse
|
|
|
|
const response = {
|
|
...report.properties,
|
|
post: null,
|
|
comment: null,
|
|
user: null,
|
|
submitter: submitter.properties,
|
|
type,
|
|
}
|
|
switch (type) {
|
|
case 'Post':
|
|
response.post = resource.properties
|
|
break
|
|
case 'Comment':
|
|
response.comment = resource.properties
|
|
break
|
|
case 'User':
|
|
response.user = resource.properties
|
|
break
|
|
}
|
|
|
|
return response
|
|
},
|
|
},
|
|
Query: {
|
|
reports: async (_parent, _params, { driver, _req, _user }, _resolveInfo) => {
|
|
const session = driver.session()
|
|
const res = await session.run(
|
|
`
|
|
MATCH (submitter:User)-[report:REPORTED]->(resource)
|
|
WHERE resource:User OR resource:Comment OR resource:Post
|
|
RETURN report, submitter, resource, labels(resource)[0] as type
|
|
`,
|
|
{},
|
|
)
|
|
session.close()
|
|
|
|
const dbResponse = res.records.map(r => {
|
|
return {
|
|
report: r.get('report'),
|
|
submitter: r.get('submitter'),
|
|
resource: r.get('resource'),
|
|
type: r.get('type'),
|
|
}
|
|
})
|
|
if (!dbResponse) return null
|
|
|
|
const response = []
|
|
dbResponse.forEach(ele => {
|
|
const { report, submitter, resource, type } = ele
|
|
|
|
const responseEle = {
|
|
...report.properties,
|
|
resource: resource.properties,
|
|
resourceId: resource.properties.id,
|
|
post: null,
|
|
comment: null,
|
|
user: null,
|
|
submitter: submitter.properties,
|
|
type,
|
|
}
|
|
switch (type) {
|
|
case 'Post':
|
|
responseEle.post = resource.properties
|
|
break
|
|
case 'Comment':
|
|
responseEle.comment = resource.properties
|
|
break
|
|
case 'User':
|
|
responseEle.user = resource.properties
|
|
break
|
|
}
|
|
response.push(responseEle)
|
|
})
|
|
|
|
return response
|
|
},
|
|
},
|
|
}
|