@@ -6,9 +6,9 @@ import it.pagopa.interop.purposemanagement.model.purpose._
6
6
import org .mongodb .scala .Document
7
7
import org .mongodb .scala .bson .conversions .Bson
8
8
import org .mongodb .scala .model .Aggregates ._
9
- import org .mongodb .scala .model .{Field , Filters }
10
9
import org .mongodb .scala .model .Projections .{computed , fields , include }
11
10
import org .mongodb .scala .model .Sorts .ascending
11
+ import org .mongodb .scala .model .{Field , Filters , Projections }
12
12
13
13
import java .util .UUID
14
14
import scala .concurrent .{ExecutionContext , Future }
@@ -60,18 +60,16 @@ object ReadModelPurposeQueries extends ReadModelQuery {
60
60
limit : Int ,
61
61
exactMatchOnTitle : Boolean = false
62
62
)(implicit ec : ExecutionContext , readModel : ReadModelService ): Future [PaginatedResult [PersistentPurpose ]] = {
63
+
63
64
val simpleFilters : Bson = listPurposesFilters(title, eServicesIds, consumersIds, states, exactMatchOnTitle)
64
- val query : Seq [Bson ] = Seq (
65
- `match`(simpleFilters),
66
- lookup(" eservices" , " data.eserviceId" , " data.id" , " eservices" ),
67
- addFields(Field (" eservice" , Document (""" { $arrayElemAt: [ "$eservices", 0 ] }""" ))),
68
- `match`(
69
- Filters
70
- .and(listPurposesAuthorizationFilters(excludeDraft), listPurposesProducersFilters(producersIds))
71
- )
72
- )
73
65
74
66
for {
67
+ producersFilter <- producersEservicesFilter(producersIds)
68
+ query = Seq (
69
+ `match`(simpleFilters),
70
+ `match`(listPurposesAuthorizationFilters(excludeDraft)),
71
+ `match`(producersFilter)
72
+ )
75
73
// Using aggregate to perform case insensitive sorting
76
74
// N.B.: Required because DocumentDB does not support collation
77
75
purposes <- readModel.aggregate[PersistentPurpose ](
@@ -160,6 +158,25 @@ object ReadModelPurposeQueries extends ReadModelQuery {
160
158
mapToVarArgs(versionsFilter :: Nil )(Filters .and).getOrElse(Filters .empty())
161
159
}
162
160
163
- private def listPurposesProducersFilters (producersIds : Seq [String ]): Bson =
164
- mapToVarArgs(producersIds.map(Filters .eq(" eservices.data.producerId" , _)))(Filters .or).getOrElse(Filters .empty())
161
+ private def producersEservicesFilter (
162
+ producersIds : Seq [String ]
163
+ )(implicit ec : ExecutionContext , readModel : ReadModelService ): Future [Bson ] = {
164
+ val producersEservicesIds : Future [Seq [ReadModelId ]] =
165
+ if (producersIds.isEmpty) {
166
+ Future .successful(Seq .empty)
167
+ } else {
168
+ readModel.find[ReadModelId ](
169
+ " eservices" ,
170
+ mapToVarArgs(producersIds.map(Filters .eq(" data.producerId" , _)))(Filters .or).getOrElse(Filters .empty()),
171
+ Projections .include(" data.id" ),
172
+ offset = 0 ,
173
+ limit = Int .MaxValue
174
+ )
175
+ }
176
+
177
+ producersEservicesIds.map(ids =>
178
+ mapToVarArgs(ids.map(id => Filters .eq(" data.eserviceId" , id.id)))(Filters .or).getOrElse(Filters .empty())
179
+ )
180
+
181
+ }
165
182
}
0 commit comments