From e56bbaec66f10cd57ff7552d4844e48ca24cfbf8 Mon Sep 17 00:00:00 2001 From: juhanikat Date: Fri, 4 Oct 2024 12:45:21 +0300 Subject: [PATCH 1/3] basic validators for time unit --- backend/src/routes/timeUnit.ts | 11 +++++++- backend/src/services/timeUnit.ts | 14 ++++++++++ .../components/TimeUnit/TimeUnitDetails.tsx | 3 ++- frontend/src/validators/timeUnit.ts | 27 +++++++++++++++++++ 4 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 frontend/src/validators/timeUnit.ts diff --git a/backend/src/routes/timeUnit.ts b/backend/src/routes/timeUnit.ts index b7a256b6..6a391097 100644 --- a/backend/src/routes/timeUnit.ts +++ b/backend/src/routes/timeUnit.ts @@ -3,7 +3,12 @@ import { EditDataType, EditMetaData, TimeUnitDetailsType } from '../../../fronte import { Role } from '../../../frontend/src/types' import { requireOneOf } from '../middlewares/authorizer' import { getAllSequences } from '../services/sequence' -import { getAllTimeUnits, getTimeUnitDetails, getTimeUnitLocalities } from '../services/timeUnit' +import { + getAllTimeUnits, + getTimeUnitDetails, + getTimeUnitLocalities, + validateEntireTimeUnit, +} from '../services/timeUnit' import { deleteTimeUnit, writeTimeUnit } from '../services/write/timeUnit' import { fixBigInt } from '../utils/common' @@ -37,6 +42,10 @@ router.put( requireOneOf([Role.Admin, Role.EditUnrestricted]), async (req: Request & EditMetaData }>, res) => { const { comment, references, ...editedTimeUnit } = req.body.timeUnit + const validationErrors = validateEntireTimeUnit(editedTimeUnit) + if (validationErrors.length > 0) { + return res.status(400).send({ validationErrors }) + } const result = await writeTimeUnit(editedTimeUnit, comment, references, req.user!.initials) return res.status(200).send({ id: result }) } diff --git a/backend/src/services/timeUnit.ts b/backend/src/services/timeUnit.ts index 9d8459b8..7b196b44 100644 --- a/backend/src/services/timeUnit.ts +++ b/backend/src/services/timeUnit.ts @@ -1,4 +1,8 @@ import { logDb, nowDb } from '../utils/db' +import { EditDataType, TimeUnitDetailsType } from '../../../frontend/src/backendTypes' +import { ValidationObject } from '../../../frontend/src/validators/validator' +import { validateTimeUnit } from '../../../frontend/src/validators/timeUnit' +import Prisma from '../../prisma/generated/now_test_client' export const getAllTimeUnits = async () => { const result = await nowDb.now_time_unit.findMany({ @@ -85,3 +89,13 @@ export const getTimeUnitLocalities = async (id: string) => { }) return result } + +export const validateEntireTimeUnit = (editedFields: EditDataType) => { + const keys = Object.keys(editedFields) + const errors: ValidationObject[] = [] + for (const key of keys) { + const error = validateTimeUnit(editedFields, key as keyof TimeUnitDetailsType) + if (error.error) errors.push(error) + } + return errors +} diff --git a/frontend/src/components/TimeUnit/TimeUnitDetails.tsx b/frontend/src/components/TimeUnit/TimeUnitDetails.tsx index 34950d39..8a21f8dc 100644 --- a/frontend/src/components/TimeUnit/TimeUnitDetails.tsx +++ b/frontend/src/components/TimeUnit/TimeUnitDetails.tsx @@ -13,6 +13,7 @@ import { UpdateTab } from '../DetailView/common/UpdateTab' import { DetailView, TabType } from '../DetailView/DetailView' import { LocalityTab } from './Tabs/LocalityTab' import { TimeUnitTab } from './Tabs/TimeUnitTab' +import { validateTimeUnit } from '@/validators/timeUnit' export const TimeUnitDetails = () => { const { id } = useParams() @@ -72,7 +73,7 @@ export const TimeUnitDetails = () => { hasStagingMode data={isNew ? emptyTimeUnit : data!} onWrite={onWrite} - validator={() => ({ name: '', error: null })} + validator={validateTimeUnit} deleteFunction={deleteFunction} /> ) diff --git a/frontend/src/validators/timeUnit.ts b/frontend/src/validators/timeUnit.ts new file mode 100644 index 00000000..66f9fa13 --- /dev/null +++ b/frontend/src/validators/timeUnit.ts @@ -0,0 +1,27 @@ +import { EditDataType, TimeUnitDetailsType } from '../backendTypes' +import { Validators, validator } from './validator' + +export const validateTimeUnit = (editData: EditDataType, fieldName: keyof TimeUnitDetailsType) => { + const validators: Validators>> = { + tu_display_name: { + name: 'Name', + required: true, + }, + sequence: { + name: 'Sequence', + required: true, + }, + up_bnd: { + name: 'New Upper Bound', + required: true, + asNumber: true, + }, + low_bnd: { + name: 'New Lower Bound', + required: true, + asNumber: true, + }, + } + + return validator>(validators, editData, fieldName) +} From d15c8fd2cfb777b612d5359a5788c5e8879842e0 Mon Sep 17 00:00:00 2001 From: juhanikat Date: Fri, 4 Oct 2024 12:45:21 +0300 Subject: [PATCH 2/3] basic validators for time unit --- backend/src/routes/timeUnit.ts | 11 +++++++- backend/src/services/timeUnit.ts | 14 ++++++++++ .../components/TimeUnit/TimeUnitDetails.tsx | 3 ++- frontend/src/validators/timeUnit.ts | 27 +++++++++++++++++++ 4 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 frontend/src/validators/timeUnit.ts diff --git a/backend/src/routes/timeUnit.ts b/backend/src/routes/timeUnit.ts index b7a256b6..6a391097 100644 --- a/backend/src/routes/timeUnit.ts +++ b/backend/src/routes/timeUnit.ts @@ -3,7 +3,12 @@ import { EditDataType, EditMetaData, TimeUnitDetailsType } from '../../../fronte import { Role } from '../../../frontend/src/types' import { requireOneOf } from '../middlewares/authorizer' import { getAllSequences } from '../services/sequence' -import { getAllTimeUnits, getTimeUnitDetails, getTimeUnitLocalities } from '../services/timeUnit' +import { + getAllTimeUnits, + getTimeUnitDetails, + getTimeUnitLocalities, + validateEntireTimeUnit, +} from '../services/timeUnit' import { deleteTimeUnit, writeTimeUnit } from '../services/write/timeUnit' import { fixBigInt } from '../utils/common' @@ -37,6 +42,10 @@ router.put( requireOneOf([Role.Admin, Role.EditUnrestricted]), async (req: Request & EditMetaData }>, res) => { const { comment, references, ...editedTimeUnit } = req.body.timeUnit + const validationErrors = validateEntireTimeUnit(editedTimeUnit) + if (validationErrors.length > 0) { + return res.status(400).send({ validationErrors }) + } const result = await writeTimeUnit(editedTimeUnit, comment, references, req.user!.initials) return res.status(200).send({ id: result }) } diff --git a/backend/src/services/timeUnit.ts b/backend/src/services/timeUnit.ts index 9d8459b8..7b196b44 100644 --- a/backend/src/services/timeUnit.ts +++ b/backend/src/services/timeUnit.ts @@ -1,4 +1,8 @@ import { logDb, nowDb } from '../utils/db' +import { EditDataType, TimeUnitDetailsType } from '../../../frontend/src/backendTypes' +import { ValidationObject } from '../../../frontend/src/validators/validator' +import { validateTimeUnit } from '../../../frontend/src/validators/timeUnit' +import Prisma from '../../prisma/generated/now_test_client' export const getAllTimeUnits = async () => { const result = await nowDb.now_time_unit.findMany({ @@ -85,3 +89,13 @@ export const getTimeUnitLocalities = async (id: string) => { }) return result } + +export const validateEntireTimeUnit = (editedFields: EditDataType) => { + const keys = Object.keys(editedFields) + const errors: ValidationObject[] = [] + for (const key of keys) { + const error = validateTimeUnit(editedFields, key as keyof TimeUnitDetailsType) + if (error.error) errors.push(error) + } + return errors +} diff --git a/frontend/src/components/TimeUnit/TimeUnitDetails.tsx b/frontend/src/components/TimeUnit/TimeUnitDetails.tsx index 34950d39..8a21f8dc 100644 --- a/frontend/src/components/TimeUnit/TimeUnitDetails.tsx +++ b/frontend/src/components/TimeUnit/TimeUnitDetails.tsx @@ -13,6 +13,7 @@ import { UpdateTab } from '../DetailView/common/UpdateTab' import { DetailView, TabType } from '../DetailView/DetailView' import { LocalityTab } from './Tabs/LocalityTab' import { TimeUnitTab } from './Tabs/TimeUnitTab' +import { validateTimeUnit } from '@/validators/timeUnit' export const TimeUnitDetails = () => { const { id } = useParams() @@ -72,7 +73,7 @@ export const TimeUnitDetails = () => { hasStagingMode data={isNew ? emptyTimeUnit : data!} onWrite={onWrite} - validator={() => ({ name: '', error: null })} + validator={validateTimeUnit} deleteFunction={deleteFunction} /> ) diff --git a/frontend/src/validators/timeUnit.ts b/frontend/src/validators/timeUnit.ts new file mode 100644 index 00000000..66f9fa13 --- /dev/null +++ b/frontend/src/validators/timeUnit.ts @@ -0,0 +1,27 @@ +import { EditDataType, TimeUnitDetailsType } from '../backendTypes' +import { Validators, validator } from './validator' + +export const validateTimeUnit = (editData: EditDataType, fieldName: keyof TimeUnitDetailsType) => { + const validators: Validators>> = { + tu_display_name: { + name: 'Name', + required: true, + }, + sequence: { + name: 'Sequence', + required: true, + }, + up_bnd: { + name: 'New Upper Bound', + required: true, + asNumber: true, + }, + low_bnd: { + name: 'New Lower Bound', + required: true, + asNumber: true, + }, + } + + return validator>(validators, editData, fieldName) +} From 0d17b66a8ba04f2f94dce4d7542cd3e0abef7eed Mon Sep 17 00:00:00 2001 From: juhanikat Date: Fri, 4 Oct 2024 13:47:49 +0300 Subject: [PATCH 3/3] fix typescript error --- backend/src/services/timeUnit.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/services/timeUnit.ts b/backend/src/services/timeUnit.ts index 7b196b44..fd057c5c 100644 --- a/backend/src/services/timeUnit.ts +++ b/backend/src/services/timeUnit.ts @@ -94,7 +94,7 @@ export const validateEntireTimeUnit = (editedFields: EditDataType, key as keyof TimeUnitDetailsType) if (error.error) errors.push(error) } return errors