11import _ from 'lodash' ;
2+ import { Op , Sequelize } from 'sequelize' ;
23
34import models from '../../models' ;
45import util from '../../util' ;
56import { PERMISSION } from '../../permissions/constants' ;
7+ import { DEFAULT_PAGE_SIZE } from '../../constants' ;
68
79module . exports = [
810 ( req , res , next ) => {
@@ -15,33 +17,67 @@ module.exports = [
1517 return next ( err ) ;
1618 }
1719
20+ const page = parseInt ( req . query . page , 10 ) || 1 ;
21+ const pageSize = parseInt ( req . query . pageSize , 10 ) || DEFAULT_PAGE_SIZE ;
22+ const offset = ( page - 1 ) * pageSize ;
23+
1824 const projectId = _ . parseInt ( req . params . projectId ) ;
1925
2026 let sort = req . query . sort ? decodeURIComponent ( req . query . sort ) : 'createdAt desc' ;
2127 if ( sort . indexOf ( ' ' ) === - 1 ) {
2228 sort += ' asc' ;
2329 }
24- const sortableProps = [ 'createdAt asc' , 'createdAt desc' ] ;
30+ const sortableProps = [
31+ 'createdAt asc' ,
32+ 'createdAt desc' ,
33+ 'projectName asc' ,
34+ 'projectName desc' ,
35+ 'opportunityTitle asc' ,
36+ 'opportunityTitle desc' ,
37+ 'projectType asc' ,
38+ 'projectType desc' ,
39+ 'status asc' ,
40+ 'status desc' ,
41+ ] ;
2542 if ( _ . indexOf ( sortableProps , sort ) < 0 ) {
2643 return util . handleError ( 'Invalid sort criteria' , null , req , next ) ;
2744 }
28- const sortParams = sort . split ( ' ' ) ;
45+ let sortParams = sort . split ( ' ' ) ;
46+ let order = [ [ sortParams [ 0 ] , sortParams [ 1 ] ] ] ;
47+ const relationBasedSortParams = [ 'projectName' ] ;
48+ const jsonBasedSortParams = [ 'opportunityTitle' , 'projectType' ] ;
49+ if ( relationBasedSortParams . includes ( sortParams [ 0 ] ) ) {
50+ order = [
51+ [ { model : models . Project , as : 'project' } , 'name' , sortParams [ 1 ] ] ,
52+ [ 'id' , 'DESC' ]
53+ ]
54+ }
55+
56+ if ( jsonBasedSortParams . includes ( sortParams [ 0 ] ) ) {
57+ order = [
58+ [ models . sequelize . literal ( `("CopilotRequest"."data"->>'${ sortParams [ 0 ] } ')` ) , sortParams [ 1 ] ] ,
59+ [ 'id' , 'DESC' ] ,
60+ ]
61+ }
2962
3063 const whereCondition = projectId ? { projectId } : { } ;
3164
32- return models . CopilotRequest . findAll ( {
65+ return models . CopilotRequest . findAndCountAll ( {
3366 where : whereCondition ,
3467 include : [
35- {
36- model : models . CopilotOpportunity ,
37- as : 'copilotOpportunity' ,
38- } ,
68+ { model : models . CopilotOpportunity , as : 'copilotOpportunity' , required : false } ,
69+ { model : models . Project , as : 'project' , required : false } ,
3970 ] ,
40- order : [ [ sortParams [ 0 ] , sortParams [ 1 ] ] ] ,
41- } )
42- . then ( copilotRequests => res . json ( copilotRequests ) )
43- . catch ( ( err ) => {
44- util . handleError ( 'Error fetching copilot requests' , err , req , next ) ;
45- } ) ;
71+ order,
72+ limit : pageSize ,
73+ offset,
74+ distinct : true ,
75+ subQuery : false ,
76+ } ) . then ( ( { rows : copilotRequests , count} ) => util . setPaginationHeaders ( req , res , {
77+ count : count ,
78+ rows : copilotRequests ,
79+ page,
80+ pageSize,
81+ } ) ) ;
4682 } ,
4783] ;
0 commit comments