diff --git a/backend/src/schema/resolvers/reports.js b/backend/src/schema/resolvers/reports.js index 350d86d20..053f138cd 100644 --- a/backend/src/schema/resolvers/reports.js +++ b/backend/src/schema/resolvers/reports.js @@ -52,7 +52,7 @@ export default { reports: async (_parent, params, context, _resolveInfo) => { const { driver } = context const session = driver.session() - let reports, orderByClause + let reports, orderByClause, filterClause switch (params.orderBy) { case 'createdAt_asc': orderByClause = 'ORDER BY report.createdAt ASC' @@ -63,17 +63,37 @@ export default { default: orderByClause = '' } + + switch (params.reviewed) { + case true: + filterClause = 'AND ((report)<-[:REVIEWED]-(:User))' + break + case false: + filterClause = 'AND NOT ((report)<-[:REVIEWED]-(:User))' + break + default: + filterClause = '' + } + + if (params.closed) filterClause = 'AND report.closed = true' + + const offset = + params.offset && typeof params.offset === 'number' ? `SKIP ${params.offset}` : '' + const limit = params.first && typeof params.first === 'number' ? `LIMIT ${params.first}` : '' + const reportReadTxPromise = session.readTransaction(async tx => { const allReportsTransactionResponse = await tx.run( ` - MATCH (report:Report)-[:BELONGS_TO]->(resource) - WHERE resource:User OR resource:Post OR resource:Comment - WITH report, resource, - [(submitter:User)-[filed:FILED]->(report) | filed {.*, submitter: properties(submitter)} ] as filed, - [(moderator:User)-[reviewed:REVIEWED]->(report) | reviewed {.*, moderator: properties(moderator)} ] as reviewed, - resource {.*, __typename: labels(resource)[0] } as resourceWithType - RETURN report {.*, resource: resourceWithType, filed: filed, reviewed: reviewed} - ${orderByClause} + MATCH (report:Report)-[:BELONGS_TO]->(resource) + WHERE (resource:User OR resource:Post OR resource:Comment) + ${filterClause} + WITH report, resource, + [(submitter:User)-[filed:FILED]->(report) | filed {.*, submitter: properties(submitter)} ] as filed, + [(moderator:User)-[reviewed:REVIEWED]->(report) | reviewed {.*, moderator: properties(moderator)} ] as reviewed, + resource {.*, __typename: labels(resource)[0] } as resourceWithType + RETURN report {.*, resource: resourceWithType, filed: filed, reviewed: reviewed} + ${orderByClause} + ${offset} ${limit} `, ) return allReportsTransactionResponse.records.map(record => record.get('report')) diff --git a/backend/src/schema/types/type/FILED.gql b/backend/src/schema/types/type/FILED.gql index 955af0bb8..cdce62116 100644 --- a/backend/src/schema/types/type/FILED.gql +++ b/backend/src/schema/types/type/FILED.gql @@ -16,8 +16,3 @@ enum ReasonCategory { advert_products_services_commercial criminal_behavior_violation_german_law } - -enum ReportOrdering { - createdAt_asc - createdAt_desc -} diff --git a/backend/src/schema/types/type/Report.gql b/backend/src/schema/types/type/Report.gql index 49e5bdae3..ad0015d01 100644 --- a/backend/src/schema/types/type/Report.gql +++ b/backend/src/schema/types/type/Report.gql @@ -6,7 +6,7 @@ type Report { disable: Boolean! closed: Boolean! filed: [FILED] - reviewed: [REVIEWED] + reviewed: [REVIEWED]! resource: ReportedResource } @@ -21,5 +21,10 @@ type Mutation { } type Query { - reports(orderBy: ReportOrdering): [Report] + reports(orderBy: ReportOrdering, first: Int, offset: Int, reviewed: Boolean, closed: Boolean): [Report] +} + +enum ReportOrdering { + createdAt_asc + createdAt_desc } diff --git a/backend/src/seed/seed-db.js b/backend/src/seed/seed-db.js index eaa2f7984..2e10b0472 100644 --- a/backend/src/seed/seed-db.js +++ b/backend/src/seed/seed-db.js @@ -670,10 +670,12 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl'] factory.create('Report'), factory.create('Report'), factory.create('Report'), + factory.create('Report'), ]) const reportAgainstDagobert = reports[0] const reportAgainstTrollingPost = reports[1] const reportAgainstTrollingComment = reports[2] + const reportAgainstDewey = reports[3] // report resource first time await Promise.all([ @@ -695,6 +697,12 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl'] reasonDescription: 'This comment is bigoted', }), reportAgainstTrollingComment.relateTo(trollingComment, 'belongsTo'), + reportAgainstDewey.relateTo(dagobert, 'filed', { + resourceId: 'u5', + reasonCategory: 'discrimination_etc', + reasonDescription: 'This user is harassing me!', + }), + reportAgainstDewey.relateTo(dewey, 'belongsTo'), ]) // report resource a second time diff --git a/backend/yarn.lock b/backend/yarn.lock index 1354bb497..6a6fef4ad 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -1731,7 +1731,7 @@ apollo-server-caching@^0.5.0: dependencies: lru-cache "^5.0.0" -apollo-server-core@^2.9.12, apollo-server-core@^2.9.13: +apollo-server-core@^2.9.13: version "2.9.13" resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.9.13.tgz#29fee69be56d30605b0a06cd755fd39e0409915f" integrity sha512-iXTGNCtouB0Xe37ySovuZO69NBYOByJlZfUc87gj0pdcz0WbdfUp7qUtNzy3onp63Zo60TFkHWhGNcBJYFluzw== @@ -7452,11 +7452,6 @@ serve-static@1.14.1: version "1.14.1" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.1" set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" diff --git a/webapp/components/features/ReportList/ReportList.vue b/webapp/components/features/ReportList/ReportList.vue index 85b74d7cc..3659daa9e 100644 --- a/webapp/components/features/ReportList/ReportList.vue +++ b/webapp/components/features/ReportList/ReportList.vue @@ -7,6 +7,7 @@ +