1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87import { db, graphql } from '#src/utils';
export const getResultsSchema = async ({ request, reply }) => {
/*
Ability to filter by propertyIds, urlIds, nodeIds, nodeUpdateIds, messageIds, and tagIds
Messages, Tags, Properties, Pages are sorted by properties related to the most nodes w/ nodeEqualified set to false (most to least)
*/
await db.connect();
const report = (await db.query(`SELECT "id", "name", "filters" FROM "reports" WHERE "id" = $1`, [request.query.reportId])).rows?.[0];
const types = ['properties', 'urls', 'messages', 'nodes', 'tags'];
const filters = Object.fromEntries(types.map(obj => [obj, []]));
for (const type of types) {
filters[type] = report.filters.filter(obj => obj.type === type).map(obj => obj.value)
}
// Check if there are any urls in our request
const urls = (await db.query({
text: `SELECT "id", "url" FROM "urls" WHERE "id" = ANY($1::uuid[]) OR "property_id" = ANY($2::uuid[])`,
values: [filters.urls, filters.properties],
})).rows;
await db.clean();
// Make a request
const response = await graphql({
request,
query: `query (
$urlIds: [uuid!],
${filters.types.length > 0 ? '$typeIds: [String],' : ''}
${filters.messages.length > 0 ? '$messageIds: [uuid],' : ''}
) {
nodes: enodes(where: {
url_id: {_in: $urlIds},
${filters.types.length > 0 ? `message_nodes: {message: {type: {_in: $typeIds}}},` : ``}
${filters.messages.length > 0 ? `message_nodes: {message: {id: {_in: $messageIds}}},` : ``}
}) {
nodeId: id
createdAt: created_at
html
targets
relatedUrlId: url_id
equalified
messageNodes: message_nodes {
id
node: enode {
equalified
}
message {
id
message
type
messageTags: message_tags {
tag {
id
tag
}
}
}
}
}
}`,
variables: {
urlIds: urls.map(obj => obj.id),
...filters.types.length > 0 && ({ typeIds: filters.types }),
...filters.messages.length > 0 && ({ messageIds: filters.messages }),
},
});
return {
reportName: report.name,
urls: urls,
nodes: response.nodes.map(obj => ({
nodeId: obj.nodeId,
html: obj.html,
targets: JSON.parse(obj.targets),
relatedUrlId: obj.relatedUrlId,
equalified: obj.equalified,
})),
messages: response.nodes.map(obj => obj.messageNodes).flat().map(obj => ({
id: obj.message.id,
message: obj.message.message,
})),
tags: response.nodes.map(obj => obj.messageNodes).flat().map(obj => obj.message.messageTags).flat().map(obj => ({
id: obj.tag.id,
tag: obj.tag.tag,
})),
};
}