From c4c50aeb279fe12fca11520ac5e7653bb5571853 Mon Sep 17 00:00:00 2001 From: Ash Date: Mon, 20 May 2024 15:27:54 +0100 Subject: [PATCH 01/29] find place searching on alerts and warnings --- server/models/views/alerts-and-warnings.js | 6 +- server/routes/alerts-and-warnings.js | 210 ++++++++++++++------ server/views/layout.html | 2 +- server/views/location-not-found.html | 2 +- test/routes/alerts-and-warnings-POST.js | 86 -------- test/routes/alerts-and-warnings.js | 219 +++++++++++++++------ 6 files changed, 318 insertions(+), 207 deletions(-) delete mode 100644 test/routes/alerts-and-warnings-POST.js diff --git a/server/models/views/alerts-and-warnings.js b/server/models/views/alerts-and-warnings.js index 65ef129d3..22450e30e 100644 --- a/server/models/views/alerts-and-warnings.js +++ b/server/models/views/alerts-and-warnings.js @@ -2,15 +2,17 @@ const { bingKeyMaps } = require('../../config') const config = require('../../config') class ViewModel { - constructor ({ location, place, floods, station, error }) { + constructor ({ q, location, place, floods, station, canonical, error }) { Object.assign(this, { - q: location, + q: q || location, map: station ? 'map-station' : 'map', station: station || null, placeName: place ? place.name : '', placeBbox: place ? place.bbox2k : [], placeCentre: place ? place.center : [], timestamp: Date.now(), + metaCanonical: canonical, + canonicalUrl: canonical, error: error ? true : null, displayGetWarningsLink: true, displayLongTermLink: true, diff --git a/server/routes/alerts-and-warnings.js b/server/routes/alerts-and-warnings.js index f371f2b6c..7baaf0a01 100644 --- a/server/routes/alerts-and-warnings.js +++ b/server/routes/alerts-and-warnings.js @@ -1,92 +1,182 @@ +const qs = require('qs') const joi = require('@hapi/joi') +const boom = require('@hapi/boom') const ViewModel = require('../models/views/alerts-and-warnings') const Floods = require('../models/floods') const locationService = require('../services/location') const util = require('../util') +const { slugify } = require('./lib/utils') -module.exports = [{ - method: 'GET', - path: '/alerts-and-warnings', - handler: async (request, h) => { - const { q: location } = request.query - let model, place, floods - - const direction = request.query.direction === 'downstream' ? 'd' : 'u' - const station = request.query.station - ? await request.server.methods.flood.getStationById(request.query.station, direction) - : null - - if (station) { - const warningsAlerts = await request.server.methods.flood.getWarningsAlertsWithinStationBuffer(station.rloi_id) - floods = new Floods({ floods: warningsAlerts }) - model = new ViewModel({ location, place, floods, station }) - return h.view('alerts-and-warnings', { model }) - } else if (typeof location === 'undefined' || location === '' || location.match(/^england$/i)) { - floods = new Floods(await request.server.methods.flood.getFloods()) - model = new ViewModel({ location, place, floods, station }) - return h.view('alerts-and-warnings', { model }) - } else { - try { - [place] = await locationService.find(util.cleanseLocation(location)) - } catch (error) { - request.logger.warn({ - situation: `Location search error: [${error.name}] [${error.message}]`, - err: error - }) - const floods = new Floods(await request.server.methods.flood.getFloods()) - model = new ViewModel({ location, place, floods, station, error }) - return h.view('alerts-and-warnings', { model }) - } +function createQueryParametersString (queryObject) { + const { q, location, ...otherParameters } = queryObject + const queryString = qs.stringify(otherParameters, { addQueryPrefix: true, encode: false }) + return queryString +} - if (!place) { - model = new ViewModel({ location, place, floods, station }) - return h.view('alerts-and-warnings', { model }) - } +async function routeHandler (request, h) { + let location = request.query.q || request.query.location || request.payload?.location + const direction = request.query.direction === 'downstream' ? 'd' : 'u' + + const station = request.query.station + ? await request.server.methods.flood.getStationById(request.query.station, direction) + : null + + let model, floods - if (!place?.isEngland.is_england) { - // If no place return empty floods - model = new ViewModel({ location, place, floods, station }) - return h.view('alerts-and-warnings', { model }) + request.yar.set('q', location) + + if (station) { + const warningsAlerts = await request.server.methods.flood.getWarningsAlertsWithinStationBuffer(station.rloi_id) + floods = new Floods({ floods: warningsAlerts }) + model = new ViewModel({ location, floods, station }) + return h.view('alerts-and-warnings', { model }) + } + + if (location) { + location = util.cleanseLocation(location) + + const [place] = await locationService.find(location) + + if (!place) { + if (request.method === 'get') { + return boom.notFound(`Location ${location} not found`) } else { - // Data passed to floods model so the schema is the same as cached floods - const data = await request.server.methods.flood.getFloodsWithin(place.bbox2k) - floods = new Floods(data) - model = new ViewModel({ location, place, floods, station }) - return h.view('alerts-and-warnings', { model }) + return h.view('location-not-found', { pageTitle: 'Error: Find location - Check for flooding', href: 'alerts-and-warnings', location }).takeover() + } + } + + if (!place.isEngland.is_england) { + request.logger.warn({ + situation: 'Location search error: Valid response but location not in England.' + }) + + if (request.method === 'post') { + return h.view('location-not-found', { pageTitle: 'Error: Find location - Check for flooding', href: 'alerts-and-warnings', location }).takeover() } } - }, + + const queryString = createQueryParametersString(request.query) + + return h.redirect(`/alerts-and-warnings/${slugify(place?.name)}${queryString}`).permanent() + } + + const data = await request.server.methods.flood.getFloods() + floods = new Floods(data) + model = new ViewModel({ location, floods }) + return h.view('alerts-and-warnings', { model }) +} + +async function locationRouteHandler (request, h) { + const canonicalUrl = request.url.origin + request.url.pathname + const location = util.cleanseLocation(request.params.location) + const direction = request.query.direction === 'downstream' ? 'd' : 'u' + + const station = request.query.station + ? await request.server.methods.flood.getStationById(request.query.station, direction) + : null + + const [place] = await locationService.find(location) + + let model, floods + + if (station) { + const warningsAlerts = await request.server.methods.flood.getWarningsAlertsWithinStationBuffer(station.rloi_id) + floods = new Floods({ floods: warningsAlerts }) + model = new ViewModel({ location, place, floods, station, canonical: canonicalUrl, q: request.yar.get('q') }) + return h.view('alerts-and-warnings', { model }) + } + + if (location.match(/^england$/i)) { + return h.redirect('/alerts-and-warnings') + } + + if (slugify(place?.name) !== location) { + return boom.notFound(`Location ${location} not found`) + } + + if (!place.isEngland.is_england) { + request.logger.warn({ + situation: 'Location search error: Valid response but location not in England.' + }) + + if (request.method === 'get') { + return boom.notFound(`Location ${location} not found`) + } else { + return h.view('location-not-found', { pageTitle: 'Error: Find location - Check for flooding', href: 'alerts-and-warnings', location }).takeover() + } + } + + // Data passed to floods model so the schema is the same as cached floods + const data = await request.server.methods.flood.getFloodsWithin(place.bbox2k) + floods = new Floods(data) + model = new ViewModel({ location, place, floods, station, canonical: canonicalUrl, q: request.yar.get('q') }) + return h.view('alerts-and-warnings', { model }) +} + +function failActionHandler (request, h) { + request.logger.warn({ + situation: 'Location search error: Invalid or no string input.' + }) + + const location = request.query.q || request.query.location || request.payload?.location + + if (!location) { + return h.redirect('alerts-and-warnings').takeover() + } else { + return h.view('location-not-found', { pageTitle: 'Error: Find location - Check for flooding', href: 'alerts-and-warnings', location }).takeover() + } +} + +module.exports = [{ + method: 'GET', + path: '/alerts-and-warnings', + handler: routeHandler, options: { validate: { query: joi.object({ - q: joi.string().allow('').trim().max(200), + q: joi.string().trim().max(200), station: joi.string(), btn: joi.string(), ext: joi.string(), fid: joi.string(), lyr: joi.string(), v: joi.string() - }) + }), + failAction: failActionHandler } } -}, { +}, +{ + method: 'GET', + path: '/alerts-and-warnings/{location}', + handler: locationRouteHandler, + options: { + validate: { + params: joi.object({ + location: joi.string().lowercase() + }), + query: joi.object({ + station: joi.string(), + btn: joi.string(), + ext: joi.string(), + fid: joi.string(), + lyr: joi.string(), + v: joi.string() + }), + failAction: failActionHandler + } + } +}, +{ method: 'POST', path: '/alerts-and-warnings', - handler: async (request, h) => { - const { location } = request.payload - if (location === '') { - return h.redirect(`/alerts-and-warnings?q=${location}`) - } - return h.redirect(`/alerts-and-warnings?q=${encodeURIComponent(util.cleanseLocation(location))}`) - }, + handler: routeHandler, options: { validate: { payload: joi.object({ location: joi.string().allow('').trim().max(200).required() }), - failAction: (request, h, _err) => { - return h.view('alerts-and-warnings').takeover() - } + failAction: failActionHandler } } }] diff --git a/server/views/layout.html b/server/views/layout.html index f9e35eb87..60dada24d 100644 --- a/server/views/layout.html +++ b/server/views/layout.html @@ -30,7 +30,7 @@ {% if metaCanonical %} - + {% endif %} " } + url: '/alerts-and-warnings', + payload: { + location: '' + } } const response = await server.inject(options) - Code.expect(response.statusCode).to.equal(200) - const root = parse(response.payload) - const headers = root.querySelectorAll('h2') - Code.expect(headers.some(h => h.text.trim().startsWith("No results for \x3Cscript>alert('TEST')\x3C/script>"))).to.be.false() + Code.expect(response.statusCode).to.equal(404) + Code.expect(response.result.message).to.equal('Not Found') }) + lab.experiment('RLOI', () => { lab.test('GET /river-and-sea-levels?rloi-id=7224 should redirect', async () => { - const floodService = require('../../server/services/flood') - - const fakeStationsData = () => data.stationsWithinRadius - - const originalStation = () => data.riverStation7224 - const cachedStation = () => data.cachedStation - - sandbox.stub(floodService, 'getStationsByRadius').callsFake(fakeStationsData) - sandbox.stub(floodService, 'getStationById').callsFake(originalStation) - sandbox.stub(floodService, 'getStationsGeoJson').callsFake(cachedStation) + stubs.getJson.callsFake(() => data.warringtonGetJson) + stubs.getStationsByRadius.callsFake(() => data.stationsWithinRadius) + stubs.getStationById.callsFake(() => data.riverStation7224) + stubs.getStationsGeoJson.callsFake(() => data.cachedStation) + stubs.getIsEngland.callsFake(() => ({ is_england: true })) // Set cached stationsGeojson - + const floodService = require('../../server/services/flood') floodService.stationsGeojson = await floodService.getStationsGeoJson() - const riversPlugin = { - plugin: { - name: 'rivers', - register: (server, options) => { - server.route(require('../../server/routes/river-and-sea-levels')) - } - } - } - - await server.register(require('../../server/plugins/views')) - await server.register(require('../../server/plugins/session')) - await server.register(riversPlugin) - // Add Cache methods to server - const registerServerMethods = require('../../server/services/server-methods') - registerServerMethods(server) - - await server.initialize() const options = { method: 'GET', url: '/river-and-sea-levels?rloi-id=7224' @@ -2640,39 +940,18 @@ lab.experiment('Test - /river-and-sea-levels', () => { Code.expect(response.statusCode).to.equal(302) Code.expect(response.headers.location).to.equal('/river-and-sea-levels/rloi/7224') }) - lab.test('GET /river-and-sea-levels/rloi/7224', async () => { - const floodService = require('../../server/services/flood') - - const fakeStationsData = () => data.stationsWithinRadius - const originalStation = () => data.riverStation7224 - const cachedStation = () => data.cachedStation - - sandbox.stub(floodService, 'getStationsByRadius').callsFake(fakeStationsData) - sandbox.stub(floodService, 'getStationById').callsFake(originalStation) - sandbox.stub(floodService, 'getStationsGeoJson').callsFake(cachedStation) + lab.test('GET /river-and-sea-levels/rloi/7224', async () => { + stubs.getJson.callsFake(() => data.warringtonGetJson) + stubs.getStationsByRadius.callsFake(() => data.stationsWithinRadius) + stubs.getStationById.callsFake(() => data.riverStation7224) + stubs.getStationsGeoJson.callsFake(() => data.cachedStation) + stubs.getIsEngland.callsFake(() => ({ is_england: true })) // Set cached stationsGeojson - + const floodService = require('../../server/services/flood') floodService.stationsGeojson = await floodService.getStationsGeoJson() - const riversPlugin = { - plugin: { - name: 'rivers', - register: (server, options) => { - server.route(require('../../server/routes/river-and-sea-levels')) - } - } - } - - await server.register(require('../../server/plugins/views')) - await server.register(require('../../server/plugins/session')) - await server.register(riversPlugin) - // Add Cache methods to server - const registerServerMethods = require('../../server/services/server-methods') - registerServerMethods(server) - - await server.initialize() const options = { method: 'GET', url: '/river-and-sea-levels/rloi/7224' @@ -2686,40 +965,19 @@ lab.experiment('Test - /river-and-sea-levels', () => { Code.expect(response.payload).to.contain('Showing levels within 5 miles of Grants Bridge.') }) }) + lab.experiment('River', () => { lab.test('GET /river-and-sea-levels?river-id=river-nidd should redirect', async () => { - const floodService = require('../../server/services/flood') - - const fakeStationsData = () => data.stationsWithinRadius - - const originalStation = () => data.riverStation7224 - const cachedStation = () => data.cachedStation - - sandbox.stub(floodService, 'getStationsByRadius').callsFake(fakeStationsData) - sandbox.stub(floodService, 'getStationById').callsFake(originalStation) - sandbox.stub(floodService, 'getStationsGeoJson').callsFake(cachedStation) + stubs.getJson.callsFake(() => data.warringtonGetJson) + stubs.getStationsByRadius.callsFake(() => data.stationsWithinRadius) + stubs.getStationById.callsFake(() => data.riverStation7224) + stubs.getStationsGeoJson.callsFake(() => data.cachedStation) + stubs.getIsEngland.callsFake(() => ({ is_england: true })) // Set cached stationsGeojson - + const floodService = require('../../server/services/flood') floodService.stationsGeojson = await floodService.getStationsGeoJson() - const riversPlugin = { - plugin: { - name: 'rivers', - register: (server, options) => { - server.route(require('../../server/routes/river-and-sea-levels')) - } - } - } - - await server.register(require('../../server/plugins/views')) - await server.register(require('../../server/plugins/session')) - await server.register(riversPlugin) - // Add Cache methods to server - const registerServerMethods = require('../../server/services/server-methods') - registerServerMethods(server) - - await server.initialize() const options = { method: 'GET', url: '/river-and-sea-levels?riverId=river-nidd' @@ -2730,30 +988,10 @@ lab.experiment('Test - /river-and-sea-levels', () => { Code.expect(response.statusCode).to.equal(302) Code.expect(response.headers.location).to.equal('/river-and-sea-levels/river/river-nidd') }) - lab.test('GET /river-and-sea-levels/river/river-nidd', async () => { - const floodService = require('../../server/services/flood') - - const riverStation = () => data.riverNiddStations - - sandbox.stub(floodService, 'getRiverById').callsFake(riverStation) - - const riversPlugin = { - plugin: { - name: 'rivers', - register: (server, options) => { - server.route(require('../../server/routes/river-and-sea-levels')) - } - } - } - await server.register(require('../../server/plugins/views')) - await server.register(require('../../server/plugins/session')) - await server.register(riversPlugin) - // Add Cache methods to server - const registerServerMethods = require('../../server/services/server-methods') - registerServerMethods(server) + lab.test('GET /river-and-sea-levels/river/river-nidd', async () => { + stubs.getRiverById.callsFake(() => data.riverNiddStations) - await server.initialize() const options = { method: 'GET', url: '/river-and-sea-levels/river/river-nidd' @@ -2768,36 +1006,11 @@ lab.experiment('Test - /river-and-sea-levels', () => { const riversTab = root.querySelectorAll('ul#filter.defra-navbar__list li.defra-navbar__item--selected')[0].text.trim() Code.expect(riversTab).to.be.equal('River (6)') }) - lab.test('GET /river-and-sea-levels - Check for related content links', async () => { - const floodService = require('../../server/services/flood') - - const fakeIsEngland = () => { - return { is_england: true } - } - - const fakeStationsData = () => [] - - sandbox.stub(floodService, 'getIsEngland').callsFake(fakeIsEngland) - sandbox.stub(floodService, 'getStations').callsFake(fakeStationsData) - const riversPlugin = { - plugin: { - name: 'rivers', - register: (server, options) => { - server.route(require('../../server/routes/river-and-sea-levels')) - } - } - } - - await server.register(require('../../server/plugins/views')) - await server.register(require('../../server/plugins/session')) - await server.register(require('../../server/plugins/logging')) - await server.register(riversPlugin) - // Add Cache methods to server - const registerServerMethods = require('../../server/services/server-methods') - registerServerMethods(server) + lab.test('GET /river-and-sea-levels - Check for related content links', async () => { + stubs.getStations.callsFake(() => []) + stubs.getIsEngland.callsFake(() => ({ is_england: true })) - await server.initialize() const options = { method: 'GET', url: '/river-and-sea-levels' @@ -2812,14 +1025,3 @@ lab.experiment('Test - /river-and-sea-levels', () => { }) }) }) - -function checkTitleAndDescription (root, title, description) { - const metaDescription = root - .querySelectorAll('[name="description"]') - - const metaTitle = root - .querySelectorAll('[property="og:title"]') - - Code.expect(metaDescription[0]._attrs.content).to.equal(description) - Code.expect(metaTitle[0]._attrs.content).to.contain(title) -} From f2990edc77429676535034a7b6c77844ef1900bd Mon Sep 17 00:00:00 2001 From: nikiwycherley Date: Mon, 15 Jul 2024 15:36:18 +0100 Subject: [PATCH 25/29] Release 8.5.0 (#744) * Bump version number (8.5.0) * Add release notes (8.5.0) * Update CFF-8.5.0.md --------- Co-authored-by: GitHub Actions Co-authored-by: Lee Gordon <40238160+LeeGordon83@users.noreply.github.com> --- package-lock.json | 4 ++-- package.json | 2 +- release-docs/CFF-8.5.0.md | 27 +++++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 release-docs/CFF-8.5.0.md diff --git a/package-lock.json b/package-lock.json index 1a4c5d737..e3385483a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "flood-app", - "version": "8.4.0", + "version": "8.5.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "flood-app", - "version": "8.4.0", + "version": "8.5.0", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index d157f917b..96ee182e3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flood-app", - "version": "8.4.0", + "version": "8.5.0", "description": "Flood risk app", "main": "index.js", "repository": "github:defra/flood-app", diff --git a/release-docs/CFF-8.5.0.md b/release-docs/CFF-8.5.0.md new file mode 100644 index 000000000..3ec86f03b --- /dev/null +++ b/release-docs/CFF-8.5.0.md @@ -0,0 +1,27 @@ +# Check For Flooding Release + +* Version: 8.5.0 +* Proposed Release Date: 17th July 2024 +* Jira Release Overview: https://eaflood.atlassian.net/projects/FSR/versions/17136/tab/release-report-all-issues + + +## Tickets + + + * FSR-1208 | river and sea levels search redirects (#723) + + * FSR-1207 | update page title to use place name + + + +## Instructions + + + 1 - Execute LFW_{STAGE}_04_UPDATE_FLOOD_APP_AND_SERVICE_PIPELINE + + +Execute smoke tests and forward results + +## Related Infrastructure Changes Required + +* None From f9976fb4fe613bcedfa3f2ff3bf95fde626088bb Mon Sep 17 00:00:00 2001 From: LeeGordon83 Date: Mon, 15 Jul 2024 15:51:56 +0100 Subject: [PATCH 26/29] Revert "Release 8.5.0 (#744)" This reverts commit 534a131a89873d8e54866e278087acb2d1da9587. --- package-lock.json | 4 ++-- package.json | 2 +- release-docs/CFF-8.5.0.md | 27 --------------------------- 3 files changed, 3 insertions(+), 30 deletions(-) delete mode 100644 release-docs/CFF-8.5.0.md diff --git a/package-lock.json b/package-lock.json index e3385483a..1a4c5d737 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "flood-app", - "version": "8.5.0", + "version": "8.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "flood-app", - "version": "8.5.0", + "version": "8.4.0", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 96ee182e3..d157f917b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flood-app", - "version": "8.5.0", + "version": "8.4.0", "description": "Flood risk app", "main": "index.js", "repository": "github:defra/flood-app", diff --git a/release-docs/CFF-8.5.0.md b/release-docs/CFF-8.5.0.md deleted file mode 100644 index 3ec86f03b..000000000 --- a/release-docs/CFF-8.5.0.md +++ /dev/null @@ -1,27 +0,0 @@ -# Check For Flooding Release - -* Version: 8.5.0 -* Proposed Release Date: 17th July 2024 -* Jira Release Overview: https://eaflood.atlassian.net/projects/FSR/versions/17136/tab/release-report-all-issues - - -## Tickets - - - * FSR-1208 | river and sea levels search redirects (#723) - - * FSR-1207 | update page title to use place name - - - -## Instructions - - - 1 - Execute LFW_{STAGE}_04_UPDATE_FLOOD_APP_AND_SERVICE_PIPELINE - - -Execute smoke tests and forward results - -## Related Infrastructure Changes Required - -* None From 01e8ed0ec27c9d2b7f4dc09f604b628c3d394ac5 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Tue, 16 Jul 2024 09:52:03 +0100 Subject: [PATCH 27/29] Bump version number (8.5.0) --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1a4c5d737..e3385483a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "flood-app", - "version": "8.4.0", + "version": "8.5.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "flood-app", - "version": "8.4.0", + "version": "8.5.0", "hasInstallScript": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index d157f917b..96ee182e3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "flood-app", - "version": "8.4.0", + "version": "8.5.0", "description": "Flood risk app", "main": "index.js", "repository": "github:defra/flood-app", From 04c48eacb1e3adddca4850a16262a427743a56f8 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Tue, 16 Jul 2024 09:52:24 +0100 Subject: [PATCH 28/29] Add release notes (8.5.0) --- release-docs/CFF-8.5.0.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 release-docs/CFF-8.5.0.md diff --git a/release-docs/CFF-8.5.0.md b/release-docs/CFF-8.5.0.md new file mode 100644 index 000000000..89127a0e0 --- /dev/null +++ b/release-docs/CFF-8.5.0.md @@ -0,0 +1,39 @@ +# Check For Flooding Release + +* Version: 8.5.0 +* Proposed Release Date: +* Jira Release Overview: https://eaflood.atlassian.net/projects/FSR/versions/17136/tab/release-report-all-issues + +## Sense Check + +* Note that this is the definitive release notes for WebOps. The release notes in flood-service and flood-db are for CFF dev team use only. +* Cross check the list of Jira tickets below with those in the Jira release linked to above and update where needed +* Add additional Jira tickets from the related release notes in the 'Release 8.5.0' PR's created in: + * [flood-service](https://github.com/DEFRA/flood-service) + +* Add any required infrastructure changes such as redirects to the infrastructure changes section below +* Once this sense check is done, delete this section + +## Tickets + + + + * FSR-1208 | river and sea levels search redirects (#723) + + * FSR-1207 | update page title to use place name + + * FSR-1207 | remove commented out code + + + +## Instructions + + + 1 - Execute LFW_{STAGE}_04_UPDATE_FLOOD_APP_AND_SERVICE_PIPELINE + + +Execute smoke tests and forward results + +## Related Infrastructure Changes Required + +* None From 95700b1afccb5caded2900abcf17c93229db8853 Mon Sep 17 00:00:00 2001 From: Lee Gordon <40238160+LeeGordon83@users.noreply.github.com> Date: Tue, 16 Jul 2024 09:54:20 +0100 Subject: [PATCH 29/29] Update CFF-8.5.0.md --- release-docs/CFF-8.5.0.md | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/release-docs/CFF-8.5.0.md b/release-docs/CFF-8.5.0.md index 89127a0e0..fa1fb41fe 100644 --- a/release-docs/CFF-8.5.0.md +++ b/release-docs/CFF-8.5.0.md @@ -1,18 +1,9 @@ # Check For Flooding Release * Version: 8.5.0 -* Proposed Release Date: +* Proposed Release Date: 17th July 2024 * Jira Release Overview: https://eaflood.atlassian.net/projects/FSR/versions/17136/tab/release-report-all-issues -## Sense Check - -* Note that this is the definitive release notes for WebOps. The release notes in flood-service and flood-db are for CFF dev team use only. -* Cross check the list of Jira tickets below with those in the Jira release linked to above and update where needed -* Add additional Jira tickets from the related release notes in the 'Release 8.5.0' PR's created in: - * [flood-service](https://github.com/DEFRA/flood-service) - -* Add any required infrastructure changes such as redirects to the infrastructure changes section below -* Once this sense check is done, delete this section ## Tickets @@ -22,8 +13,6 @@ * FSR-1207 | update page title to use place name - * FSR-1207 | remove commented out code - ## Instructions