diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 013dd6c..2dc1b94 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -8,12 +8,8 @@ name: Build on: workflow_dispatch: push: - branches: + branches: - '!main' -# - '*' # matches every branch that doesn't contain a '/' -# - '*/*' # matches every branch containing a single '/' -# - '**' # matches every branch -# - '!main' # excludes main pull_request: branches: - '**' @@ -23,53 +19,48 @@ permissions: jobs: test: -# runs-on: self-hosted runs-on: ubuntu-latest - env: - # define Java options for both official sbt and sbt-extras - JAVA_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8 - JVM_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8 steps: - name: Checkout - uses: actions/checkout@v3 - - name: Set up JDK 8 - uses: actions/setup-java@v3 + uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v4 with: - java-version: '8' + java-version: '17' distribution: 'temurin' -# cache: 'sbt' - name: Setup sbt launcher uses: sbt/setup-sbt@v1 -# - name: Run tests & Coverage Report -# run: sbt coverage test coverageReport -# - name: Upload coverage to Codecov -# uses: codecov/codecov-action@v3 -# with: -# files: common/target/scala-2.12/coverage-report/cobertura.xml,core/target/scala-2.12/coverage-report/cobertura.xml,teskit/target/scala-2.12/coverage-report/cobertura.xml -# flags: unittests -# fail_ci_if_error: true -# verbose: true - - name: Run tests - run: STRIPE_CLIENT_ID=${{secrets.STRIPE_CLIENT_ID}} STRIPE_API_KEY=${{secrets.STRIPE_API_KEY}} sbt clean test - env: - STRIPE_CLIENT_ID: ${{secrets.STRIPE_CLIENT_ID}} - STRIPE_API_KEY: ${{secrets.STRIPE_API_KEY}} - # Optional: This step uploads information to the GitHub dependency graph and unblocking Dependabot alerts for the repository - # - name: Upload dependency graph - # uses: scalacenter/sbt-dependency-submission@ab086b50c947c9774b70f39fc7f6e20ca2706c91 + - name: Env + run: | + echo "JFROG_USER=${{ secrets.JFROG_USER }}" >> $GITHUB_ENV + echo "JFROG_PASSWORD=${{ secrets.JFROG_PASSWORD }}" >> $GITHUB_ENV + echo "GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> $GITHUB_ENV + echo "STRIPE_CLIENT_ID=${{ secrets.STRIPE_CLIENT_ID }}" >> $GITHUB_ENV + echo "STRIPE_API_KEY=${{ secrets.STRIPE_API_KEY }}" >> $GITHUB_ENV + echo "CODECOV_TOKEN=${{ secrets.CODECOV_TOKEN }}" >> $GITHUB_ENV + - name: Cross-compile + run: SBT_OPTS="-Xss4M -Xms1g -Xmx4g -Dfile.encoding=UTF-8" sbt '+ Test/compile' + - name: Run tests & Coverage Report + run: SBT_OPTS="-Xss4M -Xms1g -Xmx4g -Dfile.encoding=UTF-8" sbt coverage clean test coverageReport coverageAggregate + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v4 + with: + files: common/target/scala-*/coverage-report/cobertura.xml,core/target/scala-*/coverage-report/cobertura.xml,testkit/target/scala-*/coverage-report/cobertura.xml + flags: unittests + fail_ci_if_error: true + verbose: true lint: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 - - name: Set up JDK 8 - uses: actions/setup-java@v3 + uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v4 with: - java-version: '8' + java-version: '17' distribution: 'temurin' -# cache: 'sbt' - name: Setup sbt launcher uses: sbt/setup-sbt@v1 - name: Formatting - run: sbt scalafmtSbtCheck scalafmtCheck test:scalafmtCheck \ No newline at end of file + run: SBT_OPTS="-Xss4M -Xms1g -Xmx4g -Dfile.encoding=UTF-8" sbt scalafmtSbtCheck scalafmtCheck Test/scalafmtCheck diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 845717f..829b20d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,59 +8,58 @@ name: Release on: workflow_dispatch: push: - branches: + branches: - 'main' -# - '*' # matches every branch that doesn't contain a '/' -# - '*/*' # matches every branch containing a single '/' -# - '**' # matches every branch -# - '!main' # excludes main permissions: contents: read jobs: release: -# runs-on: self-hosted runs-on: ubuntu-latest - env: - # define Java options for both official sbt and sbt-extras - JAVA_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8 - JVM_OPTS: -Xms2048M -Xmx2048M -Xss6M -XX:ReservedCodeCacheSize=256M -Dfile.encoding=UTF-8 steps: - name: Checkout - uses: actions/checkout@v3 - - name: Set up JDK 8 - uses: actions/setup-java@v3 + uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v4 with: - java-version: '8' + java-version: '17' distribution: 'temurin' - cache: 'sbt' - name: Setup sbt launcher uses: sbt/setup-sbt@v1 + - name: Env + run: | + echo "JFROG_USER=${{ secrets.JFROG_USER }}" >> $GITHUB_ENV + echo "JFROG_PASSWORD=${{ secrets.JFROG_PASSWORD }}" >> $GITHUB_ENV + echo "GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> $GITHUB_ENV + echo "STRIPE_CLIENT_ID=${{ secrets.STRIPE_CLIENT_ID }}" >> $GITHUB_ENV + echo "STRIPE_API_KEY=${{ secrets.STRIPE_API_KEY }}" >> $GITHUB_ENV + echo "CODECOV_TOKEN=${{ secrets.CODECOV_TOKEN }}" >> $GITHUB_ENV + - name: Cross-compile + run: SBT_OPTS="-Xss4M -Xms1g -Xmx4g -Dfile.encoding=UTF-8" sbt '+ Test/compile' - name: Run tests & Coverage Report - run: STRIPE_CLIENT_ID=${{secrets.STRIPE_CLIENT_ID}} STRIPE_API_KEY=${{secrets.STRIPE_API_KEY}} sbt coverage test coverageReport + run: SBT_OPTS="-Xss4M -Xms1g -Xmx4g -Dfile.encoding=UTF-8" sbt coverage test coverageReport coverageAggregate - name: Upload coverage to Codecov - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: - files: common/target/scala-2.12/coverage-report/cobertura.xml,core/target/scala-2.12/coverage-report/cobertura.xml,teskit/target/scala-2.12/coverage-report/cobertura.xml + files: common/target/scala-*/coverage-report/cobertura.xml,core/target/scala-*/coverage-report/cobertura.xml,testkit/target/scala-*/coverage-report/cobertura.xml flags: unittests fail_ci_if_error: true verbose: true - - name: Publish - run: sbt publish + - name: Cross-publish + run: SBT_OPTS="-Xss4M -Xms1g -Xmx4g -Dfile.encoding=UTF-8" sbt '+ publish' lint: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 - - name: Set up JDK 8 - uses: actions/setup-java@v3 + uses: actions/checkout@v4 + - name: Set up JDK 17 + uses: actions/setup-java@v4 with: - java-version: '8' + java-version: '17' distribution: 'temurin' - # cache: 'sbt' - name: Setup sbt launcher uses: sbt/setup-sbt@v1 - name: Formatting - run: sbt scalafmtSbtCheck scalafmtCheck test:scalafmtCheck \ No newline at end of file + run: SBT_OPTS="-Xss4M -Xms1g -Xmx4g -Dfile.encoding=UTF-8" sbt scalafmtSbtCheck scalafmtCheck Test/scalafmtCheck diff --git a/.gitignore b/.gitignore index 161f68f..74a1104 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,4 @@ sbt.json target .metals *.log -tmp \ No newline at end of file +tmp diff --git a/api/build.sbt b/api/build.sbt index 9875977..331638b 100644 --- a/api/build.sbt +++ b/api/build.sbt @@ -2,7 +2,7 @@ import com.typesafe.sbt.packager.docker._ Compile / mainClass := Some("app.softnetwork.payment.api.SoftPayEndpointsPostgresLauncher") -dockerBaseImage := "openjdk:8" +dockerBaseImage := "eclipse-temurin:17-jdk" dockerEntrypoint := Seq(s"${(Docker / defaultLinuxInstallLocation).value}/bin/entrypoint.sh") diff --git a/build.sbt b/build.sbt index 637b771..7ef39ae 100644 --- a/build.sbt +++ b/build.sbt @@ -1,14 +1,28 @@ +lazy val scala212 = "2.12.20" +lazy val scala213 = "2.13.16" +lazy val javacCompilerVersion = "17" +lazy val scalacCompilerOptions = Seq("-deprecation", "-feature") + +lazy val moduleSettings = Seq( + crossScalaVersions := Seq(scala212, scala213), + scalacOptions ++= { + CrossVersion.partialVersion(scalaVersion.value) match { + case Some((2, 12)) => scalacCompilerOptions :+ "-Ypartial-unification" + case Some((2, 13)) => scalacCompilerOptions :+ s"-release:$javacCompilerVersion" + case _ => Seq.empty + } + } +) + ThisBuild / organization := "app.softnetwork" name := "payment" -ThisBuild / version := "0.8.3.1" - -ThisBuild / scalaVersion := "2.12.18" +ThisBuild / version := "0.9.0" -ThisBuild / scalacOptions ++= Seq("-deprecation", "-feature", "-target:jvm-1.8", "-Ypartial-unification") +ThisBuild / scalaVersion := scala212 -ThisBuild / javacOptions ++= Seq("-source", "1.8", "-target", "1.8", "-Xlint") +ThisBuild / javacOptions ++= Seq("-source", javacCompilerVersion, "-target", javacCompilerVersion, "-Xlint") ThisBuild / resolvers ++= Seq( "Softnetwork Server" at "https://softnetwork.jfrog.io/artifactory/releases/", @@ -31,19 +45,52 @@ val scalatest = Seq( ThisBuild / libraryDependencies ++= Seq( "com.thesamet.scalapb" %% "scalapb-runtime" % scalapb.compiler.Version.scalapbVersion % "protobuf", - "org.scala-lang.modules" %% "scala-parser-combinators" % "1.1.1" + "org.scala-lang.modules" %% "scala-parser-combinators" % "2.4.0", + "org.scala-lang.modules" %% "scala-collection-compat" % "2.11.0", + "org.slf4j" % "slf4j-api" % Versions.slf4j, + "ch.qos.logback" % "logback-classic" % Versions.logback ) ++ scalatest +ThisBuild / libraryDependencySchemes ++= Seq( + "org.scala-lang.modules" %% "scala-xml" % VersionScheme.Always, + "org.scala-lang.modules" %% "scala-parser-combinators" % VersionScheme.Always +) + +ThisBuild / javaOptions ++= Seq( + "--add-opens=java.base/java.util=ALL-UNNAMED", + "--add-opens=java.base/java.util.concurrent=ALL-UNNAMED", + "--add-opens=java.base/java.lang=ALL-UNNAMED", + "--add-opens=java.base/java.lang.invoke=ALL-UNNAMED", + "--add-opens=java.base/java.math=ALL-UNNAMED", + "--add-opens=java.base/java.io=ALL-UNNAMED", + "--add-opens=java.base/java.net=ALL-UNNAMED", + "--add-opens=java.base/java.nio=ALL-UNNAMED", + "--add-opens=java.base/java.text=ALL-UNNAMED", + "--add-opens=java.base/java.time=ALL-UNNAMED", + "--add-opens=java.base/sun.nio.ch=ALL-UNNAMED" +) + +ThisBuild / Test / fork := true + +ThisBuild / Test / javaOptions ++= (ThisBuild / javaOptions).value + Test / parallelExecution := false lazy val client = project.in(file("client")) .configs(IntegrationTest) - .settings(Defaults.itSettings, app.softnetwork.Info.infoSettings) + .settings( + Defaults.itSettings, + app.softnetwork.Info.infoSettings, + moduleSettings + ) .enablePlugins(BuildInfoPlugin, AkkaGrpcPlugin, JavaAppPackaging, UniversalDeployPlugin) lazy val common = project.in(file("common")) .configs(IntegrationTest) - .settings(Defaults.itSettings) + .settings( + Defaults.itSettings, + moduleSettings + ) .enablePlugins(AkkaGrpcPlugin) .dependsOn( client % "compile->compile;test->test;it->it" @@ -51,7 +98,11 @@ lazy val common = project.in(file("common")) lazy val core = project.in(file("core")) .configs(IntegrationTest) - .settings(Defaults.itSettings, app.softnetwork.Info.infoSettings) + .settings( + Defaults.itSettings, + app.softnetwork.Info.infoSettings, + moduleSettings + ) .enablePlugins(BuildInfoPlugin, AkkaGrpcPlugin) .dependsOn( common % "compile->compile;test->test;it->it" @@ -59,21 +110,30 @@ lazy val core = project.in(file("core")) lazy val mangopay = project.in(file("mangopay")) .configs(IntegrationTest) - .settings(Defaults.itSettings) + .settings( + Defaults.itSettings, + moduleSettings + ) .dependsOn( core % "compile->compile;test->test;it->it" ) lazy val stripe = project.in(file("stripe")) .configs(IntegrationTest) - .settings(Defaults.itSettings) + .settings( + Defaults.itSettings, + moduleSettings + ) .dependsOn( core % "compile->compile;test->test;it->it" ) lazy val api = project.in(file("api")) .configs(IntegrationTest) - .settings(Defaults.itSettings) + .settings( + Defaults.itSettings, + moduleSettings + ) .enablePlugins(DockerComposePlugin, DockerPlugin, JavaAppPackaging) .dependsOn( mangopay % "compile->compile;test->test;it->it" @@ -84,7 +144,10 @@ lazy val api = project.in(file("api")) lazy val testkit = project.in(file("testkit")) .configs(IntegrationTest) - .settings(Defaults.itSettings) + .settings( + Defaults.itSettings, + moduleSettings + ) .dependsOn( mangopay % "compile->compile;test->test;it->it" ) @@ -95,4 +158,7 @@ lazy val testkit = project.in(file("testkit")) lazy val root = project.in(file(".")) .aggregate(client, common, core, mangopay, stripe, testkit, api) .configs(IntegrationTest) - .settings(Defaults.itSettings) + .settings( + Defaults.itSettings, + crossScalaVersions := Nil + ) diff --git a/client/build.sbt b/client/build.sbt index 05b3533..629a1af 100644 --- a/client/build.sbt +++ b/client/build.sbt @@ -20,7 +20,7 @@ libraryDependencies ++= Seq( "app.softnetwork.account" %% "account-common" % Versions.account, "app.softnetwork.account" %% "account-common" % Versions.account % "protobuf", "app.softnetwork.api" %% "generic-server-api" % Versions.genericPersistence, - "app.softnetwork.protobuf" %% "scalapb-extensions" % "0.1.7", + "app.softnetwork.protobuf" %% "scalapb-extensions" % "0.2.0", "commons-validator" % "commons-validator" % "1.6", "com.github.scopt" %% "scopt" % Versions.scopt, "org.scalatra.scalate" %% "scalate-core" % Versions.scalate exclude ("org.scala-lang.modules", "scala-xml_2.12") exclude ("org.scala-lang.modules", "scala-parser-combinators_2.12"), diff --git a/client/src/main/scala/app/softnetwork/payment/cli/Main.scala b/client/src/main/scala/app/softnetwork/payment/cli/Main.scala index 5635451..daf6720 100644 --- a/client/src/main/scala/app/softnetwork/payment/cli/Main.scala +++ b/client/src/main/scala/app/softnetwork/payment/cli/Main.scala @@ -76,7 +76,7 @@ class Main extends Completion { printUsage() System.exit(1) case Some(cmd) => - cmd.run(list) complete () match { + cmd.run(list).complete() match { case Success((exit, message)) => message.foreach(println) System.exit(exit) diff --git a/common/src/main/resources/reference.conf b/common/src/main/resources/reference.conf index 1d11e4c..f8ba7ef 100644 --- a/common/src/main/resources/reference.conf +++ b/common/src/main/resources/reference.conf @@ -13,6 +13,7 @@ softnetwork { payment{ baseUrl = "http://localhost:"${softnetwork.api.server.port}"/"${softnetwork.api.server.root-path} baseUrl = ${?PAYMENT_BASE_URL} + base-url = ${payment.baseUrl} path = "payment" path = ${?PAYMENT_PATH} diff --git a/common/src/main/scala/app/softnetwork/payment/config/PaymentSettings.scala b/common/src/main/scala/app/softnetwork/payment/config/PaymentSettings.scala index c938429..13fd64b 100644 --- a/common/src/main/scala/app/softnetwork/payment/config/PaymentSettings.scala +++ b/common/src/main/scala/app/softnetwork/payment/config/PaymentSettings.scala @@ -1,7 +1,7 @@ package app.softnetwork.payment.config import com.typesafe.config.{Config, ConfigFactory} -import configs.Configs +import configs.ConfigReader /** Created by smanciot on 05/07/2018. */ @@ -10,7 +10,7 @@ trait PaymentSettings { lazy val config: Config = ConfigFactory.load() lazy val PaymentConfig: Payment.Config = { - Configs[Payment.Config].get(config, "payment").toEither match { + ConfigReader[Payment.Config].read(config, "payment").toEither match { case Left(configError) => Console.err.println(s"Something went wrong with the provided arguments $configError") throw configError.configException diff --git a/common/src/main/scala/app/softnetwork/payment/spi/PaymentProviders.scala b/common/src/main/scala/app/softnetwork/payment/spi/PaymentProviders.scala index 9026454..17b95c2 100644 --- a/common/src/main/scala/app/softnetwork/payment/spi/PaymentProviders.scala +++ b/common/src/main/scala/app/softnetwork/payment/spi/PaymentProviders.scala @@ -7,7 +7,7 @@ import com.typesafe.config.Config import org.json4s.Formats import java.util.ServiceLoader -import scala.collection.JavaConverters._ +import scala.jdk.CollectionConverters._ object PaymentProviders { diff --git a/core/src/main/scala/app/softnetwork/payment/persistence/typed/PayInCommandHandler.scala b/core/src/main/scala/app/softnetwork/payment/persistence/typed/PayInCommandHandler.scala index 8aa8283..602275d 100644 --- a/core/src/main/scala/app/softnetwork/payment/persistence/typed/PayInCommandHandler.scala +++ b/core/src/main/scala/app/softnetwork/payment/persistence/typed/PayInCommandHandler.scala @@ -117,7 +117,7 @@ trait PayInCommandHandler } } // load credited payment account - paymentDao.loadPaymentAccount(creditedAccount, clientId) complete () match { + paymentDao.loadPaymentAccount(creditedAccount, clientId).complete() match { case Success(s) => s match { case Some(creditedPaymentAccount) => @@ -212,7 +212,7 @@ trait PayInCommandHandler } } // load credited payment account - paymentDao.loadPaymentAccount(creditedAccount, clientId) complete () match { + paymentDao.loadPaymentAccount(creditedAccount, clientId).complete() match { case Success(s) => s match { case Some(creditedPaymentAccount) => @@ -489,7 +489,7 @@ trait PayInCommandHandler ) case Some(preAuthorizationTransaction) => // load credited payment account - paymentDao.loadPaymentAccount(creditedAccount, clientId) complete () match { + paymentDao.loadPaymentAccount(creditedAccount, clientId).complete() match { case Success(s) => s match { case Some(creditedPaymentAccount) => diff --git a/core/src/main/scala/app/softnetwork/payment/persistence/typed/PaymentBehavior.scala b/core/src/main/scala/app/softnetwork/payment/persistence/typed/PaymentBehavior.scala index 8575a40..bd16917 100644 --- a/core/src/main/scala/app/softnetwork/payment/persistence/typed/PaymentBehavior.scala +++ b/core/src/main/scala/app/softnetwork/payment/persistence/typed/PaymentBehavior.scala @@ -490,7 +490,7 @@ trait PaymentBehavior ) } else { // load credited payment account - paymentDao.loadPaymentAccount(creditedAccount, clientId) complete () match { + paymentDao.loadPaymentAccount(creditedAccount, clientId).complete() match { case Success(s) => maybeCreditedPaymentAccount = s maybeCreditedPaymentAccount match { @@ -543,14 +543,16 @@ trait PaymentBehavior ) { val payOutTransactionId = if (payOutRequired) { - paymentDao.payOut( - orderUuid.getOrElse(""), - creditedAccount, - debitedAmount, - feesAmount = 0, /* fees have already been applied with Transfer */ - currency, - externalReference - ) complete () match { + paymentDao + .payOut( + orderUuid.getOrElse(""), + creditedAccount, + debitedAmount, + feesAmount = 0, /* fees have already been applied with Transfer */ + currency, + externalReference + ) + .complete() match { case Success(s) => s match { case Right(r) => Some(r.transactionId) diff --git a/core/src/main/scala/app/softnetwork/payment/persistence/typed/PaymentCommandHandler.scala b/core/src/main/scala/app/softnetwork/payment/persistence/typed/PaymentCommandHandler.scala index ff31965..6dec3ec 100644 --- a/core/src/main/scala/app/softnetwork/payment/persistence/typed/PaymentCommandHandler.scala +++ b/core/src/main/scala/app/softnetwork/payment/persistence/typed/PaymentCommandHandler.scala @@ -37,7 +37,7 @@ trait PaymentCommandHandler { _: Completion => val uuid = pa.externalUuidWithProfile state match { case None => - keyValueDao.lookupKeyValue(uuid) complete () match { + keyValueDao.lookupKeyValue(uuid).complete() match { case Success(s) => s match { case Some(t) if t != entityId => @@ -78,7 +78,7 @@ trait PaymentCommandHandler { _: Completion => )(implicit system: ActorSystem[_]): PaymentProvider = { PaymentProviders.paymentProvider( clientId - .flatMap(softPayAccountDao.loadProvider(_) complete () match { + .flatMap(softPayAccountDao.loadProvider(_).complete() match { case Success(s) => s case Failure(_) => None }) diff --git a/core/src/main/scala/app/softnetwork/payment/persistence/typed/PreAuthorizationCommandHandler.scala b/core/src/main/scala/app/softnetwork/payment/persistence/typed/PreAuthorizationCommandHandler.scala index dce20b1..0dc6006 100644 --- a/core/src/main/scala/app/softnetwork/payment/persistence/typed/PreAuthorizationCommandHandler.scala +++ b/core/src/main/scala/app/softnetwork/payment/persistence/typed/PreAuthorizationCommandHandler.scala @@ -107,7 +107,7 @@ trait PreAuthorizationCommandHandler val creditedUserId: Option[String] = creditedAccount match { case Some(account) => - paymentDao.loadPaymentAccount(account, clientId) complete () match { + paymentDao.loadPaymentAccount(account, clientId).complete() match { case Success(s) => s.flatMap(_.userId) case Failure(f) => log.error(s"Error loading credited account: ${f.getMessage}") diff --git a/core/src/main/scala/app/softnetwork/payment/persistence/typed/SoftPayAccountBehavior.scala b/core/src/main/scala/app/softnetwork/payment/persistence/typed/SoftPayAccountBehavior.scala index 140ec35..5b407a4 100644 --- a/core/src/main/scala/app/softnetwork/payment/persistence/typed/SoftPayAccountBehavior.scala +++ b/core/src/main/scala/app/softnetwork/payment/persistence/typed/SoftPayAccountBehavior.scala @@ -101,7 +101,7 @@ trait SoftPayAccountBehavior extends AccountBehavior[SoftPayAccount, BasicAccoun AccountMessages.ProviderAlreadyRegistered ~> replyTo } } else if ( - (accountKeyDao.lookupAccount(provider.clientId) complete ()).exists(_ != entityId) + (accountKeyDao.lookupAccount(provider.clientId).complete()).exists(_ != entityId) ) { Effect.none.thenRun { _ => AccountMessages.ProviderAlreadyRegistered ~> replyTo diff --git a/core/src/main/scala/app/softnetwork/payment/service/ClientSession.scala b/core/src/main/scala/app/softnetwork/payment/service/ClientSession.scala index 7c99f04..130dafc 100644 --- a/core/src/main/scala/app/softnetwork/payment/service/ClientSession.scala +++ b/core/src/main/scala/app/softnetwork/payment/service/ClientSession.scala @@ -60,7 +60,7 @@ trait ClientSession[SD <: SessionData with SessionDataDecorator[SD]] extends Com def sessionManager(clientId: Option[String]): SessionManager[SD] = { clientId match { case Some(id) => - softPayAccountDao.loadClient(id) complete () match { + softPayAccountDao.loadClient(id).complete() match { case Success(s) => clientSessionManager(s) case Failure(_) => manager } diff --git a/mangopay/src/main/resources/reference.conf b/mangopay/src/main/resources/reference.conf index 9c1552b..b118764 100644 --- a/mangopay/src/main/resources/reference.conf +++ b/mangopay/src/main/resources/reference.conf @@ -4,6 +4,7 @@ payment{ client-id = "softpaymentdev" api-key = "aJLYtPbdE672E7HHNk6jZrmz9Mwo8YWs05KZXVXje7xKWZHa8j" baseUrl = "https://api.sandbox.mangopay.com/" + base-url = ${payment.mangopay.baseUrl} debug = false # https://docs.mangopay.com/guide/errors technical-errors = ["009103", "009199", "009499", "009999", "009101", "101202"] diff --git a/mangopay/src/main/scala/app/softnetwork/payment/config/MangoPay.scala b/mangopay/src/main/scala/app/softnetwork/payment/config/MangoPay.scala index f6a547e..82a7ef2 100644 --- a/mangopay/src/main/scala/app/softnetwork/payment/config/MangoPay.scala +++ b/mangopay/src/main/scala/app/softnetwork/payment/config/MangoPay.scala @@ -74,7 +74,7 @@ object MangoPay { val url = new URL(s"${config.hooksBaseUrl}") if (!Seq("localhost", "127.0.0.1").contains(url.getHost)) { // init MangoPay hooks - import scala.collection.JavaConverters._ + import scala.jdk.CollectionConverters._ val hooks: List[Hook] = Try(mangoPayApi.getHookApi.getAll) match { case Success(s) => s.asScala.toList diff --git a/mangopay/src/main/scala/app/softnetwork/payment/config/MangoPaySettings.scala b/mangopay/src/main/scala/app/softnetwork/payment/config/MangoPaySettings.scala index 3ea8eb1..f77a09b 100644 --- a/mangopay/src/main/scala/app/softnetwork/payment/config/MangoPaySettings.scala +++ b/mangopay/src/main/scala/app/softnetwork/payment/config/MangoPaySettings.scala @@ -1,14 +1,14 @@ package app.softnetwork.payment.config import com.typesafe.config.{Config, ConfigFactory} -import configs.Configs +import configs.ConfigReader trait MangoPaySettings { lazy val config: Config = ConfigFactory.load() lazy val MangoPayConfig: MangoPay.Config = - Configs[MangoPay.Config].get(config, "payment.mangopay").toEither match { + ConfigReader[MangoPay.Config].read(config, "payment.mangopay").toEither match { case Left(configError) => Console.err.println(s"Something went wrong with the provided arguments $configError") throw configError.configException diff --git a/mangopay/src/main/scala/app/softnetwork/payment/spi/MangoPayProvider.scala b/mangopay/src/main/scala/app/softnetwork/payment/spi/MangoPayProvider.scala index 6f23004..d2d1595 100644 --- a/mangopay/src/main/scala/app/softnetwork/payment/spi/MangoPayProvider.scala +++ b/mangopay/src/main/scala/app/softnetwork/payment/spi/MangoPayProvider.scala @@ -51,7 +51,7 @@ import scala.language.implicitConversions trait MangoPayProvider extends PaymentProvider { import scala.language.implicitConversions - import scala.collection.JavaConverters._ + import scala.jdk.CollectionConverters._ override implicit def config: MangoPayConfig @@ -2187,10 +2187,10 @@ trait MangoPayProvider extends PaymentProvider { .withCountry(address.getCountry.name()) .copy(state = Option(address.getRegion)) ), - technicalEmails = client.getTechEmails.asScala, - administrativeEmails = client.getAdminEmails.asScala, - billingEmails = client.getBillingEmails.asScala, - fraudEmails = client.getFraudEmails.asScala, + technicalEmails = client.getTechEmails.asScala.toSeq, + administrativeEmails = client.getAdminEmails.asScala.toSeq, + billingEmails = client.getBillingEmails.asScala.toSeq, + fraudEmails = client.getFraudEmails.asScala.toSeq, vatNumber = Option(client.getTaxNumber) ) ) @@ -2292,7 +2292,7 @@ trait MangoPayProvider extends PaymentProvider { override def getDeclaration(userId: String, uboDeclarationId: String): Option[UboDeclaration] = { Try(MangoPay().getUboDeclarationApi.get(userId, uboDeclarationId)) match { case Success(s) => - import scala.collection.JavaConverters._ + import scala.jdk.CollectionConverters._ Some( UboDeclaration.defaultInstance .withId(uboDeclarationId) @@ -2302,7 +2302,7 @@ trait MangoPayProvider extends PaymentProvider { reason = Option(s.getReason), message = Option(s.getMessage) ) - .withUbos(s.getUbos.asScala.map(ubo => { + .withUbos(s.getUbos.asScala.toSeq.map(ubo => { UboDeclaration.UltimateBeneficialOwner.defaultInstance .withId(ubo.getId) .withFirstName(ubo.getFirstName) diff --git a/project/Versions.scala b/project/Versions.scala index 3752e06..548ee4a 100644 --- a/project/Versions.scala +++ b/project/Versions.scala @@ -1,12 +1,12 @@ object Versions { - val genericPersistence = "0.7.3" + val genericPersistence = "0.8.2" - val scheduler = "0.7.3" + val scheduler = "0.8.0" - val notification = "0.8.2" + val notification = "0.9.0" - val account = "0.7.3" + val account = "0.8.1" val scalatest = "3.2.16" @@ -17,4 +17,8 @@ object Versions { val scalate = "1.9.8" val selenium = "4.23.0" + + val slf4j = "2.0.7" + + val logback = "1.4.14" } diff --git a/project/plugins.sbt b/project/plugins.sbt index 173b732..1a76b25 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -8,11 +8,11 @@ resolvers ++= Seq( "Softnetwork snapshots" at "https://softnetwork.jfrog.io/artifactory/snapshots/" ) -addSbtPlugin("app.softnetwork.sbt-softnetwork" % "sbt-softnetwork-git" % "0.1.7") +addSbtPlugin("app.softnetwork.sbt-softnetwork" % "sbt-softnetwork-git" % "0.2.0") -addSbtPlugin("app.softnetwork.sbt-softnetwork" % "sbt-softnetwork-info" % "0.1.7") +addSbtPlugin("app.softnetwork.sbt-softnetwork" % "sbt-softnetwork-info" % "0.2.0") -addSbtPlugin("app.softnetwork.sbt-softnetwork" % "sbt-softnetwork-publish" % "0.1.7") +addSbtPlugin("app.softnetwork.sbt-softnetwork" % "sbt-softnetwork-publish" % "0.2.0") addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.3.10") @@ -20,6 +20,4 @@ addSbtPlugin("com.tapad" % "sbt-docker-compose" % "1.0.34") addDependencyTreePlugin -addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.9.2") - -addSbtPlugin("org.scoverage" % "sbt-scoverage" % "2.0.8") +addSbtPlugin("org.scoverage" % "sbt-scoverage" % "2.3.0") diff --git a/stripe/src/main/resources/reference.conf b/stripe/src/main/resources/reference.conf index bbfcb66..984681b 100644 --- a/stripe/src/main/resources/reference.conf +++ b/stripe/src/main/resources/reference.conf @@ -5,6 +5,7 @@ payment { api-key: "sk_test_51PZSi4RoAUNlu6LYA6opFyXxSM9U7Q2C0pHDbFnk92MJdOEEvREmcvW7ZlRim2ebZaLc8Nf0sejbcef5Bri7xMJj009Ps5fBSK" api-key: ${?STRIPE_API_KEY} baseUrl = "https://api.stripe.com" + base-url = ${payment.stripe.baseUrl} debug = false secure-mode-path = ${payment.path} hooks-path = ${payment.path} diff --git a/stripe/src/main/scala/app/softnetwork/payment/config/StripeApi.scala b/stripe/src/main/scala/app/softnetwork/payment/config/StripeApi.scala index 5be1f4c..1b7d3cc 100644 --- a/stripe/src/main/scala/app/softnetwork/payment/config/StripeApi.scala +++ b/stripe/src/main/scala/app/softnetwork/payment/config/StripeApi.scala @@ -125,7 +125,7 @@ object StripeApi { val url = s"${config.hooksBaseUrl}?hash=$hash" - import collection.JavaConverters._ + import scala.jdk.CollectionConverters._ Try { ((Option( diff --git a/stripe/src/main/scala/app/softnetwork/payment/config/StripeSettings.scala b/stripe/src/main/scala/app/softnetwork/payment/config/StripeSettings.scala index da320ee..9b4c3ec 100644 --- a/stripe/src/main/scala/app/softnetwork/payment/config/StripeSettings.scala +++ b/stripe/src/main/scala/app/softnetwork/payment/config/StripeSettings.scala @@ -1,14 +1,14 @@ package app.softnetwork.payment.config import com.typesafe.config.{Config, ConfigFactory} -import configs.Configs +import configs.ConfigReader trait StripeSettings { lazy val config: Config = ConfigFactory.load() lazy val StripeApiConfig: StripeApi.Config = - Configs[StripeApi.Config].get(config, "payment.stripe").toEither match { + ConfigReader[StripeApi.Config].read(config, "payment.stripe").toEither match { case Left(configError) => Console.err.println(s"Something went wrong with the provided arguments $configError") throw configError.configException diff --git a/stripe/src/main/scala/app/softnetwork/payment/service/StripeEventHandler.scala b/stripe/src/main/scala/app/softnetwork/payment/service/StripeEventHandler.scala index fd498af..6b7fdf0 100644 --- a/stripe/src/main/scala/app/softnetwork/payment/service/StripeEventHandler.scala +++ b/stripe/src/main/scala/app/softnetwork/payment/service/StripeEventHandler.scala @@ -16,7 +16,7 @@ import com.stripe.net.Webhook import scala.util.{Failure, Success, Try} import scala.language.implicitConversions -import collection.JavaConverters._ +import scala.jdk.CollectionConverters._ /** Created by smanciot on 27/04/2021. */ @@ -59,7 +59,7 @@ trait StripeEventHandler extends Completion { _: BasicPaymentService with Paymen ) } //disable account - run(InvalidateRegularUser(accountId)) complete () match { + run(InvalidateRegularUser(accountId)).complete() match { case Success(RegularUserInvalidated) => log.info( s"[Payment Hooks] Stripe Webhook received: Account Updated -> Account disabled for $accountId" @@ -152,7 +152,7 @@ trait StripeEventHandler extends Completion { _: BasicPaymentService with Paymen s"[Payment Hooks] Stripe Webhook received: Account Updated -> Charges and Payouts are enabled for $accountId" ) //enable account - run(ValidateRegularUser(account.getId)) complete () match { + run(ValidateRegularUser(account.getId)).complete() match { case Success(RegularUserValidated) => log.info( s"[Payment Hooks] Stripe Webhook received: Account Updated -> Account enabled for $accountId" @@ -278,7 +278,7 @@ trait StripeEventHandler extends Completion { _: BasicPaymentService with Paymen accountId, document ) - ) complete () match { + ).complete() match { case Success(KycDocumentCreatedOrUpdated) => log.info( s"[Payment Hooks] Stripe Webhook received: Document ID: $documentId refused" diff --git a/stripe/src/main/scala/app/softnetwork/payment/spi/StripeAccountApi.scala b/stripe/src/main/scala/app/softnetwork/payment/spi/StripeAccountApi.scala index 264434e..727046d 100644 --- a/stripe/src/main/scala/app/softnetwork/payment/spi/StripeAccountApi.scala +++ b/stripe/src/main/scala/app/softnetwork/payment/spi/StripeAccountApi.scala @@ -45,7 +45,7 @@ import java.io.ByteArrayInputStream import java.text.SimpleDateFormat import java.util.{Calendar, TimeZone} import scala.util.{Failure, Success, Try} -import collection.JavaConverters._ +import scala.jdk.CollectionConverters._ import scala.language.implicitConversions trait StripeAccountApi extends PaymentAccountApi { _: StripeContext => @@ -1125,7 +1125,8 @@ trait StripeAccountApi extends PaymentAccountApi { _: StripeContext => StripeApi().requestOptions() ) .getData - .asScala match { + .asScala + .toSeq match { case persons => Some( model.UboDeclaration.defaultInstance @@ -1188,6 +1189,7 @@ trait StripeAccountApi extends PaymentAccountApi { _: StripeContext => ) .getData .asScala + .toSeq val ownersProvided = persons.map(_.getRelationship.getPercentOwnership.doubleValue()).sum == 100.0 @@ -1237,7 +1239,7 @@ trait StripeAccountApi extends PaymentAccountApi { _: StripeContext => StripeApi().requestOptions() ) - Some( + Option( model.UboDeclaration.defaultInstance .withId(uboDeclarationId) .withCreatedDate(persistence.now()) diff --git a/stripe/src/main/scala/app/softnetwork/payment/spi/StripeBalanceApi.scala b/stripe/src/main/scala/app/softnetwork/payment/spi/StripeBalanceApi.scala index 216c840..a9bb070 100644 --- a/stripe/src/main/scala/app/softnetwork/payment/spi/StripeBalanceApi.scala +++ b/stripe/src/main/scala/app/softnetwork/payment/spi/StripeBalanceApi.scala @@ -3,7 +3,7 @@ package app.softnetwork.payment.spi import app.softnetwork.payment.config.StripeApi import com.google.gson.Gson import com.stripe.model.Balance -import collection.JavaConverters._ +import scala.jdk.CollectionConverters._ trait StripeBalanceApi extends BalanceApi { self: StripeContext => @@ -21,6 +21,7 @@ trait StripeBalanceApi extends BalanceApi { self: StripeContext => .retrieve(StripeApi().requestOptions(walletId)) .getAvailable .asScala + .toSeq val availableAmount = balances.find( diff --git a/stripe/src/main/scala/app/softnetwork/payment/spi/StripeDirectDebitApi.scala b/stripe/src/main/scala/app/softnetwork/payment/spi/StripeDirectDebitApi.scala index c3eb0d6..95de008 100644 --- a/stripe/src/main/scala/app/softnetwork/payment/spi/StripeDirectDebitApi.scala +++ b/stripe/src/main/scala/app/softnetwork/payment/spi/StripeDirectDebitApi.scala @@ -27,7 +27,7 @@ import com.stripe.param.{ import java.net.URLEncoder import java.util.Date import scala.util.{Failure, Success, Try} -import collection.JavaConverters._ +import scala.jdk.CollectionConverters._ import scala.language.implicitConversions trait StripeDirectDebitApi extends DirectDebitApi { @@ -204,6 +204,7 @@ trait StripeDirectDebitApi extends DirectDebitApi { billing .setEmail(email) case None => + throw new Exception("Customer email is required to create a payment method") } Option(customer.getAddress) match { case Some(address) => diff --git a/stripe/src/main/scala/app/softnetwork/payment/spi/StripePayInApi.scala b/stripe/src/main/scala/app/softnetwork/payment/spi/StripePayInApi.scala index 36b70b9..5601f26 100644 --- a/stripe/src/main/scala/app/softnetwork/payment/spi/StripePayInApi.scala +++ b/stripe/src/main/scala/app/softnetwork/payment/spi/StripePayInApi.scala @@ -17,7 +17,7 @@ import com.stripe.param.{ } import scala.util.{Failure, Success, Try} -import collection.JavaConverters._ +import scala.jdk.CollectionConverters._ trait StripePayInApi extends PayInApi { _: StripeContext => diff --git a/stripe/src/main/scala/app/softnetwork/payment/spi/StripePayOutApi.scala b/stripe/src/main/scala/app/softnetwork/payment/spi/StripePayOutApi.scala index ff50d66..ff4f2e4 100644 --- a/stripe/src/main/scala/app/softnetwork/payment/spi/StripePayOutApi.scala +++ b/stripe/src/main/scala/app/softnetwork/payment/spi/StripePayOutApi.scala @@ -8,7 +8,7 @@ import com.stripe.model.{PaymentIntent, Payout, Transfer} import com.stripe.param.PayoutCreateParams import scala.util.{Failure, Success, Try} -import collection.JavaConverters._ +import scala.jdk.CollectionConverters._ trait StripePayOutApi extends PayOutApi { _: StripeContext with StripeTransferApi with StripeBalanceApi => diff --git a/stripe/src/main/scala/app/softnetwork/payment/spi/StripeRefundApi.scala b/stripe/src/main/scala/app/softnetwork/payment/spi/StripeRefundApi.scala index 1d881c2..d9cc00c 100644 --- a/stripe/src/main/scala/app/softnetwork/payment/spi/StripeRefundApi.scala +++ b/stripe/src/main/scala/app/softnetwork/payment/spi/StripeRefundApi.scala @@ -22,7 +22,7 @@ import com.stripe.param.{ } import scala.util.{Failure, Success, Try} -import collection.JavaConverters._ +import scala.jdk.CollectionConverters._ trait StripeRefundApi extends RefundApi { _: StripeContext => diff --git a/stripe/src/main/scala/app/softnetwork/payment/spi/StripeTransferApi.scala b/stripe/src/main/scala/app/softnetwork/payment/spi/StripeTransferApi.scala index 99ca8bf..af93e82 100644 --- a/stripe/src/main/scala/app/softnetwork/payment/spi/StripeTransferApi.scala +++ b/stripe/src/main/scala/app/softnetwork/payment/spi/StripeTransferApi.scala @@ -11,7 +11,7 @@ import com.stripe.param.{ TransferCreateParams } -import collection.JavaConverters._ +import scala.jdk.CollectionConverters._ import scala.util.{Failure, Success, Try} trait StripeTransferApi extends TransferApi { _: StripeContext => diff --git a/stripe/src/test/resources/reference.conf b/stripe/src/test/resources/reference.conf index 94270ae..2500aad 100644 --- a/stripe/src/test/resources/reference.conf +++ b/stripe/src/test/resources/reference.conf @@ -1,3 +1,4 @@ payment{ baseUrl = "http://www.softnetwork.fr:"${softnetwork.api.server.port}"/"${softnetwork.api.server.root-path} + base-url = ${payment.baseUrl} } \ No newline at end of file diff --git a/testkit/src/main/scala/app/softnetwork/payment/scalatest/PaymentRouteSpec.scala b/testkit/src/main/scala/app/softnetwork/payment/scalatest/PaymentRouteSpec.scala index 910b84c..b3c9208 100644 --- a/testkit/src/main/scala/app/softnetwork/payment/scalatest/PaymentRouteSpec.scala +++ b/testkit/src/main/scala/app/softnetwork/payment/scalatest/PaymentRouteSpec.scala @@ -455,23 +455,27 @@ trait PaymentRouteSpec[SD <: SessionData with SessionDataDecorator[SD]] ) ~> routes ~> check { status shouldEqual StatusCodes.OK preAuthorizationId = responseAs[PaymentPreAuthorized].transactionId - paymentClient.payInWithPreAuthorization( - preAuthorizationId, - computeExternalUuidWithProfile(sellerUuid, Some("seller")), - None - ) complete () match { + paymentClient + .payInWithPreAuthorization( + preAuthorizationId, + computeExternalUuidWithProfile(sellerUuid, Some("seller")), + None + ) + .complete() match { case Success(result) => assert(result.transactionId.isDefined) assert(result.error.isEmpty) - paymentClient.payOut( - orderUuid, - computeExternalUuidWithProfile(sellerUuid, Some("seller")), - 100, - 0, - "EUR", - Some("reference"), - result.transactionId - ) complete () match { + paymentClient + .payOut( + orderUuid, + computeExternalUuidWithProfile(sellerUuid, Some("seller")), + 100, + 0, + "EUR", + Some("reference"), + result.transactionId + ) + .complete() match { case Success(s) => assert(s.transactionId.isDefined) assert(s.error.isEmpty) @@ -522,15 +526,17 @@ trait PaymentRouteSpec[SD <: SessionData with SessionDataDecorator[SD]] ) ~> routes ~> check { status shouldEqual StatusCodes.OK assert(responseAs[PaidIn].transactionId == transactionId) - paymentClient.payOut( - orderUuid, - computeExternalUuidWithProfile(sellerUuid, Some("seller")), - debitedAmount, - feesAmount, - "EUR", - None, - transactionId - ) complete () match { + paymentClient + .payOut( + orderUuid, + computeExternalUuidWithProfile(sellerUuid, Some("seller")), + debitedAmount, + feesAmount, + "EUR", + None, + transactionId + ) + .complete() match { case Success(s) => assert(s.transactionId.isDefined) assert(s.error.isEmpty) @@ -575,15 +581,17 @@ trait PaymentRouteSpec[SD <: SessionData with SessionDataDecorator[SD]] ) ~> routes ~> check { status shouldEqual StatusCodes.OK assert(responseAs[PaidIn].transactionId == transactionId) - paymentClient.payOut( - orderUuid, - computeExternalUuidWithProfile(sellerUuid, Some("seller")), - debitedAmount, - feesAmount, - "EUR", - None, - transactionId - ) complete () match { + paymentClient + .payOut( + orderUuid, + computeExternalUuidWithProfile(sellerUuid, Some("seller")), + debitedAmount, + feesAmount, + "EUR", + None, + transactionId + ) + .complete() match { case Success(s) => assert(s.transactionId.isDefined) assert(s.error.isEmpty) diff --git a/testkit/src/main/scala/app/softnetwork/payment/spi/MockMangoPayProvider.scala b/testkit/src/main/scala/app/softnetwork/payment/spi/MockMangoPayProvider.scala index 92987f9..d6221bf 100644 --- a/testkit/src/main/scala/app/softnetwork/payment/spi/MockMangoPayProvider.scala +++ b/testkit/src/main/scala/app/softnetwork/payment/spi/MockMangoPayProvider.scala @@ -44,7 +44,7 @@ trait MockMangoPayProvider extends MangoPayProvider with Entity { import MockMangoPayProvider._ - import scala.collection.JavaConverters._ + import scala.jdk.CollectionConverters._ private val OK = "000000" diff --git a/testkit/src/test/scala/app/softnetwork/payment/handlers/PaymentHandlerSpec.scala b/testkit/src/test/scala/app/softnetwork/payment/handlers/PaymentHandlerSpec.scala index e5ce288..98a637f 100644 --- a/testkit/src/test/scala/app/softnetwork/payment/handlers/PaymentHandlerSpec.scala +++ b/testkit/src/test/scala/app/softnetwork/payment/handlers/PaymentHandlerSpec.scala @@ -521,9 +521,11 @@ class PaymentHandlerSpec sellerBankAccountId = paymentAccount.bankAccount.flatMap(_.id).getOrElse("") // assert(sellerBankAccountId != previousBankAccountId) uboDeclarationId = paymentAccount.getLegalUser.uboDeclaration.map(_.id).getOrElse("") - paymentClient.loadLegalUserDetails( - computeExternalUuidWithProfile(sellerUuid, Some("seller")) - ) complete () match { + paymentClient + .loadLegalUserDetails( + computeExternalUuidWithProfile(sellerUuid, Some("seller")) + ) + .complete() match { case Success(value) => assert(value.legalUserType.isBusiness) assert(value.legalName == legalUser.legalName) @@ -867,22 +869,26 @@ class PaymentHandlerSpec transaction.status shouldBe Transaction.TransactionStatus.TRANSACTION_CREATED case _ => fail() } - paymentClient.payInWithPreAuthorization( - preAuthorizationId, - computeExternalUuidWithProfile(sellerUuid, Some("seller")), - Some(110) - ) complete () match { + paymentClient + .payInWithPreAuthorization( + preAuthorizationId, + computeExternalUuidWithProfile(sellerUuid, Some("seller")), + Some(110) + ) + .complete() match { case Success(result) => assert(result.transactionId.isEmpty) assert(result.error.getOrElse("") == "DebitedAmountAbovePreAuthorizationAmount") case Failure(f) => fail(f.getMessage) } val debitedAmount = 90 - paymentClient.payInWithPreAuthorization( - preAuthorizationId, - computeExternalUuidWithProfile(sellerUuid, Some("seller")), - Some(debitedAmount) - ) complete () match { + paymentClient + .payInWithPreAuthorization( + preAuthorizationId, + computeExternalUuidWithProfile(sellerUuid, Some("seller")), + Some(debitedAmount) + ) + .complete() match { case Success(result) => transactionId = result.transactionId.getOrElse("") assert(transactionId.nonEmpty) @@ -929,24 +935,28 @@ class PaymentHandlerSpec } case other => fail(other.getClass.toString) } - paymentClient.loadBalance( - currency, - Option(computeExternalUuidWithProfile(sellerUuid, Some("seller"))), - None - ) complete () match { + paymentClient + .loadBalance( + currency, + Option(computeExternalUuidWithProfile(sellerUuid, Some("seller"))), + None + ) + .complete() match { case Success(balance) => assert(balance.getOrElse(0) == debitedAmount) case Failure(f) => fail(f.getMessage) } - paymentClient.payOut( - orderUuid, - computeExternalUuidWithProfile(sellerUuid, Some("seller")), - 100, - 0, - currency, - None, - result.transactionId - ) complete () match { + paymentClient + .payOut( + orderUuid, + computeExternalUuidWithProfile(sellerUuid, Some("seller")), + 100, + 0, + currency, + None, + result.transactionId + ) + .complete() match { case Success(s) => transactionId = s.transactionId.getOrElse("") assert(transactionId.nonEmpty) @@ -983,15 +993,17 @@ class PaymentHandlerSpec ) ) await { case result: PaidIn => - paymentClient.payOut( - orderUuid, - computeExternalUuidWithProfile(sellerUuid, Some("seller")), - 100, - 0, - currency, - None, - Option(result.transactionId) - ) complete () match { + paymentClient + .payOut( + orderUuid, + computeExternalUuidWithProfile(sellerUuid, Some("seller")), + 100, + 0, + currency, + None, + Option(result.transactionId) + ) + .complete() match { case Success(s) => val transactionId = s.transactionId assert(transactionId.isDefined) @@ -1033,15 +1045,17 @@ class PaymentHandlerSpec ) ) await { case result: PaidIn => - paymentClient.payOut( - orderUuid, - computeExternalUuidWithProfile(sellerUuid, Some("seller")), - 100, - 0, - currency, - None, - Option(result.transactionId) - ) complete () match { + paymentClient + .payOut( + orderUuid, + computeExternalUuidWithProfile(sellerUuid, Some("seller")), + 100, + 0, + currency, + None, + Option(result.transactionId) + ) + .complete() match { case Success(s) => assert(s.transactionId.isDefined) assert(s.error.isEmpty) @@ -1065,27 +1079,31 @@ class PaymentHandlerSpec ) await { case result: PaidIn => val payInTransactionId = result.transactionId - paymentClient.refund( - orderUuid, - payInTransactionId, - 101, - None, - currency, - "change my mind", - initializedByClient = true - ) complete () match { + paymentClient + .refund( + orderUuid, + payInTransactionId, + 101, + None, + currency, + "change my mind", + initializedByClient = true + ) + .complete() match { case Success(r) => assert(r.transactionId.isEmpty) assert(r.error.getOrElse("") == "IllegalTransactionAmount") - paymentClient.refund( - orderUuid, - payInTransactionId, - 50, - None, - currency, - "change my mind", - initializedByClient = true - ) complete () match { + paymentClient + .refund( + orderUuid, + payInTransactionId, + 50, + None, + currency, + "change my mind", + initializedByClient = true + ) + .complete() match { case Success(s) => assert(s.transactionId.isDefined) assert(s.error.isEmpty) @@ -1150,16 +1168,18 @@ class PaymentHandlerSpec } case other => fail(other.toString) } - paymentClient.transfer( - Some(orderUuid), - computeExternalUuidWithProfile(sellerUuid, Some("seller")), - computeExternalUuidWithProfile(vendorUuid, Some("vendor")), - 50, - 10, - currency, - payOutRequired = true, - None - ) complete () match { + paymentClient + .transfer( + Some(orderUuid), + computeExternalUuidWithProfile(sellerUuid, Some("seller")), + computeExternalUuidWithProfile(vendorUuid, Some("vendor")), + 50, + 10, + currency, + payOutRequired = true, + None + ) + .complete() match { case Success(s) => val paidOutTransactionId = s.paidOutTransactionId assert(paidOutTransactionId.isDefined) @@ -1188,14 +1208,16 @@ class PaymentHandlerSpec } "direct debit" in { - paymentClient.directDebit( - computeExternalUuidWithProfile(vendorUuid, Some("vendor")), - 100, - 0, - currency, - "Direct Debit", - None - ) complete () match { + paymentClient + .directDebit( + computeExternalUuidWithProfile(vendorUuid, Some("vendor")), + 100, + 0, + currency, + "Direct Debit", + None + ) + .complete() match { case Success(s) => assert(s.transactionId.isDefined) assert(s.error.isEmpty) diff --git a/testkit/src/test/scala/app/softnetwork/payment/service/StripePaymentServiceSpec.scala b/testkit/src/test/scala/app/softnetwork/payment/service/StripePaymentServiceSpec.scala index 0fa2113..85023b8 100644 --- a/testkit/src/test/scala/app/softnetwork/payment/service/StripePaymentServiceSpec.scala +++ b/testkit/src/test/scala/app/softnetwork/payment/service/StripePaymentServiceSpec.scala @@ -74,7 +74,7 @@ import org.openqa.selenium.htmlunit.HtmlUnitDriver import java.net.{InetAddress, URLEncoder} import java.time.LocalDate import scala.util.{Failure, Success, Try} -import collection.JavaConverters._ +import scala.jdk.CollectionConverters._ trait StripePaymentServiceSpec[SD <: SessionData with SessionDataDecorator[SD]] extends AnyWordSpecLike @@ -560,25 +560,29 @@ trait StripePaymentServiceSpec[SD <: SessionData with SessionDataDecorator[SD]] } "pay out with 3ds card" in { - paymentClient.payOut( - orderUuid, - computeExternalUuidWithProfile(externalUserId, Some("seller")), - debitedAmount, - feesAmount, - currency, - Some("reference"), - payInTransactionId - ) complete () match { + paymentClient + .payOut( + orderUuid, + computeExternalUuidWithProfile(externalUserId, Some("seller")), + debitedAmount, + feesAmount, + currency, + Some("reference"), + payInTransactionId + ) + .complete() match { case Success(result) => log.info(serialization.write(result)) assert(result.transactionId.isDefined) assert(result.error.isEmpty || result.error.exists(_.isEmpty)) assert(result.transactionStatus.isTransactionSucceeded) payOutTransactionId = result.transactionId - paymentClient.loadPayOutTransaction( - orderUuid, - result.transactionId.get - ) complete () match { + paymentClient + .loadPayOutTransaction( + orderUuid, + result.transactionId.get + ) + .complete() match { case Success(result) => log.info(serialization.write(result)) assert(result.transactionId.getOrElse("") == payOutTransactionId.getOrElse("unknown")) @@ -683,19 +687,21 @@ trait StripePaymentServiceSpec[SD <: SessionData with SessionDataDecorator[SD]] } "pay in with pre authorized card" in { - paymentClient.payInWithPreAuthorization( - preAuthorizationId, - computeExternalUuidWithProfile(externalUserId, Some("seller")), - None, - Some(feesAmount) - ) complete () match { + paymentClient + .payInWithPreAuthorization( + preAuthorizationId, + computeExternalUuidWithProfile(externalUserId, Some("seller")), + None, + Some(feesAmount) + ) + .complete() match { case Success(result) => log.info(serialization.write(result)) assert(result.transactionId.isDefined) assert(result.error.isEmpty) assert(result.transactionStatus.isTransactionSucceeded) payInTransactionId = result.transactionId - paymentClient.loadPayInTransaction(orderUuid, payInTransactionId.get) complete () match { + paymentClient.loadPayInTransaction(orderUuid, payInTransactionId.get).complete() match { case Success(result) => log.info(serialization.write(result)) assert(result.transactionId.getOrElse("") == payInTransactionId.getOrElse("unknown")) @@ -708,25 +714,29 @@ trait StripePaymentServiceSpec[SD <: SessionData with SessionDataDecorator[SD]] } "pay out with pre authorized card" in { - paymentClient.payOut( - orderUuid, - computeExternalUuidWithProfile(externalUserId, Some("seller")), - debitedAmount, - feesAmount, - currency, - Some("reference"), - payInTransactionId - ) complete () match { + paymentClient + .payOut( + orderUuid, + computeExternalUuidWithProfile(externalUserId, Some("seller")), + debitedAmount, + feesAmount, + currency, + Some("reference"), + payInTransactionId + ) + .complete() match { case Success(result) => log.info(serialization.write(result)) assert(result.transactionId.isDefined) assert(result.error.isEmpty) assert(result.transactionStatus.isTransactionSucceeded) payOutTransactionId = result.transactionId - paymentClient.loadPayOutTransaction( - orderUuid, - result.transactionId.get - ) complete () match { + paymentClient + .loadPayOutTransaction( + orderUuid, + result.transactionId.get + ) + .complete() match { case Success(result) => log.info(serialization.write(result)) assert(result.transactionId.getOrElse("") == payOutTransactionId.getOrElse("unknown")) @@ -761,7 +771,7 @@ trait StripePaymentServiceSpec[SD <: SessionData with SessionDataDecorator[SD]] status shouldEqual StatusCodes.OK val result = responseAs[PaidIn] payInTransactionId = result.transactionId - paymentClient.loadPayInTransaction(orderUuid, payInTransactionId.get) complete () match { + paymentClient.loadPayInTransaction(orderUuid, payInTransactionId.get).complete() match { case Success(result) => log.info(serialization.write(result)) assert(result.transactionId.getOrElse("") == payInTransactionId.getOrElse("unknown")) @@ -783,25 +793,29 @@ trait StripePaymentServiceSpec[SD <: SessionData with SessionDataDecorator[SD]] } "pay out with pre registered card" in { - paymentClient.payOut( - orderUuid, - computeExternalUuidWithProfile(externalUserId, Some("seller")), - debitedAmount, - feesAmount, - currency, - Some("reference"), - payInTransactionId - ) complete () match { + paymentClient + .payOut( + orderUuid, + computeExternalUuidWithProfile(externalUserId, Some("seller")), + debitedAmount, + feesAmount, + currency, + Some("reference"), + payInTransactionId + ) + .complete() match { case Success(result) => log.info(serialization.write(result)) assert(result.transactionId.isDefined) assert(result.error.isEmpty) assert(result.transactionStatus.isTransactionSucceeded) payOutTransactionId = result.transactionId - paymentClient.loadPayOutTransaction( - orderUuid, - result.transactionId.get - ) complete () match { + paymentClient + .loadPayOutTransaction( + orderUuid, + result.transactionId.get + ) + .complete() match { case Success(result) => log.info(serialization.write(result)) assert(result.transactionId.getOrElse("") == payOutTransactionId.getOrElse("unknown")) @@ -837,7 +851,7 @@ trait StripePaymentServiceSpec[SD <: SessionData with SessionDataDecorator[SD]] status shouldEqual StatusCodes.OK val result = responseAs[PaidIn] payInTransactionId = result.transactionId - paymentClient.loadPayInTransaction(orderUuid, payInTransactionId.get) complete () match { + paymentClient.loadPayInTransaction(orderUuid, payInTransactionId.get).complete() match { case Success(result) => log.info(serialization.write(result)) assert(result.transactionId.getOrElse("") == payInTransactionId.getOrElse("unknown")) @@ -859,25 +873,29 @@ trait StripePaymentServiceSpec[SD <: SessionData with SessionDataDecorator[SD]] } "pay out with registered card" in { - paymentClient.payOut( - orderUuid, - computeExternalUuidWithProfile(externalUserId, Some("seller")), - debitedAmount, - feesAmount, - currency, - Some("reference"), - payInTransactionId - ) complete () match { + paymentClient + .payOut( + orderUuid, + computeExternalUuidWithProfile(externalUserId, Some("seller")), + debitedAmount, + feesAmount, + currency, + Some("reference"), + payInTransactionId + ) + .complete() match { case Success(result) => log.info(serialization.write(result)) assert(result.transactionId.isDefined) assert(result.error.isEmpty) assert(result.transactionStatus.isTransactionSucceeded) payOutTransactionId = result.transactionId - paymentClient.loadPayOutTransaction( - orderUuid, - result.transactionId.get - ) complete () match { + paymentClient + .loadPayOutTransaction( + orderUuid, + result.transactionId.get + ) + .complete() match { case Success(result) => log.info(serialization.write(result)) assert(result.transactionId.getOrElse("") == payOutTransactionId.getOrElse("unknown")) @@ -1012,7 +1030,7 @@ trait StripePaymentServiceSpec[SD <: SessionData with SessionDataDecorator[SD]] currency, Some("reference"), payInTransactionId - ) complete () match { + ).complete() match { case Success(result) => log.info(serialization.write(result)) assert(result.transactionId.isDefined) @@ -1022,7 +1040,7 @@ trait StripePaymentServiceSpec[SD <: SessionData with SessionDataDecorator[SD]] paymentClient.loadPayOutTransaction( orderUuid, result.transactionId.get - ) complete () match { + ).complete() match { case Success(result) => log.info(serialization.write(result)) assert(result.transactionId.getOrElse("") == payOutTransactionId.getOrElse("unknown")) @@ -1189,25 +1207,29 @@ trait StripePaymentServiceSpec[SD <: SessionData with SessionDataDecorator[SD]] } "pay out without pre registered card" in { - paymentClient.payOut( - orderUuid, - computeExternalUuidWithProfile(externalUserId, Some("seller")), - debitedAmount, - feesAmount, - currency, - Some("reference"), - payInTransactionId - ) complete () match { + paymentClient + .payOut( + orderUuid, + computeExternalUuidWithProfile(externalUserId, Some("seller")), + debitedAmount, + feesAmount, + currency, + Some("reference"), + payInTransactionId + ) + .complete() match { case Success(result) => log.info(serialization.write(result)) assert(result.transactionId.isDefined) assert(result.error.isEmpty) assert(result.transactionStatus.isTransactionSucceeded) payOutTransactionId = result.transactionId - paymentClient.loadPayOutTransaction( - orderUuid, - result.transactionId.get - ) complete () match { + paymentClient + .loadPayOutTransaction( + orderUuid, + result.transactionId.get + ) + .complete() match { case Success(result) => log.info(serialization.write(result)) assert(result.transactionId.getOrElse("") == payOutTransactionId.getOrElse("unknown")) @@ -1220,15 +1242,17 @@ trait StripePaymentServiceSpec[SD <: SessionData with SessionDataDecorator[SD]] } "refund pay in and reverse transfer" in { - paymentClient.refund( - orderUuid, - payOutTransactionId, - debitedAmount, - Some(feesAmount), - currency, - "reason message", - initializedByClient = false - ) complete () match { + paymentClient + .refund( + orderUuid, + payOutTransactionId, + debitedAmount, + Some(feesAmount), + currency, + "reason message", + initializedByClient = false + ) + .complete() match { case Success(result) => log.info(serialization.write(result)) assert(result.transactionId.isDefined)