2
0
Files
bot/packages/utils/results.ts

124 lines
3.2 KiB
TypeScript
Raw Normal View History

import {
2022-06-11 07:27:38 +02:00
Group,
Variable,
2022-06-11 07:27:38 +02:00
InputBlock,
ResultHeaderCell,
ResultWithAnswers,
Answer,
VariableWithValue,
} from 'models'
2022-06-11 07:27:38 +02:00
import { isInputBlock, isDefined, byId } from './utils'
export const parseResultHeader = ({
2022-06-11 07:27:38 +02:00
groups,
variables,
}: {
2022-06-11 07:27:38 +02:00
groups: Group[]
variables: Variable[]
}): ResultHeaderCell[] => {
2022-06-11 07:27:38 +02:00
const parsedGroups = parseInputsResultHeader({ groups, variables })
return [
{ label: 'Submitted at', id: 'date' },
2022-06-11 07:27:38 +02:00
...parsedGroups,
...parseVariablesHeaders(variables, parsedGroups),
]
}
const parseInputsResultHeader = ({
2022-06-11 07:27:38 +02:00
groups,
variables,
}: {
2022-06-11 07:27:38 +02:00
groups: Group[]
variables: Variable[]
}): ResultHeaderCell[] =>
(
2022-06-11 07:27:38 +02:00
groups
.flatMap((g) =>
g.blocks.map((s) => ({
...s,
2022-06-11 07:27:38 +02:00
blockTitle: g.title,
}))
)
2022-06-11 07:27:38 +02:00
.filter((block) => isInputBlock(block)) as (InputBlock & {
blockTitle: string
})[]
2022-06-11 07:27:38 +02:00
).reduce<ResultHeaderCell[]>((headers, inputBlock) => {
if (
headers.find(
(h) =>
isDefined(h.variableId) &&
h.variableId ===
2022-06-11 07:27:38 +02:00
variables.find(byId(inputBlock.options.variableId))?.id
)
)
return headers
const matchedVariableName =
2022-06-11 07:27:38 +02:00
inputBlock.options.variableId &&
variables.find(byId(inputBlock.options.variableId))?.name
2022-06-11 07:27:38 +02:00
let label = matchedVariableName ?? inputBlock.blockTitle
const totalPrevious = headers.filter((h) => h.label.includes(label)).length
if (totalPrevious > 0) label = label + ` (${totalPrevious})`
return [
...headers,
{
id: inputBlock.id,
2022-06-11 07:27:38 +02:00
blockType: inputBlock.type,
blockId: inputBlock.id,
variableId: inputBlock.options.variableId,
label,
2022-06-11 07:27:38 +02:00
isLong: 'isLong' in inputBlock.options && inputBlock.options.isLong,
},
]
}, [])
const parseVariablesHeaders = (
variables: Variable[],
2022-06-11 07:27:38 +02:00
blockResultHeader: ResultHeaderCell[]
) =>
variables.reduce<ResultHeaderCell[]>((headers, v) => {
2022-06-11 07:27:38 +02:00
if (blockResultHeader.find((h) => h.variableId === v.id)) return headers
return [
...headers,
{
id: v.id,
label: v.name,
variableId: v.id,
},
]
}, [])
export const parseAnswers =
2022-06-11 07:27:38 +02:00
({ groups, variables }: { groups: Group[]; variables: Variable[] }) =>
({
createdAt,
answers,
variables: resultVariables,
}: Pick<ResultWithAnswers, 'createdAt' | 'answers' | 'variables'>): {
[key: string]: string
} => {
2022-06-11 07:27:38 +02:00
const header = parseResultHeader({ groups, variables })
return {
submittedAt: createdAt,
...[...answers, ...resultVariables].reduce<{
[key: string]: string
}>((o, answerOrVariable) => {
if ('blockId' in answerOrVariable) {
const answer = answerOrVariable as Answer
const key = answer.variableId
? header.find((cell) => cell.variableId === answer.variableId)
?.label
2022-06-11 07:27:38 +02:00
: header.find((cell) => cell.blockId === answer.blockId)?.label
if (!key) return o
return {
...o,
[key]: answer.content.toString(),
}
}
const variable = answerOrVariable as VariableWithValue
if (isDefined(o[variable.name])) return o
return { ...o, [variable.name]: variable.value }
}, {}),
}
}