From 75a56fd3cc1384190b94d396b77bd6cab41cb77b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Mar 2026 13:14:37 +0000 Subject: [PATCH 1/3] Initial plan From ef1e3b99e77e7d98ea900417ae0a095be653363e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Mar 2026 13:42:07 +0000 Subject: [PATCH 2/3] Migrate surf-transaction to microservice architecture with RabbitMQ Co-authored-by: twisti-dev <76837088+twisti-dev@users.noreply.github.com> Agent-Logs-Url: https://github.com/SLNE-Development/surf-transaction/sessions/76a093c8-452c-41a7-b164-eaa167e15e4b --- build.gradle.kts | 1 + settings.gradle.kts | 13 +- .../api/surf-transaction-api.api | 15 + .../member/results/AccountMemberResult.kt | 3 + .../account/result/AccountCreationResult.kt | 2 + .../api/account/result/AccountDeleteResult.kt | 3 + surf-transaction-core/build.gradle.kts | 13 +- .../core/user/TransactionUserServiceImpl.kt | 19 -- .../build.gradle.kts | 19 ++ .../account/AccountServiceClientImpl.kt | 90 ++++++ .../currency/CurrencyServiceClientImpl.kt | 56 ++++ .../TransactionServiceClientImpl.kt | 111 +++++++ .../client/user/TransactionUserServiceImpl.kt | 11 + .../build.gradle.kts | 25 ++ .../transaction/core/TransactionInstance.kt | 12 +- .../core/account/AccountAccessImpl.kt | 12 +- .../transaction/core/account/AccountImpl.kt | 0 .../core/account/CoreAccountService.kt | 24 ++ .../member/AccountMemberOperationsImpl.kt | 8 +- .../transaction/core/component/Components.kt | 0 .../core/currency/CoreCurrencyService.kt | 18 ++ .../core/currency/CurrencyCreateResult.kt | 5 +- .../core/currency/CurrencyDefaultResult.kt | 5 +- .../core/currency/CurrencyEventsListener.kt | 6 +- .../transaction/core/currency/CurrencyImpl.kt | 0 .../account/AddMemberToAccountPackets.kt | 17 ++ .../CompleteAccountNameSuggestionsPackets.kt | 12 + .../rabbit/account/CreateAccountPackets.kt | 18 ++ .../rabbit/account/DeleteAccountPackets.kt | 14 + .../account/GetAccountByAccountIdPackets.kt | 15 + .../rabbit/account/GetAccountByNamePackets.kt | 12 + .../account/GetAllAccountsByOwnerPackets.kt | 14 + .../account/GetDefaultAccountPackets.kt | 14 + .../account/RemoveMemberFromAccountPackets.kt | 17 ++ .../rabbit/currency/CreateCurrencyPackets.kt | 14 + .../currency/GetAllCurrenciesPackets.kt | 15 + .../currency/MakeDefaultCurrencyPackets.kt | 13 + .../core/rabbit/transaction/BalancePackets.kt | 16 + .../core/rabbit/transaction/DepositPackets.kt | 23 ++ .../transaction/TransactionResultPacket.kt | 25 ++ .../rabbit/transaction/TransferPackets.kt | 24 ++ .../rabbit/transaction/WithdrawPackets.kt | 21 ++ .../transaction/core/redis/RedisService.kt | 12 +- .../currency/ChangedDefaultCurrencyEvent.kt | 0 .../events/currency/CurrencyCreatedEvent.kt | 0 .../serializer/NetworkCurrencySerializer.kt | 0 .../transaction/CoreTransactionService.kt | 50 ++++ .../core/transaction/TransactionImpl.kt | 16 +- .../core/transactional/TransactionalImpl.kt | 12 +- .../core/user/TransactionUserImpl.kt | 0 .../build.gradle.kts | 20 ++ .../surf/transaction/core/db/CreateTables.kt | 0 .../core/db/account/AccountMemberTable.kt | 0 .../core/db/account/AccountRepository.kt | 0 .../core/db/account/AccountRepositoryImpl.kt | 0 .../core/db/account/AccountTable.kt | 0 .../core/db/currency/CurrencyRepository.kt | 0 .../db/currency/CurrencyRepositoryImpl.kt | 0 .../core/db/currency/CurrencyTable.kt | 0 .../db/transaction/TransactionDataTable.kt | 0 .../db/transaction/TransactionRepository.kt | 0 .../transaction/TransactionRepositoryImpl.kt | 0 .../core/db/transaction/TransactionTable.kt | 0 .../microservice/TransactionMicroservice.kt | 22 ++ .../TransactionMicroserviceInstance.kt | 28 ++ .../account/AccountServiceImpl.kt | 76 ++--- .../currency/CurrencyServiceImpl.kt | 28 +- .../rabbit/TransactionRabbitHandler.kt | 273 ++++++++++++++++++ .../redis/MicroserviceRedisService.kt | 18 ++ .../transaction/TransactionServiceImpl.kt | 19 +- surf-transaction-paper/build.gradle.kts | 10 +- .../account/arguments/AccountArgument.kt | 4 +- .../subcommands/CurrencyCreateCommand.kt | 4 +- .../subcommands/CurrencyMakeDefaultCommand.kt | 4 +- surf-transaction-velocity/build.gradle.kts | 10 +- 75 files changed, 1210 insertions(+), 151 deletions(-) delete mode 100644 surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/user/TransactionUserServiceImpl.kt create mode 100644 surf-transaction-core/surf-transaction-core-client/build.gradle.kts create mode 100644 surf-transaction-core/surf-transaction-core-client/src/main/kotlin/dev/slne/surf/transaction/core/client/account/AccountServiceClientImpl.kt create mode 100644 surf-transaction-core/surf-transaction-core-client/src/main/kotlin/dev/slne/surf/transaction/core/client/currency/CurrencyServiceClientImpl.kt create mode 100644 surf-transaction-core/surf-transaction-core-client/src/main/kotlin/dev/slne/surf/transaction/core/client/transaction/TransactionServiceClientImpl.kt create mode 100644 surf-transaction-core/surf-transaction-core-client/src/main/kotlin/dev/slne/surf/transaction/core/client/user/TransactionUserServiceImpl.kt create mode 100644 surf-transaction-core/surf-transaction-core-common/build.gradle.kts rename surf-transaction-core/{ => surf-transaction-core-common}/src/main/kotlin/dev/slne/surf/transaction/core/TransactionInstance.kt (68%) rename surf-transaction-core/{ => surf-transaction-core-common}/src/main/kotlin/dev/slne/surf/transaction/core/account/AccountAccessImpl.kt (71%) rename surf-transaction-core/{ => surf-transaction-core-common}/src/main/kotlin/dev/slne/surf/transaction/core/account/AccountImpl.kt (100%) create mode 100644 surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/account/CoreAccountService.kt rename surf-transaction-core/{ => surf-transaction-core-common}/src/main/kotlin/dev/slne/surf/transaction/core/account/member/AccountMemberOperationsImpl.kt (86%) rename surf-transaction-core/{ => surf-transaction-core-common}/src/main/kotlin/dev/slne/surf/transaction/core/component/Components.kt (100%) create mode 100644 surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/currency/CoreCurrencyService.kt rename surf-transaction-core/{ => surf-transaction-core-common}/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyCreateResult.kt (75%) rename surf-transaction-core/{ => surf-transaction-core-common}/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyDefaultResult.kt (65%) rename surf-transaction-core/{ => surf-transaction-core-common}/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyEventsListener.kt (78%) rename surf-transaction-core/{ => surf-transaction-core-common}/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyImpl.kt (100%) create mode 100644 surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/AddMemberToAccountPackets.kt create mode 100644 surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/CompleteAccountNameSuggestionsPackets.kt create mode 100644 surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/CreateAccountPackets.kt create mode 100644 surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/DeleteAccountPackets.kt create mode 100644 surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/GetAccountByAccountIdPackets.kt create mode 100644 surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/GetAccountByNamePackets.kt create mode 100644 surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/GetAllAccountsByOwnerPackets.kt create mode 100644 surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/GetDefaultAccountPackets.kt create mode 100644 surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/RemoveMemberFromAccountPackets.kt create mode 100644 surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/currency/CreateCurrencyPackets.kt create mode 100644 surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/currency/GetAllCurrenciesPackets.kt create mode 100644 surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/currency/MakeDefaultCurrencyPackets.kt create mode 100644 surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/BalancePackets.kt create mode 100644 surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/DepositPackets.kt create mode 100644 surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/TransactionResultPacket.kt create mode 100644 surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/TransferPackets.kt create mode 100644 surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/WithdrawPackets.kt rename surf-transaction-core/{ => surf-transaction-core-common}/src/main/kotlin/dev/slne/surf/transaction/core/redis/RedisService.kt (75%) rename surf-transaction-core/{ => surf-transaction-core-common}/src/main/kotlin/dev/slne/surf/transaction/core/redis/events/currency/ChangedDefaultCurrencyEvent.kt (100%) rename surf-transaction-core/{ => surf-transaction-core-common}/src/main/kotlin/dev/slne/surf/transaction/core/redis/events/currency/CurrencyCreatedEvent.kt (100%) rename surf-transaction-core/{ => surf-transaction-core-common}/src/main/kotlin/dev/slne/surf/transaction/core/redis/serializer/NetworkCurrencySerializer.kt (100%) create mode 100644 surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/transaction/CoreTransactionService.kt rename surf-transaction-core/{ => surf-transaction-core-common}/src/main/kotlin/dev/slne/surf/transaction/core/transaction/TransactionImpl.kt (70%) rename surf-transaction-core/{ => surf-transaction-core-common}/src/main/kotlin/dev/slne/surf/transaction/core/transactional/TransactionalImpl.kt (87%) rename surf-transaction-core/{ => surf-transaction-core-common}/src/main/kotlin/dev/slne/surf/transaction/core/user/TransactionUserImpl.kt (100%) create mode 100644 surf-transaction-microservice/build.gradle.kts rename {surf-transaction-core => surf-transaction-microservice}/src/main/kotlin/dev/slne/surf/transaction/core/db/CreateTables.kt (100%) rename {surf-transaction-core => surf-transaction-microservice}/src/main/kotlin/dev/slne/surf/transaction/core/db/account/AccountMemberTable.kt (100%) rename {surf-transaction-core => surf-transaction-microservice}/src/main/kotlin/dev/slne/surf/transaction/core/db/account/AccountRepository.kt (100%) rename {surf-transaction-core => surf-transaction-microservice}/src/main/kotlin/dev/slne/surf/transaction/core/db/account/AccountRepositoryImpl.kt (100%) rename {surf-transaction-core => surf-transaction-microservice}/src/main/kotlin/dev/slne/surf/transaction/core/db/account/AccountTable.kt (100%) rename {surf-transaction-core => surf-transaction-microservice}/src/main/kotlin/dev/slne/surf/transaction/core/db/currency/CurrencyRepository.kt (100%) rename {surf-transaction-core => surf-transaction-microservice}/src/main/kotlin/dev/slne/surf/transaction/core/db/currency/CurrencyRepositoryImpl.kt (100%) rename {surf-transaction-core => surf-transaction-microservice}/src/main/kotlin/dev/slne/surf/transaction/core/db/currency/CurrencyTable.kt (100%) rename {surf-transaction-core => surf-transaction-microservice}/src/main/kotlin/dev/slne/surf/transaction/core/db/transaction/TransactionDataTable.kt (100%) rename {surf-transaction-core => surf-transaction-microservice}/src/main/kotlin/dev/slne/surf/transaction/core/db/transaction/TransactionRepository.kt (100%) rename {surf-transaction-core => surf-transaction-microservice}/src/main/kotlin/dev/slne/surf/transaction/core/db/transaction/TransactionRepositoryImpl.kt (100%) rename {surf-transaction-core => surf-transaction-microservice}/src/main/kotlin/dev/slne/surf/transaction/core/db/transaction/TransactionTable.kt (100%) create mode 100644 surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/TransactionMicroservice.kt create mode 100644 surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/TransactionMicroserviceInstance.kt rename {surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core => surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice}/account/AccountServiceImpl.kt (59%) rename {surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core => surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice}/currency/CurrencyServiceImpl.kt (75%) create mode 100644 surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/rabbit/TransactionRabbitHandler.kt create mode 100644 surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/redis/MicroserviceRedisService.kt rename {surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core => surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice}/transaction/TransactionServiceImpl.kt (88%) diff --git a/build.gradle.kts b/build.gradle.kts index ee0fde5..fa1b03e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -7,6 +7,7 @@ buildscript { } dependencies { classpath("dev.slne.surf:surf-api-gradle-plugin:1.21.11+") + classpath("dev.slne.surf.microservice:surf-microservice-gradle-plugin:1.21.11+") } } diff --git a/settings.gradle.kts b/settings.gradle.kts index c56356b..ff4109c 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,10 +1,21 @@ -rootProject.name = "surf-transaction" +pluginManagement { + repositories { + gradlePluginPortal() + maven("https://repo.slne.dev/repository/maven-public/") { name = "maven-public" } + } +} plugins { id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" + id("dev.slne.surf.surfapi.gradle.settings") version "1.21.11+" } +rootProject.name = "surf-transaction" + include("surf-transaction-api") include("surf-transaction-core") +include("surf-transaction-core:surf-transaction-core-common") +include("surf-transaction-core:surf-transaction-core-client") +include("surf-transaction-microservice") include("surf-transaction-paper") include("surf-transaction-velocity") diff --git a/surf-transaction-api/api/surf-transaction-api.api b/surf-transaction-api/api/surf-transaction-api.api index d21d384..51ad819 100644 --- a/surf-transaction-api/api/surf-transaction-api.api +++ b/surf-transaction-api/api/surf-transaction-api.api @@ -41,11 +41,16 @@ public final class dev/slne/surf/transaction/api/account/member/results/AccountM public static final field ACCOUNT_NOT_FOUND Ldev/slne/surf/transaction/api/account/member/results/AccountMemberResult; public static final field NOTHING_CHANGED Ldev/slne/surf/transaction/api/account/member/results/AccountMemberResult; public static final field SUCCESS Ldev/slne/surf/transaction/api/account/member/results/AccountMemberResult; + public static final field Companion Ldev/slne/surf/transaction/api/account/member/results/AccountMemberResult$Companion; public static fun getEntries ()Lkotlin/enums/EnumEntries; public static fun valueOf (Ljava/lang/String;)Ldev/slne/surf/transaction/api/account/member/results/AccountMemberResult; public static fun values ()[Ldev/slne/surf/transaction/api/account/member/results/AccountMemberResult; } +public final class dev/slne/surf/transaction/api/account/member/results/AccountMemberResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public abstract interface class dev/slne/surf/transaction/api/account/result/AccountCreationResult { } @@ -65,11 +70,16 @@ public final class dev/slne/surf/transaction/api/account/result/AccountCreationR public static final field NAME_IS_UUID Ldev/slne/surf/transaction/api/account/result/AccountCreationResult$FailureReason; public static final field NAME_TOO_LONG Ldev/slne/surf/transaction/api/account/result/AccountCreationResult$FailureReason; public static final field NAME_TOO_SHORT Ldev/slne/surf/transaction/api/account/result/AccountCreationResult$FailureReason; + public static final field Companion Ldev/slne/surf/transaction/api/account/result/AccountCreationResult$FailureReason$Companion; public static fun getEntries ()Lkotlin/enums/EnumEntries; public static fun valueOf (Ljava/lang/String;)Ldev/slne/surf/transaction/api/account/result/AccountCreationResult$FailureReason; public static fun values ()[Ldev/slne/surf/transaction/api/account/result/AccountCreationResult$FailureReason; } +public final class dev/slne/surf/transaction/api/account/result/AccountCreationResult$FailureReason$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public final class dev/slne/surf/transaction/api/account/result/AccountCreationResult$Success : dev/slne/surf/transaction/api/account/result/AccountCreationResult { public fun (Ldev/slne/surf/transaction/api/account/Account;)V public final fun component1 ()Ldev/slne/surf/transaction/api/account/Account; @@ -85,11 +95,16 @@ public final class dev/slne/surf/transaction/api/account/result/AccountDeleteRes public static final field ACCOUNT_NOT_FOUND Ldev/slne/surf/transaction/api/account/result/AccountDeleteResult; public static final field DEFAULT_ACCOUNT_CANNOT_BE_DELETED Ldev/slne/surf/transaction/api/account/result/AccountDeleteResult; public static final field SUCCESS Ldev/slne/surf/transaction/api/account/result/AccountDeleteResult; + public static final field Companion Ldev/slne/surf/transaction/api/account/result/AccountDeleteResult$Companion; public static fun getEntries ()Lkotlin/enums/EnumEntries; public static fun valueOf (Ljava/lang/String;)Ldev/slne/surf/transaction/api/account/result/AccountDeleteResult; public static fun values ()[Ldev/slne/surf/transaction/api/account/result/AccountDeleteResult; } +public final class dev/slne/surf/transaction/api/account/result/AccountDeleteResult$Companion { + public final fun serializer ()Lkotlinx/serialization/KSerializer; +} + public abstract interface class dev/slne/surf/transaction/api/currency/Currency : net/kyori/adventure/text/ComponentLike { public static final field CURRENCY_NAME_MAX_LENGTH I public static final field CURRENCY_SYMBOL_MAX_LENGTH I diff --git a/surf-transaction-api/src/main/kotlin/dev/slne/surf/transaction/api/account/member/results/AccountMemberResult.kt b/surf-transaction-api/src/main/kotlin/dev/slne/surf/transaction/api/account/member/results/AccountMemberResult.kt index 47d0e7e..0bd17ac 100644 --- a/surf-transaction-api/src/main/kotlin/dev/slne/surf/transaction/api/account/member/results/AccountMemberResult.kt +++ b/surf-transaction-api/src/main/kotlin/dev/slne/surf/transaction/api/account/member/results/AccountMemberResult.kt @@ -1,10 +1,13 @@ package dev.slne.surf.transaction.api.account.member.results +import kotlinx.serialization.Serializable + /** * Represents the result of an account member modification operation. * * This result is returned when adding or removing members from an account. */ +@Serializable enum class AccountMemberResult { /** diff --git a/surf-transaction-api/src/main/kotlin/dev/slne/surf/transaction/api/account/result/AccountCreationResult.kt b/surf-transaction-api/src/main/kotlin/dev/slne/surf/transaction/api/account/result/AccountCreationResult.kt index 4af8cc0..132609b 100644 --- a/surf-transaction-api/src/main/kotlin/dev/slne/surf/transaction/api/account/result/AccountCreationResult.kt +++ b/surf-transaction-api/src/main/kotlin/dev/slne/surf/transaction/api/account/result/AccountCreationResult.kt @@ -1,5 +1,6 @@ package dev.slne.surf.transaction.api.account.result +import kotlinx.serialization.Serializable import dev.slne.surf.transaction.api.account.Account /** @@ -27,6 +28,7 @@ sealed interface AccountCreationResult { /** * Describes possible reasons why account creation may fail. */ + @Serializable enum class FailureReason { /** * An account with the given name already exists. diff --git a/surf-transaction-api/src/main/kotlin/dev/slne/surf/transaction/api/account/result/AccountDeleteResult.kt b/surf-transaction-api/src/main/kotlin/dev/slne/surf/transaction/api/account/result/AccountDeleteResult.kt index c156039..604adab 100644 --- a/surf-transaction-api/src/main/kotlin/dev/slne/surf/transaction/api/account/result/AccountDeleteResult.kt +++ b/surf-transaction-api/src/main/kotlin/dev/slne/surf/transaction/api/account/result/AccountDeleteResult.kt @@ -1,8 +1,11 @@ package dev.slne.surf.transaction.api.account.result +import kotlinx.serialization.Serializable + /** * Represents the result of an account deletion attempt. */ +@Serializable enum class AccountDeleteResult { /** diff --git a/surf-transaction-core/build.gradle.kts b/surf-transaction-core/build.gradle.kts index 44de5dc..5b9cbbc 100644 --- a/surf-transaction-core/build.gradle.kts +++ b/surf-transaction-core/build.gradle.kts @@ -1,12 +1 @@ -plugins { - id("dev.slne.surf.surfapi.gradle.core") -} - -surfCoreApi { - withSurfDatabaseR2dbc("1.3.0", "dev.slne.surf.transaction.libs.db") - withSurfRedis() -} - -dependencies { - api(project(":surf-transaction-api")) -} \ No newline at end of file +// Container module – no source code, sub-modules carry all implementation diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/user/TransactionUserServiceImpl.kt b/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/user/TransactionUserServiceImpl.kt deleted file mode 100644 index 73a82bc..0000000 --- a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/user/TransactionUserServiceImpl.kt +++ /dev/null @@ -1,19 +0,0 @@ -package dev.slne.surf.transaction.core.user - -import com.google.auto.service.AutoService -import dev.slne.surf.transaction.api.user.TransactionUserService -import java.util.* - -@AutoService(TransactionUserService::class) -class TransactionUserServiceImpl : TransactionUserService { - /* Currently not worth caching - private val cache = Caffeine.newBuilder() - .maximumSize(10_000) - .expireAfterAccess(10, TimeUnit.MINUTES) - .build { uuid -> - TransactionUserImpl(uuid) - } - */ - - override fun byUuid(uuid: UUID) = TransactionUserImpl(uuid) -} \ No newline at end of file diff --git a/surf-transaction-core/surf-transaction-core-client/build.gradle.kts b/surf-transaction-core/surf-transaction-core-client/build.gradle.kts new file mode 100644 index 0000000..ede58c5 --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-client/build.gradle.kts @@ -0,0 +1,19 @@ +import dev.slne.surf.microservice.gradle.plugin.rabbit.RabbitModule + +plugins { + id("dev.slne.surf.surfapi.gradle.core") + id("dev.slne.surf.microservice") +} + +surfMicroservice { + withRabbitModule(RabbitModule.CLIENT_API) +} + +surfCoreApi { + withSurfRedis() +} + +dependencies { + api(project(":surf-transaction-api")) + api(project(":surf-transaction-core:surf-transaction-core-common")) +} diff --git a/surf-transaction-core/surf-transaction-core-client/src/main/kotlin/dev/slne/surf/transaction/core/client/account/AccountServiceClientImpl.kt b/surf-transaction-core/surf-transaction-core-client/src/main/kotlin/dev/slne/surf/transaction/core/client/account/AccountServiceClientImpl.kt new file mode 100644 index 0000000..54ba035 --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-client/src/main/kotlin/dev/slne/surf/transaction/core/client/account/AccountServiceClientImpl.kt @@ -0,0 +1,90 @@ +package dev.slne.surf.transaction.core.client.account + +import com.google.auto.service.AutoService +import dev.slne.surf.microservice.api.rabbit.client.ClientRabbitMQApi +import dev.slne.surf.surfapi.core.api.util.requiredService +import dev.slne.surf.transaction.api.account.Account +import dev.slne.surf.transaction.api.account.AccountService +import dev.slne.surf.transaction.api.account.member.results.AccountMemberResult +import dev.slne.surf.transaction.api.account.result.AccountCreationResult +import dev.slne.surf.transaction.api.account.result.AccountDeleteResult +import dev.slne.surf.transaction.core.account.CoreAccountService +import dev.slne.surf.transaction.core.rabbit.account.AddMemberToAccountRequest +import dev.slne.surf.transaction.core.rabbit.account.CompleteAccountNameSuggestionsRequest +import dev.slne.surf.transaction.core.rabbit.account.CreateAccountRequest +import dev.slne.surf.transaction.core.rabbit.account.DeleteAccountRequest +import dev.slne.surf.transaction.core.rabbit.account.GetAccountByAccountIdRequest +import dev.slne.surf.transaction.core.rabbit.account.GetAccountByNameRequest +import dev.slne.surf.transaction.core.rabbit.account.GetAllAccountsByOwnerRequest +import dev.slne.surf.transaction.core.rabbit.account.GetDefaultAccountRequest +import dev.slne.surf.transaction.core.rabbit.account.RemoveMemberFromAccountRequest +import java.util.UUID + +@AutoService(AccountService::class) +class AccountServiceClientImpl : CoreAccountService { + private val rabbitApi get() = requiredService() + + override suspend fun getAccountByAccountId(accountId: UUID): Account? { + val response = rabbitApi.sendRequest(GetAccountByAccountIdRequest(accountId)) + return response.account + } + + override suspend fun getAccountByName(accountName: String): Account? { + val response = rabbitApi.sendRequest(GetAccountByNameRequest(accountName.lowercase())) + return response.account + } + + override suspend fun createAccount(ownerUuid: UUID, name: String): AccountCreationResult { + val response = rabbitApi.sendRequest(CreateAccountRequest(ownerUuid, name)) + return if (response.account != null) { + AccountCreationResult.Success(response.account) + } else { + AccountCreationResult.Failed( + response.failureReason ?: AccountCreationResult.FailureReason.NAME_ALREADY_EXISTS + ) + } + } + + override suspend fun getAllAccountsByOwner(ownerUuid: UUID): Set { + val response = rabbitApi.sendRequest(GetAllAccountsByOwnerRequest(ownerUuid)) + return response.accounts.toSet() + } + + override suspend fun getDefaultAccount(playerUuid: UUID): Account { + val response = rabbitApi.sendRequest(GetDefaultAccountRequest(playerUuid)) + return response.account + } + + override suspend fun deleteAccount(account: Account): AccountDeleteResult { + val response = rabbitApi.sendRequest(DeleteAccountRequest(account.accountId)) + return response.result + } + + override suspend fun addMemberToAccount( + accountId: UUID, + executor: UUID, + target: UUID + ): AccountMemberResult { + val response = rabbitApi.sendRequest(AddMemberToAccountRequest(accountId, executor, target)) + return response.result + } + + override suspend fun removeMemberFromAccount( + accountId: UUID, + executor: UUID, + target: UUID + ): AccountMemberResult { + val response = + rabbitApi.sendRequest(RemoveMemberFromAccountRequest(accountId, executor, target)) + return response.result + } + + override suspend fun completeAccountNameSuggestions( + input: String, + maxSuggestions: Int + ): List { + val response = + rabbitApi.sendRequest(CompleteAccountNameSuggestionsRequest(input, maxSuggestions)) + return response.suggestions + } +} diff --git a/surf-transaction-core/surf-transaction-core-client/src/main/kotlin/dev/slne/surf/transaction/core/client/currency/CurrencyServiceClientImpl.kt b/surf-transaction-core/surf-transaction-core-client/src/main/kotlin/dev/slne/surf/transaction/core/client/currency/CurrencyServiceClientImpl.kt new file mode 100644 index 0000000..2345d4c --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-client/src/main/kotlin/dev/slne/surf/transaction/core/client/currency/CurrencyServiceClientImpl.kt @@ -0,0 +1,56 @@ +package dev.slne.surf.transaction.core.client.currency + +import com.google.auto.service.AutoService +import dev.slne.surf.microservice.api.rabbit.client.ClientRabbitMQApi +import dev.slne.surf.surfapi.core.api.util.requiredService +import dev.slne.surf.surfapi.core.api.util.toObjectSet +import dev.slne.surf.transaction.api.currency.CurrencyService +import dev.slne.surf.transaction.core.currency.CoreCurrencyService +import dev.slne.surf.transaction.core.currency.CurrencyCreateResult +import dev.slne.surf.transaction.core.currency.CurrencyDefaultResult +import dev.slne.surf.transaction.core.currency.CurrencyImpl +import dev.slne.surf.transaction.core.rabbit.currency.CreateCurrencyRequest +import dev.slne.surf.transaction.core.rabbit.currency.GetAllCurrenciesRequest +import dev.slne.surf.transaction.core.rabbit.currency.MakeDefaultCurrencyRequest +import kotlin.properties.Delegates + +@AutoService(CurrencyService::class) +class CurrencyServiceClientImpl : CoreCurrencyService { + override var defaultCurrency: CurrencyImpl by Delegates.notNull() + override var currencies: Set by Delegates.notNull() + + private val rabbitApi get() = requiredService() + + override fun getCurrencyByName(name: String) = + currencies.find { it.name.equals(name, ignoreCase = true) } + + override suspend fun cacheCurrencies() { + val response = rabbitApi.sendRequest(GetAllCurrenciesRequest()) + currencies = response.currencies.toObjectSet() + defaultCurrency = response.currencies.find { it.name == response.defaultCurrencyName } + ?: response.currencies.firstOrNull() + ?: CurrencyImpl.DEFAULT + } + + override fun cacheCurrency(currency: CurrencyImpl) { + currencies = currencies.plus(currency).toObjectSet() + } + + override fun updateDefaultCurrency(newDefaultName: String) { + val newDefaultCurrency = + currencies.find { it.name.equals(newDefaultName, ignoreCase = true) } ?: return + defaultCurrency.defaultCurrency = false + newDefaultCurrency.defaultCurrency = true + defaultCurrency = newDefaultCurrency + } + + override suspend fun createCurrency(currency: CurrencyImpl): CurrencyCreateResult { + val response = rabbitApi.sendRequest(CreateCurrencyRequest(currency)) + return response.result + } + + override suspend fun makeDefaultCurrency(currency: CurrencyImpl): CurrencyDefaultResult { + val response = rabbitApi.sendRequest(MakeDefaultCurrencyRequest(currency.name)) + return response.result + } +} diff --git a/surf-transaction-core/surf-transaction-core-client/src/main/kotlin/dev/slne/surf/transaction/core/client/transaction/TransactionServiceClientImpl.kt b/surf-transaction-core/surf-transaction-core-client/src/main/kotlin/dev/slne/surf/transaction/core/client/transaction/TransactionServiceClientImpl.kt new file mode 100644 index 0000000..e28697f --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-client/src/main/kotlin/dev/slne/surf/transaction/core/client/transaction/TransactionServiceClientImpl.kt @@ -0,0 +1,111 @@ +package dev.slne.surf.transaction.core.client.transaction + +import com.google.auto.service.AutoService +import dev.slne.surf.microservice.api.rabbit.client.ClientRabbitMQApi +import dev.slne.surf.surfapi.core.api.util.requiredService +import dev.slne.surf.transaction.api.account.Account +import dev.slne.surf.transaction.api.currency.Currency +import dev.slne.surf.transaction.api.transaction.TransactionResult +import dev.slne.surf.transaction.api.transaction.TransactionService +import dev.slne.surf.transaction.api.transaction.data.TransactionData +import dev.slne.surf.transaction.core.rabbit.transaction.BalanceRequest +import dev.slne.surf.transaction.core.rabbit.transaction.DepositRequest +import dev.slne.surf.transaction.core.rabbit.transaction.TransactionResultPacket +import dev.slne.surf.transaction.core.rabbit.transaction.TransferRequest +import dev.slne.surf.transaction.core.rabbit.transaction.WithdrawRequest +import dev.slne.surf.transaction.core.transaction.CoreTransactionService +import java.math.BigDecimal +import java.util.UUID + +@AutoService(TransactionService::class) +class TransactionServiceClientImpl : CoreTransactionService { + private val rabbitApi get() = requiredService() + + override suspend fun deposit( + account: Account, + initiator: UUID, + amount: BigDecimal, + currency: Currency, + ignoreMinimum: Boolean, + vararg additionalData: TransactionData + ): TransactionResult { + val response = rabbitApi.sendRequest( + DepositRequest( + accountId = account.accountId, + initiator = initiator, + amount = amount, + currencyName = currency.name, + ignoreMinimum = ignoreMinimum, + additionalData = additionalData.toSet() + ) + ) + return response.result.toTransactionResult() + } + + override suspend fun withdraw( + account: Account, + initiator: UUID, + amount: BigDecimal, + currency: Currency, + ignoreMinimum: Boolean, + vararg additionalData: TransactionData + ): TransactionResult { + val response = rabbitApi.sendRequest( + WithdrawRequest( + accountId = account.accountId, + initiator = initiator, + amount = amount, + currencyName = currency.name, + ignoreMinimum = ignoreMinimum, + additionalData = additionalData.toSet() + ) + ) + return response.result.toTransactionResult() + } + + override suspend fun transfer( + initiator: UUID, + sender: Account, + amount: BigDecimal, + currency: Currency, + receiver: Account, + ignoreSenderMinimum: Boolean, + ignoreReceiverMinimum: Boolean, + additionalSenderData: Set, + additionalReceiverData: Set + ): TransactionResult { + val response = rabbitApi.sendRequest( + TransferRequest( + initiator = initiator, + senderAccountId = sender.accountId, + amount = amount, + currencyName = currency.name, + receiverAccountId = receiver.accountId, + ignoreSenderMinimum = ignoreSenderMinimum, + ignoreReceiverMinimum = ignoreReceiverMinimum, + additionalSenderData = additionalSenderData, + additionalReceiverData = additionalReceiverData + ) + ) + return response.result.toTransactionResult() + } + + override suspend fun balance(account: Account, currency: Currency): BigDecimal { + val response = rabbitApi.sendRequest( + BalanceRequest(accountId = account.accountId, currencyName = currency.name) + ) + return response.balance + } + + private fun TransactionResultPacket.toTransactionResult(): TransactionResult = when (this) { + is TransactionResultPacket.Success -> TransactionResult.Success(transaction) + is TransactionResultPacket.TransferSuccess -> + TransactionResult.TransferSuccess(senderTransaction, receiverTransaction) + TransactionResultPacket.ReceiverInsufficientFunds -> + TransactionResult.ReceiverInsufficientFunds + TransactionResultPacket.SenderInsufficientFunds -> + TransactionResult.SenderInsufficientFunds + is TransactionResultPacket.DatabaseError -> + TransactionResult.DatabaseError(RuntimeException(message)) + } +} diff --git a/surf-transaction-core/surf-transaction-core-client/src/main/kotlin/dev/slne/surf/transaction/core/client/user/TransactionUserServiceImpl.kt b/surf-transaction-core/surf-transaction-core-client/src/main/kotlin/dev/slne/surf/transaction/core/client/user/TransactionUserServiceImpl.kt new file mode 100644 index 0000000..60f8fc5 --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-client/src/main/kotlin/dev/slne/surf/transaction/core/client/user/TransactionUserServiceImpl.kt @@ -0,0 +1,11 @@ +package dev.slne.surf.transaction.core.client.user + +import com.google.auto.service.AutoService +import dev.slne.surf.transaction.api.user.TransactionUserService +import dev.slne.surf.transaction.core.user.TransactionUserImpl +import java.util.UUID + +@AutoService(TransactionUserService::class) +class TransactionUserServiceImpl : TransactionUserService { + override fun byUuid(uuid: UUID) = TransactionUserImpl(uuid) +} diff --git a/surf-transaction-core/surf-transaction-core-common/build.gradle.kts b/surf-transaction-core/surf-transaction-core-common/build.gradle.kts new file mode 100644 index 0000000..d34821c --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/build.gradle.kts @@ -0,0 +1,25 @@ +import dev.slne.surf.microservice.gradle.plugin.rabbit.RabbitModule +import dev.slne.surf.surfapi.gradle.util.slneReleases + +plugins { + id("dev.slne.surf.surfapi.gradle.core") + id("dev.slne.surf.microservice") +} + +surfMicroservice { + withRabbitModule(RabbitModule.CLIENT_API) +} + +surfCoreApi { + withSurfRedis() +} + +publishing { + repositories { + slneReleases() + } +} + +dependencies { + api(project(":surf-transaction-api")) +} diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/TransactionInstance.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/TransactionInstance.kt similarity index 68% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/TransactionInstance.kt rename to surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/TransactionInstance.kt index 5ed2575..c56ea12 100644 --- a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/TransactionInstance.kt +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/TransactionInstance.kt @@ -1,23 +1,18 @@ package dev.slne.surf.transaction.core -import dev.slne.surf.database.DatabaseApi import dev.slne.surf.surfapi.core.api.util.requiredService -import dev.slne.surf.transaction.core.currency.CurrencyServiceImpl -import dev.slne.surf.transaction.core.db.CreateTables +import dev.slne.surf.transaction.core.currency.CoreCurrencyService import dev.slne.surf.transaction.core.redis.RedisService import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.nio.file.Path abstract class TransactionInstance { - val databaseApi = DatabaseApi.create(dataPath) - abstract val dataPath: Path open suspend fun load() { - CreateTables.create() withContext(Dispatchers.IO) { RedisService.get().connect() } - CurrencyServiceImpl.get().cacheCurrencies() + CoreCurrencyService.get().cacheCurrencies() } open suspend fun enable() { @@ -25,11 +20,10 @@ abstract class TransactionInstance { open suspend fun disable() { withContext(Dispatchers.IO) { RedisService.get().disconnect() } - databaseApi.shutdown() } companion object { val instance = requiredService() fun get() = instance } -} \ No newline at end of file +} diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/account/AccountAccessImpl.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/account/AccountAccessImpl.kt similarity index 71% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/account/AccountAccessImpl.kt rename to surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/account/AccountAccessImpl.kt index 05386a7..4244bbe 100644 --- a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/account/AccountAccessImpl.kt +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/account/AccountAccessImpl.kt @@ -8,22 +8,22 @@ import java.util.UUID class AccountAccessImpl(override val userUuid: UUID) : AccountAccess { override suspend fun getDefaultAccount(): Account { - return AccountServiceImpl.get().getDefaultAccount(userUuid) + return CoreAccountService.get().getDefaultAccount(userUuid) } override suspend fun getAllAccounts(): Set { - return AccountServiceImpl.get().getAllAccountsByOwner(userUuid) + return CoreAccountService.get().getAllAccountsByOwner(userUuid) } override suspend fun createAccount(name: String): AccountCreationResult { - return AccountServiceImpl.get().createAccount(userUuid, name) + return CoreAccountService.get().createAccount(userUuid, name) } override suspend fun getAccountByName(accountName: String): Account? { - return AccountServiceImpl.get().getAccountByName(accountName) + return CoreAccountService.get().getAccountByName(accountName) } override suspend fun deleteAccount(account: Account): AccountDeleteResult { - return AccountServiceImpl.get().deleteAccount(account) + return CoreAccountService.get().deleteAccount(account) } -} \ No newline at end of file +} diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/account/AccountImpl.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/account/AccountImpl.kt similarity index 100% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/account/AccountImpl.kt rename to surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/account/AccountImpl.kt diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/account/CoreAccountService.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/account/CoreAccountService.kt new file mode 100644 index 0000000..179132f --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/account/CoreAccountService.kt @@ -0,0 +1,24 @@ +package dev.slne.surf.transaction.core.account + +import dev.slne.surf.transaction.api.account.Account +import dev.slne.surf.transaction.api.account.AccountService +import dev.slne.surf.transaction.api.account.member.results.AccountMemberResult +import dev.slne.surf.transaction.api.account.result.AccountCreationResult +import dev.slne.surf.transaction.api.account.result.AccountDeleteResult +import dev.slne.surf.transaction.api.util.InternalTransactionApi +import java.util.UUID + +@InternalTransactionApi +interface CoreAccountService : AccountService { + suspend fun getAllAccountsByOwner(ownerUuid: UUID): Set + suspend fun getDefaultAccount(playerUuid: UUID): Account + suspend fun deleteAccount(account: Account): AccountDeleteResult + suspend fun addMemberToAccount(accountId: UUID, executor: UUID, target: UUID): AccountMemberResult + suspend fun removeMemberFromAccount(accountId: UUID, executor: UUID, target: UUID): AccountMemberResult + suspend fun completeAccountNameSuggestions(input: String, maxSuggestions: Int): List + + companion object { + @OptIn(InternalTransactionApi::class) + fun get() = AccountService.instance as CoreAccountService + } +} diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/account/member/AccountMemberOperationsImpl.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/account/member/AccountMemberOperationsImpl.kt similarity index 86% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/account/member/AccountMemberOperationsImpl.kt rename to surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/account/member/AccountMemberOperationsImpl.kt index b0681dc..a1ddeb7 100644 --- a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/account/member/AccountMemberOperationsImpl.kt +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/account/member/AccountMemberOperationsImpl.kt @@ -4,7 +4,7 @@ import dev.slne.surf.surfapi.core.api.util.freeze import dev.slne.surf.surfapi.core.api.util.toMutableObjectSet import dev.slne.surf.transaction.api.account.member.AccountMemberOperations import dev.slne.surf.transaction.api.account.member.results.AccountMemberResult -import dev.slne.surf.transaction.core.account.AccountServiceImpl +import dev.slne.surf.transaction.core.account.CoreAccountService import java.util.* class AccountMemberOperationsImpl( @@ -18,7 +18,7 @@ class AccountMemberOperationsImpl( executor: UUID, target: UUID ): AccountMemberResult { - val result = AccountServiceImpl.get().addMemberToAccount(accountId, executor, target) + val result = CoreAccountService.get().addMemberToAccount(accountId, executor, target) if (result == AccountMemberResult.SUCCESS) { _members.add(target) } @@ -29,7 +29,7 @@ class AccountMemberOperationsImpl( executor: UUID, target: UUID ): AccountMemberResult { - val result = AccountServiceImpl.get().removeMemberFromAccount(accountId, executor, target) + val result = CoreAccountService.get().removeMemberFromAccount(accountId, executor, target) if (result == AccountMemberResult.SUCCESS) { _members.remove(target) } @@ -39,4 +39,4 @@ class AccountMemberOperationsImpl( override fun isMember(player: UUID): Boolean { return members.contains(player) } -} \ No newline at end of file +} diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/component/Components.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/component/Components.kt similarity index 100% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/component/Components.kt rename to surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/component/Components.kt diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/currency/CoreCurrencyService.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/currency/CoreCurrencyService.kt new file mode 100644 index 0000000..7eb2edd --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/currency/CoreCurrencyService.kt @@ -0,0 +1,18 @@ +package dev.slne.surf.transaction.core.currency + +import dev.slne.surf.transaction.api.currency.CurrencyService +import dev.slne.surf.transaction.api.util.InternalTransactionApi + +@InternalTransactionApi +interface CoreCurrencyService : CurrencyService { + suspend fun cacheCurrencies() + fun cacheCurrency(currency: CurrencyImpl) + fun updateDefaultCurrency(newDefaultName: String) + suspend fun createCurrency(currency: CurrencyImpl): CurrencyCreateResult + suspend fun makeDefaultCurrency(currency: CurrencyImpl): CurrencyDefaultResult + + companion object { + @OptIn(InternalTransactionApi::class) + fun get() = CurrencyService.instance as CoreCurrencyService + } +} diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyCreateResult.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyCreateResult.kt similarity index 75% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyCreateResult.kt rename to surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyCreateResult.kt index 9bf49fa..0b7b638 100644 --- a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyCreateResult.kt +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyCreateResult.kt @@ -1,9 +1,12 @@ package dev.slne.surf.transaction.core.currency +import kotlinx.serialization.Serializable + +@Serializable enum class CurrencyCreateResult { SUCCESS, ALREADY_EXISTS, DEFAULT_ALREADY_EXISTS, INVALID_NAME, INVALID_SYMBOL -} \ No newline at end of file +} diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyDefaultResult.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyDefaultResult.kt similarity index 65% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyDefaultResult.kt rename to surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyDefaultResult.kt index c5e7e28..076f837 100644 --- a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyDefaultResult.kt +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyDefaultResult.kt @@ -1,6 +1,9 @@ package dev.slne.surf.transaction.core.currency +import kotlinx.serialization.Serializable + +@Serializable enum class CurrencyDefaultResult { SUCCESS, NOT_FOUND -} \ No newline at end of file +} diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyEventsListener.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyEventsListener.kt similarity index 78% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyEventsListener.kt rename to surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyEventsListener.kt index e598f45..990283c 100644 --- a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyEventsListener.kt +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyEventsListener.kt @@ -8,11 +8,11 @@ class CurrencyEventsListener { @OnRedisEvent fun onCurrencyCreated(event: CurrencyCreatedEvent) { - CurrencyServiceImpl.get().cacheCurrency(event.currency) + CoreCurrencyService.get().cacheCurrency(event.currency) } @OnRedisEvent fun onChangedDefaultCurrency(event: ChangedDefaultCurrencyEvent) { - CurrencyServiceImpl.get().updateDefaultCurrency(event.newDefault) + CoreCurrencyService.get().updateDefaultCurrency(event.newDefault) } -} \ No newline at end of file +} diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyImpl.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyImpl.kt similarity index 100% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyImpl.kt rename to surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyImpl.kt diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/AddMemberToAccountPackets.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/AddMemberToAccountPackets.kt new file mode 100644 index 0000000..dd319da --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/AddMemberToAccountPackets.kt @@ -0,0 +1,17 @@ +package dev.slne.surf.transaction.core.rabbit.account + +import dev.slne.surf.rabbitmq.packet.RabbitRequestPacket +import dev.slne.surf.rabbitmq.packet.RabbitResponsePacket +import dev.slne.surf.surfapi.core.api.serializer.java.uuid.SerializableStringUUID +import dev.slne.surf.transaction.api.account.member.results.AccountMemberResult +import kotlinx.serialization.Serializable + +@Serializable +class AddMemberToAccountRequest( + val accountId: SerializableStringUUID, + val executor: SerializableStringUUID, + val target: SerializableStringUUID +) : RabbitRequestPacket() + +@Serializable +class AddMemberToAccountResponse(val result: AccountMemberResult) : RabbitResponsePacket() diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/CompleteAccountNameSuggestionsPackets.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/CompleteAccountNameSuggestionsPackets.kt new file mode 100644 index 0000000..306258c --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/CompleteAccountNameSuggestionsPackets.kt @@ -0,0 +1,12 @@ +package dev.slne.surf.transaction.core.rabbit.account + +import dev.slne.surf.rabbitmq.packet.RabbitRequestPacket +import dev.slne.surf.rabbitmq.packet.RabbitResponsePacket +import kotlinx.serialization.Serializable + +@Serializable +class CompleteAccountNameSuggestionsRequest(val input: String, val maxSuggestions: Int) : + RabbitRequestPacket() + +@Serializable +class CompleteAccountNameSuggestionsResponse(val suggestions: List) : RabbitResponsePacket() diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/CreateAccountPackets.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/CreateAccountPackets.kt new file mode 100644 index 0000000..ff5bc75 --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/CreateAccountPackets.kt @@ -0,0 +1,18 @@ +package dev.slne.surf.transaction.core.rabbit.account + +import dev.slne.surf.rabbitmq.packet.RabbitRequestPacket +import dev.slne.surf.rabbitmq.packet.RabbitResponsePacket +import dev.slne.surf.surfapi.core.api.serializer.java.uuid.SerializableStringUUID +import dev.slne.surf.transaction.api.account.result.AccountCreationResult +import dev.slne.surf.transaction.core.account.AccountImpl +import kotlinx.serialization.Serializable + +@Serializable +class CreateAccountRequest(val ownerUuid: SerializableStringUUID, val name: String) : + RabbitRequestPacket() + +@Serializable +class CreateAccountResponse( + val account: AccountImpl?, + val failureReason: AccountCreationResult.FailureReason? +) : RabbitResponsePacket() diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/DeleteAccountPackets.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/DeleteAccountPackets.kt new file mode 100644 index 0000000..3f63ce8 --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/DeleteAccountPackets.kt @@ -0,0 +1,14 @@ +package dev.slne.surf.transaction.core.rabbit.account + +import dev.slne.surf.rabbitmq.packet.RabbitRequestPacket +import dev.slne.surf.rabbitmq.packet.RabbitResponsePacket +import dev.slne.surf.surfapi.core.api.serializer.java.uuid.SerializableStringUUID +import dev.slne.surf.transaction.api.account.result.AccountDeleteResult +import kotlinx.serialization.Serializable + +@Serializable +class DeleteAccountRequest(val accountId: SerializableStringUUID) : + RabbitRequestPacket() + +@Serializable +class DeleteAccountResponse(val result: AccountDeleteResult) : RabbitResponsePacket() diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/GetAccountByAccountIdPackets.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/GetAccountByAccountIdPackets.kt new file mode 100644 index 0000000..dacdada --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/GetAccountByAccountIdPackets.kt @@ -0,0 +1,15 @@ +package dev.slne.surf.transaction.core.rabbit.account + +import dev.slne.surf.rabbitmq.packet.RabbitRequestPacket +import dev.slne.surf.rabbitmq.packet.RabbitResponsePacket +import dev.slne.surf.surfapi.core.api.serializer.java.uuid.SerializableStringUUID +import dev.slne.surf.transaction.core.account.AccountImpl +import kotlinx.serialization.Serializable +import java.util.UUID + +@Serializable +class GetAccountByAccountIdRequest(val accountId: SerializableStringUUID) : + RabbitRequestPacket() + +@Serializable +class GetAccountByAccountIdResponse(val account: AccountImpl?) : RabbitResponsePacket() diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/GetAccountByNamePackets.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/GetAccountByNamePackets.kt new file mode 100644 index 0000000..506614c --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/GetAccountByNamePackets.kt @@ -0,0 +1,12 @@ +package dev.slne.surf.transaction.core.rabbit.account + +import dev.slne.surf.rabbitmq.packet.RabbitRequestPacket +import dev.slne.surf.rabbitmq.packet.RabbitResponsePacket +import dev.slne.surf.transaction.core.account.AccountImpl +import kotlinx.serialization.Serializable + +@Serializable +class GetAccountByNameRequest(val name: String) : RabbitRequestPacket() + +@Serializable +class GetAccountByNameResponse(val account: AccountImpl?) : RabbitResponsePacket() diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/GetAllAccountsByOwnerPackets.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/GetAllAccountsByOwnerPackets.kt new file mode 100644 index 0000000..a625186 --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/GetAllAccountsByOwnerPackets.kt @@ -0,0 +1,14 @@ +package dev.slne.surf.transaction.core.rabbit.account + +import dev.slne.surf.rabbitmq.packet.RabbitRequestPacket +import dev.slne.surf.rabbitmq.packet.RabbitResponsePacket +import dev.slne.surf.surfapi.core.api.serializer.java.uuid.SerializableStringUUID +import dev.slne.surf.transaction.core.account.AccountImpl +import kotlinx.serialization.Serializable + +@Serializable +class GetAllAccountsByOwnerRequest(val ownerUuid: SerializableStringUUID) : + RabbitRequestPacket() + +@Serializable +class GetAllAccountsByOwnerResponse(val accounts: List) : RabbitResponsePacket() diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/GetDefaultAccountPackets.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/GetDefaultAccountPackets.kt new file mode 100644 index 0000000..b722d4c --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/GetDefaultAccountPackets.kt @@ -0,0 +1,14 @@ +package dev.slne.surf.transaction.core.rabbit.account + +import dev.slne.surf.rabbitmq.packet.RabbitRequestPacket +import dev.slne.surf.rabbitmq.packet.RabbitResponsePacket +import dev.slne.surf.surfapi.core.api.serializer.java.uuid.SerializableStringUUID +import dev.slne.surf.transaction.core.account.AccountImpl +import kotlinx.serialization.Serializable + +@Serializable +class GetDefaultAccountRequest(val playerUuid: SerializableStringUUID) : + RabbitRequestPacket() + +@Serializable +class GetDefaultAccountResponse(val account: AccountImpl) : RabbitResponsePacket() diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/RemoveMemberFromAccountPackets.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/RemoveMemberFromAccountPackets.kt new file mode 100644 index 0000000..902a7af --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/RemoveMemberFromAccountPackets.kt @@ -0,0 +1,17 @@ +package dev.slne.surf.transaction.core.rabbit.account + +import dev.slne.surf.rabbitmq.packet.RabbitRequestPacket +import dev.slne.surf.rabbitmq.packet.RabbitResponsePacket +import dev.slne.surf.surfapi.core.api.serializer.java.uuid.SerializableStringUUID +import dev.slne.surf.transaction.api.account.member.results.AccountMemberResult +import kotlinx.serialization.Serializable + +@Serializable +class RemoveMemberFromAccountRequest( + val accountId: SerializableStringUUID, + val executor: SerializableStringUUID, + val target: SerializableStringUUID +) : RabbitRequestPacket() + +@Serializable +class RemoveMemberFromAccountResponse(val result: AccountMemberResult) : RabbitResponsePacket() diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/currency/CreateCurrencyPackets.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/currency/CreateCurrencyPackets.kt new file mode 100644 index 0000000..3d05950 --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/currency/CreateCurrencyPackets.kt @@ -0,0 +1,14 @@ +package dev.slne.surf.transaction.core.rabbit.currency + +import dev.slne.surf.rabbitmq.packet.RabbitRequestPacket +import dev.slne.surf.rabbitmq.packet.RabbitResponsePacket +import dev.slne.surf.transaction.core.currency.CurrencyCreateResult +import dev.slne.surf.transaction.core.currency.CurrencyImpl +import kotlinx.serialization.Serializable + +@Serializable +class CreateCurrencyRequest(val currency: CurrencyImpl) : + RabbitRequestPacket() + +@Serializable +class CreateCurrencyResponse(val result: CurrencyCreateResult) : RabbitResponsePacket() diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/currency/GetAllCurrenciesPackets.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/currency/GetAllCurrenciesPackets.kt new file mode 100644 index 0000000..7f1577c --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/currency/GetAllCurrenciesPackets.kt @@ -0,0 +1,15 @@ +package dev.slne.surf.transaction.core.rabbit.currency + +import dev.slne.surf.rabbitmq.packet.RabbitRequestPacket +import dev.slne.surf.rabbitmq.packet.RabbitResponsePacket +import dev.slne.surf.transaction.core.currency.CurrencyImpl +import kotlinx.serialization.Serializable + +@Serializable +class GetAllCurrenciesRequest : RabbitRequestPacket() + +@Serializable +class GetAllCurrenciesResponse( + val currencies: List, + val defaultCurrencyName: String +) : RabbitResponsePacket() diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/currency/MakeDefaultCurrencyPackets.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/currency/MakeDefaultCurrencyPackets.kt new file mode 100644 index 0000000..ea48c5c --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/currency/MakeDefaultCurrencyPackets.kt @@ -0,0 +1,13 @@ +package dev.slne.surf.transaction.core.rabbit.currency + +import dev.slne.surf.rabbitmq.packet.RabbitRequestPacket +import dev.slne.surf.rabbitmq.packet.RabbitResponsePacket +import dev.slne.surf.transaction.core.currency.CurrencyDefaultResult +import kotlinx.serialization.Serializable + +@Serializable +class MakeDefaultCurrencyRequest(val currencyName: String) : + RabbitRequestPacket() + +@Serializable +class MakeDefaultCurrencyResponse(val result: CurrencyDefaultResult) : RabbitResponsePacket() diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/BalancePackets.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/BalancePackets.kt new file mode 100644 index 0000000..522eabe --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/BalancePackets.kt @@ -0,0 +1,16 @@ +package dev.slne.surf.transaction.core.rabbit.transaction + +import dev.slne.surf.rabbitmq.packet.RabbitRequestPacket +import dev.slne.surf.rabbitmq.packet.RabbitResponsePacket +import dev.slne.surf.surfapi.core.api.serializer.java.number.bigdecimal.SerializableBigDecimal +import dev.slne.surf.surfapi.core.api.serializer.java.uuid.SerializableStringUUID +import kotlinx.serialization.Serializable + +@Serializable +class BalanceRequest( + val accountId: SerializableStringUUID, + val currencyName: String +) : RabbitRequestPacket() + +@Serializable +class BalanceResponse(val balance: SerializableBigDecimal) : RabbitResponsePacket() diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/DepositPackets.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/DepositPackets.kt new file mode 100644 index 0000000..a971aed --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/DepositPackets.kt @@ -0,0 +1,23 @@ +package dev.slne.surf.transaction.core.rabbit.transaction + +import dev.slne.surf.rabbitmq.packet.RabbitRequestPacket +import dev.slne.surf.rabbitmq.packet.RabbitResponsePacket +import dev.slne.surf.surfapi.core.api.serializer.java.number.bigdecimal.SerializableBigDecimal +import dev.slne.surf.surfapi.core.api.serializer.java.uuid.SerializableStringUUID +import dev.slne.surf.transaction.api.transaction.data.TransactionData +import kotlinx.serialization.Serializable +import java.math.BigDecimal +import java.util.UUID + +@Serializable +class DepositRequest( + val accountId: SerializableStringUUID, + val initiator: SerializableStringUUID, + val amount: SerializableBigDecimal, + val currencyName: String, + val ignoreMinimum: Boolean, + val additionalData: Set +) : RabbitRequestPacket() + +@Serializable +class DepositResponse(val result: TransactionResultPacket) : RabbitResponsePacket() diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/TransactionResultPacket.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/TransactionResultPacket.kt new file mode 100644 index 0000000..24390d5 --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/TransactionResultPacket.kt @@ -0,0 +1,25 @@ +package dev.slne.surf.transaction.core.rabbit.transaction + +import dev.slne.surf.transaction.core.transaction.TransactionImpl +import kotlinx.serialization.Serializable + +@Serializable +sealed class TransactionResultPacket { + @Serializable + data class Success(val transaction: TransactionImpl) : TransactionResultPacket() + + @Serializable + data class TransferSuccess( + val senderTransaction: TransactionImpl, + val receiverTransaction: TransactionImpl + ) : TransactionResultPacket() + + @Serializable + data object ReceiverInsufficientFunds : TransactionResultPacket() + + @Serializable + data object SenderInsufficientFunds : TransactionResultPacket() + + @Serializable + data class DatabaseError(val message: String) : TransactionResultPacket() +} diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/TransferPackets.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/TransferPackets.kt new file mode 100644 index 0000000..015521e --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/TransferPackets.kt @@ -0,0 +1,24 @@ +package dev.slne.surf.transaction.core.rabbit.transaction + +import dev.slne.surf.rabbitmq.packet.RabbitRequestPacket +import dev.slne.surf.rabbitmq.packet.RabbitResponsePacket +import dev.slne.surf.surfapi.core.api.serializer.java.number.bigdecimal.SerializableBigDecimal +import dev.slne.surf.surfapi.core.api.serializer.java.uuid.SerializableStringUUID +import dev.slne.surf.transaction.api.transaction.data.TransactionData +import kotlinx.serialization.Serializable + +@Serializable +class TransferRequest( + val initiator: SerializableStringUUID, + val senderAccountId: SerializableStringUUID, + val amount: SerializableBigDecimal, + val currencyName: String, + val receiverAccountId: SerializableStringUUID, + val ignoreSenderMinimum: Boolean, + val ignoreReceiverMinimum: Boolean, + val additionalSenderData: Set, + val additionalReceiverData: Set +) : RabbitRequestPacket() + +@Serializable +class TransferResponse(val result: TransactionResultPacket) : RabbitResponsePacket() diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/WithdrawPackets.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/WithdrawPackets.kt new file mode 100644 index 0000000..652fb8f --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/WithdrawPackets.kt @@ -0,0 +1,21 @@ +package dev.slne.surf.transaction.core.rabbit.transaction + +import dev.slne.surf.rabbitmq.packet.RabbitRequestPacket +import dev.slne.surf.rabbitmq.packet.RabbitResponsePacket +import dev.slne.surf.surfapi.core.api.serializer.java.number.bigdecimal.SerializableBigDecimal +import dev.slne.surf.surfapi.core.api.serializer.java.uuid.SerializableStringUUID +import dev.slne.surf.transaction.api.transaction.data.TransactionData +import kotlinx.serialization.Serializable + +@Serializable +class WithdrawRequest( + val accountId: SerializableStringUUID, + val initiator: SerializableStringUUID, + val amount: SerializableBigDecimal, + val currencyName: String, + val ignoreMinimum: Boolean, + val additionalData: Set +) : RabbitRequestPacket() + +@Serializable +class WithdrawResponse(val result: TransactionResultPacket) : RabbitResponsePacket() diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/redis/RedisService.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/redis/RedisService.kt similarity index 75% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/redis/RedisService.kt rename to surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/redis/RedisService.kt index a5b5b1a..a4e6f8e 100644 --- a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/redis/RedisService.kt +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/redis/RedisService.kt @@ -3,11 +3,7 @@ package dev.slne.surf.transaction.core.redis import dev.slne.surf.redis.RedisApi import dev.slne.surf.redis.event.RedisEvent import dev.slne.surf.surfapi.core.api.util.requiredService -import dev.slne.surf.transaction.api.account.AccountService import dev.slne.surf.transaction.core.currency.CurrencyEventsListener -import dev.slne.surf.transaction.core.db.account.AccountRepository -import dev.slne.surf.transaction.core.db.currency.CurrencyRepository -import dev.slne.surf.transaction.core.db.transaction.TransactionRepository import org.jetbrains.annotations.Blocking import org.jetbrains.annotations.MustBeInvokedByOverriders import kotlin.time.Duration @@ -18,12 +14,6 @@ abstract class RedisService { @Blocking fun connect() { register() - - CurrencyRepository.init() - AccountRepository.init() - TransactionRepository.init() - AccountService.init() - redisApi.freezeAndConnect() } @@ -53,4 +43,4 @@ abstract class RedisService { keyToString ) } -} \ No newline at end of file +} diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/redis/events/currency/ChangedDefaultCurrencyEvent.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/redis/events/currency/ChangedDefaultCurrencyEvent.kt similarity index 100% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/redis/events/currency/ChangedDefaultCurrencyEvent.kt rename to surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/redis/events/currency/ChangedDefaultCurrencyEvent.kt diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/redis/events/currency/CurrencyCreatedEvent.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/redis/events/currency/CurrencyCreatedEvent.kt similarity index 100% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/redis/events/currency/CurrencyCreatedEvent.kt rename to surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/redis/events/currency/CurrencyCreatedEvent.kt diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/redis/serializer/NetworkCurrencySerializer.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/redis/serializer/NetworkCurrencySerializer.kt similarity index 100% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/redis/serializer/NetworkCurrencySerializer.kt rename to surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/redis/serializer/NetworkCurrencySerializer.kt diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/transaction/CoreTransactionService.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/transaction/CoreTransactionService.kt new file mode 100644 index 0000000..2800a9a --- /dev/null +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/transaction/CoreTransactionService.kt @@ -0,0 +1,50 @@ +package dev.slne.surf.transaction.core.transaction + +import dev.slne.surf.transaction.api.account.Account +import dev.slne.surf.transaction.api.currency.Currency +import dev.slne.surf.transaction.api.transaction.TransactionResult +import dev.slne.surf.transaction.api.transaction.TransactionService +import dev.slne.surf.transaction.api.transaction.data.TransactionData +import dev.slne.surf.transaction.api.util.InternalTransactionApi +import java.math.BigDecimal +import java.util.UUID + +@InternalTransactionApi +interface CoreTransactionService : TransactionService { + suspend fun deposit( + account: Account, + initiator: UUID, + amount: BigDecimal, + currency: Currency, + ignoreMinimum: Boolean, + vararg additionalData: TransactionData + ): TransactionResult + + suspend fun withdraw( + account: Account, + initiator: UUID, + amount: BigDecimal, + currency: Currency, + ignoreMinimum: Boolean, + vararg additionalData: TransactionData + ): TransactionResult + + suspend fun transfer( + initiator: UUID, + sender: Account, + amount: BigDecimal, + currency: Currency, + receiver: Account, + ignoreSenderMinimum: Boolean, + ignoreReceiverMinimum: Boolean, + additionalSenderData: Set, + additionalReceiverData: Set + ): TransactionResult + + suspend fun balance(account: Account, currency: Currency): BigDecimal + + companion object { + @OptIn(InternalTransactionApi::class) + fun get() = TransactionService.instance as CoreTransactionService + } +} diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/transaction/TransactionImpl.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/transaction/TransactionImpl.kt similarity index 70% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/transaction/TransactionImpl.kt rename to surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/transaction/TransactionImpl.kt index d5e2bb1..b2471fc 100644 --- a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/transaction/TransactionImpl.kt +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/transaction/TransactionImpl.kt @@ -1,20 +1,24 @@ package dev.slne.surf.transaction.core.transaction +import dev.slne.surf.surfapi.core.api.serializer.java.number.bigdecimal.SerializableBigDecimal +import dev.slne.surf.surfapi.core.api.serializer.java.uuid.SerializableStringUUID import dev.slne.surf.transaction.api.account.Account import dev.slne.surf.transaction.api.currency.Currency import dev.slne.surf.transaction.api.transaction.Transaction import dev.slne.surf.transaction.api.transaction.data.TransactionData +import kotlinx.serialization.Serializable import org.jetbrains.annotations.Unmodifiable import java.math.BigDecimal import java.util.* +@Serializable class TransactionImpl( - override val identifier: UUID, - override val initiator: UUID?, - override val senderAccountId: UUID?, - override val receiverAccountId: UUID?, + override val identifier: SerializableStringUUID, + override val initiator: SerializableStringUUID?, + override val senderAccountId: SerializableStringUUID?, + override val receiverAccountId: SerializableStringUUID?, val currencyName: String, - override val amount: BigDecimal, + override val amount: SerializableBigDecimal, override val data: @Unmodifiable Set, override val ignoreMinimumAmount: Boolean = false ) : Transaction { @@ -28,4 +32,4 @@ class TransactionImpl( override fun toString(): String { return "TransactionImpl(identifier=$identifier, initiator=$initiator, senderAccountId=$senderAccountId, receiverAccountId=$receiverAccountId, currencyName='$currencyName', amount=$amount, data=$data, ignoreMinimumAmount=$ignoreMinimumAmount)" } -} \ No newline at end of file +} diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/transactional/TransactionalImpl.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/transactional/TransactionalImpl.kt similarity index 87% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/transactional/TransactionalImpl.kt rename to surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/transactional/TransactionalImpl.kt index 9ef55e5..ed86632 100644 --- a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/transactional/TransactionalImpl.kt +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/transactional/TransactionalImpl.kt @@ -5,7 +5,7 @@ import dev.slne.surf.transaction.api.currency.Currency import dev.slne.surf.transaction.api.transaction.TransactionResult import dev.slne.surf.transaction.api.transaction.data.TransactionData import dev.slne.surf.transaction.api.transactional.Transactional -import dev.slne.surf.transaction.core.transaction.TransactionServiceImpl +import dev.slne.surf.transaction.core.transaction.CoreTransactionService import java.math.BigDecimal import java.util.* @@ -19,7 +19,7 @@ class TransactionalImpl : Transactional { ignoreMinimum: Boolean, vararg additionalData: TransactionData ): TransactionResult { - return TransactionServiceImpl.get().deposit( + return CoreTransactionService.get().deposit( account, initiator, amount, @@ -37,7 +37,7 @@ class TransactionalImpl : Transactional { ignoreMinimum: Boolean, vararg additionalData: TransactionData ): TransactionResult { - return TransactionServiceImpl.get().withdraw( + return CoreTransactionService.get().withdraw( account, initiator, amount, @@ -58,7 +58,7 @@ class TransactionalImpl : Transactional { additionalSenderData: Set, additionalReceiverData: Set ): TransactionResult { - return TransactionServiceImpl.get().transfer( + return CoreTransactionService.get().transfer( initiator, sender, amount, @@ -75,6 +75,6 @@ class TransactionalImpl : Transactional { account: Account, currency: Currency ): BigDecimal { - return TransactionServiceImpl.get().balance(account, currency) + return CoreTransactionService.get().balance(account, currency) } -} \ No newline at end of file +} diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/user/TransactionUserImpl.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/user/TransactionUserImpl.kt similarity index 100% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/user/TransactionUserImpl.kt rename to surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/user/TransactionUserImpl.kt diff --git a/surf-transaction-microservice/build.gradle.kts b/surf-transaction-microservice/build.gradle.kts new file mode 100644 index 0000000..6308193 --- /dev/null +++ b/surf-transaction-microservice/build.gradle.kts @@ -0,0 +1,20 @@ +import dev.slne.surf.microservice.gradle.plugin.rabbit.RabbitModule + +plugins { + id("dev.slne.surf.surfapi.gradle.core") + id("dev.slne.surf.microservice") +} + +surfCoreApi { + withSurfDatabaseR2dbc("1.3.0", "dev.slne.surf.transaction.libs.db") + withSurfRedis() +} + +surfMicroservice { + withRabbitModule(RabbitModule.SERVER_API) + withMicroserviceApi() +} + +dependencies { + implementation(project(":surf-transaction-core:surf-transaction-core-common")) +} diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/CreateTables.kt b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/CreateTables.kt similarity index 100% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/CreateTables.kt rename to surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/CreateTables.kt diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/account/AccountMemberTable.kt b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/account/AccountMemberTable.kt similarity index 100% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/account/AccountMemberTable.kt rename to surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/account/AccountMemberTable.kt diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/account/AccountRepository.kt b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/account/AccountRepository.kt similarity index 100% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/account/AccountRepository.kt rename to surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/account/AccountRepository.kt diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/account/AccountRepositoryImpl.kt b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/account/AccountRepositoryImpl.kt similarity index 100% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/account/AccountRepositoryImpl.kt rename to surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/account/AccountRepositoryImpl.kt diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/account/AccountTable.kt b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/account/AccountTable.kt similarity index 100% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/account/AccountTable.kt rename to surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/account/AccountTable.kt diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/currency/CurrencyRepository.kt b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/currency/CurrencyRepository.kt similarity index 100% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/currency/CurrencyRepository.kt rename to surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/currency/CurrencyRepository.kt diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/currency/CurrencyRepositoryImpl.kt b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/currency/CurrencyRepositoryImpl.kt similarity index 100% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/currency/CurrencyRepositoryImpl.kt rename to surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/currency/CurrencyRepositoryImpl.kt diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/currency/CurrencyTable.kt b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/currency/CurrencyTable.kt similarity index 100% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/currency/CurrencyTable.kt rename to surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/currency/CurrencyTable.kt diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/transaction/TransactionDataTable.kt b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/transaction/TransactionDataTable.kt similarity index 100% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/transaction/TransactionDataTable.kt rename to surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/transaction/TransactionDataTable.kt diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/transaction/TransactionRepository.kt b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/transaction/TransactionRepository.kt similarity index 100% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/transaction/TransactionRepository.kt rename to surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/transaction/TransactionRepository.kt diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/transaction/TransactionRepositoryImpl.kt b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/transaction/TransactionRepositoryImpl.kt similarity index 100% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/transaction/TransactionRepositoryImpl.kt rename to surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/transaction/TransactionRepositoryImpl.kt diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/transaction/TransactionTable.kt b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/transaction/TransactionTable.kt similarity index 100% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/db/transaction/TransactionTable.kt rename to surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/core/db/transaction/TransactionTable.kt diff --git a/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/TransactionMicroservice.kt b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/TransactionMicroservice.kt new file mode 100644 index 0000000..8d2caf3 --- /dev/null +++ b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/TransactionMicroservice.kt @@ -0,0 +1,22 @@ +package dev.slne.surf.transaction.microservice + +import com.google.auto.service.AutoService +import dev.slne.surf.microservice.api.microservice.Microservice +import dev.slne.surf.transaction.core.TransactionInstance +import dev.slne.surf.transaction.microservice.rabbit.TransactionRabbitHandler + +@AutoService(Microservice::class) +class TransactionMicroservice : Microservice() { + override suspend fun onBootstrap(args: List) { + TransactionInstance.get().load() + TransactionInstance.get().enable() + + val rabbitApi = serverRabbitMQApi + rabbitApi.registerRequestHandler(TransactionRabbitHandler()) + rabbitApi.freezeAndConnect() + } + + override suspend fun onDisable() { + TransactionInstance.get().disable() + } +} diff --git a/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/TransactionMicroserviceInstance.kt b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/TransactionMicroserviceInstance.kt new file mode 100644 index 0000000..15eaec4 --- /dev/null +++ b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/TransactionMicroserviceInstance.kt @@ -0,0 +1,28 @@ +package dev.slne.surf.transaction.microservice + +import com.google.auto.service.AutoService +import dev.slne.surf.database.DatabaseApi +import dev.slne.surf.transaction.core.TransactionInstance +import dev.slne.surf.transaction.core.currency.CoreCurrencyService +import dev.slne.surf.transaction.core.db.CreateTables +import dev.slne.surf.transaction.core.redis.RedisService +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import java.nio.file.Path + +@AutoService(TransactionInstance::class) +class TransactionMicroserviceInstance : TransactionInstance() { + override val dataPath: Path = Path.of("data") + val databaseApi = DatabaseApi.create(dataPath) + + override suspend fun load() { + CreateTables.create() + withContext(Dispatchers.IO) { RedisService.get().connect() } + CoreCurrencyService.get().cacheCurrencies() + } + + override suspend fun disable() { + withContext(Dispatchers.IO) { RedisService.get().disconnect() } + databaseApi.shutdown() + } +} diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/account/AccountServiceImpl.kt b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/account/AccountServiceImpl.kt similarity index 59% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/account/AccountServiceImpl.kt rename to surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/account/AccountServiceImpl.kt index dc93907..691b6f5 100644 --- a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/account/AccountServiceImpl.kt +++ b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/account/AccountServiceImpl.kt @@ -1,4 +1,4 @@ -package dev.slne.surf.transaction.core.account +package dev.slne.surf.transaction.microservice.account import com.google.auto.service.AutoService import dev.slne.surf.transaction.api.account.Account @@ -6,15 +6,19 @@ import dev.slne.surf.transaction.api.account.AccountService import dev.slne.surf.transaction.api.account.member.results.AccountMemberResult import dev.slne.surf.transaction.api.account.result.AccountCreationResult import dev.slne.surf.transaction.api.account.result.AccountDeleteResult +import dev.slne.surf.transaction.core.account.CoreAccountService import dev.slne.surf.transaction.core.db.account.AccountRepository import dev.slne.surf.transaction.core.redis.RedisService -import java.util.* +import java.util.UUID import kotlin.time.Duration.Companion.minutes @AutoService(AccountService::class) -class AccountServiceImpl : AccountService { +class AccountServiceImpl : CoreAccountService { private val defaultAccountCache = - RedisService.cache("default_account", 10.minutes) + RedisService.cache( + "default_account", + 10.minutes + ) override suspend fun getAccountByAccountId(accountId: UUID): Account? { return AccountRepository.findAccountByAccountId(accountId) @@ -24,31 +28,22 @@ class AccountServiceImpl : AccountService { return AccountRepository.findAccountByName(accountName.lowercase()) } - override suspend fun createAccount( - ownerUuid: UUID, - name: String - ): AccountCreationResult { - val name = name.trim().replace(" ", "_").lowercase() + override suspend fun createAccount(ownerUuid: UUID, name: String): AccountCreationResult { + val trimmedName = name.trim().replace(" ", "_").lowercase() - if (name.length < Account.MIN_NAME_LENGTH) { - return AccountCreationResult.Failed( - AccountCreationResult.FailureReason.NAME_TOO_SHORT - ) + if (trimmedName.length < Account.MIN_NAME_LENGTH) { + return AccountCreationResult.Failed(AccountCreationResult.FailureReason.NAME_TOO_SHORT) } - if (name.length > Account.MAX_NAME_LENGTH) { - return AccountCreationResult.Failed( - AccountCreationResult.FailureReason.NAME_TOO_LONG - ) + if (trimmedName.length > Account.MAX_NAME_LENGTH) { + return AccountCreationResult.Failed(AccountCreationResult.FailureReason.NAME_TOO_LONG) } - if (runCatching { UUID.fromString(name) }.getOrNull() != null) { - return AccountCreationResult.Failed( - AccountCreationResult.FailureReason.NAME_IS_UUID - ) + if (runCatching { UUID.fromString(trimmedName) }.getOrNull() != null) { + return AccountCreationResult.Failed(AccountCreationResult.FailureReason.NAME_IS_UUID) } - val alreadyExists = AccountRepository.existsByAccountName(name) + val alreadyExists = AccountRepository.existsByAccountName(trimmedName) if (alreadyExists) { return AccountCreationResult.Failed( AccountCreationResult.FailureReason.NAME_ALREADY_EXISTS @@ -56,25 +51,21 @@ class AccountServiceImpl : AccountService { } return AccountCreationResult.Success( - AccountRepository.createAccount( - ownerUuid, - name, - false - ) + AccountRepository.createAccount(ownerUuid, trimmedName, false) ) } - suspend fun getAllAccountsByOwner(ownerUuid: UUID): Set { + override suspend fun getAllAccountsByOwner(ownerUuid: UUID): Set { return AccountRepository.findAccountsByOwner(ownerUuid).toSet() } - suspend fun getDefaultAccount(playerUuid: UUID): Account { + override suspend fun getDefaultAccount(playerUuid: UUID): Account { return defaultAccountCache.cachedOrLoad(playerUuid) { AccountRepository.findOrCreateDefaultAccount(playerUuid) } } - suspend fun deleteAccount(account: Account): AccountDeleteResult { + override suspend fun deleteAccount(account: Account): AccountDeleteResult { if (account.defaultAccount) { return AccountDeleteResult.DEFAULT_ACCOUNT_CANNOT_BE_DELETED } @@ -87,16 +78,13 @@ class AccountServiceImpl : AccountService { return AccountDeleteResult.SUCCESS } - suspend fun addMemberToAccount( + override suspend fun addMemberToAccount( accountId: UUID, executor: UUID, target: UUID ): AccountMemberResult { - val (result, accountOwnerUuid) = AccountRepository.addMemberToAccount( - accountId, - executor, - target - ) + val (result, accountOwnerUuid) = + AccountRepository.addMemberToAccount(accountId, executor, target) if (result == AccountMemberResult.SUCCESS && accountOwnerUuid != null) { defaultAccountCache.invalidate(accountOwnerUuid) @@ -105,16 +93,13 @@ class AccountServiceImpl : AccountService { return result } - suspend fun removeMemberFromAccount( + override suspend fun removeMemberFromAccount( accountId: UUID, executor: UUID, target: UUID ): AccountMemberResult { - val (result, accountOwnerUuid) = AccountRepository.removeMemberFromAccount( - accountId, - executor, - target - ) + val (result, accountOwnerUuid) = + AccountRepository.removeMemberFromAccount(accountId, executor, target) if (result == AccountMemberResult.SUCCESS && accountOwnerUuid != null) { defaultAccountCache.invalidate(accountOwnerUuid) @@ -123,7 +108,10 @@ class AccountServiceImpl : AccountService { return result } - suspend fun completeAccountNameSuggestions(input: String, maxSuggestions: Int): List { + override suspend fun completeAccountNameSuggestions( + input: String, + maxSuggestions: Int + ): List { val inputLowerCase = input.lowercase() return AccountRepository.completeAccountNameSuggestions(inputLowerCase, maxSuggestions) } @@ -131,4 +119,4 @@ class AccountServiceImpl : AccountService { companion object { fun get() = AccountService.instance as AccountServiceImpl } -} \ No newline at end of file +} diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyServiceImpl.kt b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/currency/CurrencyServiceImpl.kt similarity index 75% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyServiceImpl.kt rename to surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/currency/CurrencyServiceImpl.kt index 4f406c5..d8ef205 100644 --- a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/currency/CurrencyServiceImpl.kt +++ b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/currency/CurrencyServiceImpl.kt @@ -1,10 +1,14 @@ -package dev.slne.surf.transaction.core.currency +package dev.slne.surf.transaction.microservice.currency import com.google.auto.service.AutoService import dev.slne.surf.surfapi.core.api.util.toObjectSet import dev.slne.surf.transaction.api.currency.Currency.Companion.CURRENCY_NAME_MAX_LENGTH import dev.slne.surf.transaction.api.currency.Currency.Companion.CURRENCY_SYMBOL_MAX_LENGTH import dev.slne.surf.transaction.api.currency.CurrencyService +import dev.slne.surf.transaction.core.currency.CoreCurrencyService +import dev.slne.surf.transaction.core.currency.CurrencyCreateResult +import dev.slne.surf.transaction.core.currency.CurrencyDefaultResult +import dev.slne.surf.transaction.core.currency.CurrencyImpl import dev.slne.surf.transaction.core.db.currency.CurrencyRepository import dev.slne.surf.transaction.core.redis.RedisService import dev.slne.surf.transaction.core.redis.events.currency.ChangedDefaultCurrencyEvent @@ -13,24 +17,24 @@ import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer import kotlin.properties.Delegates @AutoService(CurrencyService::class) -class CurrencyServiceImpl : CurrencyService { +class CurrencyServiceImpl : CoreCurrencyService { override var defaultCurrency: CurrencyImpl by Delegates.notNull() override var currencies: Set by Delegates.notNull() override fun getCurrencyByName(name: String) = currencies.find { it.name.equals(name, ignoreCase = true) } - suspend fun cacheCurrencies() { + override suspend fun cacheCurrencies() { val currencies = CurrencyRepository.findAllAndCreateDefaultCurrencyIfMissing() defaultCurrency = currencies.single { it.defaultCurrency } this.currencies = currencies.toObjectSet() } - fun cacheCurrency(currency: CurrencyImpl) { + override fun cacheCurrency(currency: CurrencyImpl) { currencies = currencies.plus(currency).toObjectSet() } - fun updateDefaultCurrency(newDefaultName: String) { + override fun updateDefaultCurrency(newDefaultName: String) { val newDefaultCurrency = currencies.find { it.name.equals(newDefaultName, ignoreCase = true) } ?: return defaultCurrency.defaultCurrency = false @@ -38,8 +42,10 @@ class CurrencyServiceImpl : CurrencyService { defaultCurrency = newDefaultCurrency } - suspend fun createCurrency(currency: CurrencyImpl): CurrencyCreateResult { - require(!currency.defaultCurrency) { "Cannot create default currency. Use makeDefaultCurrency() instead." } + override suspend fun createCurrency(currency: CurrencyImpl): CurrencyCreateResult { + require(!currency.defaultCurrency) { + "Cannot create default currency. Use makeDefaultCurrency() instead." + } validateCurrency(currency)?.let { return it } val result = CurrencyRepository.createCurrency(currency) @@ -66,8 +72,10 @@ class CurrencyServiceImpl : CurrencyService { return null } - suspend fun makeDefaultCurrency(currency: CurrencyImpl): CurrencyDefaultResult { - require(!currency.defaultCurrency) { "Currency '${currency.name}' is already the default currency." } + override suspend fun makeDefaultCurrency(currency: CurrencyImpl): CurrencyDefaultResult { + require(!currency.defaultCurrency) { + "Currency '${currency.name}' is already the default currency." + } val result = CurrencyRepository.makeDefaultCurrency(currency) @@ -81,4 +89,4 @@ class CurrencyServiceImpl : CurrencyService { companion object { fun get() = CurrencyService.instance as CurrencyServiceImpl } -} \ No newline at end of file +} diff --git a/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/rabbit/TransactionRabbitHandler.kt b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/rabbit/TransactionRabbitHandler.kt new file mode 100644 index 0000000..4c7e24b --- /dev/null +++ b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/rabbit/TransactionRabbitHandler.kt @@ -0,0 +1,273 @@ +package dev.slne.surf.transaction.microservice.rabbit + +import dev.slne.surf.rabbitmq.annotation.RabbitHandler +import dev.slne.surf.transaction.api.account.AccountService +import dev.slne.surf.transaction.api.currency.CurrencyService +import dev.slne.surf.transaction.api.transaction.TransactionResult +import dev.slne.surf.transaction.core.account.CoreAccountService +import dev.slne.surf.transaction.core.currency.CoreCurrencyService +import dev.slne.surf.transaction.core.rabbit.account.AddMemberToAccountRequest +import dev.slne.surf.transaction.core.rabbit.account.AddMemberToAccountResponse +import dev.slne.surf.transaction.core.rabbit.account.CompleteAccountNameSuggestionsRequest +import dev.slne.surf.transaction.core.rabbit.account.CompleteAccountNameSuggestionsResponse +import dev.slne.surf.transaction.core.rabbit.account.CreateAccountRequest +import dev.slne.surf.transaction.core.rabbit.account.CreateAccountResponse +import dev.slne.surf.transaction.core.rabbit.account.DeleteAccountRequest +import dev.slne.surf.transaction.core.rabbit.account.DeleteAccountResponse +import dev.slne.surf.transaction.core.rabbit.account.GetAccountByAccountIdRequest +import dev.slne.surf.transaction.core.rabbit.account.GetAccountByAccountIdResponse +import dev.slne.surf.transaction.core.rabbit.account.GetAccountByNameRequest +import dev.slne.surf.transaction.core.rabbit.account.GetAccountByNameResponse +import dev.slne.surf.transaction.core.rabbit.account.GetAllAccountsByOwnerRequest +import dev.slne.surf.transaction.core.rabbit.account.GetAllAccountsByOwnerResponse +import dev.slne.surf.transaction.core.rabbit.account.GetDefaultAccountRequest +import dev.slne.surf.transaction.core.rabbit.account.GetDefaultAccountResponse +import dev.slne.surf.transaction.core.rabbit.account.RemoveMemberFromAccountRequest +import dev.slne.surf.transaction.core.rabbit.account.RemoveMemberFromAccountResponse +import dev.slne.surf.transaction.core.rabbit.currency.CreateCurrencyRequest +import dev.slne.surf.transaction.core.rabbit.currency.CreateCurrencyResponse +import dev.slne.surf.transaction.core.rabbit.currency.GetAllCurrenciesRequest +import dev.slne.surf.transaction.core.rabbit.currency.GetAllCurrenciesResponse +import dev.slne.surf.transaction.core.rabbit.currency.MakeDefaultCurrencyRequest +import dev.slne.surf.transaction.core.rabbit.currency.MakeDefaultCurrencyResponse +import dev.slne.surf.transaction.core.rabbit.transaction.BalanceRequest +import dev.slne.surf.transaction.core.rabbit.transaction.BalanceResponse +import dev.slne.surf.transaction.core.rabbit.transaction.DepositRequest +import dev.slne.surf.transaction.core.rabbit.transaction.DepositResponse +import dev.slne.surf.transaction.core.rabbit.transaction.TransactionResultPacket +import dev.slne.surf.transaction.core.rabbit.transaction.TransferRequest +import dev.slne.surf.transaction.core.rabbit.transaction.TransferResponse +import dev.slne.surf.transaction.core.rabbit.transaction.WithdrawRequest +import dev.slne.surf.transaction.core.rabbit.transaction.WithdrawResponse +import dev.slne.surf.transaction.core.transaction.CoreTransactionService +import dev.slne.surf.transaction.core.account.AccountImpl as CoreAccountImpl + +class TransactionRabbitHandler { + + // ─── Account handlers ──────────────────────────────────────────────────── + + @RabbitHandler + fun handleGetAccountByAccountId(request: GetAccountByAccountIdRequest) { + request.launch { + val account = CoreAccountService.get().getAccountByAccountId(request.accountId) + request.respond(GetAccountByAccountIdResponse(account as? CoreAccountImpl)) + } + } + + @RabbitHandler + fun handleGetAccountByName(request: GetAccountByNameRequest) { + request.launch { + val account = CoreAccountService.get().getAccountByName(request.name) + request.respond(GetAccountByNameResponse(account as? CoreAccountImpl)) + } + } + + @RabbitHandler + fun handleCreateAccount(request: CreateAccountRequest) { + request.launch { + val result = CoreAccountService.get().createAccount(request.ownerUuid, request.name) + val (account, failureReason) = when (result) { + is dev.slne.surf.transaction.api.account.result.AccountCreationResult.Success -> + (result.account as? CoreAccountImpl) to null + is dev.slne.surf.transaction.api.account.result.AccountCreationResult.Failed -> + null to result.reason + } + request.respond(CreateAccountResponse(account, failureReason)) + } + } + + @RabbitHandler + fun handleGetDefaultAccount(request: GetDefaultAccountRequest) { + request.launch { + val account = CoreAccountService.get().getDefaultAccount(request.playerUuid) + request.respond(GetDefaultAccountResponse(account as CoreAccountImpl)) + } + } + + @RabbitHandler + fun handleGetAllAccountsByOwner(request: GetAllAccountsByOwnerRequest) { + request.launch { + val accounts = CoreAccountService.get().getAllAccountsByOwner(request.ownerUuid) + request.respond(GetAllAccountsByOwnerResponse(accounts.filterIsInstance())) + } + } + + @RabbitHandler + fun handleDeleteAccount(request: DeleteAccountRequest) { + request.launch { + val account = AccountService.instance.getAccountByAccountId(request.accountId) + val result = if (account != null) { + CoreAccountService.get().deleteAccount(account) + } else { + dev.slne.surf.transaction.api.account.result.AccountDeleteResult.ACCOUNT_NOT_FOUND + } + request.respond(DeleteAccountResponse(result)) + } + } + + @RabbitHandler + fun handleAddMemberToAccount(request: AddMemberToAccountRequest) { + request.launch { + val result = CoreAccountService.get().addMemberToAccount( + request.accountId, + request.executor, + request.target + ) + request.respond(AddMemberToAccountResponse(result)) + } + } + + @RabbitHandler + fun handleRemoveMemberFromAccount(request: RemoveMemberFromAccountRequest) { + request.launch { + val result = CoreAccountService.get().removeMemberFromAccount( + request.accountId, + request.executor, + request.target + ) + request.respond(RemoveMemberFromAccountResponse(result)) + } + } + + @RabbitHandler + fun handleCompleteAccountNameSuggestions(request: CompleteAccountNameSuggestionsRequest) { + request.launch { + val suggestions = CoreAccountService.get().completeAccountNameSuggestions( + request.input, + request.maxSuggestions + ) + request.respond(CompleteAccountNameSuggestionsResponse(suggestions)) + } + } + + // ─── Currency handlers ─────────────────────────────────────────────────── + + @RabbitHandler + fun handleGetAllCurrencies(request: GetAllCurrenciesRequest) { + request.launch { + val currencies = + CoreCurrencyService.get().currencies.filterIsInstance() + val defaultCurrencyName = CoreCurrencyService.get().defaultCurrency.name + request.respond(GetAllCurrenciesResponse(currencies, defaultCurrencyName)) + } + } + + @RabbitHandler + fun handleCreateCurrency(request: CreateCurrencyRequest) { + request.launch { + val result = CoreCurrencyService.get().createCurrency(request.currency) + request.respond(CreateCurrencyResponse(result)) + } + } + + @RabbitHandler + fun handleMakeDefaultCurrency(request: MakeDefaultCurrencyRequest) { + request.launch { + val currency = CurrencyService.instance.getCurrencyByName(request.currencyName) + val result = if (currency != null) { + CoreCurrencyService.get().makeDefaultCurrency( + currency as dev.slne.surf.transaction.core.currency.CurrencyImpl + ) + } else { + dev.slne.surf.transaction.core.currency.CurrencyDefaultResult.NOT_FOUND + } + request.respond(MakeDefaultCurrencyResponse(result)) + } + } + + // ─── Transaction handlers ──────────────────────────────────────────────── + + @RabbitHandler + fun handleDeposit(request: DepositRequest) { + request.launch { + val account = AccountService.instance.getAccountByAccountId(request.accountId) + ?: error("Account not found: ${request.accountId}") + val currency = CurrencyService.instance.getCurrencyByName(request.currencyName) + ?: error("Currency not found: ${request.currencyName}") + + val result = CoreTransactionService.get().deposit( + account, + request.initiator, + request.amount, + currency, + request.ignoreMinimum, + *request.additionalData.toTypedArray() + ) + request.respond(DepositResponse(result.toPacket())) + } + } + + @RabbitHandler + fun handleWithdraw(request: WithdrawRequest) { + request.launch { + val account = AccountService.instance.getAccountByAccountId(request.accountId) + ?: error("Account not found: ${request.accountId}") + val currency = CurrencyService.instance.getCurrencyByName(request.currencyName) + ?: error("Currency not found: ${request.currencyName}") + + val result = CoreTransactionService.get().withdraw( + account, + request.initiator, + request.amount, + currency, + request.ignoreMinimum, + *request.additionalData.toTypedArray() + ) + request.respond(WithdrawResponse(result.toPacket())) + } + } + + @RabbitHandler + fun handleTransfer(request: TransferRequest) { + request.launch { + val sender = AccountService.instance.getAccountByAccountId(request.senderAccountId) + ?: error("Sender account not found: ${request.senderAccountId}") + val receiver = AccountService.instance.getAccountByAccountId(request.receiverAccountId) + ?: error("Receiver account not found: ${request.receiverAccountId}") + val currency = CurrencyService.instance.getCurrencyByName(request.currencyName) + ?: error("Currency not found: ${request.currencyName}") + + val result = CoreTransactionService.get().transfer( + request.initiator, + sender, + request.amount, + currency, + receiver, + request.ignoreSenderMinimum, + request.ignoreReceiverMinimum, + request.additionalSenderData, + request.additionalReceiverData + ) + request.respond(TransferResponse(result.toPacket())) + } + } + + @RabbitHandler + fun handleBalance(request: BalanceRequest) { + request.launch { + val account = AccountService.instance.getAccountByAccountId(request.accountId) + ?: error("Account not found: ${request.accountId}") + val currency = CurrencyService.instance.getCurrencyByName(request.currencyName) + ?: error("Currency not found: ${request.currencyName}") + + val balance = CoreTransactionService.get().balance(account, currency) + request.respond(BalanceResponse(balance)) + } + } + + private fun TransactionResult.toPacket(): TransactionResultPacket = when (this) { + is TransactionResult.Success -> + TransactionResultPacket.Success(transaction as dev.slne.surf.transaction.core.transaction.TransactionImpl) + is TransactionResult.TransferSuccess -> + TransactionResultPacket.TransferSuccess( + senderTransaction as dev.slne.surf.transaction.core.transaction.TransactionImpl, + receiverTransaction as dev.slne.surf.transaction.core.transaction.TransactionImpl + ) + TransactionResult.ReceiverInsufficientFunds -> + TransactionResultPacket.ReceiverInsufficientFunds + TransactionResult.SenderInsufficientFunds -> + TransactionResultPacket.SenderInsufficientFunds + is TransactionResult.DatabaseError -> + TransactionResultPacket.DatabaseError(cause.message ?: "Unknown error") + } +} diff --git a/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/redis/MicroserviceRedisService.kt b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/redis/MicroserviceRedisService.kt new file mode 100644 index 0000000..9ba3c0b --- /dev/null +++ b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/redis/MicroserviceRedisService.kt @@ -0,0 +1,18 @@ +package dev.slne.surf.transaction.microservice.redis + +import com.google.auto.service.AutoService +import dev.slne.surf.transaction.core.db.account.AccountRepository +import dev.slne.surf.transaction.core.db.currency.CurrencyRepository +import dev.slne.surf.transaction.core.db.transaction.TransactionRepository +import dev.slne.surf.transaction.core.redis.RedisService + +@AutoService(RedisService::class) +class MicroserviceRedisService : RedisService() { + override fun register() { + super.register() + + CurrencyRepository.init() + AccountRepository.init() + TransactionRepository.init() + } +} diff --git a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/transaction/TransactionServiceImpl.kt b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/transaction/TransactionServiceImpl.kt similarity index 88% rename from surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/transaction/TransactionServiceImpl.kt rename to surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/transaction/TransactionServiceImpl.kt index f182ada..2296668 100644 --- a/surf-transaction-core/src/main/kotlin/dev/slne/surf/transaction/core/transaction/TransactionServiceImpl.kt +++ b/surf-transaction-microservice/src/main/kotlin/dev/slne/surf/transaction/microservice/transaction/TransactionServiceImpl.kt @@ -1,4 +1,4 @@ -package dev.slne.surf.transaction.core.transaction +package dev.slne.surf.transaction.microservice.transaction import com.google.auto.service.AutoService import dev.slne.surf.transaction.api.account.Account @@ -7,12 +7,14 @@ import dev.slne.surf.transaction.api.transaction.TransactionResult import dev.slne.surf.transaction.api.transaction.TransactionService import dev.slne.surf.transaction.api.transaction.data.TransactionData import dev.slne.surf.transaction.core.db.transaction.TransactionRepository +import dev.slne.surf.transaction.core.transaction.CoreTransactionService +import dev.slne.surf.transaction.core.transaction.TransactionImpl import java.math.BigDecimal import java.util.UUID @AutoService(TransactionService::class) -class TransactionServiceImpl: TransactionService { - suspend fun deposit( +class TransactionServiceImpl : CoreTransactionService { + override suspend fun deposit( account: Account, initiator: UUID, amount: BigDecimal, @@ -34,7 +36,7 @@ class TransactionServiceImpl: TransactionService { return TransactionRepository.persistTransaction(transaction) } - suspend fun withdraw( + override suspend fun withdraw( account: Account, initiator: UUID, amount: BigDecimal, @@ -58,7 +60,7 @@ class TransactionServiceImpl: TransactionService { return TransactionRepository.persistTransaction(transaction) } - suspend fun transfer( + override suspend fun transfer( initiator: UUID, sender: Account, amount: BigDecimal, @@ -97,14 +99,11 @@ class TransactionServiceImpl: TransactionService { return TransactionRepository.transfer(senderTransaction, receiverTransaction) } - suspend fun balance( - account: Account, - currency: Currency - ): BigDecimal { + override suspend fun balance(account: Account, currency: Currency): BigDecimal { return TransactionRepository.balanceDecimal(account.accountId, currency) } companion object { fun get() = TransactionService.instance as TransactionServiceImpl } -} \ No newline at end of file +} diff --git a/surf-transaction-paper/build.gradle.kts b/surf-transaction-paper/build.gradle.kts index 873e3c1..b9744b5 100644 --- a/surf-transaction-paper/build.gradle.kts +++ b/surf-transaction-paper/build.gradle.kts @@ -1,9 +1,16 @@ +import dev.slne.surf.microservice.gradle.plugin.rabbit.RabbitModule + plugins { id("dev.slne.surf.surfapi.gradle.paper-plugin") + id("dev.slne.surf.microservice") +} + +surfMicroservice { + withRabbitModule(RabbitModule.CLIENT_API) } dependencies { - api(project(":surf-transaction-core")) + api(project(":surf-transaction-core:surf-transaction-core-client")) } surfPaperPluginApi { @@ -12,4 +19,5 @@ surfPaperPluginApi { generateLibraryLoader(false) foliaSupported(true) withSurfRedis() + withCorePaper() } \ No newline at end of file diff --git a/surf-transaction-paper/src/main/kotlin/dev/slne/surf/transaction/paper/commands/account/arguments/AccountArgument.kt b/surf-transaction-paper/src/main/kotlin/dev/slne/surf/transaction/paper/commands/account/arguments/AccountArgument.kt index 2137092..2d19119 100644 --- a/surf-transaction-paper/src/main/kotlin/dev/slne/surf/transaction/paper/commands/account/arguments/AccountArgument.kt +++ b/surf-transaction-paper/src/main/kotlin/dev/slne/surf/transaction/paper/commands/account/arguments/AccountArgument.kt @@ -10,7 +10,7 @@ import dev.jorel.commandapi.arguments.ArgumentSuggestions import dev.jorel.commandapi.arguments.StringArgument import dev.slne.surf.surfapi.bukkit.api.command.args.SuspendCustomArgument import dev.slne.surf.transaction.api.account.Account -import dev.slne.surf.transaction.core.account.AccountServiceImpl +import dev.slne.surf.transaction.core.account.CoreAccountService import dev.slne.surf.transaction.paper.plugin import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.future.future @@ -42,7 +42,7 @@ class AccountArgument(nodeName: String) : ): CompletableFuture = plugin.scope.future { val currentInput = info.currentInput val suggestions = - AccountServiceImpl.get().completeAccountNameSuggestions(currentInput, 100) + CoreAccountService.get().completeAccountNameSuggestions(currentInput, 100) for (suggestion in suggestions) { builder.suggest(suggestion) diff --git a/surf-transaction-paper/src/main/kotlin/dev/slne/surf/transaction/paper/commands/currency/admin/subcommands/CurrencyCreateCommand.kt b/surf-transaction-paper/src/main/kotlin/dev/slne/surf/transaction/paper/commands/currency/admin/subcommands/CurrencyCreateCommand.kt index 41d87c4..da64b23 100644 --- a/surf-transaction-paper/src/main/kotlin/dev/slne/surf/transaction/paper/commands/currency/admin/subcommands/CurrencyCreateCommand.kt +++ b/surf-transaction-paper/src/main/kotlin/dev/slne/surf/transaction/paper/commands/currency/admin/subcommands/CurrencyCreateCommand.kt @@ -14,7 +14,7 @@ import dev.slne.surf.transaction.api.currency.Currency import dev.slne.surf.transaction.api.currency.CurrencyScale import dev.slne.surf.transaction.core.component.Components import dev.slne.surf.transaction.core.currency.CurrencyImpl -import dev.slne.surf.transaction.core.currency.CurrencyServiceImpl +import dev.slne.surf.transaction.core.currency.CoreCurrencyService import dev.slne.surf.transaction.paper.commands.CommandPermission import dev.slne.surf.transaction.paper.commands.arguments.currencyScaleArgument import dev.slne.surf.transaction.paper.commands.arguments.getCurrencyScale @@ -77,7 +77,7 @@ private suspend fun create( minimumAmount = minimumAmount.toBigDecimal() ) - val result = CurrencyServiceImpl.get().createCurrency(currency) + val result = CoreCurrencyService.get().createCurrency(currency) sender.sendText { appendPrefix() diff --git a/surf-transaction-paper/src/main/kotlin/dev/slne/surf/transaction/paper/commands/currency/admin/subcommands/CurrencyMakeDefaultCommand.kt b/surf-transaction-paper/src/main/kotlin/dev/slne/surf/transaction/paper/commands/currency/admin/subcommands/CurrencyMakeDefaultCommand.kt index d372b0d..be307f1 100644 --- a/surf-transaction-paper/src/main/kotlin/dev/slne/surf/transaction/paper/commands/currency/admin/subcommands/CurrencyMakeDefaultCommand.kt +++ b/surf-transaction-paper/src/main/kotlin/dev/slne/surf/transaction/paper/commands/currency/admin/subcommands/CurrencyMakeDefaultCommand.kt @@ -8,7 +8,7 @@ import dev.slne.surf.surfapi.core.api.messages.adventure.sendText import dev.slne.surf.transaction.api.currency.Currency import dev.slne.surf.transaction.core.component.Components import dev.slne.surf.transaction.core.currency.CurrencyImpl -import dev.slne.surf.transaction.core.currency.CurrencyServiceImpl +import dev.slne.surf.transaction.core.currency.CoreCurrencyService import dev.slne.surf.transaction.paper.commands.CommandPermission import dev.slne.surf.transaction.paper.commands.arguments.currencyArgument import org.bukkit.command.CommandSender @@ -28,7 +28,7 @@ private suspend fun makeDefault(sender: CommandSender, currency: Currency) { throw CommandAPI.failWithString("Currency '${currency.name}' is already the default currency.") } - val result = CurrencyServiceImpl.get().makeDefaultCurrency(currency as CurrencyImpl) + val result = CoreCurrencyService.get().makeDefaultCurrency(currency as CurrencyImpl) sender.sendText { appendPrefix() diff --git a/surf-transaction-velocity/build.gradle.kts b/surf-transaction-velocity/build.gradle.kts index be4e0c8..2ebcd75 100644 --- a/surf-transaction-velocity/build.gradle.kts +++ b/surf-transaction-velocity/build.gradle.kts @@ -1,9 +1,17 @@ +import dev.slne.surf.microservice.gradle.plugin.rabbit.RabbitModule + plugins { id("dev.slne.surf.surfapi.gradle.velocity") + id("dev.slne.surf.microservice") } surfVelocityApi { withSurfRedis() + withCoreVelocity() +} + +surfMicroservice { + withRabbitModule(RabbitModule.CLIENT_API) } velocityPluginFile { @@ -11,5 +19,5 @@ velocityPluginFile { } dependencies { - api(project(":surf-transaction-core")) + api(project(":surf-transaction-core:surf-transaction-core-client")) } \ No newline at end of file From b1ef39f50fffebb6f0bad4015209c753821e1e4b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Mar 2026 13:44:39 +0000 Subject: [PATCH 3/3] Remove unused imports in RabbitMQ packet files Co-authored-by: twisti-dev <76837088+twisti-dev@users.noreply.github.com> Agent-Logs-Url: https://github.com/SLNE-Development/surf-transaction/sessions/76a093c8-452c-41a7-b164-eaa167e15e4b --- .../core/rabbit/account/GetAccountByAccountIdPackets.kt | 1 - .../surf/transaction/core/rabbit/transaction/DepositPackets.kt | 2 -- 2 files changed, 3 deletions(-) diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/GetAccountByAccountIdPackets.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/GetAccountByAccountIdPackets.kt index dacdada..b08f4f5 100644 --- a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/GetAccountByAccountIdPackets.kt +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/account/GetAccountByAccountIdPackets.kt @@ -5,7 +5,6 @@ import dev.slne.surf.rabbitmq.packet.RabbitResponsePacket import dev.slne.surf.surfapi.core.api.serializer.java.uuid.SerializableStringUUID import dev.slne.surf.transaction.core.account.AccountImpl import kotlinx.serialization.Serializable -import java.util.UUID @Serializable class GetAccountByAccountIdRequest(val accountId: SerializableStringUUID) : diff --git a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/DepositPackets.kt b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/DepositPackets.kt index a971aed..43bc8fd 100644 --- a/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/DepositPackets.kt +++ b/surf-transaction-core/surf-transaction-core-common/src/main/kotlin/dev/slne/surf/transaction/core/rabbit/transaction/DepositPackets.kt @@ -6,8 +6,6 @@ import dev.slne.surf.surfapi.core.api.serializer.java.number.bigdecimal.Serializ import dev.slne.surf.surfapi.core.api.serializer.java.uuid.SerializableStringUUID import dev.slne.surf.transaction.api.transaction.data.TransactionData import kotlinx.serialization.Serializable -import java.math.BigDecimal -import java.util.UUID @Serializable class DepositRequest(