@defra/wls-eps-web-service
Version:
The web service for wildlife licencing of European Protected Species
130 lines (111 loc) • 4.49 kB
JavaScript
import Joi from 'joi'
import pageRoute from '../../../../routes/page-route.js'
import { habitatURIs, TASKLIST } from '../../../../uris.js'
import { APIRequests } from '../../../../services/api-requests.js'
import { PowerPlatformKeys } from '@defra/wls-powerapps-keys'
import { checkApplication } from '../../../common/check-application.js'
import { tagStatus } from '../../../../services/status-tags.js'
import { A24_SETT } from '../../../tasklist/a24-badger-licence.js'
import { boolFromYesNo } from '../../../common/common.js'
const {
SETT_TYPE: { MAIN_NO_ALTERNATIVE_SETT, ANNEXE, SUBSIDIARY, OUTLIER },
METHOD_IDS: { OBSTRUCT_SETT_WITH_BLOCK_OR_PROOF, OBSTRUCT_SETT_WITH_GATES, DAMAGE_A_SETT, DESTROY_A_SETT, DISTURB_A_SETT }
} = PowerPlatformKeys
const addSett = 'additional-sett'
const activityTypes = {
OBSTRUCT_SETT_WITH_GATES,
OBSTRUCT_SETT_WITH_BLOCK_OR_PROOF,
DAMAGE_A_SETT,
DESTROY_A_SETT,
DISTURB_A_SETT
}
const settTypes = {
MAIN_NO_ALTERNATIVE_SETT,
ANNEXE,
SUBSIDIARY,
OUTLIER
}
export const dateProcessor = date => {
const dateObj = new Date(date)
const day = dateObj.getDate()
const year = dateObj.getFullYear()
return `${Number(day)} ${dateObj.toLocaleString('default', { month: 'long' })} ${year}`
}
export const checkData = async (request, h) => {
const journeyData = await request.cache().getData()
// Ensure if a user just deleted their only sett, we take them back to /tasklist
const habitatSites = await APIRequests.HABITAT.getHabitatsById(journeyData.applicationId)
// Ensure the object is populated with the correct (and enough) keys
if (habitatSites.length === 0) {
return h.redirect(TASKLIST.uri)
}
return undefined
}
export const getData = async request => {
const journeyData = await request.cache().getData()
await APIRequests.APPLICATION.tags(journeyData.applicationId).set({ tag: A24_SETT, tagState: tagStatus.COMPLETE_NOT_CONFIRMED })
const habitatSites = await APIRequests.HABITAT.getHabitatsById(journeyData.applicationId)
const data = {
pageData: []
}
for (const habitat of habitatSites) {
const habitatType = habitat.settType
const methodTypes = habitat.methodIds
const startDate = dateProcessor(habitat.startDate)
const endDate = dateProcessor(habitat.endDate)
const reopen = habitat.willReopen ? 'Yes' : 'No'
const habitatData = Object.assign(habitat, { habitatType, reopen, methodTypes, startDate, endDate, activityTypes, settTypes })
data.pageData.push(habitatData)
}
data.confirmDelete = habitatURIs.CONFIRM_DELETE.uri
return data
}
export const validator = async payload => {
if (!payload[addSett]) {
throw new Joi.ValidationError('ValidationError', [{
message: 'Error: Option for additional sett has not been chosen',
path: [addSett],
type: 'no-choice-made',
context: {
label: addSett,
value: 'Error',
key: addSett
}
}], null)
}
}
export const checkSettDropout = habitatSites => {
if (habitatSites.length > 0) {
return habitatSites.every(habitatSite => parseInt(habitatSite.numberOfActiveEntrances) === 0)
}
return false
}
export const completion = async request => {
const pageData = await request.cache().getPageData()
const journeyData = await request.cache().getData()
const habitatSites = await APIRequests.HABITAT.getHabitatsById(journeyData.applicationId)
if (boolFromYesNo(pageData.payload[addSett])) {
await APIRequests.APPLICATION.tags(journeyData.applicationId).set({ tag: A24_SETT, tagState: tagStatus.ONE_COMPLETE_AND_REST_IN_PROGRESS })
delete journeyData.habitatData
await request.cache().setData(journeyData)
return habitatURIs.NAME.uri
} else if (pageData.payload[addSett] === 'no') {
// Redirect user to active sett dropout page when a single badger sett or all badger setts has 0 active (inactive) entrance holes
const flagDropOut = checkSettDropout(habitatSites)
if (flagDropOut) {
return habitatURIs.ACTIVE_SETT_DROPOUT.uri
}
// Mark the journey as complete if the user clicks "No" to adding any final setts
await APIRequests.APPLICATION.tags(journeyData.applicationId).set({ tag: A24_SETT, tagState: tagStatus.COMPLETE })
return TASKLIST.uri
}
return undefined
}
export default pageRoute({
page: habitatURIs.CHECK_YOUR_ANSWERS.page,
uri: habitatURIs.CHECK_YOUR_ANSWERS.uri,
checkData: [checkData, checkApplication],
getData,
validator,
completion
})