Source: middleware/organisations.middleware.js

import { logPageError } from './common.middleware.js'
import { fetchMany, renderTemplate } from './middleware.builders.js'

const fetchOrganisations = fetchMany({
  query: ({ req, params }) => {
    return `
      SELECT
        name,
        organisation
      FROM
        organisation
      WHERE
        (
          organisation LIKE 'local-authority:%'
          OR organisation LIKE 'national-park-authority:%'
        )
        AND (
          end_date IS NULL
          OR end_date = ''
          OR end_date >= current_timestamp
        )
      ORDER BY
        name ASC
    `
  },
  result: 'organisations'
})

/**
 * Middleware. Updates req with `templateParams`.
 *
 * @param {Object} req - Express request object
 * @param {Array<Object>} req.organisations - Array of organisation objects
 * @param {Object} res - Express response object
 * @param {Function} next - Express next function
 * @returns {void}
 */
export const prepareGetOrganisationsTemplateParams = (req, res, next) => {
  const sortedResults = req.organisations.sort((a, b) => {
    return a.name.localeCompare(b.name)
  })

  const alphabetisedOrgs = sortedResults.reduce((acc, current) => {
    const firstLetter = current.name.charAt(0).toUpperCase()
    acc[firstLetter] = acc[firstLetter] || []
    acc[firstLetter].push(current)
    return acc
  }, {})

  req.templateParams = { alphabetisedOrgs }

  next()
}

export const getOrganisations = renderTemplate({
  templateParams: (req) => req.templateParams,
  template: 'organisations/find.html',
  handlerName: 'getOrganisations'
})

export default [
  fetchOrganisations,
  prepareGetOrganisationsTemplateParams,
  getOrganisations,
  logPageError
]