diff --git a/obp-api/src/main/scala/bootstrap/liftweb/Boot.scala b/obp-api/src/main/scala/bootstrap/liftweb/Boot.scala index 1526b7e9a..286662e31 100644 --- a/obp-api/src/main/scala/bootstrap/liftweb/Boot.scala +++ b/obp-api/src/main/scala/bootstrap/liftweb/Boot.scala @@ -850,7 +850,7 @@ class Boot extends MdcLoggable { .map[String](_.getClientId) .collect(Collectors.toSet()) - Consumers.consumers.vend.getConsumersFuture().foreach{ consumers => + Consumers.consumers.vend.getConsumersFuture(Nil, None).foreach{ consumers => consumers.filter(consumer => consumer.isActive.get && !oAuth2ClientIds.contains(consumer.key.get)) .foreach(HydraUtil.createHydraClient(_)) } diff --git a/obp-api/src/main/scala/code/api/util/APIUtil.scala b/obp-api/src/main/scala/code/api/util/APIUtil.scala index 239e2fb3a..3a2d93e77 100644 --- a/obp-api/src/main/scala/code/api/util/APIUtil.scala +++ b/obp-api/src/main/scala/code/api/util/APIUtil.scala @@ -2086,7 +2086,7 @@ object APIUtil extends MdcLoggable with CustomJsonFormats{ | |Possible custom url parameters for pagination: | - |* limit=NUMBER ==> default value: 50 + |* limit=NUMBER ==> default value: ${Constant.Pagination.limit} |* offset=NUMBER ==> default value: 0 | |eg1:?limit=100&offset=0 diff --git a/obp-api/src/main/scala/code/api/v3_1_0/APIMethods310.scala b/obp-api/src/main/scala/code/api/v3_1_0/APIMethods310.scala index d0860b0ba..6448a4596 100644 --- a/obp-api/src/main/scala/code/api/v3_1_0/APIMethods310.scala +++ b/obp-api/src/main/scala/code/api/v3_1_0/APIMethods310.scala @@ -771,6 +771,10 @@ trait APIMethods310 { "Get Consumers", s"""Get the all Consumers. | + |${authenticationRequiredMessage(true)} + | + |${urlParametersDocument(true, true)} + | |""", EmptyBody, consumersJson310, @@ -790,7 +794,9 @@ trait APIMethods310 { for { (Full(u), callContext) <- authenticatedAccess(cc) _ <- NewStyle.function.hasEntitlement("", u.userId, ApiRole.canGetConsumers, callContext) - consumers <- Consumers.consumers.vend.getConsumersFuture() + httpParams <- NewStyle.function.extractHttpParamsFromUrl(cc.url) + (obpQueryParams, callContext) <- createQueriesByHttpParamsFuture(httpParams, callContext) + consumers <- Consumers.consumers.vend.getConsumersFuture(obpQueryParams, callContext) users <- Users.users.vend.getUsersByUserIdsFuture(consumers.map(_.createdByUserId.get)) } yield { (createConsumersJson(consumers, users), HttpCode.`200`(callContext)) diff --git a/obp-api/src/main/scala/code/consumer/ConsumerProvider.scala b/obp-api/src/main/scala/code/consumer/ConsumerProvider.scala index 351e4e6a0..25725e19f 100644 --- a/obp-api/src/main/scala/code/consumer/ConsumerProvider.scala +++ b/obp-api/src/main/scala/code/consumer/ConsumerProvider.scala @@ -1,6 +1,6 @@ package code.consumer -import code.api.util.APIUtil +import code.api.util.{APIUtil, CallContext, OBPQueryParam} import code.model.{AppType, Consumer, MappedConsumersProvider} import code.remotedata.RemotedataConsumers import com.openbankproject.commons.model.{BankIdAccountId, User, View} @@ -31,7 +31,7 @@ trait ConsumersProvider { def getConsumerByConsumerId(consumerId: String): Box[Consumer] def getConsumerByConsumerIdFuture(consumerId: String): Future[Box[Consumer]] def getConsumersByUserIdFuture(userId: String): Future[List[Consumer]] - def getConsumersFuture(): Future[List[Consumer]] + def getConsumersFuture(httpParams: List[OBPQueryParam], callContext: Option[CallContext]): Future[List[Consumer]] def createConsumer(key: Option[String], secret: Option[String], isActive: Option[Boolean], name: Option[String], appType: Option[AppType], description: Option[String], developerEmail: Option[String], redirectURL: Option[String], createdByUserId: Option[String], clientCertificate: Option[String] = None, company: Option[String] = None): Box[Consumer] def deleteConsumer(consumer: Consumer): Boolean def updateConsumer(id: Long, key: Option[String], secret: Option[String], isActive: Option[Boolean], name: Option[String], appType: Option[AppType], description: Option[String], developerEmail: Option[String], redirectURL: Option[String], createdByUserId: Option[String]): Box[Consumer] @@ -64,7 +64,7 @@ class RemotedataConsumersCaseClasses { case class getConsumerByConsumerId(consumerId: String) case class getConsumerByConsumerIdFuture(consumerId: String) case class getConsumersByUserIdFuture(userId: String) - case class getConsumersFuture() + case class getConsumersFuture(httpParams: List[OBPQueryParam], callContext: Option[CallContext]) case class createConsumer(key: Option[String], secret: Option[String], isActive: Option[Boolean], name: Option[String], appType: Option[AppType], description: Option[String], developerEmail: Option[String], redirectURL: Option[String], createdByUserId: Option[String], clientCertificate: Option[String], company: Option[String]) case class updateConsumer(id: Long, key: Option[String], secret: Option[String], isActive: Option[Boolean], name: Option[String], appType: Option[AppType], description: Option[String], developerEmail: Option[String], redirectURL: Option[String], createdByUserId: Option[String]) case class deleteConsumer(consumer: Consumer) diff --git a/obp-api/src/main/scala/code/model/OAuth.scala b/obp-api/src/main/scala/code/model/OAuth.scala index 7368ff9e9..14da03e21 100644 --- a/obp-api/src/main/scala/code/model/OAuth.scala +++ b/obp-api/src/main/scala/code/model/OAuth.scala @@ -27,7 +27,7 @@ TESOBE (http://www.tesobe.com/) package code.model import java.util.{Collections, Date} -import code.api.util.APIUtil +import code.api.util.{APIUtil, CallContext, OBPAscending, OBPDescending, OBPFromDate, OBPLimit, OBPOffset, OBPOrdering, OBPQueryParam, OBPToDate} import code.api.util.CommonFunctions.validUri import code.api.util.migration.Migration.DbFunction import code.consumer.{Consumers, ConsumersProvider} @@ -119,11 +119,26 @@ object MappedConsumersProvider extends ConsumersProvider with MdcLoggable { Future(getConsumersByUserId(userId)) } - def getConsumers(): List[Consumer] = { - Consumer.findAll() + def getConsumers(queryParams: List[OBPQueryParam], callContext: Option[CallContext]): List[Consumer] = { + val limit = queryParams.collect { case OBPLimit(value) => MaxRows[Consumer](value) }.headOption + val offset = queryParams.collect { case OBPOffset(value) => StartAt[Consumer](value) }.headOption + val fromDate = queryParams.collect { case OBPFromDate(date) => By_>=(Consumer.createdAt, date) }.headOption + val toDate = queryParams.collect { case OBPToDate(date) => By_<=(Consumer.createdAt, date) }.headOption + val ordering = queryParams.collect { + case OBPOrdering(_, direction) => + direction match { + case OBPAscending => OrderBy(Consumer.createdAt, Ascending) + case OBPDescending => OrderBy(Consumer.createdAt, Descending) + } + } + + val mapperParams: Seq[QueryParam[Consumer]] = Seq(limit.toSeq, offset.toSeq, fromDate.toSeq, toDate.toSeq, ordering.toSeq).flatten + + Consumer.findAll(mapperParams: _*) } - override def getConsumersFuture(): Future[List[Consumer]] = { - Future(getConsumers()) + + override def getConsumersFuture(httpParams: List[OBPQueryParam], callContext: Option[CallContext]): Future[List[Consumer]] = { + Future(getConsumers(httpParams: List[OBPQueryParam], callContext: Option[CallContext])) } override def createConsumer(key: Option[String], diff --git a/obp-api/src/main/scala/code/remotedata/RemotedataConsumers.scala b/obp-api/src/main/scala/code/remotedata/RemotedataConsumers.scala index 06f991656..714644782 100644 --- a/obp-api/src/main/scala/code/remotedata/RemotedataConsumers.scala +++ b/obp-api/src/main/scala/code/remotedata/RemotedataConsumers.scala @@ -2,6 +2,7 @@ package code.remotedata import akka.pattern.ask import code.actorsystem.ObpActorInit +import code.api.util.{CallContext, OBPQueryParam} import code.consumer.{ConsumersProvider, RemotedataConsumersCaseClasses} import code.model._ import net.liftweb.common._ @@ -35,8 +36,8 @@ object RemotedataConsumers extends ObpActorInit with ConsumersProvider { def getConsumersByUserIdFuture(id: String): Future[List[Consumer]] = (actor ? cc.getConsumersByUserIdFuture(id)).mapTo[List[Consumer]] - def getConsumersFuture(): Future[List[Consumer]] = - (actor ? cc.getConsumersFuture()).mapTo[List[Consumer]] + def getConsumersFuture(httpParams: List[OBPQueryParam], callContext: Option[CallContext]): Future[List[Consumer]] = + (actor ? cc.getConsumersFuture(httpParams: List[OBPQueryParam], callContext: Option[CallContext])).mapTo[List[Consumer]] def createConsumer(key: Option[String], secret: Option[String], isActive: Option[Boolean], name: Option[String], appType: Option[AppType], description: Option[String], developerEmail: Option[String], redirectURL: Option[String], createdByUserId: Option[String], clientCertificate: Option[String] = None, company: Option[String] = None): Box[Consumer] = getValueFromFuture( (actor ? cc.createConsumer(key, secret, isActive, name, appType, description, developerEmail, redirectURL, createdByUserId, clientCertificate, company)).mapTo[Box[Consumer]] diff --git a/obp-api/src/main/scala/code/remotedata/RemotedataConsumersActor.scala b/obp-api/src/main/scala/code/remotedata/RemotedataConsumersActor.scala index fe6db3f0a..84a7264da 100644 --- a/obp-api/src/main/scala/code/remotedata/RemotedataConsumersActor.scala +++ b/obp-api/src/main/scala/code/remotedata/RemotedataConsumersActor.scala @@ -2,6 +2,7 @@ package code.remotedata import akka.actor.Actor import code.actorsystem.ObpActorHelper +import code.api.util.{CallContext, OBPQueryParam} import code.consumer.RemotedataConsumersCaseClasses import code.model.{MappedConsumersProvider, _} import code.util.Helper.MdcLoggable @@ -41,9 +42,9 @@ class RemotedataConsumersActor extends Actor with ObpActorHelper with MdcLoggabl logger.debug(s"getConsumersByUserIdFuture($id)") sender ! (mapper.getConsumersByUserId(id)) - case cc.getConsumersFuture() => + case cc.getConsumersFuture(httpParams: List[OBPQueryParam], callContext: Option[CallContext]) => logger.debug(s"getConsumersFuture()") - sender ! (mapper.getConsumers()) + sender ! (mapper.getConsumers(httpParams: List[OBPQueryParam], callContext: Option[CallContext])) case cc.createConsumer(key: Option[String], secret: Option[String], isActive: Option[Boolean], name: Option[String], appType: Option[AppType], description: Option[String], developerEmail: Option[String], redirectURL: Option[String], createdByUserId: Option[String], clientCertificate: Option[String], company: Option[String]) => logger.debug(s"createConsumer(*****, *****, ${isActive.getOrElse("None")}, ${name.getOrElse("None")}, ${appType.getOrElse("None")}, ${description.getOrElse("None")}, ${developerEmail.getOrElse("None")}, ${redirectURL.getOrElse("None")}, ${createdByUserId.getOrElse("None")}, ${clientCertificate.getOrElse("None")}, ${company.getOrElse("None")})")