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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118import { db, event, graphqlQuery } from "#src/utils";
interface ItemCount {
key: string;
count: number;
}
interface AuditSummaryResp {
unique_url_stats: {
aggregate: {
count: number;
};
};
mostCommonUrls: ItemCount[];
mostCommonBlockers: ItemCount[];
mostCommonTags: ItemCount[];
}
export const getAuditSummaryFast = async () => {
const start = performance.now();
const auditId = (event.queryStringParameters as any).id;
const mostCommonUrlsLimit = parseInt(
(event.queryStringParameters as any).mostCommonUrlsLimit ?? "5"
);
const mostCommonBlockersLimit = parseInt(
(event.queryStringParameters as any).mostCommonBlockersLimit ?? "5"
);
/* const mostCommonCategoriesLimit = parseInt(
(event.queryStringParameters as any).mostCommonCategoriesLimit ?? "3"
); */
const mostCommonTagsLimit = parseInt(
(event.queryStringParameters as any).mostCommonTagsLimit ?? "3"
);
const query = {
query: `query GetFullAuditSummary(
$audit_id: uuid!,
$urlLimit: Int,
$msgLimit: Int,
$tagLimit: Int
) {
# 1. Total Unique URLs with blockers
unique_url_stats: blocker_summary_view_aggregate(
where: { audit_id: { _eq: $audit_id } }
) {
aggregate {
count(columns: url, distinct: true)
}
}
mostCommonUrls: get_most_common_urls(
args: { search_audit_id: $audit_id, row_limit: $urlLimit }
) {
key
count
}
mostCommonBlockers: get_most_common_messages(
args: { search_audit_id: $audit_id, row_limit: $msgLimit }
) {
key
count
}
mostCommonTags: get_most_common_tags(
args: { search_audit_id: $audit_id, row_limit: $tagLimit }
) {
key
count
}
}`,
variables: {
audit_id: auditId,
urlLimit: mostCommonUrlsLimit,
msgLimit: mostCommonBlockersLimit,
tagLimit: mostCommonTagsLimit
},
};
const response = (await graphqlQuery(query)) as AuditSummaryResp;
// Most common blockers are grouped by message content, but the Detailed View
// can only be filtered by category — look up each content's category so the
// summary table can link straight into a filtered Detailed View.
const contents = response.mostCommonBlockers.map((item) => item.key);
const categoriesResponse = contents.length > 0
? ((await graphqlQuery({
query: `query GetMessageCategories($contents: [String!]) {
messages(where: { content: { _in: $contents } }, distinct_on: content, order_by: { content: asc }) {
content
category
}
}`,
variables: { contents },
})) as { messages: { content: string; category: string }[] })
: { messages: [] };
const contentToCategory = new Map(
categoriesResponse.messages.map((m) => [m.content, m.category])
);
const mostCommonErrors = response.mostCommonBlockers.map((item) => ({
...item,
category: contentToCategory.get(item.key) ?? null,
}));
const end = performance.now();
return {
statusCode: 200,
headers: { "content-type": "application/json" },
body: JSON.stringify({
urlsWithBlockersCount: response.unique_url_stats.aggregate.count,
urlsWithMostErrors: response.mostCommonUrls,
mostCommonErrors,
mostCommonTags: response.mostCommonTags,
executionTime: end - start
}),
};
};