@defra/wls-eps-web-service
Version:
The web service for wildlife licencing of European Protected Species
162 lines (149 loc) • 6.67 kB
JavaScript
import { API } from '@defra/wls-connectors-lib'
import { apiUrls, apiRequestsWrapper } from './api-requests.js'
import { boomify } from '@hapi/boom'
import db from 'debug'
import { tagStatus } from './status-tags.js'
const debug = db('web-service:api-requests')
export const APPLICATION = {
/**
* Basic application creation - creates the record unassociated with any user and not assigned a reference number.
* It has only a type
* @param userId
* @param type
* @returns {Promise<*>}
*/
create: async (applicationTypeId, applicationPurposeId) => apiRequestsWrapper(
async () => {
const application = await API.post(apiUrls.APPLICATION, { applicationTypeId, applicationPurposeId })
debug(`Created pre-application ${JSON.stringify(application.id)}`)
return application
},
`Error creating pre-application of type ${applicationTypeId} for ${applicationPurposeId}`,
500
),
/**
* Associates a user with the application with the default role. Sets the reference number
* @param userId
* @param applicationId
* @returns {Promise<void>}
*/
initialize: async (userId, applicationId, role) => apiRequestsWrapper(
async () => {
const applicationUsers = await API.get(apiUrls.APPLICATION_USERS, `userId=${userId}&applicationId=${applicationId}&role=${role}`)
const result = {}
// Associate user if no association exists
if (!applicationUsers.length) {
result.applicationUser = await API.post(apiUrls.APPLICATION_USER, { userId, applicationId, role })
debug(`associated applicationId: ${result.applicationUser.applicationId} with userId: ${result.applicationUser.userId} using role: ${role}`)
} else {
result.applicationUser = applicationUsers[0]
debug(`Found existing association between applicationId: ${applicationUsers[0].applicationId} and userId: ${applicationUsers[0].userId} using role: ${role}`)
}
// Create reference number if no reference number exists
result.application = await API.get(`${apiUrls.APPLICATION}/${applicationId}`)
if (!result.application?.applicationReferenceNumber) {
const { ref: applicationReferenceNumber } = await API.get('/applications/get-reference', `applicationTypeId=${result.application.applicationTypeId}`)
Object.assign(result.application, { applicationReferenceNumber })
debug(`Assign reference number ${applicationReferenceNumber} to applicationId: ${result.application.id}`)
result.application = await API.put(`${apiUrls.APPLICATION}/${applicationId}`, (({ id, ...l }) => l)(result.application))
}
return result
},
`Error creating application-user with userId ${userId} and applicationId ${applicationId}`,
500
),
findByUser: async userId => apiRequestsWrapper(
async () => {
debug(`Finding applications for userId: ${userId}`)
return API.get(apiUrls.APPLICATIONS, `userId=${userId}`)
},
`Error finding application with userId ${userId}`,
500
),
findRoles: async (userId, applicationId) => {
debug(`Testing the existence of application for userId: ${userId} applicationId: ${applicationId}`)
const applicationUsers = await API.get(apiUrls.APPLICATION_USERS, `userId=${userId}&applicationId=${applicationId}`)
return applicationUsers.map(au => au.role)
},
update: async (applicationId, payload) => apiRequestsWrapper(
async () => {
debug(`Amend applications by applicationId: ${applicationId}`)
return API.put(`${apiUrls.APPLICATION}/${applicationId}`, payload)
},
`Error amending application by applicationId: ${applicationId}`,
500
),
getById: async (applicationId, noCache) => apiRequestsWrapper(
async () => {
const query = {}
if (noCache) {
query.nocache = 'true'
}
debug(`Get applications by applicationId: ${applicationId}. Query: ${query}`)
return API.get(`${apiUrls.APPLICATION}/${applicationId}`, query)
},
`Error getting application by applicationId: ${applicationId}`,
500
),
submit: async applicationId => apiRequestsWrapper(
async () => {
debug(`Submit application for applicationId: ${applicationId}`)
return API.post(`${apiUrls.APPLICATION}/${applicationId}/submit`)
},
`Error submitting application for applicationId: ${applicationId}`,
500
),
tags: applicationId => ({
get: async key => apiRequestsWrapper(
async () => {
const application = await API.get(`${apiUrls.APPLICATION}/${applicationId}`)
application.applicationTags = application.applicationTags || []
const tag = application.applicationTags.find(t => t.tag === key)
if (tag === undefined) {
return tagStatus.NOT_STARTED
} else {
return tag.tagState
}
},
`Error fetching tag ${key} for applicationId: ${applicationId}`,
500
),
getAll: async () => {
const application = await API.get(`${apiUrls.APPLICATION}/${applicationId}`)
application.applicationTags = application.applicationTags || []
return application.applicationTags
},
set: async tagObj => apiRequestsWrapper(
async () => {
const key = tagObj.tag
const tagState = tagObj.tagState
// If you are trying to set an impossible state
if (Object.values(tagStatus).indexOf(tagState) === -1) {
const error = new Error('Invalid tag status assignment')
console.error(`Error adding value key ${key} and value ${tagState} for applicationId: ${applicationId}`, error)
boomify(error, { statusCode: 500 })
throw error
}
const application = await API.get(`${apiUrls.APPLICATION}/${applicationId}`)
application.applicationTags = application.applicationTags || []
const tag = application.applicationTags.find(t => t.tag === key)
if (tag === undefined) {
// The first time the user is adding a tag
application.applicationTags.push(tagObj)
await API.put(`${apiUrls.APPLICATION}/${applicationId}`, application)
} else {
// The tag to update
const index = application.applicationTags.indexOf(tag)
// Nothing to update
if (application.applicationTags[index].tagState === tagState) {
return
}
application.applicationTags[index].tagState = tagState
await API.put(`${apiUrls.APPLICATION}/${applicationId}`, application)
}
},
`Error adding tag ${JSON.stringify(tagObj)} for applicationId: ${applicationId}`,
500
)
})
}