|
1 | 1 | import axios from 'axios'
|
2 | 2 | import { NextFunction, Request, Response } from 'express'
|
| 3 | +import * as naturalSort from 'javascript-natural-sort' |
| 4 | +import * as groupBy from 'lodash/groupBy' |
3 | 5 | import * as proj4 from 'proj4'
|
4 | 6 |
|
5 | 7 | proj4.defs([
|
@@ -41,40 +43,51 @@ export async function search(
|
41 | 43 |
|
42 | 44 | const { data } = await axios.get(url)
|
43 | 45 |
|
| 46 | + const results0 = data.map(result => { |
| 47 | + const { x: longitude, y: latitude } = proj4.transform( |
| 48 | + projections.ordnanceSurvey, |
| 49 | + projections.standard, |
| 50 | + [Number(result.X), Number(result.Y)] |
| 51 | + ) |
| 52 | + |
| 53 | + return { |
| 54 | + id: result.UPRN.toString(), |
| 55 | + name: [ |
| 56 | + result.ORGANISATION, |
| 57 | + result.SAO, |
| 58 | + [result.PAO, result.STREET].filter(Boolean).join(' '), |
| 59 | + ] |
| 60 | + .filter(Boolean) |
| 61 | + .join(', '), |
| 62 | + uprn: result.UPRN.toString(), |
| 63 | + updrn: result.UPRN.toString(), |
| 64 | + x: Number(result.X), |
| 65 | + y: Number(result.Y), |
| 66 | + lat: latitude, |
| 67 | + lng: longitude, |
| 68 | + rawData: result, |
| 69 | + } |
| 70 | + }) |
| 71 | + |
| 72 | + const results1 = groupBy(results0, r => { |
| 73 | + return [r.rawData.PAO, r.rawData.STREET].filter(Boolean).join(' ') |
| 74 | + }) |
| 75 | + |
| 76 | + const results = [] |
| 77 | + |
| 78 | + Object.keys(results1) |
| 79 | + .sort(naturalSort) |
| 80 | + .forEach(k => { |
| 81 | + Object.values(results1[k]) |
| 82 | + .sort((a: any, b: any) => { |
| 83 | + return naturalSort(a.rawData.SAO, b.rawData.SAO) |
| 84 | + }) |
| 85 | + .forEach(sorted => results.push(sorted)) |
| 86 | + }) |
| 87 | + |
44 | 88 | response.json({
|
45 | 89 | localAuthority,
|
46 |
| - results: data |
47 |
| - .map(result => { |
48 |
| - const { x: longitude, y: latitude } = proj4.transform( |
49 |
| - projections.ordnanceSurvey, |
50 |
| - projections.standard, |
51 |
| - [Number(result.X), Number(result.Y)] |
52 |
| - ) |
53 |
| - |
54 |
| - return { |
55 |
| - id: result.UPRN.toString(), |
56 |
| - name: [ |
57 |
| - result.ORGANISATION, |
58 |
| - result.SAO, |
59 |
| - [result.PAO, result.STREET].filter(Boolean).join(' '), |
60 |
| - ] |
61 |
| - .filter(Boolean) |
62 |
| - .join(', '), |
63 |
| - uprn: result.UPRN.toString(), |
64 |
| - updrn: result.UPRN.toString(), |
65 |
| - x: Number(result.X), |
66 |
| - y: Number(result.Y), |
67 |
| - lat: longitude, |
68 |
| - lng: longitude, |
69 |
| - rawData: result, |
70 |
| - } |
71 |
| - }) |
72 |
| - .sort((a, b) => { |
73 |
| - const aa = [a.rawData.PAO, a.rawData.STREET].filter(Boolean).join(' ') |
74 |
| - const bb = [b.rawData.PAO, b.rawData.STREET].filter(Boolean).join(' ') |
75 |
| - // return bb < aa |
76 |
| - return aa < bb ? -1 : aa > bb ? 1 : 0 |
77 |
| - }), |
| 90 | + results, |
78 | 91 | })
|
79 | 92 | } catch (e) {
|
80 | 93 | next(e)
|
|
0 commit comments