mirror of
https://github.com/nowcommunity/nowdatabase.git
synced 2026-10-12 19:13:52 +03:00
Extract reference validation helpers for unit test isolation
This commit is contained in:
@@ -7,11 +7,10 @@ import {
|
||||
getReferenceJournals,
|
||||
getReferenceLocalities,
|
||||
getReferenceSpecies,
|
||||
buildReferenceDisplayLabelMap,
|
||||
validateEntireReference,
|
||||
getAuthorsOfReference,
|
||||
getJournalById,
|
||||
} from '../services/reference'
|
||||
import { buildReferenceDisplayLabelMap, validateEntireReference } from '../services/referenceValidation'
|
||||
import { requireOneOf } from '../middlewares/authorizer'
|
||||
import { Role, EditMetaData, ReferenceDetailsType, EditDataType } from '../../../frontend/src/shared/types'
|
||||
import { deleteReference, writeReference } from '../services/write/reference'
|
||||
|
||||
@@ -1,17 +1,10 @@
|
||||
import { nowDb } from '../utils/db'
|
||||
import { EditDataType, ReferenceDetailsType } from '../../../frontend/src/shared/types'
|
||||
import { ValidationObject } from '../../../frontend/src/shared/validators/validator'
|
||||
import {
|
||||
ReferenceDisplayLabelMap,
|
||||
ReferenceFieldDisplayNames,
|
||||
validateReference,
|
||||
} from '../../../frontend/src/shared/validators/reference'
|
||||
import { type ref_ref } from '../../prisma/generated/now_test_client'
|
||||
import { TabListQueryOptions } from './tabularQuery'
|
||||
|
||||
type ReferenceTypeFieldName = { field_name: string | null; ref_field_name: string | null }
|
||||
|
||||
export type ReferenceTypeWithFieldNames = { ref_type_id: number; ref_field_name: ReferenceTypeFieldName[] }
|
||||
import {
|
||||
buildReferenceDisplayLabelMap,
|
||||
type ReferenceTypeWithFieldNames,
|
||||
validateEntireReference,
|
||||
} from './referenceValidation'
|
||||
|
||||
export const getAllReferences = async () => {
|
||||
const result = await nowDb.ref_ref.findMany({
|
||||
@@ -118,28 +111,6 @@ export const getReferenceTypes = async (): Promise<ReferenceTypeWithFieldNames[]
|
||||
return referenceTypes
|
||||
}
|
||||
|
||||
export const buildReferenceDisplayLabelMap = (
|
||||
referenceTypes: ReferenceTypeWithFieldNames[]
|
||||
): ReferenceDisplayLabelMap => {
|
||||
const labelMap: ReferenceDisplayLabelMap = {}
|
||||
|
||||
referenceTypes.forEach(referenceType => {
|
||||
const labelsForType = referenceType.ref_field_name.reduce<ReferenceFieldDisplayNames>((typeLabels, field) => {
|
||||
if (field.field_name && field.ref_field_name) {
|
||||
typeLabels[field.field_name as keyof ReferenceFieldDisplayNames] = field.ref_field_name
|
||||
}
|
||||
|
||||
return typeLabels
|
||||
}, {})
|
||||
|
||||
if (Object.keys(labelsForType).length > 0) {
|
||||
labelMap[referenceType.ref_type_id] = labelsForType
|
||||
}
|
||||
})
|
||||
|
||||
return labelMap
|
||||
}
|
||||
|
||||
export const getReferenceAuthors = async () => {
|
||||
const uniqueReferenceAuthors = await nowDb.ref_authors.groupBy({
|
||||
by: ['author_surname', 'author_initials'],
|
||||
@@ -185,15 +156,4 @@ export const getReferenceJournals = async () => {
|
||||
return referenceJournalTypes
|
||||
}
|
||||
|
||||
export const validateEntireReference = (
|
||||
editedFields: EditDataType<ref_ref>,
|
||||
options?: { displayLabelMap?: ReferenceDisplayLabelMap }
|
||||
) => {
|
||||
const keys = Object.keys(editedFields as Record<string, unknown>) as (keyof EditDataType<ReferenceDetailsType>)[]
|
||||
const errors: ValidationObject[] = []
|
||||
for (const key of keys) {
|
||||
const error = validateReference(editedFields as EditDataType<ReferenceDetailsType>, key, options)
|
||||
if (error.error) errors.push(error)
|
||||
}
|
||||
return errors
|
||||
}
|
||||
export { buildReferenceDisplayLabelMap, validateEntireReference }
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
import { EditDataType, ReferenceDetailsType } from '../../../frontend/src/shared/types'
|
||||
import { ValidationObject } from '../../../frontend/src/shared/validators/validator'
|
||||
import {
|
||||
ReferenceDisplayLabelMap,
|
||||
ReferenceFieldDisplayNames,
|
||||
validateReference,
|
||||
} from '../../../frontend/src/shared/validators/reference'
|
||||
|
||||
type ReferenceTypeFieldName = { field_name: string | null; ref_field_name: string | null }
|
||||
|
||||
export type ReferenceTypeWithFieldNames = { ref_type_id: number; ref_field_name: ReferenceTypeFieldName[] }
|
||||
|
||||
export const buildReferenceDisplayLabelMap = (
|
||||
referenceTypes: ReferenceTypeWithFieldNames[]
|
||||
): ReferenceDisplayLabelMap => {
|
||||
const labelMap: ReferenceDisplayLabelMap = {}
|
||||
|
||||
referenceTypes.forEach(referenceType => {
|
||||
const labelsForType = referenceType.ref_field_name.reduce<ReferenceFieldDisplayNames>((typeLabels, field) => {
|
||||
if (field.field_name && field.ref_field_name) {
|
||||
typeLabels[field.field_name as keyof ReferenceFieldDisplayNames] = field.ref_field_name
|
||||
}
|
||||
|
||||
return typeLabels
|
||||
}, {})
|
||||
|
||||
if (Object.keys(labelsForType).length > 0) {
|
||||
labelMap[referenceType.ref_type_id] = labelsForType
|
||||
}
|
||||
})
|
||||
|
||||
return labelMap
|
||||
}
|
||||
|
||||
export const validateEntireReference = (
|
||||
editedFields: EditDataType<ReferenceDetailsType>,
|
||||
options?: { displayLabelMap?: ReferenceDisplayLabelMap }
|
||||
) => {
|
||||
const keys = Object.keys(editedFields as Record<string, unknown>) as (keyof EditDataType<ReferenceDetailsType>)[]
|
||||
const errors: ValidationObject[] = []
|
||||
|
||||
for (const key of keys) {
|
||||
const error = validateReference(editedFields, key, options)
|
||||
if (error.error) errors.push(error)
|
||||
}
|
||||
|
||||
return errors
|
||||
}
|
||||
@@ -4,7 +4,7 @@ import {
|
||||
buildReferenceDisplayLabelMap,
|
||||
validateEntireReference,
|
||||
type ReferenceTypeWithFieldNames,
|
||||
} from '../../services/reference'
|
||||
} from '../../services/referenceValidation'
|
||||
import { EditDataType, ReferenceDetailsType } from '../../../../frontend/src/shared/types'
|
||||
|
||||
const electronicCitationReferenceType: ReferenceTypeWithFieldNames = {
|
||||
|
||||
Reference in New Issue
Block a user