forked from jschroeter/knime-fe-workshop
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrandomNode.ts
More file actions
38 lines (31 loc) · 1.26 KB
/
randomNode.ts
File metadata and controls
38 lines (31 loc) · 1.26 KB
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
import type { Node } from "~/shared/types";
import { fetchTopNodes } from "~/shared/api/topNodes";
import { fetchNode } from "~/shared/api/node";
// TODO wrap fetchTopNodes and fetchNode in defineCachedFunctions
export default defineEventHandler(async (event) => {
const topNodes = await fetchTopNodes();
// get "level" from query params, default to 10 if not provided or invalid
const levelParam = getQuery(event).level;
let level = Number(levelParam);
if (isNaN(level) || level < 1 || level > 10) level = 10;
// determine the range of nodes to pick from based on level
// level 1 means first 10% of top nodes, level 10 means 100%
const range = Math.max(1, Math.ceil((topNodes.length * level) / 10));
let node: Node | undefined | null;
let attempts = 0;
// pick a random node, but there might be nodes that are not available
// or deprecated, therefore let's try a few times until we find a valid one
while (!node && attempts < 5) {
const randomIndex = Math.floor(Math.random() * range);
const randomNodeId = topNodes[randomIndex].nodeId;
node = await fetchNode(randomNodeId);
attempts++;
}
if (!node) {
throw createError({
statusCode: 500,
statusMessage: "Failed to fetch random node",
});
}
return node;
});