@defra/wls-eps-web-service
Version:
The web service for wildlife licencing of European Protected Species
56 lines (52 loc) • 2.19 kB
JavaScript
import { APIRequests } from '../../../../services/api-requests.js'
import { cacheDirect } from '../../../../session-cache/cache-decorator.js'
import pageRoute from '../../../../routes/page-route.js'
import Joi from 'joi'
import { contactRoleIsSingular } from '../contact-roles.js'
const nameReg = /^[\s\p{L}'.,-]{1,160}$/u
/**
* Find the duplicate names to validate against
* For a singular role, ecologists etc, the duplicate check is across the user
* otherwise, for authorised people, it is across the application.
* For a singular role, the current name is excepted
* @param contactRoles
* @param userId
* @param applicationId
* @returns {Promise<*[]|*>}
*/
const duplicateNames = async (primaryRole, contactRoles, userId, applicationId) => {
let contacts = []
for await (const cr of contactRoles) {
if (contactRoleIsSingular(cr)) {
contacts = contacts.concat(await APIRequests.CONTACT.role(cr).findByUser(userId))
} else {
contacts = await APIRequests.CONTACT.role(cr).getByApplicationId(applicationId)
}
}
if (contactRoleIsSingular(primaryRole)) {
const currentContact = await APIRequests.CONTACT.role(primaryRole).getByApplicationId(applicationId)
return contacts.map(c => c.fullName).filter(c => c && c.toUpperCase() !== currentContact?.fullName?.toUpperCase())
} else {
return contacts.map(c => c.fullName).filter(c => c)
}
}
export const getValidator = (primaryRole, contactRoles) => async (payload, context) => {
const cd = cacheDirect(context)
const { userId, applicationId } = await cd.getData()
const names = await duplicateNames(primaryRole, contactRoles, userId, applicationId)
Joi.assert({ name: payload.name }, Joi.object({
// Remove double spacing
name: Joi.string().trim().replace(/((\s+){2,})/gm, '$2')
.pattern(nameReg).invalid(...names).insensitive().required()
}), 'name', { abortEarly: false, allowUnknown: true })
}
export const contactNamePage = ({ page, uri, checkData, getData, completion, setData }, primaryRole, contactRoles) =>
pageRoute({
page,
uri,
checkData,
getData,
completion,
setData,
validator: getValidator(primaryRole, contactRoles)
})