@@ -23,6 +23,7 @@ const { dataSource } = require('../../database/DataSource.js');
2323const { statusAcronyms } = require ( '../../domain/enums/StatusAcronyms.js' ) ;
2424const { unpackNumberRange } = require ( '../../utilities/rangeUtils.js' ) ;
2525const { splitStringToStringsTrimmed } = require ( '../../utilities/stringUtils.js' ) ;
26+ const { setTimeRangeQuery } = require ( '../../utilities/setTimeRangeQuery.js' ) ;
2627
2728/**
2829 * Subquery to select the latest history item for each environment.
@@ -69,18 +70,11 @@ class GetAllEnvironmentsUseCase {
6970 const { filter, page = { } } = query ;
7071 const { limit = ApiConfig . pagination . limit , offset = 0 } = page ;
7172
72- /**
73- * Prepare a query builder with ordering, limit and offset
74- *
75- * @return {QueryBuilder } the created query builder
76- */
77- const prepareQueryBuilder = ( ) => dataSource . createQueryBuilder ( )
73+ const queryBuilder = dataSource . createQueryBuilder ( )
7874 . orderBy ( 'updatedAt' , 'desc' )
7975 . limit ( limit )
8076 . offset ( offset ) ;
8177
82- const fetchQueryBuilder = prepareQueryBuilder ( ) ;
83-
8478 if ( filter ) {
8579 const {
8680 ids : idsExpression ,
@@ -90,38 +84,34 @@ class GetAllEnvironmentsUseCase {
9084 created,
9185 } = filter ;
9286
93- const filterQueryBuilder = prepareQueryBuilder ( ) ;
94-
9587 if ( created ) {
96- const from = created . from !== undefined ? created . from : 0 ;
97- const to = created . to !== undefined ? created . to : Date . now ( ) ;
98- filterQueryBuilder . where ( 'createdAt' ) . between ( from , to ) ;
88+ setTimeRangeQuery ( created , 'createdAt' , queryBuilder ) ;
9989 }
10090
10191 if ( idsExpression ) {
10292 const filters = idsExpression . split ( ',' ) . map ( ( id ) => id . trim ( ) ) ;
10393
10494 // Filter should be like with only one filter
10595 if ( filters . length === 1 ) {
106- filterQueryBuilder . where ( 'id' ) . substring ( filters [ 0 ] ) ;
96+ queryBuilder . where ( 'id' ) . substring ( filters [ 0 ] ) ;
10797 }
10898
10999 // Filters should be exact with more than one filter
110100 if ( filters . length > 1 ) {
111- filterQueryBuilder . andWhere ( { id : { [ Op . in ] : filters } } ) ;
101+ queryBuilder . andWhere ( { id : { [ Op . in ] : filters } } ) ;
112102 }
113103 }
114104
115105 if ( currentStatusExpression ) {
116106 const filters = currentStatusExpression . split ( ',' ) . map ( ( status ) => status . trim ( ) ) ;
117107
118108 // Filter the environments by current status using the subquery
119- filterQueryBuilder . literalWhere (
109+ queryBuilder . literalWhere (
120110 `${ ENVIRONMENT_LATEST_HISTORY_ITEM_SUBQUERY } IN (:filters)` ,
121111 { filters } ,
122112 ) ;
123113
124- filterQueryBuilder . includeAttribute ( {
114+ queryBuilder . includeAttribute ( {
125115 query : ENVIRONMENT_LATEST_HISTORY_ITEM_SUBQUERY ,
126116 alias : 'currentStatus' ,
127117 } ) ;
@@ -157,7 +147,7 @@ class GetAllEnvironmentsUseCase {
157147 * Use OR condition to match subsequences ending with either DESTROYED or DONE
158148 * Filter the environments by using LIKE for subsequence matching
159149 */
160- filterQueryBuilder . literalWhere (
150+ queryBuilder . literalWhere (
161151 `(${ ENVIRONMENT_STATUS_HISTORY_SUBQUERY } LIKE :statusFiltersWithDestroyed OR ` +
162152 `${ ENVIRONMENT_STATUS_HISTORY_SUBQUERY } LIKE :statusFiltersWithDone)` ,
163153 {
@@ -166,17 +156,17 @@ class GetAllEnvironmentsUseCase {
166156 } ,
167157 ) ;
168158
169- filterQueryBuilder . includeAttribute ( {
159+ queryBuilder . includeAttribute ( {
170160 query : ENVIRONMENT_STATUS_HISTORY_SUBQUERY ,
171161 alias : 'statusHistory' ,
172162 } ) ;
173163 } else {
174- filterQueryBuilder . literalWhere (
164+ queryBuilder . literalWhere (
175165 `${ ENVIRONMENT_STATUS_HISTORY_SUBQUERY } LIKE :statusFilters` ,
176166 { statusFilters : `%${ statusFilters . join ( ',' ) } %` } ,
177167 ) ;
178168
179- filterQueryBuilder . includeAttribute ( {
169+ queryBuilder . includeAttribute ( {
180170 query : ENVIRONMENT_STATUS_HISTORY_SUBQUERY ,
181171 alias : 'statusHistory' ,
182172 } ) ;
@@ -190,30 +180,20 @@ class GetAllEnvironmentsUseCase {
190180
191181 // Check that the final run numbers list contains at least one valid run number
192182 if ( finalRunNumberList . length > 0 ) {
193- filterQueryBuilder . include ( {
183+ queryBuilder . include ( {
194184 association : 'runs' ,
195185 where : {
196186 // Filter should be like with only one filter and exact with more than one filter
197187 runNumber : { [ finalRunNumberList . length === 1 ? Op . substring : Op . in ] : finalRunNumberList } ,
198188 } ,
199189 } ) ;
200190 }
201- } ;
202-
203- const filteredEnvironmentsIds = ( await EnvironmentRepository . findAll ( filterQueryBuilder ) ) . map ( ( { id } ) => id ) ;
204- // If no environments match the filter, return an empty result
205- if ( filteredEnvironmentsIds . length === 0 ) {
206- return {
207- count : 0 ,
208- environments : [ ] ,
209- } ;
210191 }
211- fetchQueryBuilder . where ( 'id' ) . oneOf ( filteredEnvironmentsIds ) ;
212192 }
213193
214- fetchQueryBuilder . include ( { association : 'runs' } ) ;
215- fetchQueryBuilder . include ( { association : 'historyItems' } ) ;
216- const { count, rows } = await EnvironmentRepository . findAndCountAll ( fetchQueryBuilder ) ;
194+ queryBuilder . include ( { association : 'runs' } ) ;
195+ queryBuilder . include ( { association : 'historyItems' } ) ;
196+ const { count, rows } = await EnvironmentRepository . findAndCountAll ( queryBuilder ) ;
217197 return {
218198 count,
219199 environments : rows . map ( ( environment ) => environmentAdapter . toEntity ( environment ) ) ,
0 commit comments