@@ -6,47 +6,41 @@ const Joi = require('joi')
6
6
const { setAppSearch, getAppSearch } = require ( '../session' )
7
7
const keys = require ( '../session/keys' )
8
8
9
- async function createModel ( request ) {
10
- const page = request . query . page ?? 1
9
+ async function createModel ( request , page ) {
10
+ page = page ?? request . query . page ?? 1
11
11
const { limit, offset } = getPagination ( page , request . query . limit )
12
12
const path = request . headers . path ?? ''
13
13
const searchText = getAppSearch ( request , keys . appSearch . searchText )
14
14
const searchType = getAppSearch ( request , keys . appSearch . searchType )
15
15
const apps = await getApplications ( searchType , searchText , limit , offset , request . yar . id )
16
16
if ( apps . total > 0 ) {
17
17
const pagingData = getPagingData ( apps . total ?? 0 , limit , page , path )
18
-
19
- let statusClass , status
18
+ let statusClass
20
19
return {
21
20
applications : apps . applications . map ( n => {
22
- switch ( n . status ) {
23
- case 1 :
21
+ switch ( n . status . status ) {
22
+ case 'In Progress' :
24
23
statusClass = 'govuk-tag--grey'
25
- status = 'In Progress'
26
24
break
27
- case 2 :
25
+ case 'Submitted' :
28
26
statusClass = 'govuk-tag--blue'
29
- status = 'Submitted'
30
27
break
31
- case 3 :
28
+ case 'Withdrawn' :
32
29
statusClass = 'govuk-tag--red'
33
- status = 'Withdrawn'
34
30
break
35
- case 4 :
31
+ case 'Deleted' :
36
32
statusClass = 'govuk-tag--red'
37
- status = 'Deleted'
38
33
break
39
34
default :
40
35
statusClass = 'govuk-tag--grey'
41
- status = 'Pending'
42
36
}
43
37
return [
44
38
{ text : n . reference } ,
45
- { text : n . data . organisation . name } ,
46
- { text : n . data . organisation . sbi } ,
39
+ { text : n . data ? .organisation ? .name } ,
40
+ { text : n . data ? .organisation ? .sbi } ,
47
41
{ text : new Date ( n . createdAt ) . toLocaleDateString ( 'en-GB' ) } ,
48
42
{ text : new Date ( n . createdAt ) . toLocaleDateString ( 'en-GB' ) } ,
49
- { html : `<span class="govuk-tag ${ statusClass } ">${ status } </span>` } ,
43
+ { html : `<span class="govuk-tag ${ statusClass } ">${ n . status . status } </span>` } ,
50
44
{ html : `<a href="view-application/${ n . reference } ">View application</a>` }
51
45
]
52
46
} ) ,
@@ -61,6 +55,36 @@ async function createModel (request) {
61
55
}
62
56
}
63
57
}
58
+ const appRefRegEx = / ^ v v - [ \d a - f ] { 4 } - [ \d a - f ] { 4 } $ / i
59
+ const validStatus = [ 'pending' , 'in progress' , 'deleted' , 'submitted' , 'withdrawn' , 'completed' ]
60
+ const sbiRegEx = / ^ [ \0 - 9 ] { 9 } $ / i
61
+ function checkValidSearch ( searchText ) {
62
+ let searchType
63
+ searchText = ( searchText ?? '' ) . trim ( )
64
+ switch ( true ) {
65
+ case appRefRegEx . test ( searchText ) :
66
+ searchType = 'ref'
67
+ break
68
+ case validStatus . indexOf ( searchText . toLowerCase ( ) ) !== - 1 :
69
+ searchType = 'status'
70
+ break
71
+ case sbiRegEx . test ( searchText ) :
72
+ searchType = 'sbi'
73
+ break
74
+ }
75
+
76
+ if ( ! searchType && searchText . length <= 0 ) {
77
+ searchType = 'reset'
78
+ }
79
+ if ( searchType ) {
80
+ return {
81
+ searchText,
82
+ searchType
83
+ }
84
+ } else {
85
+ throw new Error ( 'Invalid search. It should be application reference or status or sbi number.' )
86
+ }
87
+ }
64
88
module . exports = [
65
89
{
66
90
method : 'GET' ,
@@ -85,19 +109,17 @@ module.exports = [
85
109
query : Joi . object ( {
86
110
page : Joi . number ( ) . greater ( 0 ) . default ( 1 ) ,
87
111
limit : Joi . number ( ) . greater ( 0 ) . default ( 10 )
88
- } ) ,
89
- payload : Joi . object ( {
90
- searchText : Joi . number ( ) . min ( 10000000 ) . max ( 999999999 ) ,
91
- searchType : Joi . string ( )
92
- } ) ,
93
- failAction : async ( request , h , error ) => {
94
- return h . view ( viewTemplate , { ...request . payload , errorMessage : { text : error . details [ 0 ] . message } , error : true } ) . code ( 400 ) . takeover ( )
95
- }
112
+ } )
96
113
} ,
97
114
handler : async ( request , h ) => {
98
- setAppSearch ( request , keys . appSearch . searchText , request . payload . searchText ?? '' )
99
- setAppSearch ( request , keys . appSearch . searchType , request . payload . searchType ?? '' )
100
- return h . view ( viewTemplate , await createModel ( request ) )
115
+ try {
116
+ const { searchText, searchType } = checkValidSearch ( request . payload . searchText )
117
+ setAppSearch ( request , keys . appSearch . searchText , searchText ?? '' )
118
+ setAppSearch ( request , keys . appSearch . searchType , searchType ?? '' )
119
+ return h . view ( viewTemplate , await createModel ( request , 1 ) )
120
+ } catch ( err ) {
121
+ return h . view ( viewTemplate , { ...request . payload , error : err } ) . code ( 400 ) . takeover ( )
122
+ }
101
123
}
102
124
}
103
125
}
0 commit comments