Validate time only field constrains

This commit is contained in:
Adria Navarro 2024-05-23 13:07:45 +02:00
parent ac92aaeab3
commit 402426a5f3
1 changed files with 56 additions and 4 deletions

View File

@ -1,8 +1,10 @@
import cloneDeep from "lodash/cloneDeep"
import validateJs from "validate.js" import validateJs from "validate.js"
import dayjs from "dayjs"
import cloneDeep from "lodash/fp/cloneDeep"
import { import {
Datasource, Datasource,
DatasourcePlusQueryResponse, DatasourcePlusQueryResponse,
FieldConstraints,
FieldType, FieldType,
QueryJson, QueryJson,
Row, Row,
@ -206,9 +208,7 @@ export async function validate({
errors[fieldName] = [`Contains invalid JSON`] errors[fieldName] = [`Contains invalid JSON`]
} }
} else if (type === FieldType.DATETIME && column.timeOnly) { } else if (type === FieldType.DATETIME && column.timeOnly) {
if (row[fieldName] && !row[fieldName].match(/^(\d+)(:[0-5]\d){1,2}$/)) { res = validateTimeOnlyField(fieldName, row[fieldName], constraints)
errors[fieldName] = [`${fieldName} is not a valid time`]
}
} else { } else {
res = validateJs.single(row[fieldName], constraints) res = validateJs.single(row[fieldName], constraints)
} }
@ -216,3 +216,55 @@ export async function validate({
} }
return { valid: Object.keys(errors).length === 0, errors } return { valid: Object.keys(errors).length === 0, errors }
} }
function validateTimeOnlyField(
fieldName: string,
value: any,
constraints: FieldConstraints | undefined
) {
let res
if (value && !value.match(/^(\d+)(:[0-5]\d){1,2}$/)) {
res = [`${fieldName} is not a valid time`]
}
if (constraints) {
let castedValue = value
const stringTimeToDateISOString = (value: string) => {
const [hour, minute] = value.split(":").map((x: string) => +x)
return dayjs().hour(hour).minute(minute).toISOString()
}
if (castedValue) {
castedValue = stringTimeToDateISOString(castedValue)
}
let castedConstraints = cloneDeep(constraints)
if (castedConstraints.datetime?.earliest) {
castedConstraints.datetime.earliest = stringTimeToDateISOString(
castedConstraints.datetime?.earliest
)
}
if (castedConstraints.datetime?.latest) {
castedConstraints.datetime.latest = stringTimeToDateISOString(
castedConstraints.datetime?.latest
)
}
let jsValidation = validateJs.single(castedValue, castedConstraints)
jsValidation = jsValidation?.map((m: string) =>
m
?.replace(
castedConstraints.datetime?.earliest || "",
constraints.datetime?.earliest || ""
)
.replace(
castedConstraints.datetime?.latest || "",
constraints.datetime?.latest || ""
)
)
if (jsValidation) {
res ??= []
res.push(...jsValidation)
}
}
return res
}