From ec5c7ece21777ec627880330abe7be891ceb67d4 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 5 Dec 2021 14:41:02 +0330 Subject: [PATCH 001/169] Add referral module structure --- pom.xml | 1 + referral/pom.xml | 20 +++++++++++++++++++ referral/referral-app/pom.xml | 16 +++++++++++++++ .../referral-persister-postgres/pom.xml | 18 +++++++++++++++++ 4 files changed, 55 insertions(+) create mode 100644 referral/pom.xml create mode 100644 referral/referral-app/pom.xml create mode 100644 referral/referral-ports/referral-persister-postgres/pom.xml diff --git a/pom.xml b/pom.xml index f0d2fef1a..1b55304bb 100644 --- a/pom.xml +++ b/pom.xml @@ -28,6 +28,7 @@ utility wallet websocket + referral diff --git a/referral/pom.xml b/referral/pom.xml new file mode 100644 index 000000000..706f44631 --- /dev/null +++ b/referral/pom.xml @@ -0,0 +1,20 @@ + + + + OPEX-Core + co.nilin.opex + 1.0-SNAPSHOT + + 4.0.0 + + co.nilin.opex.referral + referral + pom + + referral-app + referral-ports/referral-persister-postgres + + + \ No newline at end of file diff --git a/referral/referral-app/pom.xml b/referral/referral-app/pom.xml new file mode 100644 index 000000000..e9ba31162 --- /dev/null +++ b/referral/referral-app/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + + + referral + co.nilin.opex.referral + 1.0-SNAPSHOT + + + co.nilin.opex.referral.app + referral-app + + \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/pom.xml b/referral/referral-ports/referral-persister-postgres/pom.xml new file mode 100644 index 000000000..a355664cd --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/pom.xml @@ -0,0 +1,18 @@ + + + 4.0.0 + + + referral + co.nilin.opex.referral + 1.0-SNAPSHOT + ../../pom.xml + + + co.nilin.opex.referral.ports.postgres + referral-persister-postgres + referral-persister-postgres + + \ No newline at end of file From 6414eea1006af368f2b85f1777d65a5e4f2bdba4 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 5 Dec 2021 15:48:22 +0330 Subject: [PATCH 002/169] Add spring dependency --- bc-gateway/bc-gateway-app/pom.xml | 5 --- referral/pom.xml | 32 ++++++++++++++ referral/referral-app/pom.xml | 72 +++++++++++++++++++++++++++++++ 3 files changed, 104 insertions(+), 5 deletions(-) diff --git a/bc-gateway/bc-gateway-app/pom.xml b/bc-gateway/bc-gateway-app/pom.xml index 3bbcc3e7c..c4f36f94d 100644 --- a/bc-gateway/bc-gateway-app/pom.xml +++ b/bc-gateway/bc-gateway-app/pom.xml @@ -31,11 +31,6 @@ com.fasterxml.jackson.module jackson-module-kotlin - - - org.jetbrains.kotlin - kotlin-stdlib - io.projectreactor.kotlin reactor-kotlin-extensions diff --git a/referral/pom.xml b/referral/pom.xml index 706f44631..e8938a8ab 100644 --- a/referral/pom.xml +++ b/referral/pom.xml @@ -12,9 +12,41 @@ co.nilin.opex.referral referral pom + referral-app referral-ports/referral-persister-postgres + + + org.springframework.boot + spring-boot-starter-test + + + + + + + co.nilin.opex.referral.ports.postgres + referral-persister-postgres + ${project.version} + + + co.nilin.opex.utility.error + error-handler + ${project.version} + + + co.nilin.opex.utility.log + logging-handler + ${project.version} + + + co.nilin.opex.utility.interceptors + interceptors + ${project.version} + + + \ No newline at end of file diff --git a/referral/referral-app/pom.xml b/referral/referral-app/pom.xml index e9ba31162..8216269ae 100644 --- a/referral/referral-app/pom.xml +++ b/referral/referral-app/pom.xml @@ -13,4 +13,76 @@ co.nilin.opex.referral.app referral-app + + 2020.0.2 + + + + + org.jetbrains.kotlin + kotlin-reflect + + + org.springframework.boot + spring-boot-starter-webflux + + + io.projectreactor.kotlin + reactor-kotlin-extensions + + + org.jetbrains.kotlinx + kotlinx-coroutines-reactor + + + org.jetbrains.kotlinx + kotlinx-coroutines-core + + + io.projectreactor + reactor-test + test + + + org.springframework.cloud + spring-cloud-starter-consul-all + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-oauth2-resource-server + + + co.nilin.opex.referral.ports.postgres + referral-persister-postgres + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + \ No newline at end of file From 36c827e1fd99ffc8ab699d06a6d09b33115b3bd5 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 5 Dec 2021 15:51:09 +0330 Subject: [PATCH 003/169] Add referral application entrance --- .../co/nilin/opex/referral/app/ReferralApp.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/ReferralApp.kt diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/ReferralApp.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/ReferralApp.kt new file mode 100644 index 000000000..39ebd6d2b --- /dev/null +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/ReferralApp.kt @@ -0,0 +1,13 @@ +package co.nilin.opex.referral.app + +import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.runApplication +import org.springframework.context.annotation.ComponentScan + +@SpringBootApplication +@ComponentScan("co.nilin.opex") +class ReferralApp + +fun main(args: Array) { + runApplication(*args) +} \ No newline at end of file From 3dcc574508bb2a2e0105229c1a419580e45dd58b Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 6 Dec 2021 10:22:25 +0330 Subject: [PATCH 004/169] Add database structure --- referral/referral-app/pom.xml | 4 --- .../referral-persister-postgres/pom.xml | 29 +++++++++++++++++++ .../ports/postgres/config/PostgresConfig.kt | 24 +++++++++++++++ .../src/main/resources/schema.sql | 0 4 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/config/PostgresConfig.kt create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql diff --git a/referral/referral-app/pom.xml b/referral/referral-app/pom.xml index 8216269ae..cf1a1509e 100644 --- a/referral/referral-app/pom.xml +++ b/referral/referral-app/pom.xml @@ -18,10 +18,6 @@ - - org.jetbrains.kotlin - kotlin-reflect - org.springframework.boot spring-boot-starter-webflux diff --git a/referral/referral-ports/referral-persister-postgres/pom.xml b/referral/referral-ports/referral-persister-postgres/pom.xml index a355664cd..a8eac0c28 100644 --- a/referral/referral-ports/referral-persister-postgres/pom.xml +++ b/referral/referral-ports/referral-persister-postgres/pom.xml @@ -15,4 +15,33 @@ referral-persister-postgres referral-persister-postgres + + + + org.jetbrains.kotlin + kotlin-reflect + + + org.springframework.boot + spring-boot-starter-data-r2dbc + + + io.r2dbc + r2dbc-postgresql + runtime + + + org.postgresql + postgresql + runtime + + + io.projectreactor.kotlin + reactor-kotlin-extensions + + + org.jetbrains.kotlinx + kotlinx-coroutines-reactor + + \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/config/PostgresConfig.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/config/PostgresConfig.kt new file mode 100644 index 000000000..67bbce13f --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/config/PostgresConfig.kt @@ -0,0 +1,24 @@ +package co.nilin.opex.referral.ports.postgres.config + +import org.springframework.beans.factory.annotation.Value +import org.springframework.context.annotation.Configuration +import org.springframework.core.io.Resource +import org.springframework.data.r2dbc.repository.config.EnableR2dbcRepositories +import org.springframework.r2dbc.core.DatabaseClient + +@Configuration +@EnableR2dbcRepositories(basePackages = ["co.nilin.opex"]) +class PostgresConfig( + db: DatabaseClient, + @Value("classpath:schema.sql") private val schemaResource: Resource, +) { + init { + val schemaReader = schemaResource.inputStream.reader() + val schema = schemaReader.readText().trim() + schemaReader.close() + val initDb = db.sql { schema } + initDb // initialize the database + .then() + .subscribe() // execute + } +} diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql new file mode 100644 index 000000000..e69de29bb From e347f2357cb70e632e4314e3ac2f82dcd4a8b6cc Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 6 Dec 2021 13:11:39 +0330 Subject: [PATCH 005/169] Add kafka event listener --- referral/pom.xml | 11 ++++ .../referral-eventlistener-kafka/pom.xml | 53 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 referral/referral-ports/referral-eventlistener-kafka/pom.xml diff --git a/referral/pom.xml b/referral/pom.xml index e8938a8ab..900e79713 100644 --- a/referral/pom.xml +++ b/referral/pom.xml @@ -16,6 +16,7 @@ referral-app referral-ports/referral-persister-postgres + referral-ports/referral-eventlistener-kafka @@ -27,6 +28,16 @@ + + co.nilin.opex.accountant.core + accountant-core + ${project.version} + + + co.nilin.opex.matching.engine.core + matching-engine-core + ${project.version} + co.nilin.opex.referral.ports.postgres referral-persister-postgres diff --git a/referral/referral-ports/referral-eventlistener-kafka/pom.xml b/referral/referral-ports/referral-eventlistener-kafka/pom.xml new file mode 100644 index 000000000..814f07332 --- /dev/null +++ b/referral/referral-ports/referral-eventlistener-kafka/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + + + co.nilin.opex.referral + referral + 1.0-SNAPSHOT + ../../pom.xml + + + co.nilin.opex.referral.ports.kafka.listener + referral-eventlistener-kafka + referral-eventlistener-kafka + Referral kafka listener of Opex + + + + org.springframework.boot + spring-boot-starter + + + co.nilin.opex.matching.engine.core + matching-engine-core + + + co.nilin.opex.accountant.core + accountant-core + + + org.springframework.kafka + spring-kafka + + + io.projectreactor.kotlin + reactor-kotlin-extensions + + + org.jetbrains.kotlinx + kotlinx-coroutines-reactor + + + org.jetbrains.kotlinx + kotlinx-coroutines-core + + + org.springframework.kafka + spring-kafka-test + test + + + From 7a49d791f5bf1b1eab2163734fba4656080e4b30 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 6 Dec 2021 13:58:11 +0330 Subject: [PATCH 006/169] Add spring config --- .../src/main/resources/application-docker.yml | 10 +++++++ .../src/main/resources/application.yml | 29 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 referral/referral-app/src/main/resources/application-docker.yml create mode 100644 referral/referral-app/src/main/resources/application.yml diff --git a/referral/referral-app/src/main/resources/application-docker.yml b/referral/referral-app/src/main/resources/application-docker.yml new file mode 100644 index 000000000..d61be7f6c --- /dev/null +++ b/referral/referral-app/src/main/resources/application-docker.yml @@ -0,0 +1,10 @@ +spring: + kafka: + bootstrap-servers: ${KAFKA_IP_PORT} + r2dbc: + url: r2dbc:postgresql://${DB_IP_PORT}/opex_accountant + username: opex + password: hiopex + cloud: + consul: + host: ${CONSUL_HOST} \ No newline at end of file diff --git a/referral/referral-app/src/main/resources/application.yml b/referral/referral-app/src/main/resources/application.yml new file mode 100644 index 000000000..6a4196f4a --- /dev/null +++ b/referral/referral-app/src/main/resources/application.yml @@ -0,0 +1,29 @@ +server.port: 8089 +logging: + level: + co.nilin: DEBUG + reactor.netty.http.client: DEBUG +spring: + application: + name: opex-referral + main: + allow-bean-definition-overriding: false + kafka: + bootstrap-servers: 192.168.178.29:9092 + consumer: + group-id: referral + r2dbc: + url: r2dbc:postgresql://localhost/opex_referral + username: opex + password: hiopex + initialization-mode: always + cloud: + bootstrap: + enabled: true + consul: + port: 8500 + discovery: + #healthCheckPath: ${management.context-path}/health + instance-id: ${spring.application.name}:${server.port} + healthCheckInterval: 20s + prefer-ip-address: true From 94f7ea1cf33428a5641178db356f912dd417e753 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 6 Dec 2021 15:51:35 +0330 Subject: [PATCH 007/169] Add docker file --- referral/referral-app/Dockerfile | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 referral/referral-app/Dockerfile diff --git a/referral/referral-app/Dockerfile b/referral/referral-app/Dockerfile new file mode 100644 index 000000000..f2cbd4c26 --- /dev/null +++ b/referral/referral-app/Dockerfile @@ -0,0 +1,5 @@ +FROM openjdk:8-jdk-alpine +VOLUME /tmp +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app.jar"] \ No newline at end of file From d0fe403ccc5aa81c1be0f8c005698b3ce6509ba8 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 7 Dec 2021 12:31:18 +0330 Subject: [PATCH 008/169] Add event listener module --- referral/pom.xml | 5 ++ referral/referral-app/pom.xml | 4 ++ .../kafka/listener/config/KafkaConfig.kt | 70 +++++++++++++++++++ .../listener/consumer/TradeKafkaListener.kt | 28 ++++++++ .../kafka/listener/spi/RichTradeListener.kt | 8 +++ 5 files changed, 115 insertions(+) create mode 100644 referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/config/KafkaConfig.kt create mode 100644 referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/consumer/TradeKafkaListener.kt create mode 100644 referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/spi/RichTradeListener.kt diff --git a/referral/pom.xml b/referral/pom.xml index 900e79713..a11f46b56 100644 --- a/referral/pom.xml +++ b/referral/pom.xml @@ -43,6 +43,11 @@ referral-persister-postgres ${project.version} + + co.nilin.opex.referral.ports.kafka.listener + referral-eventlistener-kafka + ${project.version} + co.nilin.opex.utility.error error-handler diff --git a/referral/referral-app/pom.xml b/referral/referral-app/pom.xml index cf1a1509e..563e3d8ac 100644 --- a/referral/referral-app/pom.xml +++ b/referral/referral-app/pom.xml @@ -55,6 +55,10 @@ org.springframework.boot spring-boot-starter-oauth2-resource-server + + co.nilin.opex.referral.ports.kafka.listener + referral-eventlistener-kafka + co.nilin.opex.referral.ports.postgres referral-persister-postgres diff --git a/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/config/KafkaConfig.kt b/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/config/KafkaConfig.kt new file mode 100644 index 000000000..3ef6d738c --- /dev/null +++ b/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/config/KafkaConfig.kt @@ -0,0 +1,70 @@ +package co.nilin.opex.referral.ports.kafka.listener.config + +import co.nilin.opex.matching.engine.core.eventh.events.CoreEvent +import co.nilin.opex.referral.ports.kafka.listener.spi.RichTradeListener +import org.apache.kafka.clients.consumer.ConsumerConfig +import org.apache.kafka.clients.producer.ProducerConfig +import org.apache.kafka.common.serialization.StringDeserializer +import org.apache.kafka.common.serialization.StringSerializer +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.beans.factory.annotation.Value +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.kafka.core.ConsumerFactory +import org.springframework.kafka.core.DefaultKafkaConsumerFactory +import org.springframework.kafka.listener.ConcurrentMessageListenerContainer +import org.springframework.kafka.listener.ContainerProperties +import org.springframework.kafka.support.serializer.JsonDeserializer +import org.springframework.kafka.support.serializer.JsonSerializer +import java.util.regex.Pattern + +@Configuration +class KafkaConfig { + @Value("\${spring.kafka.bootstrap-servers}") + private val bootstrapServers: String? = null + + @Value("\${spring.kafka.consumer.group-id}") + private val groupId: String? = null + + @Bean("referralConsumerConfig") + fun consumerConfigs(): Map? { + val props: MutableMap = HashMap() + props[ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG] = bootstrapServers + props[ConsumerConfig.GROUP_ID_CONFIG] = groupId + props[ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG] = StringDeserializer::class.java + props[ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG] = JsonDeserializer::class.java + props[JsonDeserializer.TRUSTED_PACKAGES] = "co.nilin.opex.*" + props[JsonDeserializer.TYPE_MAPPINGS] = + "order_request:co.nilin.opex.referral.ports.kafka.listener.inout.OrderSubmitRequest" + return props + } + + @Bean("referralConsumerFactory") + fun consumerFactory(@Qualifier("referralConsumerConfig") consumerConfigs: Map): ConsumerFactory { + return DefaultKafkaConsumerFactory(consumerConfigs) + } + + @Bean("referralProducerConfig") + fun producerConfigs(): Map { + val props: MutableMap = HashMap() + props[ProducerConfig.BOOTSTRAP_SERVERS_CONFIG] = bootstrapServers + props[ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG] = StringSerializer::class.java + props[ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG] = JsonSerializer::class.java + return props + } + + @Autowired + @ConditionalOnBean(RichTradeListener::class) + fun configureTradeListener( + tradeListener: RichTradeListener, + @Qualifier("referralConsumerFactory") consumerFactory: ConsumerFactory + ) { + val containerProps = ContainerProperties(Pattern.compile("richTrade")) + containerProps.messageListener = tradeListener + val container = ConcurrentMessageListenerContainer(consumerFactory, containerProps) + container.beanName = "ReferralRichTradeKafkaListenerContainer" + container.start() + } +} \ No newline at end of file diff --git a/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/consumer/TradeKafkaListener.kt b/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/consumer/TradeKafkaListener.kt new file mode 100644 index 000000000..d6d57a09e --- /dev/null +++ b/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/consumer/TradeKafkaListener.kt @@ -0,0 +1,28 @@ +package co.nilin.opex.referral.ports.kafka.listener.consumer + +import co.nilin.opex.accountant.core.inout.RichTrade +import co.nilin.opex.referral.ports.kafka.listener.spi.RichTradeListener +import org.apache.kafka.clients.consumer.ConsumerRecord +import org.springframework.kafka.listener.MessageListener +import org.springframework.stereotype.Component + +@Component +class TradeKafkaListener : MessageListener { + val tradeListeners = arrayListOf() + + override fun onMessage(data: ConsumerRecord) { + tradeListeners.forEach { tl -> + tl.onTrade(data.value(), data.partition(), data.offset(), data.timestamp()) + } + } + + fun addTradeListener(tl: RichTradeListener) { + tradeListeners.add(tl) + } + + fun removeTradeListener(tl: RichTradeListener) { + tradeListeners.removeIf { item -> + item.id() == tl.id() + } + } +} \ No newline at end of file diff --git a/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/spi/RichTradeListener.kt b/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/spi/RichTradeListener.kt new file mode 100644 index 000000000..ed27ac129 --- /dev/null +++ b/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/spi/RichTradeListener.kt @@ -0,0 +1,8 @@ +package co.nilin.opex.referral.ports.kafka.listener.spi + +import co.nilin.opex.accountant.core.inout.RichTrade + +interface RichTradeListener { + fun id(): String + fun onTrade(trade: RichTrade, partition: Int, offset: Long, timestamp: Long) +} \ No newline at end of file From c9fb3faaafb034dbec84a19c42b61ebab1524b2c Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 7 Dec 2021 12:44:37 +0330 Subject: [PATCH 009/169] Add referral service to docker compose --- Deployment/docker-compose.dev.yml | 11 ++++ Deployment/docker-compose.override.yml | 55 ++++++++----------- Deployment/docker-compose.yml | 24 ++++++++ .../src/main/resources/application.yml | 2 +- 4 files changed, 58 insertions(+), 34 deletions(-) diff --git a/Deployment/docker-compose.dev.yml b/Deployment/docker-compose.dev.yml index c1d0b27c0..cea065ff6 100644 --- a/Deployment/docker-compose.dev.yml +++ b/Deployment/docker-compose.dev.yml @@ -51,6 +51,11 @@ services: - 127.0.0.1:5638:5432 networks: - opex-dev + postgres-referral: + ports: + - 127.0.0.1:5639:5432 + networks: + - opex-dev accountant: ports: - 127.0.0.1:8289:8089 @@ -110,6 +115,12 @@ services: - 127.0.0.1:1153:1044 networks: - opex-dev + referral: + ports: + - 127.0.0.1:8297:8097 + - 127.0.0.1:1154:1044 + networks: + - opex-dev nginx: ports: - 8086:80 diff --git a/Deployment/docker-compose.override.yml b/Deployment/docker-compose.override.yml index 27cfb9eeb..5f1d02aa1 100644 --- a/Deployment/docker-compose.override.yml +++ b/Deployment/docker-compose.override.yml @@ -51,92 +51,81 @@ services: - 127.0.0.1:5438:5432 networks: - opex + postgres-referral: + ports: + - 127.0.0.1:5439:5432 + networks: + - opex accountant: ports: - 127.0.0.1:8089:8089 - 127.0.0.1:1045:1044 networks: - opex: - aliases: - - accountant + - opex eventlog: ports: - 127.0.0.1:8090:8090 networks: - opex: - aliases: - - eventlog + - opex matching-engine: ports: - 127.0.0.1:8092:8092 - 127.0.0.1:1046:1044 networks: - opex: - aliases: - - matching-engine + - opex matching-gateway: ports: - 127.0.0.1:8093:8093 - 127.0.0.1:1047:1044 networks: - opex: - aliases: - - matching-gateway + - opex auth: ports: - 127.0.0.1:8083:8083 - 127.0.0.1:1048:1044 networks: - opex: - aliases: - - auth + - opex wallet: ports: - 127.0.0.1:8091:8091 - 127.0.0.1:1049:1044 networks: - opex: - aliases: - - wallet + - opex api: ports: - 127.0.0.1:8094:8094 - 127.0.0.1:1050:1044 networks: - opex: - aliases: - - api + - opex websocket: ports: - 127.0.0.1:8097:8097 - 127.0.0.1:1054:1044 networks: - opex: - aliases: - - websocket + - opex bc-gateway: ports: - 127.0.0.1:8095:8095 - 127.0.0.1:1052:1044 networks: - opex: - aliases: - - bc-gateway + - opex storage: ports: - 127.0.0.1:8096:8096 - 127.0.0.1:1053:1044 networks: - opex: - aliases: - - storage + - opex + referral: + ports: + - 127.0.0.1:8099:8097 + - 127.0.0.1:1058:1044 + networks: + - opex nginx: ports: - 80:80 networks: - opex: - aliases: - - opex_nginx + - opex networks: opex: driver: bridge diff --git a/Deployment/docker-compose.yml b/Deployment/docker-compose.yml index 56da1276c..5f1e42ca5 100644 --- a/Deployment/docker-compose.yml +++ b/Deployment/docker-compose.yml @@ -100,6 +100,17 @@ services: deploy: restart_policy: condition: on-failure + postgres-referral: + image: "postgres" + environment: + - POSTGRES_USER=opex + - POSTGRES_PASSWORD=hiopex + - POSTGRES_DB=opex_referral + volumes: + - $DATA/referral-data:/var/lib/postgresql/data/ + deploy: + restart_policy: + condition: on-failure accountant: build: context: ../accountant/accountant-app @@ -274,6 +285,19 @@ services: deploy: restart_policy: condition: on-failure + referral: + build: + context: ../referral/referral-app + dockerfile: Dockerfile + environment: + - JAVA_OPTS=-Xmx256m -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1044 + - SPRING_PROFILES_DEFAULT=docker + - CONSUL_HOST=consul + depends_on: + - consul + deploy: + restart_policy: + condition: on-failure nginx: image: jboesl/docker-nginx-headers-more volumes: diff --git a/referral/referral-app/src/main/resources/application.yml b/referral/referral-app/src/main/resources/application.yml index 6a4196f4a..4ae480a58 100644 --- a/referral/referral-app/src/main/resources/application.yml +++ b/referral/referral-app/src/main/resources/application.yml @@ -1,4 +1,4 @@ -server.port: 8089 +server.port: 8097 logging: level: co.nilin: DEBUG From d26feb6b5d398af4a3171bfc3bbf7fdfb463dbca Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 7 Dec 2021 12:59:37 +0330 Subject: [PATCH 010/169] Fix spring data source config --- Deployment/docker-compose.yml | 4 ++++ .../referral-app/src/main/resources/application-docker.yml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Deployment/docker-compose.yml b/Deployment/docker-compose.yml index 5f1e42ca5..659503052 100644 --- a/Deployment/docker-compose.yml +++ b/Deployment/docker-compose.yml @@ -293,8 +293,12 @@ services: - JAVA_OPTS=-Xmx256m -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1044 - SPRING_PROFILES_DEFAULT=docker - CONSUL_HOST=consul + - DB_IP_PORT=postgres-referral + - KAFKA_IP_PORT=kafka:9092 depends_on: - consul + - postgres-referral + - kafka deploy: restart_policy: condition: on-failure diff --git a/referral/referral-app/src/main/resources/application-docker.yml b/referral/referral-app/src/main/resources/application-docker.yml index d61be7f6c..93f5390e0 100644 --- a/referral/referral-app/src/main/resources/application-docker.yml +++ b/referral/referral-app/src/main/resources/application-docker.yml @@ -2,7 +2,7 @@ spring: kafka: bootstrap-servers: ${KAFKA_IP_PORT} r2dbc: - url: r2dbc:postgresql://${DB_IP_PORT}/opex_accountant + url: r2dbc:postgresql://${DB_IP_PORT}/opex_referral username: opex password: hiopex cloud: From 89307a8d5e8f982cbcd9205f79a643fe729bcb63 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 7 Dec 2021 15:59:23 +0330 Subject: [PATCH 011/169] Add kafka event listener base structure --- referral/pom.xml | 6 +++ referral/referral-app/pom.xml | 4 ++ .../opex/referral/app/config/AppConfig.kt | 50 +++++++++++++++++++ .../referral/app/config/AppDispatchers.kt | 8 +++ referral/referral-core/pom.xml | 39 +++++++++++++++ .../referral/core/model/CommissionReward.kt | 3 ++ .../core/spi/CommissionRewardPersister.kt | 7 +++ 7 files changed, 117 insertions(+) create mode 100644 referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt create mode 100644 referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppDispatchers.kt create mode 100644 referral/referral-core/pom.xml create mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt create mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardPersister.kt diff --git a/referral/pom.xml b/referral/pom.xml index a11f46b56..71d58c1c9 100644 --- a/referral/pom.xml +++ b/referral/pom.xml @@ -15,6 +15,7 @@ referral-app + referral-core referral-ports/referral-persister-postgres referral-ports/referral-eventlistener-kafka @@ -28,6 +29,11 @@ + + co.nilin.opex.referral.core + referral-core + ${project.version} + co.nilin.opex.accountant.core accountant-core diff --git a/referral/referral-app/pom.xml b/referral/referral-app/pom.xml index 563e3d8ac..4b566079b 100644 --- a/referral/referral-app/pom.xml +++ b/referral/referral-app/pom.xml @@ -55,6 +55,10 @@ org.springframework.boot spring-boot-starter-oauth2-resource-server + + co.nilin.opex.referral.core + referral-core + co.nilin.opex.referral.ports.kafka.listener referral-eventlistener-kafka diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt new file mode 100644 index 000000000..bcbcbe04f --- /dev/null +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt @@ -0,0 +1,50 @@ +package co.nilin.opex.referral.app.config + +import co.nilin.opex.accountant.core.inout.RichTrade +import co.nilin.opex.referral.core.spi.CommissionRewardPersister +import co.nilin.opex.referral.ports.kafka.listener.consumer.TradeKafkaListener +import co.nilin.opex.referral.ports.kafka.listener.spi.RichTradeListener +import kotlinx.coroutines.runBlocking +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration + +@Configuration +class AppConfig { + + @Bean + fun apiListener( + commissionRewardPersister: CommissionRewardPersister + ): ReferralListenerImpl { + return ReferralListenerImpl(commissionRewardPersister) + } + + @Autowired + fun configureListeners( + tradeKafkaListener: TradeKafkaListener, + appListener: ReferralListenerImpl + ) { + tradeKafkaListener.addTradeListener(appListener) + } + + class ReferralListenerImpl( + private val commissionRewardPersister: CommissionRewardPersister + ) : RichTradeListener { + + override fun id(): String { + return "ReferralListener" + } + + override fun onTrade( + trade: RichTrade, + partition: Int, + offset: Long, + timestamp: Long + ) { + println("RichTrade received") + runBlocking(AppDispatchers.kafkaExecutor) { + commissionRewardPersister.save(trade) + } + } + } +} \ No newline at end of file diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppDispatchers.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppDispatchers.kt new file mode 100644 index 000000000..6334d8d45 --- /dev/null +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppDispatchers.kt @@ -0,0 +1,8 @@ +package co.nilin.opex.referral.app.config + +import kotlinx.coroutines.asCoroutineDispatcher +import java.util.concurrent.Executors + +object AppDispatchers { + val kafkaExecutor = Executors.newSingleThreadExecutor().asCoroutineDispatcher() +} \ No newline at end of file diff --git a/referral/referral-core/pom.xml b/referral/referral-core/pom.xml new file mode 100644 index 000000000..131f4ccf1 --- /dev/null +++ b/referral/referral-core/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + + + referral + co.nilin.opex.referral + 1.0-SNAPSHOT + + + co.nilin.opex.referral.core + referral-core + referral-core + + + + co.nilin.opex.accountant.core + accountant-core + + + org.springframework.boot + spring-boot-starter-webflux + + + io.projectreactor.kotlin + reactor-kotlin-extensions + + + org.jetbrains.kotlinx + kotlinx-coroutines-reactor + + + org.jetbrains.kotlinx + kotlinx-coroutines-core + + + \ No newline at end of file diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt new file mode 100644 index 000000000..11cd5b83e --- /dev/null +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt @@ -0,0 +1,3 @@ +package co.nilin.opex.referral.core.model + +data class CommissionReward(var referrerUid: String, var referentUid: String, var tradeId: Long, var data: T) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardPersister.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardPersister.kt new file mode 100644 index 000000000..1c196faa2 --- /dev/null +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardPersister.kt @@ -0,0 +1,7 @@ +package co.nilin.opex.referral.core.spi + +import co.nilin.opex.accountant.core.inout.RichTrade + +interface CommissionRewardPersister { + suspend fun save(trade: RichTrade) +} \ No newline at end of file From fb065cb08afd36f4876411dd1f48b916da04db9f Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 8 Dec 2021 10:28:35 +0330 Subject: [PATCH 012/169] Update CommissionReward.kt --- .../co/nilin/opex/referral/core/model/CommissionReward.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt index 11cd5b83e..1daf2ae95 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt @@ -1,3 +1,5 @@ package co.nilin.opex.referral.core.model -data class CommissionReward(var referrerUid: String, var referentUid: String, var tradeId: Long, var data: T) +import co.nilin.opex.accountant.core.inout.RichTrade + +data class CommissionReward(var referrerUuid: String, var referentUuid: String, var richTrade: RichTrade) From d9661ea4b29d7293bc669ebb3be622bd79394c68 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 8 Dec 2021 11:24:22 +0330 Subject: [PATCH 013/169] Add referral model --- .../nilin/opex/referral/core/model/CommissionReward.kt | 7 ++++++- .../co/nilin/opex/referral/core/model/Referral.kt | 10 ++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Referral.kt diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt index 1daf2ae95..fb24fd9d4 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt @@ -2,4 +2,9 @@ package co.nilin.opex.referral.core.model import co.nilin.opex.accountant.core.inout.RichTrade -data class CommissionReward(var referrerUuid: String, var referentUuid: String, var richTrade: RichTrade) +data class CommissionReward( + var referrerUuid: String, + var referentUuid: String, + var referralCode: String, + var richTrade: RichTrade +) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Referral.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Referral.kt new file mode 100644 index 000000000..e81a97843 --- /dev/null +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Referral.kt @@ -0,0 +1,10 @@ +package co.nilin.opex.referral.core.model + +import java.math.BigDecimal + +data class Referral( + var id: Long?, + var code: String, + var referrerCommission: BigDecimal, + var referentCommission: BigDecimal +) From f6f54e855127b5f3eefc732b64b5da3f09a07519 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 8 Dec 2021 11:34:17 +0330 Subject: [PATCH 014/169] Add referral dao classes --- .../opex/referral/ports/postgres/dao/Config.kt | 11 +++++++++++ .../opex/referral/ports/postgres/dao/Referral.kt | 14 ++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referral.kt diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt new file mode 100644 index 000000000..b7fc7adfa --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt @@ -0,0 +1,11 @@ +package co.nilin.opex.referral.ports.postgres.dao + +import org.springframework.data.annotation.Id +import org.springframework.data.relational.core.mapping.Table +import java.math.BigDecimal + +@Table("configs") +data class Config( + @Id var name: String, + var referralCommissionReward: BigDecimal, +) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referral.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referral.kt new file mode 100644 index 000000000..360d2b287 --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referral.kt @@ -0,0 +1,14 @@ +package co.nilin.opex.referral.ports.postgres.dao + +import org.springframework.data.annotation.Id +import org.springframework.data.relational.core.mapping.Table +import java.math.BigDecimal + +@Table("referrals") +data class Referral( + @Id var id: Long?, + var code: String, + var parent: Long, + var referrerCommission: BigDecimal, + var referentCommission: BigDecimal +) From 48cc7061d7a479adc8e3524a3f2eec36f6af7008 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 8 Dec 2021 11:41:54 +0330 Subject: [PATCH 015/169] Add database schema --- .../referral/ports/postgres/config/PostgresConfig.kt | 7 ++++++- .../src/main/resources/data.sql | 4 ++++ .../src/main/resources/schema.sql | 12 ++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/config/PostgresConfig.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/config/PostgresConfig.kt index 67bbce13f..2abb19968 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/config/PostgresConfig.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/config/PostgresConfig.kt @@ -11,14 +11,19 @@ import org.springframework.r2dbc.core.DatabaseClient class PostgresConfig( db: DatabaseClient, @Value("classpath:schema.sql") private val schemaResource: Resource, + @Value("classpath:data.sql") private val dataResource: Resource? ) { init { val schemaReader = schemaResource.inputStream.reader() val schema = schemaReader.readText().trim() schemaReader.close() - val initDb = db.sql { schema } + val dataReader = dataResource?.inputStream?.reader() + val data = dataReader?.readText()?.trim() ?: "" + dataReader?.close() + val initDb = db.sql { schema.plus(data) } initDb // initialize the database .then() .subscribe() // execute } } + diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql new file mode 100644 index 000000000..5f54aa53a --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql @@ -0,0 +1,4 @@ +INSERT INTO + configs(id, referral_commission_reward) +VALUES + ('default', 0.3) ON CONFLICT DO NOTHING; \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index e69de29bb..de9bef43a 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -0,0 +1,12 @@ +CREATE TABLE IF NOT EXISTS configs ( + name VARCHAR(72) PRIMARY KEY, + referral_commission_reward DECIMAL NOT NULL +) + +CREATE TABLE IF NOT EXISTS referrals ( + id SERIAL PRIMARY KEY, + code VARCHAR(255) NOT NULL UNIQUE, + parent INTEGER NOT NULL REFERENCES referrals(id), + referrer_commission DECIMAL NOT NULL, + referent_commission DECIMAL NOT NULL +) \ No newline at end of file From 6b846695c436bfc12ed552c46f3c305243e28fb9 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 8 Dec 2021 11:44:49 +0330 Subject: [PATCH 016/169] Update core spis --- .../opex/referral/core/spi/CommissionRewardCalculator.kt | 8 ++++++++ .../opex/referral/core/spi/CommissionRewardPersister.kt | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardCalculator.kt diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardCalculator.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardCalculator.kt new file mode 100644 index 000000000..b2017634d --- /dev/null +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardCalculator.kt @@ -0,0 +1,8 @@ +package co.nilin.opex.referral.core.spi + +import co.nilin.opex.accountant.core.inout.RichTrade +import co.nilin.opex.referral.core.model.CommissionReward + +interface CommissionRewardCalculator { + suspend fun calculate(richTrade: RichTrade): CommissionReward +} \ No newline at end of file diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardPersister.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardPersister.kt index 1c196faa2..0251c2e9e 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardPersister.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardPersister.kt @@ -1,7 +1,7 @@ package co.nilin.opex.referral.core.spi -import co.nilin.opex.accountant.core.inout.RichTrade +import co.nilin.opex.referral.core.model.CommissionReward interface CommissionRewardPersister { - suspend fun save(trade: RichTrade) + suspend fun save(commissionReward: CommissionReward) } \ No newline at end of file From 5c940c18dc3398622eb4875395454b60621bf645 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 8 Dec 2021 13:22:11 +0330 Subject: [PATCH 017/169] Add commission reward calculator service --- .../core/{spi => api}/CommissionRewardCalculator.kt | 2 +- .../core/service/CommissionRewardCalculatorImpl.kt | 11 +++++++++++ .../nilin/opex/referral/core/spi/ReferralHandler.kt | 7 +++++++ 3 files changed, 19 insertions(+), 1 deletion(-) rename referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/{spi => api}/CommissionRewardCalculator.kt (84%) create mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt create mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardCalculator.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/CommissionRewardCalculator.kt similarity index 84% rename from referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardCalculator.kt rename to referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/CommissionRewardCalculator.kt index b2017634d..8947a5a02 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardCalculator.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/CommissionRewardCalculator.kt @@ -1,4 +1,4 @@ -package co.nilin.opex.referral.core.spi +package co.nilin.opex.referral.core.api import co.nilin.opex.accountant.core.inout.RichTrade import co.nilin.opex.referral.core.model.CommissionReward diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt new file mode 100644 index 000000000..83b942b1b --- /dev/null +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt @@ -0,0 +1,11 @@ +package co.nilin.opex.referral.core.service + +import co.nilin.opex.accountant.core.inout.RichTrade +import co.nilin.opex.referral.core.api.CommissionRewardCalculator +import co.nilin.opex.referral.core.model.CommissionReward + +class CommissionRewardCalculatorImpl : CommissionRewardCalculator { + override suspend fun calculate(richTrade: RichTrade): CommissionReward { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt new file mode 100644 index 000000000..f19060af8 --- /dev/null +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt @@ -0,0 +1,7 @@ +package co.nilin.opex.referral.core.spi + +import co.nilin.opex.referral.core.model.Referral + +interface ReferralHandler { + fun findReferralByUuid(uuid: String): Referral +} From bec2aa77a90b2f6b1b566cd24d87e47438d5f4f1 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 8 Dec 2021 13:47:44 +0330 Subject: [PATCH 018/169] Add uuid to referral table --- .../co/nilin/opex/referral/ports/postgres/dao/Referral.kt | 3 ++- .../referral-persister-postgres/src/main/resources/schema.sql | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referral.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referral.kt index 360d2b287..30e0d95cf 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referral.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referral.kt @@ -7,8 +7,9 @@ import java.math.BigDecimal @Table("referrals") data class Referral( @Id var id: Long?, + var uuid: String, var code: String, - var parent: Long, + var parent: Long?, var referrerCommission: BigDecimal, var referentCommission: BigDecimal ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index de9bef43a..d6058645c 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -5,8 +5,9 @@ CREATE TABLE IF NOT EXISTS configs ( CREATE TABLE IF NOT EXISTS referrals ( id SERIAL PRIMARY KEY, + uuid VARCHAR(72), code VARCHAR(255) NOT NULL UNIQUE, - parent INTEGER NOT NULL REFERENCES referrals(id), + parent INTEGER REFERENCES referrals(id), referrer_commission DECIMAL NOT NULL, referent_commission DECIMAL NOT NULL ) \ No newline at end of file From 4b88d4cf17a16e396f8843693962d9e45319a985 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 8 Dec 2021 13:48:08 +0330 Subject: [PATCH 019/169] Add config handler --- .../kotlin/co/nilin/opex/referral/core/model/Config.kt | 8 ++++++++ .../co/nilin/opex/referral/core/spi/ConfigHandler.kt | 7 +++++++ 2 files changed, 15 insertions(+) create mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt create mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ConfigHandler.kt diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt new file mode 100644 index 000000000..232505686 --- /dev/null +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt @@ -0,0 +1,8 @@ +package co.nilin.opex.referral.core.model + +import java.math.BigDecimal + +data class Config( + var name: String, + var referralCommissionReward: BigDecimal +) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ConfigHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ConfigHandler.kt new file mode 100644 index 000000000..71eff86ff --- /dev/null +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ConfigHandler.kt @@ -0,0 +1,7 @@ +package co.nilin.opex.referral.core.spi + +import co.nilin.opex.referral.core.model.Config + +interface ConfigHandler { + fun findConfig(name: String): Config? +} From 6ebb0c3330a65ef93837d99eed69d2e44caf12a1 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 8 Dec 2021 13:48:28 +0330 Subject: [PATCH 020/169] Update ReferralHandler.kt --- .../kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt index f19060af8..a1dce33c7 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt @@ -3,5 +3,5 @@ package co.nilin.opex.referral.core.spi import co.nilin.opex.referral.core.model.Referral interface ReferralHandler { - fun findReferralByUuid(uuid: String): Referral + fun findReferralByUuid(uuid: String): Referral? } From 685f4b2f215af64befa2a8fa46066fb745c7caf2 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 8 Dec 2021 14:05:48 +0330 Subject: [PATCH 021/169] Update referrals table name --- .../core/spi/{ReferralHandler.kt => ReferralCodeHandler.kt} | 2 +- .../ports/postgres/dao/{Referral.kt => ReferralCode.kt} | 4 ++-- .../referral-persister-postgres/src/main/resources/schema.sql | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/{ReferralHandler.kt => ReferralCodeHandler.kt} (82%) rename referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/{Referral.kt => ReferralCode.kt} (87%) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt similarity index 82% rename from referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt rename to referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt index a1dce33c7..6927b9bfb 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt @@ -2,6 +2,6 @@ package co.nilin.opex.referral.core.spi import co.nilin.opex.referral.core.model.Referral -interface ReferralHandler { +interface ReferralCodeHandler { fun findReferralByUuid(uuid: String): Referral? } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referral.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/ReferralCode.kt similarity index 87% rename from referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referral.kt rename to referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/ReferralCode.kt index 30e0d95cf..462836ea5 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referral.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/ReferralCode.kt @@ -4,8 +4,8 @@ import org.springframework.data.annotation.Id import org.springframework.data.relational.core.mapping.Table import java.math.BigDecimal -@Table("referrals") -data class Referral( +@Table("referral_codes") +data class ReferralCode( @Id var id: Long?, var uuid: String, var code: String, diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index d6058645c..bc3910423 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -3,11 +3,11 @@ CREATE TABLE IF NOT EXISTS configs ( referral_commission_reward DECIMAL NOT NULL ) -CREATE TABLE IF NOT EXISTS referrals ( +CREATE TABLE IF NOT EXISTS referral_codes ( id SERIAL PRIMARY KEY, uuid VARCHAR(72), code VARCHAR(255) NOT NULL UNIQUE, - parent INTEGER REFERENCES referrals(id), + parent INTEGER REFERENCES referral_codes(id), referrer_commission DECIMAL NOT NULL, referent_commission DECIMAL NOT NULL ) \ No newline at end of file From 6f91a3dfeb97d1a6af3ed47002993c1d4edb00c3 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 8 Dec 2021 14:31:27 +0330 Subject: [PATCH 022/169] Implement commission calculator --- .../core/api/CommissionRewardCalculator.kt | 2 +- .../referral/core/model/CommissionReward.kt | 5 ++++- .../opex/referral/core/model/Referral.kt | 2 ++ .../service/CommissionRewardCalculatorImpl.kt | 22 +++++++++++++++---- 4 files changed, 25 insertions(+), 6 deletions(-) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/CommissionRewardCalculator.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/CommissionRewardCalculator.kt index 8947a5a02..4da3c8d68 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/CommissionRewardCalculator.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/CommissionRewardCalculator.kt @@ -4,5 +4,5 @@ import co.nilin.opex.accountant.core.inout.RichTrade import co.nilin.opex.referral.core.model.CommissionReward interface CommissionRewardCalculator { - suspend fun calculate(richTrade: RichTrade): CommissionReward + suspend fun calculate(uuid: String, richTrade: RichTrade): CommissionReward } \ No newline at end of file diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt index fb24fd9d4..8eeca02c4 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt @@ -1,10 +1,13 @@ package co.nilin.opex.referral.core.model import co.nilin.opex.accountant.core.inout.RichTrade +import java.math.BigDecimal data class CommissionReward( var referrerUuid: String, var referentUuid: String, var referralCode: String, - var richTrade: RichTrade + var richTrade: RichTrade, + var referrerShare: BigDecimal, + var referentShare: BigDecimal ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Referral.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Referral.kt index e81a97843..141dca2ad 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Referral.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Referral.kt @@ -5,6 +5,8 @@ import java.math.BigDecimal data class Referral( var id: Long?, var code: String, + var referrerUuid: String, + var referentUuid: String, var referrerCommission: BigDecimal, var referentCommission: BigDecimal ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt index 83b942b1b..5252cf1db 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt @@ -3,9 +3,23 @@ package co.nilin.opex.referral.core.service import co.nilin.opex.accountant.core.inout.RichTrade import co.nilin.opex.referral.core.api.CommissionRewardCalculator import co.nilin.opex.referral.core.model.CommissionReward +import co.nilin.opex.referral.core.spi.ReferralCodeHandler -class CommissionRewardCalculatorImpl : CommissionRewardCalculator { - override suspend fun calculate(richTrade: RichTrade): CommissionReward { - TODO("Not yet implemented") +class CommissionRewardCalculatorImpl( + private val referralCodeHandler: ReferralCodeHandler +) : CommissionRewardCalculator { + override suspend fun calculate(uuid: String, richTrade: RichTrade): CommissionReward { + if (uuid != richTrade.makerUuid && uuid != richTrade.takerUuid) throw IllegalArgumentException("Variable uuid is not in trade") + val rc = referralCodeHandler.findReferralByUuid(uuid) + ?: throw IllegalArgumentException("No referral entity found for uuid ($uuid)") + val commission = if (uuid == richTrade.makerUuid) richTrade.makerCommision else richTrade.takerCommision + return CommissionReward( + rc.referrerUuid, + rc.referentUuid, + rc.code, + richTrade, + commission * rc.referrerCommission, + commission * rc.referentCommission + ) } -} \ No newline at end of file +} From c50955ff8283182115cc84b799c3e6e2cb7af6b4 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 11 Dec 2021 11:59:03 +0330 Subject: [PATCH 023/169] Fix app config --- .../opex/referral/app/config/AppConfig.kt | 24 ++++++++++++------- .../kafka/listener/spi/RichTradeListener.kt | 2 +- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt index bcbcbe04f..8768c50be 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt @@ -1,9 +1,12 @@ package co.nilin.opex.referral.app.config import co.nilin.opex.accountant.core.inout.RichTrade +import co.nilin.opex.referral.core.api.CommissionRewardCalculator import co.nilin.opex.referral.core.spi.CommissionRewardPersister import co.nilin.opex.referral.ports.kafka.listener.consumer.TradeKafkaListener import co.nilin.opex.referral.ports.kafka.listener.spi.RichTradeListener +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import org.springframework.beans.factory.annotation.Autowired import org.springframework.context.annotation.Bean @@ -11,12 +14,12 @@ import org.springframework.context.annotation.Configuration @Configuration class AppConfig { - @Bean - fun apiListener( - commissionRewardPersister: CommissionRewardPersister + fun referralListener( + commissionRewardPersister: CommissionRewardPersister, + commissionRewardCalculator: CommissionRewardCalculator ): ReferralListenerImpl { - return ReferralListenerImpl(commissionRewardPersister) + return ReferralListenerImpl(commissionRewardPersister, commissionRewardCalculator) } @Autowired @@ -28,22 +31,27 @@ class AppConfig { } class ReferralListenerImpl( - private val commissionRewardPersister: CommissionRewardPersister + private val commissionRewardPersister: CommissionRewardPersister, + private val commissionRewardCalculator: CommissionRewardCalculator ) : RichTradeListener { - override fun id(): String { return "ReferralListener" } override fun onTrade( - trade: RichTrade, + richTrade: RichTrade, partition: Int, offset: Long, timestamp: Long ) { println("RichTrade received") runBlocking(AppDispatchers.kafkaExecutor) { - commissionRewardPersister.save(trade) + val makeCommission = commissionRewardCalculator.calculate(richTrade.makerUuid, richTrade) + val takerCommission = commissionRewardCalculator.calculate(richTrade.makerUuid, richTrade) + coroutineScope { + launch { commissionRewardPersister.save(makeCommission) } + launch { commissionRewardPersister.save(takerCommission) } + } } } } diff --git a/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/spi/RichTradeListener.kt b/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/spi/RichTradeListener.kt index ed27ac129..5106c7599 100644 --- a/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/spi/RichTradeListener.kt +++ b/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/spi/RichTradeListener.kt @@ -4,5 +4,5 @@ import co.nilin.opex.accountant.core.inout.RichTrade interface RichTradeListener { fun id(): String - fun onTrade(trade: RichTrade, partition: Int, offset: Long, timestamp: Long) + fun onTrade(richTrade: RichTrade, partition: Int, offset: Long, timestamp: Long) } \ No newline at end of file From 8b84e7df6d0af97343f3e1cb41370ccd4da00a17 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 11 Dec 2021 12:31:41 +0330 Subject: [PATCH 024/169] Add commission reward persister base structure --- .../referral-ports/referral-persister-postgres/pom.xml | 4 ++++ .../postgres/impl/CommissionRewardPersisterImpl.kt | 10 ++++++++++ 2 files changed, 14 insertions(+) create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt diff --git a/referral/referral-ports/referral-persister-postgres/pom.xml b/referral/referral-ports/referral-persister-postgres/pom.xml index a8eac0c28..a962e0546 100644 --- a/referral/referral-ports/referral-persister-postgres/pom.xml +++ b/referral/referral-ports/referral-persister-postgres/pom.xml @@ -43,5 +43,9 @@ org.jetbrains.kotlinx kotlinx-coroutines-reactor + + co.nilin.opex.referral.core + referral-core + \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt new file mode 100644 index 000000000..295fe4885 --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt @@ -0,0 +1,10 @@ +package co.nilin.opex.referral.ports.postgres.impl + +import co.nilin.opex.referral.core.model.CommissionReward +import co.nilin.opex.referral.core.spi.CommissionRewardPersister + +class CommissionRewardPersisterImpl : CommissionRewardPersister { + override suspend fun save(commissionReward: CommissionReward) { + TODO("Not yet implemented") + } +} \ No newline at end of file From af21f43d1e7991430eeaebb3d6ad50231a4cf546 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 11 Dec 2021 12:48:00 +0330 Subject: [PATCH 025/169] Fix referral dependency issues --- .../core/service/CommissionRewardCalculatorImpl.kt | 2 ++ .../postgres/impl/CommissionRewardPersisterImpl.kt | 4 +++- .../ports/postgres/impl/ConfigHandlerImpl.kt | 12 ++++++++++++ .../ports/postgres/impl/ReferralCodeHandlerImpl.kt | 12 ++++++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt index 5252cf1db..b4095bed0 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt @@ -4,7 +4,9 @@ import co.nilin.opex.accountant.core.inout.RichTrade import co.nilin.opex.referral.core.api.CommissionRewardCalculator import co.nilin.opex.referral.core.model.CommissionReward import co.nilin.opex.referral.core.spi.ReferralCodeHandler +import org.springframework.stereotype.Service +@Service class CommissionRewardCalculatorImpl( private val referralCodeHandler: ReferralCodeHandler ) : CommissionRewardCalculator { diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt index 295fe4885..c3609a17b 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt @@ -2,9 +2,11 @@ package co.nilin.opex.referral.ports.postgres.impl import co.nilin.opex.referral.core.model.CommissionReward import co.nilin.opex.referral.core.spi.CommissionRewardPersister +import org.springframework.stereotype.Service +@Service class CommissionRewardPersisterImpl : CommissionRewardPersister { override suspend fun save(commissionReward: CommissionReward) { - TODO("Not yet implemented") + println(commissionReward) } } \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt new file mode 100644 index 000000000..09b0320b7 --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt @@ -0,0 +1,12 @@ +package co.nilin.opex.referral.ports.postgres.impl + +import co.nilin.opex.referral.core.model.Config +import co.nilin.opex.referral.core.spi.ConfigHandler +import org.springframework.stereotype.Service + +@Service +class ConfigHandlerImpl : ConfigHandler { + override fun findConfig(name: String): Config? { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt new file mode 100644 index 000000000..6e4094cbc --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -0,0 +1,12 @@ +package co.nilin.opex.referral.ports.postgres.impl + +import co.nilin.opex.referral.core.model.Referral +import co.nilin.opex.referral.core.spi.ReferralCodeHandler +import org.springframework.stereotype.Service + +@Service +class ReferralCodeHandlerImpl : ReferralCodeHandler { + override fun findReferralByUuid(uuid: String): Referral? { + TODO("Not yet implemented") + } +} \ No newline at end of file From d17ab94fce1300b558d0a762f3dbf6a4001f2749 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 11 Dec 2021 13:47:01 +0330 Subject: [PATCH 026/169] Fix kafka issues --- .../opex/referral/app/config/AppConfig.kt | 6 ++--- .../kafka/listener/config/KafkaConfig.kt | 27 ++++++++++++++----- ...aListener.kt => RichTradeKafkaListener.kt} | 2 +- .../ports/postgres/config/PostgresConfig.kt | 2 +- .../src/main/resources/schema.sql | 4 +-- 5 files changed, 28 insertions(+), 13 deletions(-) rename referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/consumer/{TradeKafkaListener.kt => RichTradeKafkaListener.kt} (92%) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt index 8768c50be..de25f654a 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt @@ -3,7 +3,7 @@ package co.nilin.opex.referral.app.config import co.nilin.opex.accountant.core.inout.RichTrade import co.nilin.opex.referral.core.api.CommissionRewardCalculator import co.nilin.opex.referral.core.spi.CommissionRewardPersister -import co.nilin.opex.referral.ports.kafka.listener.consumer.TradeKafkaListener +import co.nilin.opex.referral.ports.kafka.listener.consumer.RichTradeKafkaListener import co.nilin.opex.referral.ports.kafka.listener.spi.RichTradeListener import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.launch @@ -24,10 +24,10 @@ class AppConfig { @Autowired fun configureListeners( - tradeKafkaListener: TradeKafkaListener, + richTradeKafkaListener: RichTradeKafkaListener, appListener: ReferralListenerImpl ) { - tradeKafkaListener.addTradeListener(appListener) + richTradeKafkaListener.addTradeListener(appListener) } class ReferralListenerImpl( diff --git a/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/config/KafkaConfig.kt b/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/config/KafkaConfig.kt index 3ef6d738c..b48244b92 100644 --- a/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/config/KafkaConfig.kt +++ b/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/config/KafkaConfig.kt @@ -1,7 +1,9 @@ package co.nilin.opex.referral.ports.kafka.listener.config import co.nilin.opex.matching.engine.core.eventh.events.CoreEvent +import co.nilin.opex.referral.ports.kafka.listener.consumer.RichTradeKafkaListener import co.nilin.opex.referral.ports.kafka.listener.spi.RichTradeListener +import org.apache.kafka.clients.admin.NewTopic import org.apache.kafka.clients.consumer.ConsumerConfig import org.apache.kafka.clients.producer.ProducerConfig import org.apache.kafka.common.serialization.StringDeserializer @@ -12,8 +14,8 @@ import org.springframework.beans.factory.annotation.Value import org.springframework.boot.autoconfigure.condition.ConditionalOnBean import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration -import org.springframework.kafka.core.ConsumerFactory -import org.springframework.kafka.core.DefaultKafkaConsumerFactory +import org.springframework.context.support.GenericApplicationContext +import org.springframework.kafka.core.* import org.springframework.kafka.listener.ConcurrentMessageListenerContainer import org.springframework.kafka.listener.ContainerProperties import org.springframework.kafka.support.serializer.JsonDeserializer @@ -36,8 +38,6 @@ class KafkaConfig { props[ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG] = StringDeserializer::class.java props[ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG] = JsonDeserializer::class.java props[JsonDeserializer.TRUSTED_PACKAGES] = "co.nilin.opex.*" - props[JsonDeserializer.TYPE_MAPPINGS] = - "order_request:co.nilin.opex.referral.ports.kafka.listener.inout.OrderSubmitRequest" return props } @@ -55,16 +55,31 @@ class KafkaConfig { return props } + @Bean("referralProducerFactory") + fun producerFactory(@Qualifier("referralProducerConfig") producerConfigs: Map): ProducerFactory { + return DefaultKafkaProducerFactory(producerConfigs) + } + + @Bean("referralKafkaTemplate") + fun kafkaTemplate(@Qualifier("referralProducerFactory") producerFactory: ProducerFactory): KafkaTemplate { + return KafkaTemplate(producerFactory) + } + @Autowired @ConditionalOnBean(RichTradeListener::class) fun configureTradeListener( - tradeListener: RichTradeListener, + richTradeListener: RichTradeKafkaListener, @Qualifier("referralConsumerFactory") consumerFactory: ConsumerFactory ) { val containerProps = ContainerProperties(Pattern.compile("richTrade")) - containerProps.messageListener = tradeListener + containerProps.messageListener = richTradeListener val container = ConcurrentMessageListenerContainer(consumerFactory, containerProps) container.beanName = "ReferralRichTradeKafkaListenerContainer" container.start() } + + @Autowired + fun createTopics(applicationContext: GenericApplicationContext) { + applicationContext.registerBean("topic_richTrade", NewTopic::class.java, "richTrade", 10, 1) + } } \ No newline at end of file diff --git a/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/consumer/TradeKafkaListener.kt b/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/consumer/RichTradeKafkaListener.kt similarity index 92% rename from referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/consumer/TradeKafkaListener.kt rename to referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/consumer/RichTradeKafkaListener.kt index d6d57a09e..a50ff4f1b 100644 --- a/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/consumer/TradeKafkaListener.kt +++ b/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/consumer/RichTradeKafkaListener.kt @@ -7,7 +7,7 @@ import org.springframework.kafka.listener.MessageListener import org.springframework.stereotype.Component @Component -class TradeKafkaListener : MessageListener { +class RichTradeKafkaListener : MessageListener { val tradeListeners = arrayListOf() override fun onMessage(data: ConsumerRecord) { diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/config/PostgresConfig.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/config/PostgresConfig.kt index 2abb19968..65ef9e3e3 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/config/PostgresConfig.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/config/PostgresConfig.kt @@ -20,7 +20,7 @@ class PostgresConfig( val dataReader = dataResource?.inputStream?.reader() val data = dataReader?.readText()?.trim() ?: "" dataReader?.close() - val initDb = db.sql { schema.plus(data) } + val initDb = db.sql { "$schema\n\n$data" } initDb // initialize the database .then() .subscribe() // execute diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index bc3910423..258f7ee89 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -1,7 +1,7 @@ CREATE TABLE IF NOT EXISTS configs ( name VARCHAR(72) PRIMARY KEY, referral_commission_reward DECIMAL NOT NULL -) +); CREATE TABLE IF NOT EXISTS referral_codes ( id SERIAL PRIMARY KEY, @@ -10,4 +10,4 @@ CREATE TABLE IF NOT EXISTS referral_codes ( parent INTEGER REFERENCES referral_codes(id), referrer_commission DECIMAL NOT NULL, referent_commission DECIMAL NOT NULL -) \ No newline at end of file +); \ No newline at end of file From d6017f2cd11a403b082eb7ee73921c4833039d2e Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 11 Dec 2021 14:43:30 +0330 Subject: [PATCH 027/169] Add referral base controller --- .../app/controller/ReferralController.kt | 45 +++++++++++++++++++ .../opex/referral/core/model/Referral.kt | 1 - 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt new file mode 100644 index 000000000..bc1f48c3f --- /dev/null +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -0,0 +1,45 @@ +package co.nilin.opex.referral.app.controller + +import co.nilin.opex.referral.core.model.Referral +import com.fasterxml.jackson.annotation.JsonInclude +import org.springframework.web.bind.annotation.* +import java.math.BigDecimal + +@RestController +class ReferralController { + @JsonInclude(JsonInclude.Include.NON_NULL) + data class PostReferralBody( + var referrerCommission: BigDecimal?, + var referentCommission: BigDecimal? + ) + + @PostMapping("referrals") + suspend fun generateReferralCode(@RequestBody body: PostReferralBody): String { + TODO("Not implemented") + } + + @PatchMapping("referrals/{code}") + suspend fun updateReferral(@RequestBody body: PostReferralBody) { + TODO("Not implemented") + } + + @PutMapping("referrals/{code}/assign/{uuid}") + suspend fun assignReferrer(@RequestParam code: String, @RequestParam uuid: String) { + TODO("Not implemented") + } + + @GetMapping("referrals/{code}") + suspend fun getReferralCode(@RequestParam code: String): Referral { + TODO("Not implemented") + } + + @GetMapping("referrals") + suspend fun getAllReferralCodes(): List { + TODO("Not implemented") + } + + @DeleteMapping("referrals/{code}") + suspend fun deleteReferralCode(@RequestParam code: String) { + TODO("Not implemented") + } +} diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Referral.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Referral.kt index 141dca2ad..8b689214a 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Referral.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Referral.kt @@ -3,7 +3,6 @@ package co.nilin.opex.referral.core.model import java.math.BigDecimal data class Referral( - var id: Long?, var code: String, var referrerUuid: String, var referentUuid: String, From 1fae9ca5773effc9a2c842b75c36f181d4eb6454 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 11 Dec 2021 15:59:48 +0330 Subject: [PATCH 028/169] Update referral code handler --- .../app/controller/ReferralController.kt | 3 ++- .../referral/core/spi/ReferralCodeHandler.kt | 4 ++++ .../postgres/impl/ReferralCodeHandlerImpl.kt | 21 +++++++++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index bc1f48c3f..55c9ffa76 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -1,12 +1,13 @@ package co.nilin.opex.referral.app.controller import co.nilin.opex.referral.core.model.Referral +import co.nilin.opex.referral.core.spi.ReferralCodeHandler import com.fasterxml.jackson.annotation.JsonInclude import org.springframework.web.bind.annotation.* import java.math.BigDecimal @RestController -class ReferralController { +class ReferralController(private val referralCodeHandler: ReferralCodeHandler) { @JsonInclude(JsonInclude.Include.NON_NULL) data class PostReferralBody( var referrerCommission: BigDecimal?, diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt index 6927b9bfb..68dc292ee 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt @@ -1,7 +1,11 @@ package co.nilin.opex.referral.core.spi import co.nilin.opex.referral.core.model.Referral +import java.math.BigDecimal interface ReferralCodeHandler { + fun findAllReferrals(): List fun findReferralByUuid(uuid: String): Referral? + fun generateReferralCode(uuid: String, referrerCommission: BigDecimal, referentCommission: BigDecimal): Referral + fun updateCommissions(code: String, referrerCommission: BigDecimal, referentCommission: BigDecimal): Referral } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index 6e4094cbc..5fb33b82f 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -3,10 +3,31 @@ package co.nilin.opex.referral.ports.postgres.impl import co.nilin.opex.referral.core.model.Referral import co.nilin.opex.referral.core.spi.ReferralCodeHandler import org.springframework.stereotype.Service +import java.math.BigDecimal @Service class ReferralCodeHandlerImpl : ReferralCodeHandler { + override fun findAllReferrals(): List { + TODO("Not yet implemented") + } + override fun findReferralByUuid(uuid: String): Referral? { TODO("Not yet implemented") } + + override fun generateReferralCode( + uuid: String, + referrerCommission: BigDecimal, + referentCommission: BigDecimal + ): Referral { + TODO("Not yet implemented") + } + + override fun updateCommissions( + code: String, + referrerCommission: BigDecimal, + referentCommission: BigDecimal + ): Referral { + TODO("Not yet implemented") + } } \ No newline at end of file From b56d0e8ee7af0adba583a1bc3a0b140d6ce0fcfd Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 12 Dec 2021 12:37:32 +0330 Subject: [PATCH 029/169] Implement referral controller members --- .../app/controller/ReferralController.kt | 28 +++++++++---------- .../referral/core/spi/ReferralCodeHandler.kt | 6 +++- .../postgres/impl/ReferralCodeHandlerImpl.kt | 21 ++++++++++++-- 3 files changed, 38 insertions(+), 17 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index 55c9ffa76..d9617de04 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -14,33 +14,33 @@ class ReferralController(private val referralCodeHandler: ReferralCodeHandler) { var referentCommission: BigDecimal? ) - @PostMapping("referrals") + @PostMapping("/") suspend fun generateReferralCode(@RequestBody body: PostReferralBody): String { - TODO("Not implemented") + return referralCodeHandler.generateReferralCode("", body.referrerCommission!!, body.referentCommission!!).code } - @PatchMapping("referrals/{code}") - suspend fun updateReferral(@RequestBody body: PostReferralBody) { - TODO("Not implemented") + @PatchMapping("/{code}") + suspend fun updateReferral(@RequestParam code: String, @RequestBody body: PostReferralBody) { + referralCodeHandler.updateCommissions(code, body.referrerCommission, body.referentCommission) } - @PutMapping("referrals/{code}/assign/{uuid}") + @PutMapping("/{code}/assign/{uuid}") suspend fun assignReferrer(@RequestParam code: String, @RequestParam uuid: String) { - TODO("Not implemented") + referralCodeHandler.assign(code, uuid) } - @GetMapping("referrals/{code}") - suspend fun getReferralCode(@RequestParam code: String): Referral { - TODO("Not implemented") + @GetMapping("/{code}") + suspend fun getReferralCode(@RequestParam code: String): Referral? { + return referralCodeHandler.findReferralByCode(code) } - @GetMapping("referrals") + @GetMapping("/") suspend fun getAllReferralCodes(): List { - TODO("Not implemented") + return referralCodeHandler.findAllReferrals() } - @DeleteMapping("referrals/{code}") + @DeleteMapping("/{code}") suspend fun deleteReferralCode(@RequestParam code: String) { - TODO("Not implemented") + referralCodeHandler.deleteReferralCode(code) } } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt index 68dc292ee..5984da0b9 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt @@ -6,6 +6,10 @@ import java.math.BigDecimal interface ReferralCodeHandler { fun findAllReferrals(): List fun findReferralByUuid(uuid: String): Referral? + fun findReferralByCode(code: String): Referral? fun generateReferralCode(uuid: String, referrerCommission: BigDecimal, referentCommission: BigDecimal): Referral - fun updateCommissions(code: String, referrerCommission: BigDecimal, referentCommission: BigDecimal): Referral + fun assign(code: String, referentUuid: String): Referral + fun updateCommissions(code: String, referrerCommission: BigDecimal?, referentCommission: BigDecimal?): Referral + fun deleteReferralCode(code: String) + fun deleteReferralCodeByUuid(uuid: String) } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index 5fb33b82f..9af361a8c 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -15,6 +15,10 @@ class ReferralCodeHandlerImpl : ReferralCodeHandler { TODO("Not yet implemented") } + override fun findReferralByCode(code: String): Referral? { + TODO("Not yet implemented") + } + override fun generateReferralCode( uuid: String, referrerCommission: BigDecimal, @@ -23,11 +27,24 @@ class ReferralCodeHandlerImpl : ReferralCodeHandler { TODO("Not yet implemented") } + override fun assign(code: String, referentUuid: String): Referral { + TODO("Not yet implemented") + } + override fun updateCommissions( code: String, - referrerCommission: BigDecimal, - referentCommission: BigDecimal + referrerCommission: BigDecimal?, + referentCommission: BigDecimal? ): Referral { TODO("Not yet implemented") } + + override fun deleteReferralCode(code: String) { + TODO("Not yet implemented") + } + + override fun deleteReferralCodeByUuid(uuid: String) { + TODO("Not yet implemented") + } + } \ No newline at end of file From e46016cd5fab1b7965d60e48e78cce131cd1aad0 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 12 Dec 2021 16:37:19 +0330 Subject: [PATCH 030/169] Implement referral code handler methods --- .../app/controller/ReferralController.kt | 10 ++- .../referral/core/spi/ReferralCodeHandler.kt | 16 ++--- .../referral/ports/postgres/dao/Referral.kt | 12 ++++ .../ports/postgres/dao/ReferralCode.kt | 1 - .../postgres/impl/ReferralCodeHandlerImpl.kt | 67 +++++++++++++------ .../postgres/repository/ConfigRepository.kt | 6 ++ .../repository/ReferralCodeRepository.kt | 18 +++++ .../postgres/repository/ReferralRepository.kt | 12 ++++ 8 files changed, 110 insertions(+), 32 deletions(-) create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referral.kt create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ConfigRepository.kt create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralRepository.kt diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index d9617de04..b7cea6ce0 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -10,17 +10,23 @@ import java.math.BigDecimal class ReferralController(private val referralCodeHandler: ReferralCodeHandler) { @JsonInclude(JsonInclude.Include.NON_NULL) data class PostReferralBody( + var referrerCommission: BigDecimal, + var referentCommission: BigDecimal + ) + + @JsonInclude(JsonInclude.Include.NON_NULL) + data class PatchReferralBody( var referrerCommission: BigDecimal?, var referentCommission: BigDecimal? ) @PostMapping("/") suspend fun generateReferralCode(@RequestBody body: PostReferralBody): String { - return referralCodeHandler.generateReferralCode("", body.referrerCommission!!, body.referentCommission!!).code + return referralCodeHandler.generateReferralCode("", body.referrerCommission, body.referentCommission).code } @PatchMapping("/{code}") - suspend fun updateReferral(@RequestParam code: String, @RequestBody body: PostReferralBody) { + suspend fun updateReferral(@RequestParam code: String, @RequestBody body: PatchReferralBody) { referralCodeHandler.updateCommissions(code, body.referrerCommission, body.referentCommission) } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt index 5984da0b9..8b62cad53 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt @@ -4,12 +4,12 @@ import co.nilin.opex.referral.core.model.Referral import java.math.BigDecimal interface ReferralCodeHandler { - fun findAllReferrals(): List - fun findReferralByUuid(uuid: String): Referral? - fun findReferralByCode(code: String): Referral? - fun generateReferralCode(uuid: String, referrerCommission: BigDecimal, referentCommission: BigDecimal): Referral - fun assign(code: String, referentUuid: String): Referral - fun updateCommissions(code: String, referrerCommission: BigDecimal?, referentCommission: BigDecimal?): Referral - fun deleteReferralCode(code: String) - fun deleteReferralCodeByUuid(uuid: String) + suspend fun generateReferralCode(uuid: String, referrerCommission: BigDecimal, referentCommission: BigDecimal) + suspend fun findAllReferrals(): List + suspend fun findReferralByUuid(uuid: String): Referral? + suspend fun findReferralByCode(code: String): Referral? + suspend fun assign(code: String, referentUuid: String): Referral + suspend fun updateCommissions(code: String, referrerCommission: BigDecimal?, referentCommission: BigDecimal?) + suspend fun deleteReferralCode(code: String) + suspend fun deleteReferralCodeByUuid(uuid: String) } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referral.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referral.kt new file mode 100644 index 000000000..7ff7df417 --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referral.kt @@ -0,0 +1,12 @@ +package co.nilin.opex.referral.ports.postgres.dao + +import org.springframework.data.annotation.Id +import org.springframework.data.relational.core.mapping.Table + +@Table("referrals") +data class Referral( + @Id var id: Long?, + var uuid: String, + var code: String, + var parent: Long +) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/ReferralCode.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/ReferralCode.kt index 462836ea5..88b9638ae 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/ReferralCode.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/ReferralCode.kt @@ -9,7 +9,6 @@ data class ReferralCode( @Id var id: Long?, var uuid: String, var code: String, - var parent: Long?, var referrerCommission: BigDecimal, var referentCommission: BigDecimal ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index 9af361a8c..31d8e62aa 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -2,49 +2,74 @@ package co.nilin.opex.referral.ports.postgres.impl import co.nilin.opex.referral.core.model.Referral import co.nilin.opex.referral.core.spi.ReferralCodeHandler +import co.nilin.opex.referral.ports.postgres.dao.ReferralCode +import co.nilin.opex.referral.ports.postgres.repository.ReferralCodeRepository +import co.nilin.opex.referral.ports.postgres.repository.ReferralRepository +import kotlinx.coroutines.reactive.awaitSingle +import kotlinx.coroutines.reactive.awaitSingleOrNull import org.springframework.stereotype.Service import java.math.BigDecimal @Service -class ReferralCodeHandlerImpl : ReferralCodeHandler { - override fun findAllReferrals(): List { - TODO("Not yet implemented") +class ReferralCodeHandlerImpl( + private val referralCodeRepository: ReferralCodeRepository, + private val referralRepository: ReferralRepository +) : ReferralCodeHandler { + override suspend fun findAllReferrals(): List { + return referralCodeRepository.findAll().map { + Referral(it.code, "", it.uuid, it.referrerCommission, it.referentCommission) + }.collectList().awaitSingle() } - override fun findReferralByUuid(uuid: String): Referral? { - TODO("Not yet implemented") + override suspend fun findReferralByUuid(uuid: String): Referral? { + return referralCodeRepository.findByUuid(uuid) + .map { Referral(it.code, "", it.uuid, it.referrerCommission, it.referentCommission) }.awaitSingle() } - override fun findReferralByCode(code: String): Referral? { - TODO("Not yet implemented") + override suspend fun findReferralByCode(code: String): Referral? { + return referralCodeRepository.findByCode(code) + .map { Referral(it.code, "", it.uuid, it.referrerCommission, it.referentCommission) }.awaitSingle() } - override fun generateReferralCode( + override suspend fun generateReferralCode( uuid: String, referrerCommission: BigDecimal, referentCommission: BigDecimal - ): Referral { - TODO("Not yet implemented") + ) { + val code = "" + val referralCode = ReferralCode(null, code, uuid, referrerCommission, referentCommission) + referralCodeRepository.save(referralCode) } - override fun assign(code: String, referentUuid: String): Referral { - TODO("Not yet implemented") + override suspend fun assign(code: String, referentUuid: String): Referral { + val referralCode = referralCodeRepository.findByCode(code).awaitSingleOrNull() + if (referralCode != null) { + val referral = co.nilin.opex.referral.ports.postgres.dao.Referral(null, code, referentUuid) + referralRepository.save(referral) + return Referral( + code, + referralCode.uuid, + referentUuid, + referralCode.referrerCommission, + referralCode.referentCommission + ) + } + throw Exception("Referral code does exist") } - override fun updateCommissions( + override suspend fun updateCommissions( code: String, referrerCommission: BigDecimal?, referentCommission: BigDecimal? - ): Referral { - TODO("Not yet implemented") + ) { + referralCodeRepository.updateCommissions(code, referrerCommission, referentCommission) } - override fun deleteReferralCode(code: String) { - TODO("Not yet implemented") + override suspend fun deleteReferralCode(code: String) { + referralCodeRepository.deleteByCode(code) } - override fun deleteReferralCodeByUuid(uuid: String) { - TODO("Not yet implemented") + override suspend fun deleteReferralCodeByUuid(uuid: String) { + referralCodeRepository.deleteByUuid(uuid) } - -} \ No newline at end of file +} diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ConfigRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ConfigRepository.kt new file mode 100644 index 000000000..2e25bbe2b --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ConfigRepository.kt @@ -0,0 +1,6 @@ +package co.nilin.opex.referral.ports.postgres.repository + +import co.nilin.opex.referral.ports.postgres.dao.Config +import org.springframework.data.repository.reactive.ReactiveCrudRepository + +interface ConfigRepository : ReactiveCrudRepository \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt new file mode 100644 index 000000000..082827487 --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt @@ -0,0 +1,18 @@ +package co.nilin.opex.referral.ports.postgres.repository + +import co.nilin.opex.referral.ports.postgres.dao.ReferralCode +import org.springframework.data.r2dbc.repository.Query +import org.springframework.data.repository.reactive.ReactiveCrudRepository +import reactor.core.publisher.Mono +import java.math.BigDecimal + +interface ReferralCodeRepository : ReactiveCrudRepository { + fun findByCode(code: String): Mono + fun findByUuid(uuid: String): Mono + + @Query("UPDATE referral_codes SET referrer_commission = COALESCE(:referrerCommission, referrer_commission), referent_commission = COALESCE(:referentCommission, referent_commission) WHERE code = :code") + fun updateCommissions(code: String, referrerCommission: BigDecimal?, referentCommission: BigDecimal?) + + fun deleteByUuid(uuid: String) + fun deleteByCode(code: String) +} \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralRepository.kt new file mode 100644 index 000000000..4d718febe --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralRepository.kt @@ -0,0 +1,12 @@ +package co.nilin.opex.referral.ports.postgres.repository + +import co.nilin.opex.referral.ports.postgres.dao.Referral +import org.springframework.data.repository.reactive.ReactiveCrudRepository +import reactor.core.publisher.Flux + +interface ReferralRepository : ReactiveCrudRepository { + fun findByCode(code: String): Flux + fun findByUuid(uuid: String): Flux + fun deleteByUuid(uuid: String) + fun deleteByCode(code: String) +} \ No newline at end of file From c8b4b0f3fa78d9ffdda3723bc5447d469f9af5f6 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 13 Dec 2021 11:07:04 +0330 Subject: [PATCH 031/169] Add referent table --- .../ports/postgres/dao/{Referral.kt => Referent.kt} | 7 +++---- .../ports/postgres/impl/ReferralCodeHandlerImpl.kt | 8 +++++--- .../ports/postgres/repository/ReferralRepository.kt | 8 ++++---- .../src/main/resources/schema.sql | 12 +++++++++--- 4 files changed, 21 insertions(+), 14 deletions(-) rename referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/{Referral.kt => Referent.kt} (71%) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referral.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referent.kt similarity index 71% rename from referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referral.kt rename to referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referent.kt index 7ff7df417..b0fac3908 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referral.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referent.kt @@ -3,10 +3,9 @@ package co.nilin.opex.referral.ports.postgres.dao import org.springframework.data.annotation.Id import org.springframework.data.relational.core.mapping.Table -@Table("referrals") -data class Referral( +@Table("referents") +data class Referent( @Id var id: Long?, var uuid: String, - var code: String, - var parent: Long + var referral_code_id: Long ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index 31d8e62aa..8f4c0b9c0 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -2,6 +2,7 @@ package co.nilin.opex.referral.ports.postgres.impl import co.nilin.opex.referral.core.model.Referral import co.nilin.opex.referral.core.spi.ReferralCodeHandler +import co.nilin.opex.referral.ports.postgres.dao.Referent import co.nilin.opex.referral.ports.postgres.dao.ReferralCode import co.nilin.opex.referral.ports.postgres.repository.ReferralCodeRepository import co.nilin.opex.referral.ports.postgres.repository.ReferralRepository @@ -44,8 +45,8 @@ class ReferralCodeHandlerImpl( override suspend fun assign(code: String, referentUuid: String): Referral { val referralCode = referralCodeRepository.findByCode(code).awaitSingleOrNull() if (referralCode != null) { - val referral = co.nilin.opex.referral.ports.postgres.dao.Referral(null, code, referentUuid) - referralRepository.save(referral) + val referent = Referent(null, referentUuid, referralCode.id!!) + referralRepository.save(referent) return Referral( code, referralCode.uuid, @@ -53,8 +54,9 @@ class ReferralCodeHandlerImpl( referralCode.referrerCommission, referralCode.referentCommission ) + } else { + throw Exception("Referral code doesn't exist") } - throw Exception("Referral code does exist") } override suspend fun updateCommissions( diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralRepository.kt index 4d718febe..aa2f1c7e5 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralRepository.kt @@ -1,12 +1,12 @@ package co.nilin.opex.referral.ports.postgres.repository -import co.nilin.opex.referral.ports.postgres.dao.Referral +import co.nilin.opex.referral.ports.postgres.dao.Referent import org.springframework.data.repository.reactive.ReactiveCrudRepository import reactor.core.publisher.Flux -interface ReferralRepository : ReactiveCrudRepository { - fun findByCode(code: String): Flux - fun findByUuid(uuid: String): Flux +interface ReferralRepository : ReactiveCrudRepository { + fun findByCode(code: String): Flux + fun findByUuid(uuid: String): Flux fun deleteByUuid(uuid: String) fun deleteByCode(code: String) } \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 258f7ee89..3a0ba6daf 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -5,9 +5,15 @@ CREATE TABLE IF NOT EXISTS configs ( CREATE TABLE IF NOT EXISTS referral_codes ( id SERIAL PRIMARY KEY, - uuid VARCHAR(72), + uuid VARCHAR(72) NOT NULL, code VARCHAR(255) NOT NULL UNIQUE, - parent INTEGER REFERENCES referral_codes(id), referrer_commission DECIMAL NOT NULL, referent_commission DECIMAL NOT NULL -); \ No newline at end of file +); + +CREATE TABLE IF NOT EXISTS referents ( + id SERIAL PRIMARY KEY, + uuid VARCHAR(72) NOT NULL UNIQUE, + referral_code_id INTEGER REFERENCES referral_codes(id), + UNIQUE(uuid, referral_code_id) +); From e2ee20be359ff165b916e362424956e114185028 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 13 Dec 2021 12:04:58 +0330 Subject: [PATCH 032/169] Implement referral code generator --- .../opex/referral/app/controller/ReferralController.kt | 2 +- .../opex/referral/core/spi/ReferralCodeHandler.kt | 2 +- .../ports/postgres/impl/ReferralCodeHandlerImpl.kt | 10 ++++++++-- .../postgres/repository/ReferralCodeRepository.kt | 3 +++ 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index b7cea6ce0..48a9e9264 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -22,7 +22,7 @@ class ReferralController(private val referralCodeHandler: ReferralCodeHandler) { @PostMapping("/") suspend fun generateReferralCode(@RequestBody body: PostReferralBody): String { - return referralCodeHandler.generateReferralCode("", body.referrerCommission, body.referentCommission).code + return referralCodeHandler.generateReferralCode("", body.referrerCommission, body.referentCommission) } @PatchMapping("/{code}") diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt index 8b62cad53..5a4eb83db 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt @@ -4,7 +4,7 @@ import co.nilin.opex.referral.core.model.Referral import java.math.BigDecimal interface ReferralCodeHandler { - suspend fun generateReferralCode(uuid: String, referrerCommission: BigDecimal, referentCommission: BigDecimal) + suspend fun generateReferralCode(uuid: String, referrerCommission: BigDecimal, referentCommission: BigDecimal): String suspend fun findAllReferrals(): List suspend fun findReferralByUuid(uuid: String): Referral? suspend fun findReferralByCode(code: String): Referral? diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index 8f4c0b9c0..c7446f619 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -7,9 +7,11 @@ import co.nilin.opex.referral.ports.postgres.dao.ReferralCode import co.nilin.opex.referral.ports.postgres.repository.ReferralCodeRepository import co.nilin.opex.referral.ports.postgres.repository.ReferralRepository import kotlinx.coroutines.reactive.awaitSingle +import kotlinx.coroutines.reactive.awaitSingleOrDefault import kotlinx.coroutines.reactive.awaitSingleOrNull import org.springframework.stereotype.Service import java.math.BigDecimal +import java.math.BigInteger @Service class ReferralCodeHandlerImpl( @@ -36,10 +38,14 @@ class ReferralCodeHandlerImpl( uuid: String, referrerCommission: BigDecimal, referentCommission: BigDecimal - ) { - val code = "" + ): String { + val lastId = referralCodeRepository.findMaxId().awaitSingleOrDefault(0) + val codeInteger = BigInteger.TEN.pow(7).toLong() + lastId + if (codeInteger >= BigInteger.TEN.pow(8).toLong()) throw Exception("No referral code available") + val code = codeInteger.toString() val referralCode = ReferralCode(null, code, uuid, referrerCommission, referentCommission) referralCodeRepository.save(referralCode) + return code } override suspend fun assign(code: String, referentUuid: String): Referral { diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt index 082827487..80c8cd5d1 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt @@ -15,4 +15,7 @@ interface ReferralCodeRepository : ReactiveCrudRepository { fun deleteByUuid(uuid: String) fun deleteByCode(code: String) + + @Query("SELECT currval(pg_get_serial_sequence('referral_codes', 'id'))") + fun findMaxId(): Mono } \ No newline at end of file From aeca4f7d0202c270cc25785fc09f678fc9c47c39 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 13 Dec 2021 14:02:15 +0330 Subject: [PATCH 033/169] Add commission controller --- .../app/controller/CommissionController.kt | 30 +++++++++++++++++++ .../app/controller/ReferralController.kt | 12 ++++---- 2 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt new file mode 100644 index 000000000..4a50f4287 --- /dev/null +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt @@ -0,0 +1,30 @@ +package co.nilin.opex.referral.app.controller + +import co.nilin.opex.referral.core.spi.ReferralCodeHandler +import org.springframework.web.bind.annotation.DeleteMapping +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.RestController + +@RestController +class CommissionController(private val referralCodeHandler: ReferralCodeHandler) { + @GetMapping("/commissions/{code}") + suspend fun getCommissionsByCode(@RequestParam code: String) { + TODO("Not yet implemented") + } + + @GetMapping("/{uuid}/commissions/{code}") + suspend fun getCommissionsByUuidAndCode(@RequestParam code: String, @RequestParam uuid: String) { + TODO("Not yet implemented") + } + + @DeleteMapping("/commissions/{code}") + suspend fun deleteCommissionsByCode(@RequestParam code: String) { + TODO("Not yet implemented") + } + + @DeleteMapping("/{uuid}/commissions/{code}") + suspend fun deleteCommissionsByUuid(@RequestParam code: String) { + TODO("Not yet implemented") + } +} diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index 48a9e9264..4a8ddd829 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -20,32 +20,32 @@ class ReferralController(private val referralCodeHandler: ReferralCodeHandler) { var referentCommission: BigDecimal? ) - @PostMapping("/") + @PostMapping("/referrals") suspend fun generateReferralCode(@RequestBody body: PostReferralBody): String { return referralCodeHandler.generateReferralCode("", body.referrerCommission, body.referentCommission) } - @PatchMapping("/{code}") + @PatchMapping("/referrals/{code}") suspend fun updateReferral(@RequestParam code: String, @RequestBody body: PatchReferralBody) { referralCodeHandler.updateCommissions(code, body.referrerCommission, body.referentCommission) } - @PutMapping("/{code}/assign/{uuid}") + @PutMapping("/referrals/{code}/assign/{uuid}") suspend fun assignReferrer(@RequestParam code: String, @RequestParam uuid: String) { referralCodeHandler.assign(code, uuid) } - @GetMapping("/{code}") + @GetMapping("/referrals/{code}") suspend fun getReferralCode(@RequestParam code: String): Referral? { return referralCodeHandler.findReferralByCode(code) } - @GetMapping("/") + @GetMapping("/referrals") suspend fun getAllReferralCodes(): List { return referralCodeHandler.findAllReferrals() } - @DeleteMapping("/{code}") + @DeleteMapping("/referrals/{code}") suspend fun deleteReferralCode(@RequestParam code: String) { referralCodeHandler.deleteReferralCode(code) } From 720added2a0277d9c4cb5d1000a26219874c1a61 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 13 Dec 2021 14:09:06 +0330 Subject: [PATCH 034/169] Fix controller attributes --- .../referral/app/controller/CommissionController.kt | 10 +++++----- .../opex/referral/app/controller/ReferralController.kt | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt index 4a50f4287..882dc78a7 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt @@ -3,28 +3,28 @@ package co.nilin.opex.referral.app.controller import co.nilin.opex.referral.core.spi.ReferralCodeHandler import org.springframework.web.bind.annotation.DeleteMapping import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.RestController @RestController class CommissionController(private val referralCodeHandler: ReferralCodeHandler) { @GetMapping("/commissions/{code}") - suspend fun getCommissionsByCode(@RequestParam code: String) { + suspend fun getCommissionsByCode(@PathVariable code: String) { TODO("Not yet implemented") } @GetMapping("/{uuid}/commissions/{code}") - suspend fun getCommissionsByUuidAndCode(@RequestParam code: String, @RequestParam uuid: String) { + suspend fun getCommissionsByUuidAndCode(@PathVariable code: String, @PathVariable uuid: String) { TODO("Not yet implemented") } @DeleteMapping("/commissions/{code}") - suspend fun deleteCommissionsByCode(@RequestParam code: String) { + suspend fun deleteCommissionsByCode(@PathVariable code: String) { TODO("Not yet implemented") } @DeleteMapping("/{uuid}/commissions/{code}") - suspend fun deleteCommissionsByUuid(@RequestParam code: String) { + suspend fun deleteCommissionsByUuid(@PathVariable code: String) { TODO("Not yet implemented") } } diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index 4a8ddd829..3500181fc 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -26,17 +26,17 @@ class ReferralController(private val referralCodeHandler: ReferralCodeHandler) { } @PatchMapping("/referrals/{code}") - suspend fun updateReferral(@RequestParam code: String, @RequestBody body: PatchReferralBody) { + suspend fun updateReferral(@PathVariable code: String, @RequestBody body: PatchReferralBody) { referralCodeHandler.updateCommissions(code, body.referrerCommission, body.referentCommission) } @PutMapping("/referrals/{code}/assign/{uuid}") - suspend fun assignReferrer(@RequestParam code: String, @RequestParam uuid: String) { + suspend fun assignReferrer(@PathVariable code: String, @PathVariable uuid: String) { referralCodeHandler.assign(code, uuid) } @GetMapping("/referrals/{code}") - suspend fun getReferralCode(@RequestParam code: String): Referral? { + suspend fun getReferralCode(@PathVariable code: String): Referral? { return referralCodeHandler.findReferralByCode(code) } @@ -46,7 +46,7 @@ class ReferralController(private val referralCodeHandler: ReferralCodeHandler) { } @DeleteMapping("/referrals/{code}") - suspend fun deleteReferralCode(@RequestParam code: String) { + suspend fun deleteReferralCode(@PathVariable code: String) { referralCodeHandler.deleteReferralCode(code) } } From b53528c5151be76150d1bee8e848f26ded1a71c2 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 13 Dec 2021 14:32:27 +0330 Subject: [PATCH 035/169] Improve referral controller --- .../opex/referral/app/controller/ReferralController.kt | 10 ++-------- .../opex/referral/core/spi/ReferralCodeHandler.kt | 9 +++++++-- .../ports/postgres/impl/ReferralCodeHandlerImpl.kt | 6 ++++-- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index 3500181fc..ab8c81c31 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -14,19 +14,13 @@ class ReferralController(private val referralCodeHandler: ReferralCodeHandler) { var referentCommission: BigDecimal ) - @JsonInclude(JsonInclude.Include.NON_NULL) - data class PatchReferralBody( - var referrerCommission: BigDecimal?, - var referentCommission: BigDecimal? - ) - @PostMapping("/referrals") suspend fun generateReferralCode(@RequestBody body: PostReferralBody): String { return referralCodeHandler.generateReferralCode("", body.referrerCommission, body.referentCommission) } @PatchMapping("/referrals/{code}") - suspend fun updateReferral(@PathVariable code: String, @RequestBody body: PatchReferralBody) { + suspend fun updateReferralCodeByCode(@PathVariable code: String, @RequestBody body: PostReferralBody) { referralCodeHandler.updateCommissions(code, body.referrerCommission, body.referentCommission) } @@ -36,7 +30,7 @@ class ReferralController(private val referralCodeHandler: ReferralCodeHandler) { } @GetMapping("/referrals/{code}") - suspend fun getReferralCode(@PathVariable code: String): Referral? { + suspend fun getReferralCodeByCode(@PathVariable code: String): Referral? { return referralCodeHandler.findReferralByCode(code) } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt index 5a4eb83db..b2c1a2914 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt @@ -4,12 +4,17 @@ import co.nilin.opex.referral.core.model.Referral import java.math.BigDecimal interface ReferralCodeHandler { - suspend fun generateReferralCode(uuid: String, referrerCommission: BigDecimal, referentCommission: BigDecimal): String + suspend fun generateReferralCode( + uuid: String, + referrerCommission: BigDecimal, + referentCommission: BigDecimal + ): String + suspend fun findAllReferrals(): List suspend fun findReferralByUuid(uuid: String): Referral? suspend fun findReferralByCode(code: String): Referral? suspend fun assign(code: String, referentUuid: String): Referral - suspend fun updateCommissions(code: String, referrerCommission: BigDecimal?, referentCommission: BigDecimal?) + suspend fun updateCommissions(code: String, referrerCommission: BigDecimal, referentCommission: BigDecimal) suspend fun deleteReferralCode(code: String) suspend fun deleteReferralCodeByUuid(uuid: String) } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index c7446f619..f367f7533 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -39,6 +39,7 @@ class ReferralCodeHandlerImpl( referrerCommission: BigDecimal, referentCommission: BigDecimal ): String { + if (referrerCommission + referentCommission != BigDecimal.ONE) throw IllegalArgumentException("Sum of commissions must be 1") val lastId = referralCodeRepository.findMaxId().awaitSingleOrDefault(0) val codeInteger = BigInteger.TEN.pow(7).toLong() + lastId if (codeInteger >= BigInteger.TEN.pow(8).toLong()) throw Exception("No referral code available") @@ -67,9 +68,10 @@ class ReferralCodeHandlerImpl( override suspend fun updateCommissions( code: String, - referrerCommission: BigDecimal?, - referentCommission: BigDecimal? + referrerCommission: BigDecimal, + referentCommission: BigDecimal ) { + if (referrerCommission + referentCommission != BigDecimal.ONE) throw IllegalArgumentException("Sum of commissions must be 1") referralCodeRepository.updateCommissions(code, referrerCommission, referentCommission) } From 338e06808b3ca7cf8d4c671d5b63444c85428790 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 13 Dec 2021 14:54:43 +0330 Subject: [PATCH 036/169] Update referral controllers --- .../app/controller/CommissionController.kt | 26 ++++++++----------- .../app/controller/ReferralController.kt | 22 ++++++++-------- .../referral/core/spi/ReferralCodeHandler.kt | 6 ++--- .../postgres/impl/ReferralCodeHandlerImpl.kt | 6 ++--- 4 files changed, 28 insertions(+), 32 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt index 882dc78a7..92966041f 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt @@ -1,30 +1,26 @@ package co.nilin.opex.referral.app.controller +import co.nilin.opex.referral.core.model.CommissionReward import co.nilin.opex.referral.core.spi.ReferralCodeHandler -import org.springframework.web.bind.annotation.DeleteMapping -import org.springframework.web.bind.annotation.GetMapping -import org.springframework.web.bind.annotation.PathVariable -import org.springframework.web.bind.annotation.RestController +import org.springframework.web.bind.annotation.* @RestController class CommissionController(private val referralCodeHandler: ReferralCodeHandler) { - @GetMapping("/commissions/{code}") - suspend fun getCommissionsByCode(@PathVariable code: String) { + @GetMapping("/commissions") + suspend fun getCommissionsByUuidAndCode( + @RequestParam code: String, + @RequestParam uuid: String + ): List { TODO("Not yet implemented") } - @GetMapping("/{uuid}/commissions/{code}") - suspend fun getCommissionsByUuidAndCode(@PathVariable code: String, @PathVariable uuid: String) { + @DeleteMapping("/commissions") + suspend fun deleteCommissions(@RequestParam code: String, @RequestParam uuid: String) { TODO("Not yet implemented") } - @DeleteMapping("/commissions/{code}") - suspend fun deleteCommissionsByCode(@PathVariable code: String) { - TODO("Not yet implemented") - } - - @DeleteMapping("/{uuid}/commissions/{code}") - suspend fun deleteCommissionsByUuid(@PathVariable code: String) { + @DeleteMapping("/commissions/{id}") + suspend fun deleteCommissionsById(@PathVariable id: String) { TODO("Not yet implemented") } } diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index ab8c81c31..e44981012 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -14,33 +14,33 @@ class ReferralController(private val referralCodeHandler: ReferralCodeHandler) { var referentCommission: BigDecimal ) - @PostMapping("/referrals") + @PostMapping("/codes") suspend fun generateReferralCode(@RequestBody body: PostReferralBody): String { - return referralCodeHandler.generateReferralCode("", body.referrerCommission, body.referentCommission) + return referralCodeHandler.generateReferralCode("", body.referrerCommission, body.referentCommission) } - @PatchMapping("/referrals/{code}") + @PatchMapping("/codes/{code}") suspend fun updateReferralCodeByCode(@PathVariable code: String, @RequestBody body: PostReferralBody) { referralCodeHandler.updateCommissions(code, body.referrerCommission, body.referentCommission) } - @PutMapping("/referrals/{code}/assign/{uuid}") - suspend fun assignReferrer(@PathVariable code: String, @PathVariable uuid: String) { + @PutMapping("/codes/{code}/assign") + suspend fun assignReferrer(@PathVariable code: String, @RequestPart uuid: String) { referralCodeHandler.assign(code, uuid) } - @GetMapping("/referrals/{code}") + @GetMapping("/codes/{code}") suspend fun getReferralCodeByCode(@PathVariable code: String): Referral? { - return referralCodeHandler.findReferralByCode(code) + return referralCodeHandler.findReferralCodeByCode(code) } - @GetMapping("/referrals") + @GetMapping("/codes") suspend fun getAllReferralCodes(): List { - return referralCodeHandler.findAllReferrals() + return referralCodeHandler.findAllReferralCodes() } - @DeleteMapping("/referrals/{code}") + @DeleteMapping("/codes/{code}") suspend fun deleteReferralCode(@PathVariable code: String) { - referralCodeHandler.deleteReferralCode(code) + referralCodeHandler.deleteReferralCodeByCode(code) } } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt index b2c1a2914..b872ba53f 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt @@ -10,11 +10,11 @@ interface ReferralCodeHandler { referentCommission: BigDecimal ): String - suspend fun findAllReferrals(): List + suspend fun findAllReferralCodes(): List suspend fun findReferralByUuid(uuid: String): Referral? - suspend fun findReferralByCode(code: String): Referral? + suspend fun findReferralCodeByCode(code: String): Referral? suspend fun assign(code: String, referentUuid: String): Referral suspend fun updateCommissions(code: String, referrerCommission: BigDecimal, referentCommission: BigDecimal) - suspend fun deleteReferralCode(code: String) + suspend fun deleteReferralCodeByCode(code: String) suspend fun deleteReferralCodeByUuid(uuid: String) } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index f367f7533..93f64e76e 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -18,7 +18,7 @@ class ReferralCodeHandlerImpl( private val referralCodeRepository: ReferralCodeRepository, private val referralRepository: ReferralRepository ) : ReferralCodeHandler { - override suspend fun findAllReferrals(): List { + override suspend fun findAllReferralCodes(): List { return referralCodeRepository.findAll().map { Referral(it.code, "", it.uuid, it.referrerCommission, it.referentCommission) }.collectList().awaitSingle() @@ -29,7 +29,7 @@ class ReferralCodeHandlerImpl( .map { Referral(it.code, "", it.uuid, it.referrerCommission, it.referentCommission) }.awaitSingle() } - override suspend fun findReferralByCode(code: String): Referral? { + override suspend fun findReferralCodeByCode(code: String): Referral? { return referralCodeRepository.findByCode(code) .map { Referral(it.code, "", it.uuid, it.referrerCommission, it.referentCommission) }.awaitSingle() } @@ -75,7 +75,7 @@ class ReferralCodeHandlerImpl( referralCodeRepository.updateCommissions(code, referrerCommission, referentCommission) } - override suspend fun deleteReferralCode(code: String) { + override suspend fun deleteReferralCodeByCode(code: String) { referralCodeRepository.deleteByCode(code) } From 315e27375f5ddd7a523acbcacd4c1687015e3832 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 13 Dec 2021 16:15:55 +0330 Subject: [PATCH 037/169] Fix referral code handler db functions --- .../ports/postgres/impl/ReferralCodeHandlerImpl.kt | 10 +++++----- .../postgres/repository/ReferralCodeRepository.kt | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index 93f64e76e..b1827d8a2 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -45,7 +45,7 @@ class ReferralCodeHandlerImpl( if (codeInteger >= BigInteger.TEN.pow(8).toLong()) throw Exception("No referral code available") val code = codeInteger.toString() val referralCode = ReferralCode(null, code, uuid, referrerCommission, referentCommission) - referralCodeRepository.save(referralCode) + referralCodeRepository.save(referralCode).awaitSingleOrNull() return code } @@ -53,7 +53,7 @@ class ReferralCodeHandlerImpl( val referralCode = referralCodeRepository.findByCode(code).awaitSingleOrNull() if (referralCode != null) { val referent = Referent(null, referentUuid, referralCode.id!!) - referralRepository.save(referent) + referralRepository.save(referent).awaitSingleOrNull() return Referral( code, referralCode.uuid, @@ -72,14 +72,14 @@ class ReferralCodeHandlerImpl( referentCommission: BigDecimal ) { if (referrerCommission + referentCommission != BigDecimal.ONE) throw IllegalArgumentException("Sum of commissions must be 1") - referralCodeRepository.updateCommissions(code, referrerCommission, referentCommission) + referralCodeRepository.updateCommissions(code, referrerCommission, referentCommission).awaitSingleOrNull() } override suspend fun deleteReferralCodeByCode(code: String) { - referralCodeRepository.deleteByCode(code) + referralCodeRepository.deleteByCode(code).awaitSingleOrNull() } override suspend fun deleteReferralCodeByUuid(uuid: String) { - referralCodeRepository.deleteByUuid(uuid) + referralCodeRepository.deleteByUuid(uuid).awaitSingleOrNull() } } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt index 80c8cd5d1..6e4cff387 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt @@ -11,10 +11,10 @@ interface ReferralCodeRepository : ReactiveCrudRepository { fun findByUuid(uuid: String): Mono @Query("UPDATE referral_codes SET referrer_commission = COALESCE(:referrerCommission, referrer_commission), referent_commission = COALESCE(:referentCommission, referent_commission) WHERE code = :code") - fun updateCommissions(code: String, referrerCommission: BigDecimal?, referentCommission: BigDecimal?) + fun updateCommissions(code: String, referrerCommission: BigDecimal?, referentCommission: BigDecimal?): Mono - fun deleteByUuid(uuid: String) - fun deleteByCode(code: String) + fun deleteByUuid(uuid: String): Mono + fun deleteByCode(code: String): Mono @Query("SELECT currval(pg_get_serial_sequence('referral_codes', 'id'))") fun findMaxId(): Mono From 106402617cd38632f6c982ab11f3b007203f6637 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 13 Dec 2021 16:23:11 +0330 Subject: [PATCH 038/169] Fix referral controller validations --- .../ports/postgres/impl/ReferralCodeHandlerImpl.kt | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index b1827d8a2..dba832c45 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -39,7 +39,12 @@ class ReferralCodeHandlerImpl( referrerCommission: BigDecimal, referentCommission: BigDecimal ): String { - if (referrerCommission + referentCommission != BigDecimal.ONE) throw IllegalArgumentException("Sum of commissions must be 1") + if (referrerCommission >= BigDecimal.ZERO && referentCommission >= BigDecimal.ZERO) + throw IllegalArgumentException("Commission value must be positive") + if (referrerCommission <= BigDecimal.ONE && referentCommission <= BigDecimal.ONE) + throw IllegalArgumentException("Commission value must be less than 1") + if (referrerCommission + referentCommission != BigDecimal.ONE) + throw IllegalArgumentException("Sum of commissions must be 1") val lastId = referralCodeRepository.findMaxId().awaitSingleOrDefault(0) val codeInteger = BigInteger.TEN.pow(7).toLong() + lastId if (codeInteger >= BigInteger.TEN.pow(8).toLong()) throw Exception("No referral code available") @@ -71,7 +76,12 @@ class ReferralCodeHandlerImpl( referrerCommission: BigDecimal, referentCommission: BigDecimal ) { - if (referrerCommission + referentCommission != BigDecimal.ONE) throw IllegalArgumentException("Sum of commissions must be 1") + if (referrerCommission >= BigDecimal.ZERO && referentCommission >= BigDecimal.ZERO) + throw IllegalArgumentException("Commission value must be positive") + if (referrerCommission <= BigDecimal.ONE && referentCommission <= BigDecimal.ONE) + throw IllegalArgumentException("Commission value must be less than 1") + if (referrerCommission + referentCommission != BigDecimal.ONE) + throw IllegalArgumentException("Sum of commissions must be 1") referralCodeRepository.updateCommissions(code, referrerCommission, referentCommission).awaitSingleOrNull() } From dc2ea54169c97e52e295b15e92f4ce6aa1d855d9 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 13 Dec 2021 17:04:57 +0330 Subject: [PATCH 039/169] Update referral code usage in code --- .../app/controller/ReferralController.kt | 6 +++--- .../opex/referral/core/model/ReferralCode.kt | 10 ++++++++++ .../service/CommissionRewardCalculatorImpl.kt | 16 ++++++++-------- .../referral/core/spi/ReferralCodeHandler.kt | 10 +++++----- .../opex/referral/core/spi/ReferralHandler.kt | 9 +++++++++ 5 files changed, 35 insertions(+), 16 deletions(-) create mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/ReferralCode.kt create mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index e44981012..80176d132 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -1,6 +1,6 @@ package co.nilin.opex.referral.app.controller -import co.nilin.opex.referral.core.model.Referral +import co.nilin.opex.referral.core.model.ReferralCode import co.nilin.opex.referral.core.spi.ReferralCodeHandler import com.fasterxml.jackson.annotation.JsonInclude import org.springframework.web.bind.annotation.* @@ -30,12 +30,12 @@ class ReferralController(private val referralCodeHandler: ReferralCodeHandler) { } @GetMapping("/codes/{code}") - suspend fun getReferralCodeByCode(@PathVariable code: String): Referral? { + suspend fun getReferralCodeByCode(@PathVariable code: String): ReferralCode? { return referralCodeHandler.findReferralCodeByCode(code) } @GetMapping("/codes") - suspend fun getAllReferralCodes(): List { + suspend fun getAllReferralCodes(): List { return referralCodeHandler.findAllReferralCodes() } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/ReferralCode.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/ReferralCode.kt new file mode 100644 index 000000000..40c7fafa6 --- /dev/null +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/ReferralCode.kt @@ -0,0 +1,10 @@ +package co.nilin.opex.referral.core.model + +import java.math.BigDecimal + +data class ReferralCode( + var uuid: String, + var code: String, + var referrerCommission: BigDecimal, + var referentCommission: BigDecimal +) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt index b4095bed0..c12705c34 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt @@ -3,25 +3,25 @@ package co.nilin.opex.referral.core.service import co.nilin.opex.accountant.core.inout.RichTrade import co.nilin.opex.referral.core.api.CommissionRewardCalculator import co.nilin.opex.referral.core.model.CommissionReward -import co.nilin.opex.referral.core.spi.ReferralCodeHandler +import co.nilin.opex.referral.core.spi.ReferralHandler import org.springframework.stereotype.Service @Service class CommissionRewardCalculatorImpl( - private val referralCodeHandler: ReferralCodeHandler + private val referralHandler: ReferralHandler ) : CommissionRewardCalculator { override suspend fun calculate(uuid: String, richTrade: RichTrade): CommissionReward { if (uuid != richTrade.makerUuid && uuid != richTrade.takerUuid) throw IllegalArgumentException("Variable uuid is not in trade") - val rc = referralCodeHandler.findReferralByUuid(uuid) + val r = referralHandler.findReferralByUuid(uuid) ?: throw IllegalArgumentException("No referral entity found for uuid ($uuid)") val commission = if (uuid == richTrade.makerUuid) richTrade.makerCommision else richTrade.takerCommision return CommissionReward( - rc.referrerUuid, - rc.referentUuid, - rc.code, + r.referrerUuid, + r.referentUuid, + r.code, richTrade, - commission * rc.referrerCommission, - commission * rc.referentCommission + commission * r.referrerCommission, + commission * r.referentCommission ) } } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt index b872ba53f..bc48312be 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt @@ -1,6 +1,6 @@ package co.nilin.opex.referral.core.spi -import co.nilin.opex.referral.core.model.Referral +import co.nilin.opex.referral.core.model.ReferralCode import java.math.BigDecimal interface ReferralCodeHandler { @@ -10,10 +10,10 @@ interface ReferralCodeHandler { referentCommission: BigDecimal ): String - suspend fun findAllReferralCodes(): List - suspend fun findReferralByUuid(uuid: String): Referral? - suspend fun findReferralCodeByCode(code: String): Referral? - suspend fun assign(code: String, referentUuid: String): Referral + suspend fun findAllReferralCodes(): List + suspend fun findReferralByUuid(uuid: String): ReferralCode? + suspend fun findReferralCodeByCode(code: String): ReferralCode? + suspend fun assign(code: String, referentUuid: String): ReferralCode suspend fun updateCommissions(code: String, referrerCommission: BigDecimal, referentCommission: BigDecimal) suspend fun deleteReferralCodeByCode(code: String) suspend fun deleteReferralCodeByUuid(uuid: String) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt new file mode 100644 index 000000000..e29201cfa --- /dev/null +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt @@ -0,0 +1,9 @@ +package co.nilin.opex.referral.core.spi + +import co.nilin.opex.referral.core.model.Referral + +interface ReferralHandler { + suspend fun findAllReferrals(): List + suspend fun findReferralByUuid(uuid: String): Referral? + suspend fun findReferralCodeByCode(code: String): Referral? +} From b8160a8ad444c3a55fbfb66e00cdf5a3208177df Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 14 Dec 2021 10:40:19 +0330 Subject: [PATCH 040/169] Implement commission reward controller --- .../app/controller/CommissionController.kt | 27 ++++--- .../referral/core/model/CommissionReward.kt | 2 +- .../core/spi/CommissionRewardHandler.kt | 14 ++++ .../ports/postgres/dao/CommissionReward.kt | 16 +++++ .../impl/CommissionRewardHandlerImpl.kt | 71 +++++++++++++++++++ .../repository/CommissionRewardRepository.kt | 15 ++++ 6 files changed, 134 insertions(+), 11 deletions(-) create mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardHandler.kt create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CommissionRewardRepository.kt diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt index 92966041f..354222b7c 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt @@ -1,26 +1,33 @@ package co.nilin.opex.referral.app.controller import co.nilin.opex.referral.core.model.CommissionReward -import co.nilin.opex.referral.core.spi.ReferralCodeHandler +import co.nilin.opex.referral.core.spi.CommissionRewardHandler import org.springframework.web.bind.annotation.* @RestController -class CommissionController(private val referralCodeHandler: ReferralCodeHandler) { +class CommissionController(private val commissionRewardHandler: CommissionRewardHandler) { @GetMapping("/commissions") - suspend fun getCommissionsByUuidAndCode( - @RequestParam code: String, - @RequestParam uuid: String + suspend fun getCommissionsByReferrerAndCode( + @RequestParam uuid: String, + @RequestParam code: String? ): List { - TODO("Not yet implemented") + return commissionRewardHandler.findCommissionsByReferrer(uuid, code) } @DeleteMapping("/commissions") - suspend fun deleteCommissions(@RequestParam code: String, @RequestParam uuid: String) { - TODO("Not yet implemented") + suspend fun deleteCommissions( + @RequestParam code: String?, + @RequestParam referrerUuid: String?, + @RequestParam referentUuid: String? + ) { + if (code != null) commissionRewardHandler.deleteCommissionsByCode(code) + else if (referrerUuid != null) commissionRewardHandler.deleteCommissionsByReferrer(referrerUuid) + else if (referentUuid != null) commissionRewardHandler.deleteCommissionsByReferent(referentUuid) + else commissionRewardHandler.deleteAllCommissions() } @DeleteMapping("/commissions/{id}") - suspend fun deleteCommissionsById(@PathVariable id: String) { - TODO("Not yet implemented") + suspend fun deleteCommissionById(@PathVariable id: Long) { + commissionRewardHandler.deleteCommissionById(id) } } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt index 8eeca02c4..81cb7a971 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt @@ -7,7 +7,7 @@ data class CommissionReward( var referrerUuid: String, var referentUuid: String, var referralCode: String, - var richTrade: RichTrade, + var richTrade: RichTrade?, var referrerShare: BigDecimal, var referentShare: BigDecimal ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardHandler.kt new file mode 100644 index 000000000..f2d65506f --- /dev/null +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardHandler.kt @@ -0,0 +1,14 @@ +package co.nilin.opex.referral.core.spi + +import co.nilin.opex.referral.core.model.CommissionReward + +interface CommissionRewardHandler { + suspend fun findAllCommissions(): List + suspend fun findCommissionsByReferrer(uuid: String, code: String?): List + suspend fun findCommissionsByReferent(uuid: String): List + suspend fun deleteCommissionsByReferrer(uuid: String) + suspend fun deleteCommissionsByReferent(uuid: String) + suspend fun deleteCommissionsByCode(code: String) + suspend fun deleteAllCommissions() + suspend fun deleteCommissionById(id: Long) +} diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt new file mode 100644 index 000000000..0cc1445a8 --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt @@ -0,0 +1,16 @@ +package co.nilin.opex.referral.ports.postgres.dao + +import org.springframework.data.annotation.Id +import org.springframework.data.relational.core.mapping.Table +import java.math.BigDecimal + +@Table("commission_rewards") +data class CommissionReward( + @Id var id: Long?, + var referrerUuid: String, + var referentUuid: String, + var referralCode: String, + var richTradeId: Long, + var referrerShare: BigDecimal, + var referentShare: BigDecimal +) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt new file mode 100644 index 000000000..80742ec26 --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt @@ -0,0 +1,71 @@ +package co.nilin.opex.referral.ports.postgres.impl + +import co.nilin.opex.referral.core.model.CommissionReward +import co.nilin.opex.referral.core.spi.CommissionRewardHandler +import co.nilin.opex.referral.ports.postgres.repository.CommissionRewardRepository +import kotlinx.coroutines.reactive.awaitSingle +import org.springframework.stereotype.Service + +@Service +class CommissionRewardHandlerImpl( + private val commissionRewardRepository: CommissionRewardRepository +) : CommissionRewardHandler { + override suspend fun findAllCommissions(): List { + return commissionRewardRepository.findAll().map { + CommissionReward( + it.referrerUuid, + it.referentUuid, + it.referralCode, + null, + it.referrerShare, + it.referentShare + ) + }.collectList().awaitSingle() + } + + override suspend fun findCommissionsByReferrer(uuid: String, code: String?): List { + return commissionRewardRepository.findByReferrer(uuid).filter { code == null || it.referralCode == code }.map { + CommissionReward( + it.referrerUuid, + it.referentUuid, + it.referralCode, + null, + it.referrerShare, + it.referentShare + ) + }.collectList().awaitSingle() + } + + override suspend fun findCommissionsByReferent(uuid: String): List { + return commissionRewardRepository.findByReferent(uuid).map { + CommissionReward( + it.referrerUuid, + it.referentUuid, + it.referralCode, + null, + it.referrerShare, + it.referentShare + ) + }.collectList().awaitSingle() + } + + override suspend fun deleteCommissionsByReferrer(uuid: String) { + commissionRewardRepository.deleteByReferrerUuid(uuid) + } + + override suspend fun deleteCommissionsByReferent(uuid: String) { + commissionRewardRepository.deleteByReferentUuid(uuid) + } + + override suspend fun deleteCommissionsByCode(code: String) { + commissionRewardRepository.deleteByReferralCode(code) + } + + override suspend fun deleteAllCommissions() { + commissionRewardRepository.deleteAll() + } + + override suspend fun deleteCommissionById(id: Long) { + commissionRewardRepository.deleteById(id) + } +} diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CommissionRewardRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CommissionRewardRepository.kt new file mode 100644 index 000000000..97e11c7a7 --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CommissionRewardRepository.kt @@ -0,0 +1,15 @@ +package co.nilin.opex.referral.ports.postgres.repository + +import co.nilin.opex.referral.ports.postgres.dao.CommissionReward +import org.springframework.data.repository.reactive.ReactiveCrudRepository +import reactor.core.publisher.Flux +import reactor.core.publisher.Mono + +interface CommissionRewardRepository : ReactiveCrudRepository { + fun findByReferrer(referrerUuid: String): Flux + fun findByReferent(referentUuid: String): Flux + fun findByReferralCode(referralCode: String): Flux + fun deleteByReferrerUuid(referrerUuid: String): Mono + fun deleteByReferentUuid(referentUuid: String): Mono + fun deleteByReferralCode(referentCode: String): Mono +} \ No newline at end of file From e9af4206523004206869133c061c604bd0b596eb Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 14 Dec 2021 11:45:56 +0330 Subject: [PATCH 041/169] Refactor commission controller --- .../app/controller/CommissionController.kt | 16 +++--- .../core/spi/CommissionRewardHandler.kt | 19 ++++--- .../impl/CommissionRewardHandlerImpl.kt | 54 +++++-------------- .../repository/CommissionRewardRepository.kt | 17 +++--- 4 files changed, 45 insertions(+), 61 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt index 354222b7c..460f8fc59 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt @@ -8,10 +8,17 @@ import org.springframework.web.bind.annotation.* class CommissionController(private val commissionRewardHandler: CommissionRewardHandler) { @GetMapping("/commissions") suspend fun getCommissionsByReferrerAndCode( - @RequestParam uuid: String, + @RequestParam referrerUuid: String, @RequestParam code: String? ): List { - return commissionRewardHandler.findCommissionsByReferrer(uuid, code) + return commissionRewardHandler.findCommissions(referrerUuid = referrerUuid, referralCode = code) + } + + @GetMapping("/commissions") + suspend fun getCommissionsByReferent( + @RequestParam referentUuid: String + ): List { + return commissionRewardHandler.findCommissions(referentUuid = referentUuid) } @DeleteMapping("/commissions") @@ -20,10 +27,7 @@ class CommissionController(private val commissionRewardHandler: CommissionReward @RequestParam referrerUuid: String?, @RequestParam referentUuid: String? ) { - if (code != null) commissionRewardHandler.deleteCommissionsByCode(code) - else if (referrerUuid != null) commissionRewardHandler.deleteCommissionsByReferrer(referrerUuid) - else if (referentUuid != null) commissionRewardHandler.deleteCommissionsByReferent(referentUuid) - else commissionRewardHandler.deleteAllCommissions() + commissionRewardHandler.deleteCommissions(code, referrerUuid, referentUuid) } @DeleteMapping("/commissions/{id}") diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardHandler.kt index f2d65506f..fcac37ecd 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardHandler.kt @@ -3,12 +3,17 @@ package co.nilin.opex.referral.core.spi import co.nilin.opex.referral.core.model.CommissionReward interface CommissionRewardHandler { - suspend fun findAllCommissions(): List - suspend fun findCommissionsByReferrer(uuid: String, code: String?): List - suspend fun findCommissionsByReferent(uuid: String): List - suspend fun deleteCommissionsByReferrer(uuid: String) - suspend fun deleteCommissionsByReferent(uuid: String) - suspend fun deleteCommissionsByCode(code: String) - suspend fun deleteAllCommissions() + suspend fun findCommissions( + referralCode: String? = null, + referrerUuid: String? = null, + referentUuid: String? = null + ): List + + suspend fun deleteCommissions( + referralCode: String? = null, + referrerUuid: String? = null, + referentUuid: String? = null + ) + suspend fun deleteCommissionById(id: Long) } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt index 80742ec26..6397b3854 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt @@ -10,8 +10,16 @@ import org.springframework.stereotype.Service class CommissionRewardHandlerImpl( private val commissionRewardRepository: CommissionRewardRepository ) : CommissionRewardHandler { - override suspend fun findAllCommissions(): List { - return commissionRewardRepository.findAll().map { + override suspend fun findCommissions( + referralCode: String?, + referrerUuid: String?, + referentUuid: String? + ): List { + return commissionRewardRepository.findByReferralCodeAndReferrerUuidAndReferentUuid( + referralCode, + referrerUuid, + referentUuid + ).map { CommissionReward( it.referrerUuid, it.referentUuid, @@ -23,46 +31,8 @@ class CommissionRewardHandlerImpl( }.collectList().awaitSingle() } - override suspend fun findCommissionsByReferrer(uuid: String, code: String?): List { - return commissionRewardRepository.findByReferrer(uuid).filter { code == null || it.referralCode == code }.map { - CommissionReward( - it.referrerUuid, - it.referentUuid, - it.referralCode, - null, - it.referrerShare, - it.referentShare - ) - }.collectList().awaitSingle() - } - - override suspend fun findCommissionsByReferent(uuid: String): List { - return commissionRewardRepository.findByReferent(uuid).map { - CommissionReward( - it.referrerUuid, - it.referentUuid, - it.referralCode, - null, - it.referrerShare, - it.referentShare - ) - }.collectList().awaitSingle() - } - - override suspend fun deleteCommissionsByReferrer(uuid: String) { - commissionRewardRepository.deleteByReferrerUuid(uuid) - } - - override suspend fun deleteCommissionsByReferent(uuid: String) { - commissionRewardRepository.deleteByReferentUuid(uuid) - } - - override suspend fun deleteCommissionsByCode(code: String) { - commissionRewardRepository.deleteByReferralCode(code) - } - - override suspend fun deleteAllCommissions() { - commissionRewardRepository.deleteAll() + override suspend fun deleteCommissions(referralCode: String?, referrerUuid: String?, referentUuid: String?) { + commissionRewardRepository.deleteByReferralCodeAndReferrerUuidAndReferentUuid(referralCode, referrerUuid, referentUuid) } override suspend fun deleteCommissionById(id: Long) { diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CommissionRewardRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CommissionRewardRepository.kt index 97e11c7a7..aecdbd383 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CommissionRewardRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CommissionRewardRepository.kt @@ -6,10 +6,15 @@ import reactor.core.publisher.Flux import reactor.core.publisher.Mono interface CommissionRewardRepository : ReactiveCrudRepository { - fun findByReferrer(referrerUuid: String): Flux - fun findByReferent(referentUuid: String): Flux - fun findByReferralCode(referralCode: String): Flux - fun deleteByReferrerUuid(referrerUuid: String): Mono - fun deleteByReferentUuid(referentUuid: String): Mono - fun deleteByReferralCode(referentCode: String): Mono + fun findByReferralCodeAndReferrerUuidAndReferentUuid( + code: String?, + referrerUuid: String?, + referentUuid: String? + ): Flux + + fun deleteByReferralCodeAndReferrerUuidAndReferentUuid( + code: String?, + referrerUuid: String?, + referentUuid: String? + ): Mono } \ No newline at end of file From 25142bb7f3f8f67d47066111f1c76bfcd4e97b4a Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 14 Dec 2021 12:06:14 +0330 Subject: [PATCH 042/169] Fix commission reward projection issue --- .../opex/referral/core/model/CommissionReward.kt | 4 ++-- .../postgres/impl/CommissionRewardHandlerImpl.kt | 11 ++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt index 81cb7a971..8eb45ab87 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt @@ -7,7 +7,7 @@ data class CommissionReward( var referrerUuid: String, var referentUuid: String, var referralCode: String, - var richTrade: RichTrade?, + var richTrade: Pair, var referrerShare: BigDecimal, - var referentShare: BigDecimal + var referentShare: BigDecimal, ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt index 6397b3854..c6b5760ff 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt @@ -4,6 +4,7 @@ import co.nilin.opex.referral.core.model.CommissionReward import co.nilin.opex.referral.core.spi.CommissionRewardHandler import co.nilin.opex.referral.ports.postgres.repository.CommissionRewardRepository import kotlinx.coroutines.reactive.awaitSingle +import kotlinx.coroutines.reactive.awaitSingleOrNull import org.springframework.stereotype.Service @Service @@ -24,7 +25,7 @@ class CommissionRewardHandlerImpl( it.referrerUuid, it.referentUuid, it.referralCode, - null, + Pair(it.richTradeId, null), it.referrerShare, it.referentShare ) @@ -32,10 +33,14 @@ class CommissionRewardHandlerImpl( } override suspend fun deleteCommissions(referralCode: String?, referrerUuid: String?, referentUuid: String?) { - commissionRewardRepository.deleteByReferralCodeAndReferrerUuidAndReferentUuid(referralCode, referrerUuid, referentUuid) + commissionRewardRepository.deleteByReferralCodeAndReferrerUuidAndReferentUuid( + referralCode, + referrerUuid, + referentUuid + ).awaitSingleOrNull() } override suspend fun deleteCommissionById(id: Long) { - commissionRewardRepository.deleteById(id) + commissionRewardRepository.deleteById(id).awaitSingleOrNull() } } From 57b9c8b8bea745a4a3c2e8e32ca4da5e2af0c74e Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 14 Dec 2021 12:08:14 +0330 Subject: [PATCH 043/169] Implement config handler --- .../co/nilin/opex/referral/core/spi/ConfigHandler.kt | 2 +- .../referral/ports/postgres/impl/ConfigHandlerImpl.kt | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ConfigHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ConfigHandler.kt index 71eff86ff..e502deb44 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ConfigHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ConfigHandler.kt @@ -3,5 +3,5 @@ package co.nilin.opex.referral.core.spi import co.nilin.opex.referral.core.model.Config interface ConfigHandler { - fun findConfig(name: String): Config? + suspend fun findConfig(name: String): Config? } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt index 09b0320b7..3b4cd945e 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt @@ -2,11 +2,13 @@ package co.nilin.opex.referral.ports.postgres.impl import co.nilin.opex.referral.core.model.Config import co.nilin.opex.referral.core.spi.ConfigHandler +import co.nilin.opex.referral.ports.postgres.repository.ConfigRepository +import kotlinx.coroutines.reactive.awaitSingleOrNull import org.springframework.stereotype.Service @Service -class ConfigHandlerImpl : ConfigHandler { - override fun findConfig(name: String): Config? { - TODO("Not yet implemented") +class ConfigHandlerImpl(private val configRepository: ConfigRepository) : ConfigHandler { + override suspend fun findConfig(name: String): Config? { + return configRepository.findById(name).map { Config(it.name, it.referralCommissionReward) }.awaitSingleOrNull() } } \ No newline at end of file From 7b1826ad74110f6fbe57fc84cea770d4eba428ca Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 14 Dec 2021 12:27:05 +0330 Subject: [PATCH 044/169] Fix referral code handler --- .../referral/core/spi/ReferralCodeHandler.kt | 6 +- .../referral/ports/postgres/dao/Referent.kt | 2 +- .../postgres/impl/ReferralCodeHandlerImpl.kt | 73 +++++++++++-------- 3 files changed, 45 insertions(+), 36 deletions(-) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt index bc48312be..ccc6412ef 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt @@ -11,10 +11,10 @@ interface ReferralCodeHandler { ): String suspend fun findAllReferralCodes(): List - suspend fun findReferralByUuid(uuid: String): ReferralCode? + suspend fun findReferralCodeByReferentUuid(uuid: String): ReferralCode? suspend fun findReferralCodeByCode(code: String): ReferralCode? - suspend fun assign(code: String, referentUuid: String): ReferralCode + suspend fun assign(code: String, referentUuid: String) suspend fun updateCommissions(code: String, referrerCommission: BigDecimal, referentCommission: BigDecimal) suspend fun deleteReferralCodeByCode(code: String) - suspend fun deleteReferralCodeByUuid(uuid: String) + suspend fun deleteReferralCodesByReferrerUuid(uuid: String) } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referent.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referent.kt index b0fac3908..76f13521a 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referent.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referent.kt @@ -7,5 +7,5 @@ import org.springframework.data.relational.core.mapping.Table data class Referent( @Id var id: Long?, var uuid: String, - var referral_code_id: Long + var referralCodeId: Long ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index dba832c45..31d5d3e66 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -1,6 +1,5 @@ package co.nilin.opex.referral.ports.postgres.impl -import co.nilin.opex.referral.core.model.Referral import co.nilin.opex.referral.core.spi.ReferralCodeHandler import co.nilin.opex.referral.ports.postgres.dao.Referent import co.nilin.opex.referral.ports.postgres.dao.ReferralCode @@ -18,22 +17,6 @@ class ReferralCodeHandlerImpl( private val referralCodeRepository: ReferralCodeRepository, private val referralRepository: ReferralRepository ) : ReferralCodeHandler { - override suspend fun findAllReferralCodes(): List { - return referralCodeRepository.findAll().map { - Referral(it.code, "", it.uuid, it.referrerCommission, it.referentCommission) - }.collectList().awaitSingle() - } - - override suspend fun findReferralByUuid(uuid: String): Referral? { - return referralCodeRepository.findByUuid(uuid) - .map { Referral(it.code, "", it.uuid, it.referrerCommission, it.referentCommission) }.awaitSingle() - } - - override suspend fun findReferralCodeByCode(code: String): Referral? { - return referralCodeRepository.findByCode(code) - .map { Referral(it.code, "", it.uuid, it.referrerCommission, it.referentCommission) }.awaitSingle() - } - override suspend fun generateReferralCode( uuid: String, referrerCommission: BigDecimal, @@ -54,21 +37,47 @@ class ReferralCodeHandlerImpl( return code } - override suspend fun assign(code: String, referentUuid: String): Referral { - val referralCode = referralCodeRepository.findByCode(code).awaitSingleOrNull() - if (referralCode != null) { - val referent = Referent(null, referentUuid, referralCode.id!!) - referralRepository.save(referent).awaitSingleOrNull() - return Referral( - code, - referralCode.uuid, - referentUuid, - referralCode.referrerCommission, - referralCode.referentCommission + override suspend fun findAllReferralCodes(): List { + return referralCodeRepository.findAll().map { + co.nilin.opex.referral.core.model.ReferralCode( + it.uuid, + it.code, + it.referrerCommission, + it.referentCommission ) - } else { - throw Exception("Referral code doesn't exist") - } + }.collectList().awaitSingle() + } + + override suspend fun findReferralCodeByReferentUuid(uuid: String): co.nilin.opex.referral.core.model.ReferralCode? { + val referral = referralRepository.findByUuid(uuid).awaitSingleOrNull() ?: return null + return referralCodeRepository.findById(referral.referralCodeId) + .map { + co.nilin.opex.referral.core.model.ReferralCode( + it.uuid, + it.code, + it.referrerCommission, + it.referentCommission + ) + }.awaitSingleOrNull() + } + + override suspend fun findReferralCodeByCode(code: String): co.nilin.opex.referral.core.model.ReferralCode? { + return referralCodeRepository.findByCode(code) + .map { + co.nilin.opex.referral.core.model.ReferralCode( + it.uuid, + it.code, + it.referrerCommission, + it.referentCommission + ) + }.awaitSingle() + } + + override suspend fun assign(code: String, referentUuid: String) { + val referralCode = referralCodeRepository.findByCode(code).awaitSingleOrNull() + ?: throw Exception("Referral code doesn't exist") + val referent = Referent(null, referentUuid, referralCode.id!!) + referralRepository.save(referent).awaitSingleOrNull() } override suspend fun updateCommissions( @@ -89,7 +98,7 @@ class ReferralCodeHandlerImpl( referralCodeRepository.deleteByCode(code).awaitSingleOrNull() } - override suspend fun deleteReferralCodeByUuid(uuid: String) { + override suspend fun deleteReferralCodesByReferrerUuid(uuid: String) { referralCodeRepository.deleteByUuid(uuid).awaitSingleOrNull() } } From f0e130f2a747389bfd1ede4959c7485322e892db Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 14 Dec 2021 12:31:32 +0330 Subject: [PATCH 045/169] Add commission rewards table schema --- .../src/main/resources/schema.sql | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 3a0ba6daf..4fc4ba1b2 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -17,3 +17,13 @@ CREATE TABLE IF NOT EXISTS referents ( referral_code_id INTEGER REFERENCES referral_codes(id), UNIQUE(uuid, referral_code_id) ); + +CREATE TABLE IF NOT EXISTS commission_rewards ( + id SERIAL PRIMARY KEY, + referrerUuid VARCHAR(72) NOT NULL, + referentUuid VARCHAR(72) NOT NULL, + referralCode VARCHAR(72) NOT NULL REFERENCES referral_codes(code), + richTradeId INTEGER NOT NULL, + referrerShare DECIMAL NOT NULL, + referentShare DECIMAL NOT NULL +); From b4360bb35e51cd03f75066819e4f6b503c342b39 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 15 Dec 2021 12:33:32 +0330 Subject: [PATCH 046/169] Update referral object --- .../kotlin/co/nilin/opex/referral/core/model/Referral.kt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Referral.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Referral.kt index 8b689214a..6ad4494eb 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Referral.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Referral.kt @@ -1,11 +1,6 @@ package co.nilin.opex.referral.core.model -import java.math.BigDecimal - data class Referral( - var code: String, - var referrerUuid: String, + var referralCode: ReferralCode, var referentUuid: String, - var referrerCommission: BigDecimal, - var referentCommission: BigDecimal ) From 5cc7dc6c0a6b3069d34199711a37b5d3203dbf77 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 18 Dec 2021 11:53:19 +0330 Subject: [PATCH 047/169] Rename referral to reference --- .../referral/core/model/{Referral.kt => Reference.kt} | 2 +- .../co/nilin/opex/referral/core/spi/ReferralHandler.kt | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) rename referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/{Referral.kt => Reference.kt} (83%) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Referral.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Reference.kt similarity index 83% rename from referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Referral.kt rename to referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Reference.kt index 6ad4494eb..1a3fcf762 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Referral.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Reference.kt @@ -1,6 +1,6 @@ package co.nilin.opex.referral.core.model -data class Referral( +data class Reference( var referralCode: ReferralCode, var referentUuid: String, ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt index e29201cfa..6e125bcca 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt @@ -1,9 +1,9 @@ package co.nilin.opex.referral.core.spi -import co.nilin.opex.referral.core.model.Referral +import co.nilin.opex.referral.core.model.Reference interface ReferralHandler { - suspend fun findAllReferrals(): List - suspend fun findReferralByUuid(uuid: String): Referral? - suspend fun findReferralCodeByCode(code: String): Referral? + suspend fun findAllReferrals(): List + suspend fun findReferralByUuid(uuid: String): Reference? + suspend fun findReferralCodeByCode(code: String): Reference? } From 1b01b6dcee79e2c388246ea57e42db9c468f47c7 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 18 Dec 2021 13:16:13 +0330 Subject: [PATCH 048/169] Remove ineffective launch methods in referral listener --- .../nilin/opex/referral/app/config/AppConfig.kt | 15 ++++----------- .../referral/app/controller/ReferralController.kt | 6 +++--- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt index de25f654a..10d4e1f58 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt @@ -5,8 +5,6 @@ import co.nilin.opex.referral.core.api.CommissionRewardCalculator import co.nilin.opex.referral.core.spi.CommissionRewardPersister import co.nilin.opex.referral.ports.kafka.listener.consumer.RichTradeKafkaListener import co.nilin.opex.referral.ports.kafka.listener.spi.RichTradeListener -import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import org.springframework.beans.factory.annotation.Autowired import org.springframework.context.annotation.Bean @@ -34,9 +32,7 @@ class AppConfig { private val commissionRewardPersister: CommissionRewardPersister, private val commissionRewardCalculator: CommissionRewardCalculator ) : RichTradeListener { - override fun id(): String { - return "ReferralListener" - } + override fun id() = "ReferralListener" override fun onTrade( richTrade: RichTrade, @@ -44,15 +40,12 @@ class AppConfig { offset: Long, timestamp: Long ) { - println("RichTrade received") runBlocking(AppDispatchers.kafkaExecutor) { val makeCommission = commissionRewardCalculator.calculate(richTrade.makerUuid, richTrade) val takerCommission = commissionRewardCalculator.calculate(richTrade.makerUuid, richTrade) - coroutineScope { - launch { commissionRewardPersister.save(makeCommission) } - launch { commissionRewardPersister.save(takerCommission) } - } + commissionRewardPersister.save(makeCommission) + commissionRewardPersister.save(takerCommission) } } } -} \ No newline at end of file +} diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index 80176d132..c247ee4c4 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -31,16 +31,16 @@ class ReferralController(private val referralCodeHandler: ReferralCodeHandler) { @GetMapping("/codes/{code}") suspend fun getReferralCodeByCode(@PathVariable code: String): ReferralCode? { - return referralCodeHandler.findReferralCodeByCode(code) + return referralCodeHandler.findByCode(code) } @GetMapping("/codes") suspend fun getAllReferralCodes(): List { - return referralCodeHandler.findAllReferralCodes() + return referralCodeHandler.findAll() } @DeleteMapping("/codes/{code}") suspend fun deleteReferralCode(@PathVariable code: String) { - referralCodeHandler.deleteReferralCodeByCode(code) + referralCodeHandler.deleteByCode(code) } } From 184b927d61f313c1ce86b48aeba81eae7f83cd98 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 18 Dec 2021 13:53:15 +0330 Subject: [PATCH 049/169] Fix referral persister --- .../service/CommissionRewardCalculatorImpl.kt | 18 ++++---- .../referral/core/spi/ReferenceHandler.kt | 9 ++++ .../referral/core/spi/ReferralCodeHandler.kt | 10 ++--- .../opex/referral/core/spi/ReferralHandler.kt | 9 ---- .../dao/{Referent.kt => Reference.kt} | 4 +- .../postgres/impl/ReferenceHandlerImpl.kt | 41 +++++++++++++++++++ .../postgres/impl/ReferralCodeHandlerImpl.kt | 22 +++++----- .../repository/CommissionRewardRepository.kt | 2 + .../postgres/repository/ConfigRepository.kt | 2 + .../repository/ReferenceRepository.kt | 16 ++++++++ .../repository/ReferralCodeRepository.kt | 2 + .../postgres/repository/ReferralRepository.kt | 12 ------ .../src/main/resources/schema.sql | 2 +- 13 files changed, 100 insertions(+), 49 deletions(-) create mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferenceHandler.kt delete mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt rename referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/{Referent.kt => Reference.kt} (84%) create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt delete mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralRepository.kt diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt index c12705c34..fa9b1a350 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt @@ -3,25 +3,25 @@ package co.nilin.opex.referral.core.service import co.nilin.opex.accountant.core.inout.RichTrade import co.nilin.opex.referral.core.api.CommissionRewardCalculator import co.nilin.opex.referral.core.model.CommissionReward -import co.nilin.opex.referral.core.spi.ReferralHandler +import co.nilin.opex.referral.core.spi.ReferenceHandler import org.springframework.stereotype.Service @Service class CommissionRewardCalculatorImpl( - private val referralHandler: ReferralHandler + private val referenceHandler: ReferenceHandler ) : CommissionRewardCalculator { override suspend fun calculate(uuid: String, richTrade: RichTrade): CommissionReward { if (uuid != richTrade.makerUuid && uuid != richTrade.takerUuid) throw IllegalArgumentException("Variable uuid is not in trade") - val r = referralHandler.findReferralByUuid(uuid) + val reference = referenceHandler.findByUuid(uuid) ?: throw IllegalArgumentException("No referral entity found for uuid ($uuid)") val commission = if (uuid == richTrade.makerUuid) richTrade.makerCommision else richTrade.takerCommision return CommissionReward( - r.referrerUuid, - r.referentUuid, - r.code, - richTrade, - commission * r.referrerCommission, - commission * r.referentCommission + reference.referralCode.uuid, + reference.referentUuid, + reference.referralCode.code, + richTrade.id to richTrade, + commission * reference.referralCode.referrerCommission, + commission * reference.referralCode.referentCommission ) } } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferenceHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferenceHandler.kt new file mode 100644 index 000000000..5569e9735 --- /dev/null +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferenceHandler.kt @@ -0,0 +1,9 @@ +package co.nilin.opex.referral.core.spi + +import co.nilin.opex.referral.core.model.Reference + +interface ReferenceHandler { + suspend fun findAll(): List + suspend fun findByUuid(uuid: String): Reference? + suspend fun findByCode(code: String): Reference? +} diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt index ccc6412ef..daf18b1cb 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt @@ -10,11 +10,11 @@ interface ReferralCodeHandler { referentCommission: BigDecimal ): String - suspend fun findAllReferralCodes(): List - suspend fun findReferralCodeByReferentUuid(uuid: String): ReferralCode? - suspend fun findReferralCodeByCode(code: String): ReferralCode? + suspend fun findAll(): List + suspend fun findByReferentUuid(uuid: String): ReferralCode? + suspend fun findByCode(code: String): ReferralCode? suspend fun assign(code: String, referentUuid: String) suspend fun updateCommissions(code: String, referrerCommission: BigDecimal, referentCommission: BigDecimal) - suspend fun deleteReferralCodeByCode(code: String) - suspend fun deleteReferralCodesByReferrerUuid(uuid: String) + suspend fun deleteByCode(code: String) + suspend fun deleteByReferrerUuid(uuid: String) } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt deleted file mode 100644 index 6e125bcca..000000000 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralHandler.kt +++ /dev/null @@ -1,9 +0,0 @@ -package co.nilin.opex.referral.core.spi - -import co.nilin.opex.referral.core.model.Reference - -interface ReferralHandler { - suspend fun findAllReferrals(): List - suspend fun findReferralByUuid(uuid: String): Reference? - suspend fun findReferralCodeByCode(code: String): Reference? -} diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referent.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Reference.kt similarity index 84% rename from referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referent.kt rename to referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Reference.kt index 76f13521a..06b740147 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Referent.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Reference.kt @@ -3,8 +3,8 @@ package co.nilin.opex.referral.ports.postgres.dao import org.springframework.data.annotation.Id import org.springframework.data.relational.core.mapping.Table -@Table("referents") -data class Referent( +@Table("references") +data class Reference( @Id var id: Long?, var uuid: String, var referralCodeId: Long diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt new file mode 100644 index 000000000..fb9fb756e --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt @@ -0,0 +1,41 @@ +package co.nilin.opex.referral.ports.postgres.impl + +import co.nilin.opex.referral.core.model.Reference +import co.nilin.opex.referral.core.model.ReferralCode +import co.nilin.opex.referral.core.spi.ReferenceHandler +import co.nilin.opex.referral.ports.postgres.repository.ReferenceRepository +import co.nilin.opex.referral.ports.postgres.repository.ReferralCodeRepository +import kotlinx.coroutines.reactive.awaitSingle +import org.springframework.stereotype.Service + +@Service +class ReferenceHandlerImpl( + private val referralCodeRepository: ReferralCodeRepository, + private val referenceRepository: ReferenceRepository +) : ReferenceHandler { + override suspend fun findAll(): List { + val refs = referenceRepository.findAll().collectList().awaitSingle() + return refs.map { ref -> + val referralCode = referralCodeRepository.findById(ref.referralCodeId).map { + it.run { ReferralCode(uuid, code, referrerCommission, referentCommission) } + }.awaitSingle() + Reference(referralCode, ref.uuid) + } + } + + override suspend fun findByUuid(uuid: String): Reference? { + val ref = referenceRepository.findByUuid(uuid).awaitSingle() + val referralCode = referralCodeRepository.findById(ref.referralCodeId).map { + it.run { ReferralCode(uuid, code, referrerCommission, referentCommission) } + }.awaitSingle() + return Reference(referralCode, ref.uuid) + } + + override suspend fun findByCode(code: String): Reference? { + val ref = referenceRepository.findByCode(code).awaitSingle() + val referralCode = referralCodeRepository.findById(ref.referralCodeId).map { + it.run { ReferralCode(uuid, code, referrerCommission, referentCommission) } + }.awaitSingle() + return Reference(referralCode, ref.uuid) + } +} diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index 31d5d3e66..157b30676 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -1,10 +1,10 @@ package co.nilin.opex.referral.ports.postgres.impl import co.nilin.opex.referral.core.spi.ReferralCodeHandler -import co.nilin.opex.referral.ports.postgres.dao.Referent +import co.nilin.opex.referral.ports.postgres.dao.Reference import co.nilin.opex.referral.ports.postgres.dao.ReferralCode import co.nilin.opex.referral.ports.postgres.repository.ReferralCodeRepository -import co.nilin.opex.referral.ports.postgres.repository.ReferralRepository +import co.nilin.opex.referral.ports.postgres.repository.ReferenceRepository import kotlinx.coroutines.reactive.awaitSingle import kotlinx.coroutines.reactive.awaitSingleOrDefault import kotlinx.coroutines.reactive.awaitSingleOrNull @@ -15,7 +15,7 @@ import java.math.BigInteger @Service class ReferralCodeHandlerImpl( private val referralCodeRepository: ReferralCodeRepository, - private val referralRepository: ReferralRepository + private val referenceRepository: ReferenceRepository ) : ReferralCodeHandler { override suspend fun generateReferralCode( uuid: String, @@ -37,7 +37,7 @@ class ReferralCodeHandlerImpl( return code } - override suspend fun findAllReferralCodes(): List { + override suspend fun findAll(): List { return referralCodeRepository.findAll().map { co.nilin.opex.referral.core.model.ReferralCode( it.uuid, @@ -48,8 +48,8 @@ class ReferralCodeHandlerImpl( }.collectList().awaitSingle() } - override suspend fun findReferralCodeByReferentUuid(uuid: String): co.nilin.opex.referral.core.model.ReferralCode? { - val referral = referralRepository.findByUuid(uuid).awaitSingleOrNull() ?: return null + override suspend fun findByReferentUuid(uuid: String): co.nilin.opex.referral.core.model.ReferralCode? { + val referral = referenceRepository.findByUuid(uuid).awaitSingleOrNull() ?: return null return referralCodeRepository.findById(referral.referralCodeId) .map { co.nilin.opex.referral.core.model.ReferralCode( @@ -61,7 +61,7 @@ class ReferralCodeHandlerImpl( }.awaitSingleOrNull() } - override suspend fun findReferralCodeByCode(code: String): co.nilin.opex.referral.core.model.ReferralCode? { + override suspend fun findByCode(code: String): co.nilin.opex.referral.core.model.ReferralCode? { return referralCodeRepository.findByCode(code) .map { co.nilin.opex.referral.core.model.ReferralCode( @@ -76,8 +76,8 @@ class ReferralCodeHandlerImpl( override suspend fun assign(code: String, referentUuid: String) { val referralCode = referralCodeRepository.findByCode(code).awaitSingleOrNull() ?: throw Exception("Referral code doesn't exist") - val referent = Referent(null, referentUuid, referralCode.id!!) - referralRepository.save(referent).awaitSingleOrNull() + val reference = Reference(null, referentUuid, referralCode.id!!) + referenceRepository.save(reference).awaitSingleOrNull() } override suspend fun updateCommissions( @@ -94,11 +94,11 @@ class ReferralCodeHandlerImpl( referralCodeRepository.updateCommissions(code, referrerCommission, referentCommission).awaitSingleOrNull() } - override suspend fun deleteReferralCodeByCode(code: String) { + override suspend fun deleteByCode(code: String) { referralCodeRepository.deleteByCode(code).awaitSingleOrNull() } - override suspend fun deleteReferralCodesByReferrerUuid(uuid: String) { + override suspend fun deleteByReferrerUuid(uuid: String) { referralCodeRepository.deleteByUuid(uuid).awaitSingleOrNull() } } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CommissionRewardRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CommissionRewardRepository.kt index aecdbd383..d31466db3 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CommissionRewardRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CommissionRewardRepository.kt @@ -2,9 +2,11 @@ package co.nilin.opex.referral.ports.postgres.repository import co.nilin.opex.referral.ports.postgres.dao.CommissionReward import org.springframework.data.repository.reactive.ReactiveCrudRepository +import org.springframework.stereotype.Repository import reactor.core.publisher.Flux import reactor.core.publisher.Mono +@Repository interface CommissionRewardRepository : ReactiveCrudRepository { fun findByReferralCodeAndReferrerUuidAndReferentUuid( code: String?, diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ConfigRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ConfigRepository.kt index 2e25bbe2b..a5dd31c76 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ConfigRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ConfigRepository.kt @@ -2,5 +2,7 @@ package co.nilin.opex.referral.ports.postgres.repository import co.nilin.opex.referral.ports.postgres.dao.Config import org.springframework.data.repository.reactive.ReactiveCrudRepository +import org.springframework.stereotype.Repository +@Repository interface ConfigRepository : ReactiveCrudRepository \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt new file mode 100644 index 000000000..364873e3a --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt @@ -0,0 +1,16 @@ +package co.nilin.opex.referral.ports.postgres.repository + +import co.nilin.opex.referral.ports.postgres.dao.Reference +import org.springframework.data.r2dbc.repository.Query +import org.springframework.data.repository.reactive.ReactiveCrudRepository +import org.springframework.stereotype.Repository +import reactor.core.publisher.Flux + +@Repository +interface ReferenceRepository : ReactiveCrudRepository { + @Query("SELECT * FROM references LEFT JOIN referral_codes WHERE referral_code_id = referral_codes.id") + fun findByCode(code: String): Flux + fun findByUuid(uuid: String): Flux + fun deleteByUuid(uuid: String) + fun deleteByReferralCodeId(id: Long): Flux +} diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt index 6e4cff387..9983a62d8 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt @@ -3,9 +3,11 @@ package co.nilin.opex.referral.ports.postgres.repository import co.nilin.opex.referral.ports.postgres.dao.ReferralCode import org.springframework.data.r2dbc.repository.Query import org.springframework.data.repository.reactive.ReactiveCrudRepository +import org.springframework.stereotype.Repository import reactor.core.publisher.Mono import java.math.BigDecimal +@Repository interface ReferralCodeRepository : ReactiveCrudRepository { fun findByCode(code: String): Mono fun findByUuid(uuid: String): Mono diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralRepository.kt deleted file mode 100644 index aa2f1c7e5..000000000 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralRepository.kt +++ /dev/null @@ -1,12 +0,0 @@ -package co.nilin.opex.referral.ports.postgres.repository - -import co.nilin.opex.referral.ports.postgres.dao.Referent -import org.springframework.data.repository.reactive.ReactiveCrudRepository -import reactor.core.publisher.Flux - -interface ReferralRepository : ReactiveCrudRepository { - fun findByCode(code: String): Flux - fun findByUuid(uuid: String): Flux - fun deleteByUuid(uuid: String) - fun deleteByCode(code: String) -} \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 4fc4ba1b2..a26298892 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -11,7 +11,7 @@ CREATE TABLE IF NOT EXISTS referral_codes ( referent_commission DECIMAL NOT NULL ); -CREATE TABLE IF NOT EXISTS referents ( +CREATE TABLE IF NOT EXISTS references ( id SERIAL PRIMARY KEY, uuid VARCHAR(72) NOT NULL UNIQUE, referral_code_id INTEGER REFERENCES referral_codes(id), From 07cd8f40658ba133c92e0dcf378139e246548b7f Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 18 Dec 2021 14:17:55 +0330 Subject: [PATCH 050/169] Fix commission controller --- .../opex/referral/app/controller/CommissionController.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt index 460f8fc59..c61e2e26f 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt @@ -6,10 +6,10 @@ import org.springframework.web.bind.annotation.* @RestController class CommissionController(private val commissionRewardHandler: CommissionRewardHandler) { - @GetMapping("/commissions") + @GetMapping("/commissions/{code}") suspend fun getCommissionsByReferrerAndCode( - @RequestParam referrerUuid: String, - @RequestParam code: String? + @PathVariable code: String?, + @RequestParam referrerUuid: String ): List { return commissionRewardHandler.findCommissions(referrerUuid = referrerUuid, referralCode = code) } From cdda03dd06ea017e895800d05285200048470a84 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 18 Dec 2021 16:03:55 +0330 Subject: [PATCH 051/169] Add referral to nginx.conf --- Deployment/nginx.conf | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Deployment/nginx.conf b/Deployment/nginx.conf index 00e39ffc4..e57d734c5 100644 --- a/Deployment/nginx.conf +++ b/Deployment/nginx.conf @@ -27,6 +27,10 @@ http { server storage:8096; } + upstream docker-referral { + server referral:8097; + } + upstream docker-websocket { server websocket:8097; } @@ -74,6 +78,11 @@ http { rewrite ^/storage/(.*)$ /$1 break; } + location /referral { + proxy_pass http://docker-referral; + rewrite ^/referral/(.*)$ /$1 break; + } + location /stream { proxy_pass http://docker-websocket; # WS config From e55eab8f46a55212b872f7f2452625f9383e7250 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 19 Dec 2021 10:56:14 +0330 Subject: [PATCH 052/169] Fix database schema --- .../postgres/repository/ReferenceRepository.kt | 2 +- .../src/main/resources/data.sql | 2 +- .../src/main/resources/schema.sql | 16 ++++++++-------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt index 364873e3a..e8df57283 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt @@ -8,7 +8,7 @@ import reactor.core.publisher.Flux @Repository interface ReferenceRepository : ReactiveCrudRepository { - @Query("SELECT * FROM references LEFT JOIN referral_codes WHERE referral_code_id = referral_codes.id") + @Query("SELECT * FROM references LEFT JOIN referral_codes ON referral_code_id = referral_codes.id") fun findByCode(code: String): Flux fun findByUuid(uuid: String): Flux fun deleteByUuid(uuid: String) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql index 5f54aa53a..1494b0f01 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql @@ -1,4 +1,4 @@ INSERT INTO - configs(id, referral_commission_reward) + configs(name, referral_commission_reward) VALUES ('default', 0.3) ON CONFLICT DO NOTHING; \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index a26298892..4eea9d135 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -11,19 +11,19 @@ CREATE TABLE IF NOT EXISTS referral_codes ( referent_commission DECIMAL NOT NULL ); -CREATE TABLE IF NOT EXISTS references ( +CREATE TABLE IF NOT EXISTS "references" ( id SERIAL PRIMARY KEY, uuid VARCHAR(72) NOT NULL UNIQUE, - referral_code_id INTEGER REFERENCES referral_codes(id), + referral_code_id INTEGER NOT NULL REFERENCES referral_codes(id), UNIQUE(uuid, referral_code_id) ); CREATE TABLE IF NOT EXISTS commission_rewards ( id SERIAL PRIMARY KEY, - referrerUuid VARCHAR(72) NOT NULL, - referentUuid VARCHAR(72) NOT NULL, - referralCode VARCHAR(72) NOT NULL REFERENCES referral_codes(code), - richTradeId INTEGER NOT NULL, - referrerShare DECIMAL NOT NULL, - referentShare DECIMAL NOT NULL + referrer_uuid VARCHAR(72) NOT NULL, + referent_uuid VARCHAR(72) NOT NULL, + referral_code VARCHAR(72) NOT NULL REFERENCES referral_codes(code), + rich_trade_id INTEGER NOT NULL, + referrer_share DECIMAL NOT NULL, + referent_share DECIMAL NOT NULL ); From 86dac7dd7be77199603f56c6dcae464d543ac968 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 19 Dec 2021 11:12:46 +0330 Subject: [PATCH 053/169] Add security config --- .../referral/app/config/SecurityConfig.kt | 37 +++++++++++++++++++ .../referral/app/config/WebClientConfig.kt | 23 ++++++++++++ .../src/main/resources/application.yml | 3 ++ 3 files changed, 63 insertions(+) create mode 100644 referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt create mode 100644 referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/WebClientConfig.kt diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt new file mode 100644 index 000000000..e4f74d9c3 --- /dev/null +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt @@ -0,0 +1,37 @@ +package co.nilin.opex.referral.app.config + +import org.springframework.beans.factory.annotation.Value +import org.springframework.context.annotation.Bean +import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity +import org.springframework.security.config.web.server.ServerHttpSecurity +import org.springframework.security.oauth2.jwt.NimbusReactiveJwtDecoder +import org.springframework.security.oauth2.jwt.ReactiveJwtDecoder +import org.springframework.security.web.server.SecurityWebFilterChain +import org.springframework.web.reactive.function.client.WebClient + +@EnableWebFluxSecurity +class SecurityConfig(private val webClient: WebClient) { + @Value("\${app.auth.cert-url}") + private lateinit var jwkUrl: String + + @Bean + fun springSecurityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain? { + + http.csrf().disable() + .authorizeExchange() + .pathMatchers("/**").permitAll() + .anyExchange().authenticated() + .and() + .oauth2ResourceServer() + .jwt() + return http.build() + } + + @Bean + @Throws(Exception::class) + fun reactiveJwtDecoder(): ReactiveJwtDecoder? { + return NimbusReactiveJwtDecoder.withJwkSetUri(jwkUrl) + .webClient(webClient) + .build() + } +} diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/WebClientConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/WebClientConfig.kt new file mode 100644 index 000000000..080965477 --- /dev/null +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/WebClientConfig.kt @@ -0,0 +1,23 @@ +package co.nilin.opex.referral.app.config + +import org.springframework.cloud.client.ServiceInstance +import org.springframework.cloud.client.loadbalancer.LoadBalancerProperties +import org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancer +import org.springframework.cloud.client.loadbalancer.reactive.ReactorLoadBalancerExchangeFilterFunction +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.web.reactive.function.client.WebClient + +@Configuration +class WebClientConfig { + @Bean + fun webClient(loadBalancerFactory: ReactiveLoadBalancer.Factory): WebClient { + return WebClient.builder() + .filter( + ReactorLoadBalancerExchangeFilterFunction( + loadBalancerFactory, LoadBalancerProperties(), emptyList() + ) + ) + .build() + } +} diff --git a/referral/referral-app/src/main/resources/application.yml b/referral/referral-app/src/main/resources/application.yml index 4ae480a58..051d0e92b 100644 --- a/referral/referral-app/src/main/resources/application.yml +++ b/referral/referral-app/src/main/resources/application.yml @@ -27,3 +27,6 @@ spring: instance-id: ${spring.application.name}:${server.port} healthCheckInterval: 20s prefer-ip-address: true +app: + auth: + cert-url: lb://opex-auth/auth/realms/opex/protocol/openid-connect/certs \ No newline at end of file From 66718e795478cabf6fad603532eb5e15b1a71196 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 19 Dec 2021 14:33:59 +0330 Subject: [PATCH 054/169] Fix referral controllers --- referral/referral-app/pom.xml | 4 ++++ .../referral/app/controller/ReferralController.kt | 15 +++++++++++++-- .../postgres/impl/ReferralCodeHandlerImpl.kt | 14 +++++--------- .../postgres/repository/ReferralCodeRepository.kt | 8 ++++---- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/referral/referral-app/pom.xml b/referral/referral-app/pom.xml index 4b566079b..a9dc5037f 100644 --- a/referral/referral-app/pom.xml +++ b/referral/referral-app/pom.xml @@ -18,6 +18,10 @@ + + com.fasterxml.jackson.module + jackson-module-kotlin + org.springframework.boot spring-boot-starter-webflux diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index c247ee4c4..1ae1075a0 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -10,17 +10,28 @@ import java.math.BigDecimal class ReferralController(private val referralCodeHandler: ReferralCodeHandler) { @JsonInclude(JsonInclude.Include.NON_NULL) data class PostReferralBody( + var uuid: String, + var referrerCommission: BigDecimal, + var referentCommission: BigDecimal + ) + + @JsonInclude(JsonInclude.Include.NON_NULL) + data class PatchReferralBody( var referrerCommission: BigDecimal, var referentCommission: BigDecimal ) @PostMapping("/codes") suspend fun generateReferralCode(@RequestBody body: PostReferralBody): String { - return referralCodeHandler.generateReferralCode("", body.referrerCommission, body.referentCommission) + return referralCodeHandler.generateReferralCode( + body.uuid, + body.referrerCommission, + body.referentCommission + ) } @PatchMapping("/codes/{code}") - suspend fun updateReferralCodeByCode(@PathVariable code: String, @RequestBody body: PostReferralBody) { + suspend fun updateReferralCodeByCode(@PathVariable code: String, @RequestBody body: PatchReferralBody) { referralCodeHandler.updateCommissions(code, body.referrerCommission, body.referentCommission) } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index 157b30676..3bb8db6c7 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -3,8 +3,8 @@ package co.nilin.opex.referral.ports.postgres.impl import co.nilin.opex.referral.core.spi.ReferralCodeHandler import co.nilin.opex.referral.ports.postgres.dao.Reference import co.nilin.opex.referral.ports.postgres.dao.ReferralCode -import co.nilin.opex.referral.ports.postgres.repository.ReferralCodeRepository import co.nilin.opex.referral.ports.postgres.repository.ReferenceRepository +import co.nilin.opex.referral.ports.postgres.repository.ReferralCodeRepository import kotlinx.coroutines.reactive.awaitSingle import kotlinx.coroutines.reactive.awaitSingleOrDefault import kotlinx.coroutines.reactive.awaitSingleOrNull @@ -22,17 +22,15 @@ class ReferralCodeHandlerImpl( referrerCommission: BigDecimal, referentCommission: BigDecimal ): String { - if (referrerCommission >= BigDecimal.ZERO && referentCommission >= BigDecimal.ZERO) + if (referrerCommission < BigDecimal.ZERO && referentCommission < BigDecimal.ZERO) throw IllegalArgumentException("Commission value must be positive") - if (referrerCommission <= BigDecimal.ONE && referentCommission <= BigDecimal.ONE) - throw IllegalArgumentException("Commission value must be less than 1") if (referrerCommission + referentCommission != BigDecimal.ONE) throw IllegalArgumentException("Sum of commissions must be 1") - val lastId = referralCodeRepository.findMaxId().awaitSingleOrDefault(0) + val lastId = referralCodeRepository.findMaxId().awaitSingleOrDefault(-1) + 1 val codeInteger = BigInteger.TEN.pow(7).toLong() + lastId if (codeInteger >= BigInteger.TEN.pow(8).toLong()) throw Exception("No referral code available") val code = codeInteger.toString() - val referralCode = ReferralCode(null, code, uuid, referrerCommission, referentCommission) + val referralCode = ReferralCode(null, uuid, code, referrerCommission, referentCommission) referralCodeRepository.save(referralCode).awaitSingleOrNull() return code } @@ -85,10 +83,8 @@ class ReferralCodeHandlerImpl( referrerCommission: BigDecimal, referentCommission: BigDecimal ) { - if (referrerCommission >= BigDecimal.ZERO && referentCommission >= BigDecimal.ZERO) + if (referrerCommission < BigDecimal.ZERO && referentCommission < BigDecimal.ZERO) throw IllegalArgumentException("Commission value must be positive") - if (referrerCommission <= BigDecimal.ONE && referentCommission <= BigDecimal.ONE) - throw IllegalArgumentException("Commission value must be less than 1") if (referrerCommission + referentCommission != BigDecimal.ONE) throw IllegalArgumentException("Sum of commissions must be 1") referralCodeRepository.updateCommissions(code, referrerCommission, referentCommission).awaitSingleOrNull() diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt index 9983a62d8..2fd876301 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt @@ -9,6 +9,9 @@ import java.math.BigDecimal @Repository interface ReferralCodeRepository : ReactiveCrudRepository { + + @Query("SELECT MAX(id) FROM referral_codes") + fun findMaxId(): Mono fun findByCode(code: String): Mono fun findByUuid(uuid: String): Mono @@ -17,7 +20,4 @@ interface ReferralCodeRepository : ReactiveCrudRepository { fun deleteByUuid(uuid: String): Mono fun deleteByCode(code: String): Mono - - @Query("SELECT currval(pg_get_serial_sequence('referral_codes', 'id'))") - fun findMaxId(): Mono -} \ No newline at end of file +} From 7a2f5905fd88799ec78b87947a697fd76775ce3a Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 19 Dec 2021 15:43:51 +0330 Subject: [PATCH 055/169] Refactor referral code entity --- .../app/controller/ReferralController.kt | 5 +- .../opex/referral/core/model/ReferralCode.kt | 1 - .../service/CommissionRewardCalculatorImpl.kt | 3 +- .../referral/core/spi/ReferralCodeHandler.kt | 3 +- .../ports/postgres/dao/ReferralCode.kt | 1 - .../postgres/impl/ReferenceHandlerImpl.kt | 6 +-- .../postgres/impl/ReferralCodeHandlerImpl.kt | 49 +++++-------------- .../repository/ReferralCodeRepository.kt | 4 +- .../src/main/resources/schema.sql | 1 - 9 files changed, 22 insertions(+), 51 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index 1ae1075a0..21639473c 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -11,13 +11,11 @@ class ReferralController(private val referralCodeHandler: ReferralCodeHandler) { @JsonInclude(JsonInclude.Include.NON_NULL) data class PostReferralBody( var uuid: String, - var referrerCommission: BigDecimal, var referentCommission: BigDecimal ) @JsonInclude(JsonInclude.Include.NON_NULL) data class PatchReferralBody( - var referrerCommission: BigDecimal, var referentCommission: BigDecimal ) @@ -25,14 +23,13 @@ class ReferralController(private val referralCodeHandler: ReferralCodeHandler) { suspend fun generateReferralCode(@RequestBody body: PostReferralBody): String { return referralCodeHandler.generateReferralCode( body.uuid, - body.referrerCommission, body.referentCommission ) } @PatchMapping("/codes/{code}") suspend fun updateReferralCodeByCode(@PathVariable code: String, @RequestBody body: PatchReferralBody) { - referralCodeHandler.updateCommissions(code, body.referrerCommission, body.referentCommission) + referralCodeHandler.updateCommissions(code, body.referentCommission) } @PutMapping("/codes/{code}/assign") diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/ReferralCode.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/ReferralCode.kt index 40c7fafa6..5ebf2345d 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/ReferralCode.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/ReferralCode.kt @@ -5,6 +5,5 @@ import java.math.BigDecimal data class ReferralCode( var uuid: String, var code: String, - var referrerCommission: BigDecimal, var referentCommission: BigDecimal ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt index fa9b1a350..cf4b7b641 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt @@ -5,6 +5,7 @@ import co.nilin.opex.referral.core.api.CommissionRewardCalculator import co.nilin.opex.referral.core.model.CommissionReward import co.nilin.opex.referral.core.spi.ReferenceHandler import org.springframework.stereotype.Service +import java.math.BigDecimal @Service class CommissionRewardCalculatorImpl( @@ -20,7 +21,7 @@ class CommissionRewardCalculatorImpl( reference.referentUuid, reference.referralCode.code, richTrade.id to richTrade, - commission * reference.referralCode.referrerCommission, + commission * (BigDecimal.ONE - reference.referralCode.referentCommission), commission * reference.referralCode.referentCommission ) } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt index daf18b1cb..6a052d04c 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt @@ -6,7 +6,6 @@ import java.math.BigDecimal interface ReferralCodeHandler { suspend fun generateReferralCode( uuid: String, - referrerCommission: BigDecimal, referentCommission: BigDecimal ): String @@ -14,7 +13,7 @@ interface ReferralCodeHandler { suspend fun findByReferentUuid(uuid: String): ReferralCode? suspend fun findByCode(code: String): ReferralCode? suspend fun assign(code: String, referentUuid: String) - suspend fun updateCommissions(code: String, referrerCommission: BigDecimal, referentCommission: BigDecimal) + suspend fun updateCommissions(code: String, referentCommission: BigDecimal) suspend fun deleteByCode(code: String) suspend fun deleteByReferrerUuid(uuid: String) } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/ReferralCode.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/ReferralCode.kt index 88b9638ae..ae9a587f8 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/ReferralCode.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/ReferralCode.kt @@ -9,6 +9,5 @@ data class ReferralCode( @Id var id: Long?, var uuid: String, var code: String, - var referrerCommission: BigDecimal, var referentCommission: BigDecimal ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt index fb9fb756e..198528f86 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt @@ -17,7 +17,7 @@ class ReferenceHandlerImpl( val refs = referenceRepository.findAll().collectList().awaitSingle() return refs.map { ref -> val referralCode = referralCodeRepository.findById(ref.referralCodeId).map { - it.run { ReferralCode(uuid, code, referrerCommission, referentCommission) } + it.run { ReferralCode(uuid, code, referentCommission) } }.awaitSingle() Reference(referralCode, ref.uuid) } @@ -26,7 +26,7 @@ class ReferenceHandlerImpl( override suspend fun findByUuid(uuid: String): Reference? { val ref = referenceRepository.findByUuid(uuid).awaitSingle() val referralCode = referralCodeRepository.findById(ref.referralCodeId).map { - it.run { ReferralCode(uuid, code, referrerCommission, referentCommission) } + it.run { ReferralCode(uuid, code, referentCommission) } }.awaitSingle() return Reference(referralCode, ref.uuid) } @@ -34,7 +34,7 @@ class ReferenceHandlerImpl( override suspend fun findByCode(code: String): Reference? { val ref = referenceRepository.findByCode(code).awaitSingle() val referralCode = referralCodeRepository.findById(ref.referralCodeId).map { - it.run { ReferralCode(uuid, code, referrerCommission, referentCommission) } + it.run { ReferralCode(uuid, code, referentCommission) } }.awaitSingle() return Reference(referralCode, ref.uuid) } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index 3bb8db6c7..033e2933e 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -19,56 +19,36 @@ class ReferralCodeHandlerImpl( ) : ReferralCodeHandler { override suspend fun generateReferralCode( uuid: String, - referrerCommission: BigDecimal, referentCommission: BigDecimal ): String { - if (referrerCommission < BigDecimal.ZERO && referentCommission < BigDecimal.ZERO) - throw IllegalArgumentException("Commission value must be positive") - if (referrerCommission + referentCommission != BigDecimal.ONE) - throw IllegalArgumentException("Sum of commissions must be 1") + if (referentCommission < BigDecimal.ZERO || referentCommission > BigDecimal.ONE) + throw IllegalArgumentException("Commission value must be in range of [0, 1]") val lastId = referralCodeRepository.findMaxId().awaitSingleOrDefault(-1) + 1 val codeInteger = BigInteger.TEN.pow(7).toLong() + lastId if (codeInteger >= BigInteger.TEN.pow(8).toLong()) throw Exception("No referral code available") val code = codeInteger.toString() - val referralCode = ReferralCode(null, uuid, code, referrerCommission, referentCommission) + val referralCode = ReferralCode(null, uuid, code, referentCommission) referralCodeRepository.save(referralCode).awaitSingleOrNull() return code } override suspend fun findAll(): List { - return referralCodeRepository.findAll().map { - co.nilin.opex.referral.core.model.ReferralCode( - it.uuid, - it.code, - it.referrerCommission, - it.referentCommission - ) - }.collectList().awaitSingle() + return referralCodeRepository.findAll() + .map { it.run { co.nilin.opex.referral.core.model.ReferralCode(uuid, code, referentCommission) } } + .collectList().awaitSingle() } override suspend fun findByReferentUuid(uuid: String): co.nilin.opex.referral.core.model.ReferralCode? { val referral = referenceRepository.findByUuid(uuid).awaitSingleOrNull() ?: return null return referralCodeRepository.findById(referral.referralCodeId) - .map { - co.nilin.opex.referral.core.model.ReferralCode( - it.uuid, - it.code, - it.referrerCommission, - it.referentCommission - ) - }.awaitSingleOrNull() + .map { it.run { co.nilin.opex.referral.core.model.ReferralCode(uuid, code, referentCommission) } } + .awaitSingleOrNull() } override suspend fun findByCode(code: String): co.nilin.opex.referral.core.model.ReferralCode? { return referralCodeRepository.findByCode(code) - .map { - co.nilin.opex.referral.core.model.ReferralCode( - it.uuid, - it.code, - it.referrerCommission, - it.referentCommission - ) - }.awaitSingle() + .map { it.run { co.nilin.opex.referral.core.model.ReferralCode(uuid, code, referentCommission) } } + .awaitSingle() } override suspend fun assign(code: String, referentUuid: String) { @@ -80,14 +60,11 @@ class ReferralCodeHandlerImpl( override suspend fun updateCommissions( code: String, - referrerCommission: BigDecimal, referentCommission: BigDecimal ) { - if (referrerCommission < BigDecimal.ZERO && referentCommission < BigDecimal.ZERO) - throw IllegalArgumentException("Commission value must be positive") - if (referrerCommission + referentCommission != BigDecimal.ONE) - throw IllegalArgumentException("Sum of commissions must be 1") - referralCodeRepository.updateCommissions(code, referrerCommission, referentCommission).awaitSingleOrNull() + if (referentCommission < BigDecimal.ZERO || referentCommission > BigDecimal.ONE) + throw IllegalArgumentException("Commission value must be in range of [0, 1]") + referralCodeRepository.updateCommissions(code, referentCommission).awaitSingleOrNull() } override suspend fun deleteByCode(code: String) { diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt index 2fd876301..463b39c3f 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt @@ -15,8 +15,8 @@ interface ReferralCodeRepository : ReactiveCrudRepository { fun findByCode(code: String): Mono fun findByUuid(uuid: String): Mono - @Query("UPDATE referral_codes SET referrer_commission = COALESCE(:referrerCommission, referrer_commission), referent_commission = COALESCE(:referentCommission, referent_commission) WHERE code = :code") - fun updateCommissions(code: String, referrerCommission: BigDecimal?, referentCommission: BigDecimal?): Mono + @Query("UPDATE referral_codes SET referent_commission = COALESCE(:referentCommission, referent_commission) WHERE code = :code") + fun updateCommissions(code: String, referentCommission: BigDecimal?): Mono fun deleteByUuid(uuid: String): Mono fun deleteByCode(code: String): Mono diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 4eea9d135..711ed18be 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -7,7 +7,6 @@ CREATE TABLE IF NOT EXISTS referral_codes ( id SERIAL PRIMARY KEY, uuid VARCHAR(72) NOT NULL, code VARCHAR(255) NOT NULL UNIQUE, - referrer_commission DECIMAL NOT NULL, referent_commission DECIMAL NOT NULL ); From 0a568f18630d668f7b18fe33093b097087b20e6d Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 19 Dec 2021 15:59:10 +0330 Subject: [PATCH 056/169] Fix commission controller --- .../nilin/opex/referral/app/controller/CommissionController.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt index c61e2e26f..e42f69a99 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt @@ -16,7 +16,7 @@ class CommissionController(private val commissionRewardHandler: CommissionReward @GetMapping("/commissions") suspend fun getCommissionsByReferent( - @RequestParam referentUuid: String + @RequestParam referentUuid: String? ): List { return commissionRewardHandler.findCommissions(referentUuid = referentUuid) } From d8f3409de746f5873fdfd6545fe19e9ff2781416 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 19 Dec 2021 16:10:13 +0330 Subject: [PATCH 057/169] Implement commission persister --- .../impl/CommissionRewardPersisterImpl.kt | 17 +++++++++++++++-- .../postgres/repository/ReferenceRepository.kt | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt index c3609a17b..b92fbfb2e 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt @@ -2,11 +2,24 @@ package co.nilin.opex.referral.ports.postgres.impl import co.nilin.opex.referral.core.model.CommissionReward import co.nilin.opex.referral.core.spi.CommissionRewardPersister +import co.nilin.opex.referral.ports.postgres.repository.CommissionRewardRepository +import kotlinx.coroutines.reactive.awaitSingleOrNull import org.springframework.stereotype.Service @Service -class CommissionRewardPersisterImpl : CommissionRewardPersister { +class CommissionRewardPersisterImpl(private val commissionRewardRepository: CommissionRewardRepository) : + CommissionRewardPersister { override suspend fun save(commissionReward: CommissionReward) { - println(commissionReward) + commissionRewardRepository.save( + co.nilin.opex.referral.ports.postgres.dao.CommissionReward( + null, + commissionReward.referralCode, + commissionReward.referrerUuid, + commissionReward.referentUuid, + commissionReward.richTrade.first, + commissionReward.referrerShare, + commissionReward.referentShare + ) + ).awaitSingleOrNull() } } \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt index e8df57283..28959e904 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt @@ -8,7 +8,7 @@ import reactor.core.publisher.Flux @Repository interface ReferenceRepository : ReactiveCrudRepository { - @Query("SELECT * FROM references LEFT JOIN referral_codes ON referral_code_id = referral_codes.id") + @Query("SELECT * FROM \"references\" LEFT JOIN referral_codes ON referral_code_id = referral_codes.id") fun findByCode(code: String): Flux fun findByUuid(uuid: String): Flux fun deleteByUuid(uuid: String) From 4ce2deb7e0db447a6bb9c301264f4d241708ab62 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 19 Dec 2021 16:24:43 +0330 Subject: [PATCH 058/169] Fix not assigned referral codes --- .../ports/postgres/impl/CommissionRewardHandlerImpl.kt | 4 ++-- .../referral/ports/postgres/impl/ReferenceHandlerImpl.kt | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt index c6b5760ff..51ab170da 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt @@ -3,7 +3,7 @@ package co.nilin.opex.referral.ports.postgres.impl import co.nilin.opex.referral.core.model.CommissionReward import co.nilin.opex.referral.core.spi.CommissionRewardHandler import co.nilin.opex.referral.ports.postgres.repository.CommissionRewardRepository -import kotlinx.coroutines.reactive.awaitSingle +import kotlinx.coroutines.reactive.awaitSingleOrDefault import kotlinx.coroutines.reactive.awaitSingleOrNull import org.springframework.stereotype.Service @@ -29,7 +29,7 @@ class CommissionRewardHandlerImpl( it.referrerShare, it.referentShare ) - }.collectList().awaitSingle() + }.collectList().awaitSingleOrDefault(emptyList()) } override suspend fun deleteCommissions(referralCode: String?, referrerUuid: String?, referentUuid: String?) { diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt index 198528f86..8be6dbcb3 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt @@ -6,6 +6,7 @@ import co.nilin.opex.referral.core.spi.ReferenceHandler import co.nilin.opex.referral.ports.postgres.repository.ReferenceRepository import co.nilin.opex.referral.ports.postgres.repository.ReferralCodeRepository import kotlinx.coroutines.reactive.awaitSingle +import kotlinx.coroutines.reactive.awaitSingleOrNull import org.springframework.stereotype.Service @Service @@ -24,7 +25,7 @@ class ReferenceHandlerImpl( } override suspend fun findByUuid(uuid: String): Reference? { - val ref = referenceRepository.findByUuid(uuid).awaitSingle() + val ref = referenceRepository.findByUuid(uuid).awaitSingleOrNull() ?: return null val referralCode = referralCodeRepository.findById(ref.referralCodeId).map { it.run { ReferralCode(uuid, code, referentCommission) } }.awaitSingle() @@ -32,7 +33,7 @@ class ReferenceHandlerImpl( } override suspend fun findByCode(code: String): Reference? { - val ref = referenceRepository.findByCode(code).awaitSingle() + val ref = referenceRepository.findByCode(code).awaitSingle() ?: return null val referralCode = referralCodeRepository.findById(ref.referralCodeId).map { it.run { ReferralCode(uuid, code, referentCommission) } }.awaitSingle() From eb1010b35576996076ffdf78f374afa00b4ee402 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 19 Dec 2021 16:51:03 +0330 Subject: [PATCH 059/169] Rename references table --- .../co/nilin/opex/referral/ports/postgres/dao/Reference.kt | 2 +- .../referral/ports/postgres/repository/ReferenceRepository.kt | 2 +- .../referral-persister-postgres/src/main/resources/schema.sql | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Reference.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Reference.kt index 06b740147..131e2453d 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Reference.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Reference.kt @@ -3,7 +3,7 @@ package co.nilin.opex.referral.ports.postgres.dao import org.springframework.data.annotation.Id import org.springframework.data.relational.core.mapping.Table -@Table("references") +@Table("referral_code_references") data class Reference( @Id var id: Long?, var uuid: String, diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt index 28959e904..9a101e30a 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt @@ -8,7 +8,7 @@ import reactor.core.publisher.Flux @Repository interface ReferenceRepository : ReactiveCrudRepository { - @Query("SELECT * FROM \"references\" LEFT JOIN referral_codes ON referral_code_id = referral_codes.id") + @Query("SELECT * FROM referral_code_references LEFT JOIN referral_codes ON referral_code_id = referral_codes.id") fun findByCode(code: String): Flux fun findByUuid(uuid: String): Flux fun deleteByUuid(uuid: String) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 711ed18be..acacb0297 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -10,7 +10,7 @@ CREATE TABLE IF NOT EXISTS referral_codes ( referent_commission DECIMAL NOT NULL ); -CREATE TABLE IF NOT EXISTS "references" ( +CREATE TABLE IF NOT EXISTS referral_code_references ( id SERIAL PRIMARY KEY, uuid VARCHAR(72) NOT NULL UNIQUE, referral_code_id INTEGER NOT NULL REFERENCES referral_codes(id), From 5f4078a1b3d824d64ec35ec6f6dcd29563e192fd Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 20 Dec 2021 12:19:52 +0330 Subject: [PATCH 060/169] Add rest config --- referral/referral-app/pom.xml | 14 ++++++++- .../co/nilin/opex/referral/app/ReferralApp.kt | 2 ++ .../opex/referral/app/config/RestConfig.kt | 29 +++++++++++++++++++ .../app/controller/ReferralController.kt | 2 +- 4 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/RestConfig.kt diff --git a/referral/referral-app/pom.xml b/referral/referral-app/pom.xml index a9dc5037f..e9b193186 100644 --- a/referral/referral-app/pom.xml +++ b/referral/referral-app/pom.xml @@ -24,7 +24,7 @@ org.springframework.boot - spring-boot-starter-webflux + spring-boot-starter io.projectreactor.kotlin @@ -71,6 +71,18 @@ co.nilin.opex.referral.ports.postgres referral-persister-postgres + + co.nilin.opex.utility.log + logging-handler + + + co.nilin.opex.utility.error + error-handler + + + co.nilin.opex.utility.interceptors + interceptors + diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/ReferralApp.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/ReferralApp.kt index 39ebd6d2b..5576ab961 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/ReferralApp.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/ReferralApp.kt @@ -1,11 +1,13 @@ package co.nilin.opex.referral.app +import co.nilin.opex.utility.error.EnableOpexErrorHandler import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication import org.springframework.context.annotation.ComponentScan @SpringBootApplication @ComponentScan("co.nilin.opex") +@EnableOpexErrorHandler class ReferralApp fun main(args: Array) { diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/RestConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/RestConfig.kt new file mode 100644 index 000000000..99cadb64d --- /dev/null +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/RestConfig.kt @@ -0,0 +1,29 @@ +package co.nilin.opex.referral.app.config + +import co.nilin.opex.utility.interceptors.FormDataWorkaroundFilter +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.format.Formatter +import org.springframework.web.server.WebFilter +import java.util.* + +@Configuration +class RestConfig { + @Bean + fun dateFormatter(): Formatter? { + return object : Formatter { + override fun print(date: Date, locale: Locale): String { + return date.time.toString() + } + + override fun parse(date: String, locale: Locale): Date { + return Date(date.toLong()) + } + } + } + + @Bean + fun formDataWebFilter(): WebFilter { + return FormDataWorkaroundFilter() + } +} diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index 21639473c..736be55ca 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -33,7 +33,7 @@ class ReferralController(private val referralCodeHandler: ReferralCodeHandler) { } @PutMapping("/codes/{code}/assign") - suspend fun assignReferrer(@PathVariable code: String, @RequestPart uuid: String) { + suspend fun assignReferrer(@PathVariable code: String, @RequestParam uuid: String) { referralCodeHandler.assign(code, uuid) } From 59f21bb9d433252de0cee477896b737ed51c31b0 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 20 Dec 2021 13:47:01 +0330 Subject: [PATCH 061/169] Fix commission rewards --- .../impl/CommissionRewardPersisterImpl.kt | 2 +- .../ports/postgres/impl/ReferenceHandlerImpl.kt | 6 +++--- .../postgres/impl/ReferralCodeHandlerImpl.kt | 17 +++++++++-------- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt index b92fbfb2e..6496e0fad 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt @@ -13,9 +13,9 @@ class CommissionRewardPersisterImpl(private val commissionRewardRepository: Comm commissionRewardRepository.save( co.nilin.opex.referral.ports.postgres.dao.CommissionReward( null, - commissionReward.referralCode, commissionReward.referrerUuid, commissionReward.referentUuid, + commissionReward.referralCode, commissionReward.richTrade.first, commissionReward.referrerShare, commissionReward.referentShare diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt index 8be6dbcb3..25b78a518 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt @@ -18,7 +18,7 @@ class ReferenceHandlerImpl( val refs = referenceRepository.findAll().collectList().awaitSingle() return refs.map { ref -> val referralCode = referralCodeRepository.findById(ref.referralCodeId).map { - it.run { ReferralCode(uuid, code, referentCommission) } + ReferralCode(it.uuid, it.code, it.referentCommission) }.awaitSingle() Reference(referralCode, ref.uuid) } @@ -27,7 +27,7 @@ class ReferenceHandlerImpl( override suspend fun findByUuid(uuid: String): Reference? { val ref = referenceRepository.findByUuid(uuid).awaitSingleOrNull() ?: return null val referralCode = referralCodeRepository.findById(ref.referralCodeId).map { - it.run { ReferralCode(uuid, code, referentCommission) } + ReferralCode(it.uuid, it.code, it.referentCommission) }.awaitSingle() return Reference(referralCode, ref.uuid) } @@ -35,7 +35,7 @@ class ReferenceHandlerImpl( override suspend fun findByCode(code: String): Reference? { val ref = referenceRepository.findByCode(code).awaitSingle() ?: return null val referralCode = referralCodeRepository.findById(ref.referralCodeId).map { - it.run { ReferralCode(uuid, code, referentCommission) } + ReferralCode(it.uuid, it.code, it.referentCommission) }.awaitSingle() return Reference(referralCode, ref.uuid) } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index 033e2933e..c3dacb2ea 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -1,8 +1,8 @@ package co.nilin.opex.referral.ports.postgres.impl +import co.nilin.opex.referral.core.model.ReferralCode import co.nilin.opex.referral.core.spi.ReferralCodeHandler import co.nilin.opex.referral.ports.postgres.dao.Reference -import co.nilin.opex.referral.ports.postgres.dao.ReferralCode import co.nilin.opex.referral.ports.postgres.repository.ReferenceRepository import co.nilin.opex.referral.ports.postgres.repository.ReferralCodeRepository import kotlinx.coroutines.reactive.awaitSingle @@ -27,33 +27,34 @@ class ReferralCodeHandlerImpl( val codeInteger = BigInteger.TEN.pow(7).toLong() + lastId if (codeInteger >= BigInteger.TEN.pow(8).toLong()) throw Exception("No referral code available") val code = codeInteger.toString() - val referralCode = ReferralCode(null, uuid, code, referentCommission) + val referralCode = co.nilin.opex.referral.ports.postgres.dao.ReferralCode(null, uuid, code, referentCommission) referralCodeRepository.save(referralCode).awaitSingleOrNull() return code } - override suspend fun findAll(): List { + override suspend fun findAll(): List { return referralCodeRepository.findAll() - .map { it.run { co.nilin.opex.referral.core.model.ReferralCode(uuid, code, referentCommission) } } + .map { ReferralCode(it.uuid, it.code, it.referentCommission) } .collectList().awaitSingle() } - override suspend fun findByReferentUuid(uuid: String): co.nilin.opex.referral.core.model.ReferralCode? { + override suspend fun findByReferentUuid(uuid: String): ReferralCode? { val referral = referenceRepository.findByUuid(uuid).awaitSingleOrNull() ?: return null return referralCodeRepository.findById(referral.referralCodeId) - .map { it.run { co.nilin.opex.referral.core.model.ReferralCode(uuid, code, referentCommission) } } + .map { ReferralCode(it.uuid, it.code, it.referentCommission) } .awaitSingleOrNull() } - override suspend fun findByCode(code: String): co.nilin.opex.referral.core.model.ReferralCode? { + override suspend fun findByCode(code: String): ReferralCode? { return referralCodeRepository.findByCode(code) - .map { it.run { co.nilin.opex.referral.core.model.ReferralCode(uuid, code, referentCommission) } } + .map { ReferralCode(it.uuid, it.code, it.referentCommission) } .awaitSingle() } override suspend fun assign(code: String, referentUuid: String) { val referralCode = referralCodeRepository.findByCode(code).awaitSingleOrNull() ?: throw Exception("Referral code doesn't exist") + if (referentUuid == referralCode.uuid) throw Exception("Can't assign referral code to referrer") val reference = Reference(null, referentUuid, referralCode.id!!) referenceRepository.save(reference).awaitSingleOrNull() } From 89ad86f2e57b368a29dde281b33cf9355b294364 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 20 Dec 2021 15:36:05 +0330 Subject: [PATCH 062/169] Refactor reference entity --- .../app/controller/ReferralController.kt | 17 +++++++------- .../service/CommissionRewardCalculatorImpl.kt | 2 +- .../referral/core/spi/ReferenceHandler.kt | 5 ++-- .../referral/ports/postgres/dao/Reference.kt | 2 +- .../postgres/impl/ReferenceHandlerImpl.kt | 23 +++++++++++++------ .../repository/ReferenceRepository.kt | 7 ++++-- .../src/main/resources/schema.sql | 2 +- 7 files changed, 36 insertions(+), 22 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index 736be55ca..53f6cc960 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -1,30 +1,26 @@ package co.nilin.opex.referral.app.controller +import co.nilin.opex.referral.core.model.Reference import co.nilin.opex.referral.core.model.ReferralCode +import co.nilin.opex.referral.core.spi.ReferenceHandler import co.nilin.opex.referral.core.spi.ReferralCodeHandler -import com.fasterxml.jackson.annotation.JsonInclude import org.springframework.web.bind.annotation.* import java.math.BigDecimal @RestController -class ReferralController(private val referralCodeHandler: ReferralCodeHandler) { - @JsonInclude(JsonInclude.Include.NON_NULL) +class ReferralController(private val referralCodeHandler: ReferralCodeHandler, private val referenceHandler: ReferenceHandler) { data class PostReferralBody( var uuid: String, var referentCommission: BigDecimal ) - @JsonInclude(JsonInclude.Include.NON_NULL) data class PatchReferralBody( var referentCommission: BigDecimal ) @PostMapping("/codes") suspend fun generateReferralCode(@RequestBody body: PostReferralBody): String { - return referralCodeHandler.generateReferralCode( - body.uuid, - body.referentCommission - ) + return referralCodeHandler.generateReferralCode(body.uuid, body.referentCommission) } @PatchMapping("/codes/{code}") @@ -42,6 +38,11 @@ class ReferralController(private val referralCodeHandler: ReferralCodeHandler) { return referralCodeHandler.findByCode(code) } + @GetMapping("/codes/{code}/references") + suspend fun getReferenceByCode(@PathVariable code: String): List? { + return referenceHandler.findByCode(code) + } + @GetMapping("/codes") suspend fun getAllReferralCodes(): List { return referralCodeHandler.findAll() diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt index cf4b7b641..cce9491bf 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt @@ -13,7 +13,7 @@ class CommissionRewardCalculatorImpl( ) : CommissionRewardCalculator { override suspend fun calculate(uuid: String, richTrade: RichTrade): CommissionReward { if (uuid != richTrade.makerUuid && uuid != richTrade.takerUuid) throw IllegalArgumentException("Variable uuid is not in trade") - val reference = referenceHandler.findByUuid(uuid) + val reference = referenceHandler.findByReferentUuid(uuid) ?: throw IllegalArgumentException("No referral entity found for uuid ($uuid)") val commission = if (uuid == richTrade.makerUuid) richTrade.makerCommision else richTrade.takerCommision return CommissionReward( diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferenceHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferenceHandler.kt index 5569e9735..9c320c0ae 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferenceHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferenceHandler.kt @@ -4,6 +4,7 @@ import co.nilin.opex.referral.core.model.Reference interface ReferenceHandler { suspend fun findAll(): List - suspend fun findByUuid(uuid: String): Reference? - suspend fun findByCode(code: String): Reference? + suspend fun findByReferentUuid(uuid: String): Reference? + suspend fun findByReferrerUuid(uuid: String): List + suspend fun findByCode(code: String): List } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Reference.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Reference.kt index 131e2453d..eab8a63c9 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Reference.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Reference.kt @@ -6,6 +6,6 @@ import org.springframework.data.relational.core.mapping.Table @Table("referral_code_references") data class Reference( @Id var id: Long?, - var uuid: String, + var referentUuid: String, var referralCodeId: Long ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt index 25b78a518..61b7d06f1 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt @@ -20,23 +20,32 @@ class ReferenceHandlerImpl( val referralCode = referralCodeRepository.findById(ref.referralCodeId).map { ReferralCode(it.uuid, it.code, it.referentCommission) }.awaitSingle() - Reference(referralCode, ref.uuid) + Reference(referralCode, ref.referentUuid) } } - override suspend fun findByUuid(uuid: String): Reference? { + override suspend fun findByReferentUuid(uuid: String): Reference? { val ref = referenceRepository.findByUuid(uuid).awaitSingleOrNull() ?: return null val referralCode = referralCodeRepository.findById(ref.referralCodeId).map { ReferralCode(it.uuid, it.code, it.referentCommission) }.awaitSingle() - return Reference(referralCode, ref.uuid) + return Reference(referralCode, ref.referentUuid) } - override suspend fun findByCode(code: String): Reference? { - val ref = referenceRepository.findByCode(code).awaitSingle() ?: return null - val referralCode = referralCodeRepository.findById(ref.referralCodeId).map { + override suspend fun findByReferrerUuid(uuid: String): List { + val ref = referenceRepository.findByReferrerUuid(uuid).collectList().awaitSingle() + val referralCode = referralCodeRepository.findByUuid(uuid).map { + ReferralCode(it.uuid, it.code, it.referentCommission) + }.awaitSingle() + return ref.map { Reference(referralCode, it.referentUuid) } + } + + + override suspend fun findByCode(code: String): List { + val ref = referenceRepository.findByCode(code).collectList().awaitSingle() + val referralCode = referralCodeRepository.findByCode(code).map { ReferralCode(it.uuid, it.code, it.referentCommission) }.awaitSingle() - return Reference(referralCode, ref.uuid) + return ref.map { Reference(referralCode, it.referentUuid) } } } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt index 9a101e30a..4141eddef 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt @@ -8,9 +8,12 @@ import reactor.core.publisher.Flux @Repository interface ReferenceRepository : ReactiveCrudRepository { - @Query("SELECT * FROM referral_code_references LEFT JOIN referral_codes ON referral_code_id = referral_codes.id") + @Query("SELECT * FROM referral_code_references LEFT JOIN referral_codes ON referral_code_id = referral_codes.id WHERE code = :code") fun findByCode(code: String): Flux - fun findByUuid(uuid: String): Flux + + @Query("SELECT * FROM referral_code_references LEFT JOIN referral_codes ON referral_code_id = referral_codes.id WHERE referral_codes.uuid = :uuid") + fun findByReferrerUuid(uuid: String): Flux + fun findByReferentUuid(uuid: String): Flux fun deleteByUuid(uuid: String) fun deleteByReferralCodeId(id: Long): Flux } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index acacb0297..8b9a5320f 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -12,7 +12,7 @@ CREATE TABLE IF NOT EXISTS referral_codes ( CREATE TABLE IF NOT EXISTS referral_code_references ( id SERIAL PRIMARY KEY, - uuid VARCHAR(72) NOT NULL UNIQUE, + referent_uuid VARCHAR(72) NOT NULL UNIQUE, referral_code_id INTEGER NOT NULL REFERENCES referral_codes(id), UNIQUE(uuid, referral_code_id) ); From 7161e7b561ea21faff80c450d30809cbca8423b6 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 20 Dec 2021 16:30:36 +0330 Subject: [PATCH 063/169] Fix referral issues --- .../referral/ports/postgres/impl/ReferenceHandlerImpl.kt | 3 +-- .../ports/postgres/impl/ReferralCodeHandlerImpl.kt | 7 +++---- .../postgres/repository/CommissionRewardRepository.kt | 3 +++ .../ports/postgres/repository/ReferenceRepository.kt | 6 +++--- .../ports/postgres/repository/ReferralCodeRepository.kt | 2 +- .../src/main/resources/schema.sql | 2 +- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt index 61b7d06f1..aa867ace5 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt @@ -25,7 +25,7 @@ class ReferenceHandlerImpl( } override suspend fun findByReferentUuid(uuid: String): Reference? { - val ref = referenceRepository.findByUuid(uuid).awaitSingleOrNull() ?: return null + val ref = referenceRepository.findByReferentUuid(uuid).awaitSingleOrNull() ?: return null val referralCode = referralCodeRepository.findById(ref.referralCodeId).map { ReferralCode(it.uuid, it.code, it.referentCommission) }.awaitSingle() @@ -40,7 +40,6 @@ class ReferenceHandlerImpl( return ref.map { Reference(referralCode, it.referentUuid) } } - override suspend fun findByCode(code: String): List { val ref = referenceRepository.findByCode(code).collectList().awaitSingle() val referralCode = referralCodeRepository.findByCode(code).map { diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index c3dacb2ea..d02d25347 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -33,13 +33,12 @@ class ReferralCodeHandlerImpl( } override suspend fun findAll(): List { - return referralCodeRepository.findAll() - .map { ReferralCode(it.uuid, it.code, it.referentCommission) } + return referralCodeRepository.findAll().map { ReferralCode(it.uuid, it.code, it.referentCommission) } .collectList().awaitSingle() } override suspend fun findByReferentUuid(uuid: String): ReferralCode? { - val referral = referenceRepository.findByUuid(uuid).awaitSingleOrNull() ?: return null + val referral = referenceRepository.findByReferentUuid(uuid).awaitSingleOrNull() ?: return null return referralCodeRepository.findById(referral.referralCodeId) .map { ReferralCode(it.uuid, it.code, it.referentCommission) } .awaitSingleOrNull() @@ -65,7 +64,7 @@ class ReferralCodeHandlerImpl( ) { if (referentCommission < BigDecimal.ZERO || referentCommission > BigDecimal.ONE) throw IllegalArgumentException("Commission value must be in range of [0, 1]") - referralCodeRepository.updateCommissions(code, referentCommission).awaitSingleOrNull() + referralCodeRepository.updateByCode(code, referentCommission).awaitSingleOrNull() } override suspend fun deleteByCode(code: String) { diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CommissionRewardRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CommissionRewardRepository.kt index d31466db3..e543ce64a 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CommissionRewardRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CommissionRewardRepository.kt @@ -1,6 +1,7 @@ package co.nilin.opex.referral.ports.postgres.repository import co.nilin.opex.referral.ports.postgres.dao.CommissionReward +import org.springframework.data.r2dbc.repository.Query import org.springframework.data.repository.reactive.ReactiveCrudRepository import org.springframework.stereotype.Repository import reactor.core.publisher.Flux @@ -8,12 +9,14 @@ import reactor.core.publisher.Mono @Repository interface CommissionRewardRepository : ReactiveCrudRepository { + @Query("SELECT * FROM commission_rewards WHERE (:code is null OR referral_code = :code) AND (:referrerUuid is null OR referrer_uuid = :referrerUuid) AND (:referentUuid is null OR referent_uuid = :referentUuid)") fun findByReferralCodeAndReferrerUuidAndReferentUuid( code: String?, referrerUuid: String?, referentUuid: String? ): Flux + @Query("DELETE FROM commission_rewards WHERE (:code is null OR referral_code = :code) AND (:referrerUuid is null OR referrer_uuid = :referrer_uuid) AND (:referentUuid is null OR referent_uuid = :referentUuid)") fun deleteByReferralCodeAndReferrerUuidAndReferentUuid( code: String?, referrerUuid: String?, diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt index 4141eddef..23d1c8e87 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt @@ -12,8 +12,8 @@ interface ReferenceRepository : ReactiveCrudRepository { fun findByCode(code: String): Flux @Query("SELECT * FROM referral_code_references LEFT JOIN referral_codes ON referral_code_id = referral_codes.id WHERE referral_codes.uuid = :uuid") - fun findByReferrerUuid(uuid: String): Flux - fun findByReferentUuid(uuid: String): Flux - fun deleteByUuid(uuid: String) + fun findByReferrerUuid(referrerUuid: String): Flux + fun findByReferentUuid(referrerUuid: String): Flux + fun deleteByReferentUuid(referrerUuid: String) fun deleteByReferralCodeId(id: Long): Flux } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt index 463b39c3f..c7a196a11 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt @@ -16,7 +16,7 @@ interface ReferralCodeRepository : ReactiveCrudRepository { fun findByUuid(uuid: String): Mono @Query("UPDATE referral_codes SET referent_commission = COALESCE(:referentCommission, referent_commission) WHERE code = :code") - fun updateCommissions(code: String, referentCommission: BigDecimal?): Mono + fun updateByCode(code: String, referentCommission: BigDecimal?): Mono fun deleteByUuid(uuid: String): Mono fun deleteByCode(code: String): Mono diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 8b9a5320f..18dac65d3 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -14,7 +14,7 @@ CREATE TABLE IF NOT EXISTS referral_code_references ( id SERIAL PRIMARY KEY, referent_uuid VARCHAR(72) NOT NULL UNIQUE, referral_code_id INTEGER NOT NULL REFERENCES referral_codes(id), - UNIQUE(uuid, referral_code_id) + UNIQUE(referent_uuid, referral_code_id) ); CREATE TABLE IF NOT EXISTS commission_rewards ( From f80b4fc2be9354d291c2145b67dfd1f2cc163e01 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 21 Dec 2021 10:30:33 +0330 Subject: [PATCH 064/169] Improve CommissionController.kt --- .../opex/referral/app/controller/CommissionController.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt index e42f69a99..401959b0a 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt @@ -8,17 +8,17 @@ import org.springframework.web.bind.annotation.* class CommissionController(private val commissionRewardHandler: CommissionRewardHandler) { @GetMapping("/commissions/{code}") suspend fun getCommissionsByReferrerAndCode( - @PathVariable code: String?, - @RequestParam referrerUuid: String + @PathVariable code: String ): List { - return commissionRewardHandler.findCommissions(referrerUuid = referrerUuid, referralCode = code) + return commissionRewardHandler.findCommissions(referralCode = code) } @GetMapping("/commissions") suspend fun getCommissionsByReferent( + @RequestParam referrerUuid: String?, @RequestParam referentUuid: String? ): List { - return commissionRewardHandler.findCommissions(referentUuid = referentUuid) + return commissionRewardHandler.findCommissions(referentUuid = referentUuid, referrerUuid = referrerUuid) } @DeleteMapping("/commissions") From 012f2ec6f99d7e36c75722a2091495cffe58df5f Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 21 Dec 2021 10:52:58 +0330 Subject: [PATCH 065/169] Add report controller --- .../app/controller/ReportController.kt | 54 +++++++++++++++++++ .../referral/core/spi/ReferralCodeHandler.kt | 1 + .../postgres/impl/ReferralCodeHandlerImpl.kt | 6 +++ .../repository/ReferralCodeRepository.kt | 3 +- 4 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt new file mode 100644 index 000000000..0982c5b80 --- /dev/null +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt @@ -0,0 +1,54 @@ +package co.nilin.opex.referral.app.controller + +import co.nilin.opex.referral.core.spi.CommissionRewardHandler +import co.nilin.opex.referral.core.spi.ReferenceHandler +import co.nilin.opex.referral.core.spi.ReferralCodeHandler +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.RestController +import java.math.BigDecimal + +@RestController +class ReportController( + private val commissionRewardHandler: CommissionRewardHandler, + private val referralCodeHandler: ReferralCodeHandler, + private val referenceHandler: ReferenceHandler +) { + data class ReportBody( + val code: String, + val referentCounts: Long, + val tradeCount: Long, + val referrerShare: BigDecimal, + val referentShare: BigDecimal + ) + + @GetMapping("/reports/{code}") + suspend fun getReportByCode(@PathVariable code: String): ReportBody { + val references = referenceHandler.findByCode(code) + val commissions = commissionRewardHandler.findCommissions(referralCode = code) + return ReportBody( + code, + references.size.toLong(), + commissions.size.toLong(), + commissions.sumOf { it.referrerShare }, + commissions.sumOf { it.referentShare } + ) + } + + @GetMapping("/reports") + suspend fun getReportByReferrer(@RequestParam referrerUuid: String): List { + val references = referenceHandler.findByReferrerUuid(referrerUuid) + val codes = referralCodeHandler.findByReferrerUuid(referrerUuid) + val commissions = commissionRewardHandler.findCommissions(referrerUuid = referrerUuid) + return codes.map { + ReportBody( + it.code, + references.size.toLong(), + commissions.size.toLong(), + commissions.sumOf { c -> c.referrerShare }, + commissions.sumOf { c -> c.referentShare } + ) + } + } +} diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt index 6a052d04c..490571b4b 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ReferralCodeHandler.kt @@ -11,6 +11,7 @@ interface ReferralCodeHandler { suspend fun findAll(): List suspend fun findByReferentUuid(uuid: String): ReferralCode? + suspend fun findByReferrerUuid(uuid: String): List suspend fun findByCode(code: String): ReferralCode? suspend fun assign(code: String, referentUuid: String) suspend fun updateCommissions(code: String, referentCommission: BigDecimal) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index d02d25347..842d8ac66 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -44,6 +44,12 @@ class ReferralCodeHandlerImpl( .awaitSingleOrNull() } + override suspend fun findByReferrerUuid(uuid: String): List { + return referralCodeRepository.findByUuid(uuid).map { ReferralCode(it.uuid, it.code, it.referentCommission) } + .collectList() + .awaitSingleOrNull() + } + override suspend fun findByCode(code: String): ReferralCode? { return referralCodeRepository.findByCode(code) .map { ReferralCode(it.uuid, it.code, it.referentCommission) } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt index c7a196a11..6ff1f721a 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferralCodeRepository.kt @@ -4,6 +4,7 @@ import co.nilin.opex.referral.ports.postgres.dao.ReferralCode import org.springframework.data.r2dbc.repository.Query import org.springframework.data.repository.reactive.ReactiveCrudRepository import org.springframework.stereotype.Repository +import reactor.core.publisher.Flux import reactor.core.publisher.Mono import java.math.BigDecimal @@ -13,7 +14,7 @@ interface ReferralCodeRepository : ReactiveCrudRepository { @Query("SELECT MAX(id) FROM referral_codes") fun findMaxId(): Mono fun findByCode(code: String): Mono - fun findByUuid(uuid: String): Mono + fun findByUuid(uuid: String): Flux @Query("UPDATE referral_codes SET referent_commission = COALESCE(:referentCommission, referent_commission) WHERE code = :code") fun updateByCode(code: String, referentCommission: BigDecimal?): Mono From 901c0cdbd1a946e12da9f22988c544c2055d110b Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 21 Dec 2021 11:49:17 +0330 Subject: [PATCH 066/169] Remove referent share from report --- .../app/controller/ReportController.kt | 23 ++++--------------- 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt index 0982c5b80..d79b23465 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt @@ -19,36 +19,23 @@ class ReportController( val code: String, val referentCounts: Long, val tradeCount: Long, - val referrerShare: BigDecimal, - val referentShare: BigDecimal + val referrerShare: BigDecimal ) @GetMapping("/reports/{code}") suspend fun getReportByCode(@PathVariable code: String): ReportBody { - val references = referenceHandler.findByCode(code) + val referencesCount = referenceHandler.findByCode(code).size.toLong() val commissions = commissionRewardHandler.findCommissions(referralCode = code) - return ReportBody( - code, - references.size.toLong(), - commissions.size.toLong(), - commissions.sumOf { it.referrerShare }, - commissions.sumOf { it.referentShare } - ) + return ReportBody(code, referencesCount, commissions.size.toLong(), commissions.sumOf { it.referrerShare }) } @GetMapping("/reports") suspend fun getReportByReferrer(@RequestParam referrerUuid: String): List { - val references = referenceHandler.findByReferrerUuid(referrerUuid) + val referencesCount = referenceHandler.findByReferrerUuid(referrerUuid).size.toLong() val codes = referralCodeHandler.findByReferrerUuid(referrerUuid) val commissions = commissionRewardHandler.findCommissions(referrerUuid = referrerUuid) return codes.map { - ReportBody( - it.code, - references.size.toLong(), - commissions.size.toLong(), - commissions.sumOf { c -> c.referrerShare }, - commissions.sumOf { c -> c.referentShare } - ) + ReportBody(it.code, referencesCount, commissions.size.toLong(), commissions.sumOf { c -> c.referrerShare }) } } } From cb22a495016a6de310c661b86917a3385fc748de Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 21 Dec 2021 12:00:34 +0330 Subject: [PATCH 067/169] Improve referral code controller --- .../app/controller/ReferralController.kt | 43 +++++++++++++------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index 53f6cc960..6e2e5731b 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -1,21 +1,35 @@ package co.nilin.opex.referral.app.controller -import co.nilin.opex.referral.core.model.Reference -import co.nilin.opex.referral.core.model.ReferralCode import co.nilin.opex.referral.core.spi.ReferenceHandler import co.nilin.opex.referral.core.spi.ReferralCodeHandler +import co.nilin.opex.utility.error.data.OpexError +import co.nilin.opex.utility.error.data.OpexException import org.springframework.web.bind.annotation.* import java.math.BigDecimal @RestController -class ReferralController(private val referralCodeHandler: ReferralCodeHandler, private val referenceHandler: ReferenceHandler) { +class ReferralController( + private val referralCodeHandler: ReferralCodeHandler, + private val referenceHandler: ReferenceHandler +) { data class PostReferralBody( - var uuid: String, - var referentCommission: BigDecimal + val uuid: String, + val referentCommission: BigDecimal ) data class PatchReferralBody( - var referentCommission: BigDecimal + val referentCommission: BigDecimal + ) + + data class ReferralCodeBody( + val uuid: String, + val code: String, + val referentCommission: BigDecimal + ) + + data class ReferenceBody( + var referralCode: ReferralCodeBody, + var referentUuid: String, ) @PostMapping("/codes") @@ -34,18 +48,23 @@ class ReferralController(private val referralCodeHandler: ReferralCodeHandler, p } @GetMapping("/codes/{code}") - suspend fun getReferralCodeByCode(@PathVariable code: String): ReferralCode? { - return referralCodeHandler.findByCode(code) + suspend fun getReferralCodeByCode(@PathVariable code: String): ReferralCodeBody { + val referralCode = referralCodeHandler.findByCode(code) ?: throw OpexException(OpexError.NotFound) + return ReferralCodeBody(referralCode.uuid, referralCode.code, referralCode.referentCommission) } @GetMapping("/codes/{code}/references") - suspend fun getReferenceByCode(@PathVariable code: String): List? { - return referenceHandler.findByCode(code) + suspend fun getReferenceByCode(@PathVariable code: String): List { + return referenceHandler.findByCode(code).map { + val referralCode = + ReferralCodeBody(it.referralCode.uuid, it.referralCode.code, it.referralCode.referentCommission) + ReferenceBody(referralCode, it.referentUuid) + } } @GetMapping("/codes") - suspend fun getAllReferralCodes(): List { - return referralCodeHandler.findAll() + suspend fun getAllReferralCodes(): List { + return referralCodeHandler.findAll().map { ReferralCodeBody(it.uuid, it.code, it.referentCommission) } } @DeleteMapping("/codes/{code}") From 2faf46761c5d222eee6b815a66cca885d16a5a0d Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 21 Dec 2021 13:05:30 +0330 Subject: [PATCH 068/169] Refactor referral controllers --- .../app/controller/CommissionController.kt | 37 ++++++++++++++++--- .../app/controller/ReferralController.kt | 13 +------ 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt index 401959b0a..45e2830f7 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt @@ -1,24 +1,51 @@ package co.nilin.opex.referral.app.controller -import co.nilin.opex.referral.core.model.CommissionReward import co.nilin.opex.referral.core.spi.CommissionRewardHandler import org.springframework.web.bind.annotation.* +import java.math.BigDecimal @RestController class CommissionController(private val commissionRewardHandler: CommissionRewardHandler) { + data class CommissionRewardBody( + var referrerUuid: String, + var referentUuid: String, + var referralCode: String, + var richTrade: Long, + var referrerShare: BigDecimal, + var referentShare: BigDecimal, + ) + @GetMapping("/commissions/{code}") suspend fun getCommissionsByReferrerAndCode( @PathVariable code: String - ): List { - return commissionRewardHandler.findCommissions(referralCode = code) + ): List { + return commissionRewardHandler.findCommissions(referralCode = code).map { + CommissionRewardBody( + it.referrerUuid, + it.referentUuid, + it.referralCode, + it.richTrade.first, + it.referrerShare, + it.referentShare + ) + } } @GetMapping("/commissions") suspend fun getCommissionsByReferent( @RequestParam referrerUuid: String?, @RequestParam referentUuid: String? - ): List { - return commissionRewardHandler.findCommissions(referentUuid = referentUuid, referrerUuid = referrerUuid) + ): List { + return commissionRewardHandler.findCommissions(referentUuid = referentUuid, referrerUuid = referrerUuid).map { + CommissionRewardBody( + it.referrerUuid, + it.referentUuid, + it.referralCode, + it.richTrade.first, + it.referrerShare, + it.referentShare + ) + } } @DeleteMapping("/commissions") diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index 6e2e5731b..b4db0de73 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -27,11 +27,6 @@ class ReferralController( val referentCommission: BigDecimal ) - data class ReferenceBody( - var referralCode: ReferralCodeBody, - var referentUuid: String, - ) - @PostMapping("/codes") suspend fun generateReferralCode(@RequestBody body: PostReferralBody): String { return referralCodeHandler.generateReferralCode(body.uuid, body.referentCommission) @@ -54,12 +49,8 @@ class ReferralController( } @GetMapping("/codes/{code}/references") - suspend fun getReferenceByCode(@PathVariable code: String): List { - return referenceHandler.findByCode(code).map { - val referralCode = - ReferralCodeBody(it.referralCode.uuid, it.referralCode.code, it.referralCode.referentCommission) - ReferenceBody(referralCode, it.referentUuid) - } + suspend fun getReferenceByCode(@PathVariable code: String): List { + return referenceHandler.findByCode(code).map { it.referentUuid } } @GetMapping("/codes") From 68dcaf1251a1a5f69221e6f7d623d106c965aeb9 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 21 Dec 2021 14:30:46 +0330 Subject: [PATCH 069/169] Fix report controller --- .../app/controller/ReportController.kt | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt index d79b23465..f6d7c6ef0 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt @@ -2,23 +2,19 @@ package co.nilin.opex.referral.app.controller import co.nilin.opex.referral.core.spi.CommissionRewardHandler import co.nilin.opex.referral.core.spi.ReferenceHandler -import co.nilin.opex.referral.core.spi.ReferralCodeHandler import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PathVariable -import org.springframework.web.bind.annotation.RequestParam import org.springframework.web.bind.annotation.RestController import java.math.BigDecimal @RestController class ReportController( private val commissionRewardHandler: CommissionRewardHandler, - private val referralCodeHandler: ReferralCodeHandler, private val referenceHandler: ReferenceHandler ) { data class ReportBody( val code: String, - val referentCounts: Long, - val tradeCount: Long, + val referentsCount: Long, val referrerShare: BigDecimal ) @@ -26,16 +22,6 @@ class ReportController( suspend fun getReportByCode(@PathVariable code: String): ReportBody { val referencesCount = referenceHandler.findByCode(code).size.toLong() val commissions = commissionRewardHandler.findCommissions(referralCode = code) - return ReportBody(code, referencesCount, commissions.size.toLong(), commissions.sumOf { it.referrerShare }) - } - - @GetMapping("/reports") - suspend fun getReportByReferrer(@RequestParam referrerUuid: String): List { - val referencesCount = referenceHandler.findByReferrerUuid(referrerUuid).size.toLong() - val codes = referralCodeHandler.findByReferrerUuid(referrerUuid) - val commissions = commissionRewardHandler.findCommissions(referrerUuid = referrerUuid) - return codes.map { - ReportBody(it.code, referencesCount, commissions.size.toLong(), commissions.sumOf { c -> c.referrerShare }) - } + return ReportBody(code, referencesCount, commissions.sumOf { it.referrerShare }) } } From a5cd2d861d78e0da1aedca0b49d8698ccb8c6dc2 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 22 Dec 2021 14:06:06 +0330 Subject: [PATCH 070/169] Fix table schema of commission reward --- .../opex/referral/ports/postgres/dao/CommissionReward.kt | 8 ++++++-- .../ports/postgres/impl/CommissionRewardPersisterImpl.kt | 3 ++- .../src/main/resources/schema.sql | 8 ++++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt index 0cc1445a8..6ea585a31 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt @@ -1,6 +1,7 @@ package co.nilin.opex.referral.ports.postgres.dao import org.springframework.data.annotation.Id +import org.springframework.data.relational.core.mapping.Column import org.springframework.data.relational.core.mapping.Table import java.math.BigDecimal @@ -12,5 +13,8 @@ data class CommissionReward( var referralCode: String, var richTradeId: Long, var referrerShare: BigDecimal, - var referentShare: BigDecimal -) + var referentShare: BigDecimal, + var checkoutDate: Long?, +) { + val isCheckedOut: Boolean get() = checkoutDate != null +} diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt index 6496e0fad..1798d6109 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt @@ -18,7 +18,8 @@ class CommissionRewardPersisterImpl(private val commissionRewardRepository: Comm commissionReward.referralCode, commissionReward.richTrade.first, commissionReward.referrerShare, - commissionReward.referentShare + commissionReward.referentShare, + null ) ).awaitSingleOrNull() } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 18dac65d3..fd353cfe0 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -18,11 +18,15 @@ CREATE TABLE IF NOT EXISTS referral_code_references ( ); CREATE TABLE IF NOT EXISTS commission_rewards ( - id SERIAL PRIMARY KEY, + id BIGSERIAL PRIMARY KEY, referrer_uuid VARCHAR(72) NOT NULL, referent_uuid VARCHAR(72) NOT NULL, referral_code VARCHAR(72) NOT NULL REFERENCES referral_codes(code), rich_trade_id INTEGER NOT NULL, referrer_share DECIMAL NOT NULL, - referent_share DECIMAL NOT NULL + referent_share DECIMAL NOT NULL, + checkout_date DATE, + is_checked_out BOOLEAN NOT NULL GENERATED ALWAYS AS (checkout_date IS NOT NULL) STORED ); + +CREATE INDEX IF NOT EXISTS is_checked_index ON commission_rewards(is_checked_out); From be4b197e8dc3842d084da85b1a1fe94fd8a227dc Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 22 Dec 2021 17:08:11 +0330 Subject: [PATCH 071/169] Add payment records entity to database --- .../ports/postgres/dao/PaymentRecord.kt | 12 ++++++++++++ .../ports/postgres/dao/PaymentStatus.kt | 9 +++++++++ .../repository/PaymentRecordRepository.kt | 8 ++++++++ .../repository/PaymentStatusRepository.kt | 8 ++++++++ .../src/main/resources/schema.sql | 17 ++++++++++++++--- 5 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentStatus.kt create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentStatusRepository.kt diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt new file mode 100644 index 000000000..efd660e89 --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt @@ -0,0 +1,12 @@ +package co.nilin.opex.referral.ports.postgres.dao + +import org.springframework.data.annotation.Id +import org.springframework.data.relational.core.mapping.Table + +@Table("payment_records") +data class PaymentRecord( + @Id var id: Long?, + var commission_rewards_id: Long, + var update_date: Long, + var payment_status: String +) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentStatus.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentStatus.kt new file mode 100644 index 000000000..9b2625f72 --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentStatus.kt @@ -0,0 +1,9 @@ +package co.nilin.opex.referral.ports.postgres.dao + +import org.springframework.data.annotation.Id +import org.springframework.data.relational.core.mapping.Table + +@Table("payment_status") +data class PaymentStatus( + @Id var status: String? +) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt new file mode 100644 index 000000000..408e2a77e --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt @@ -0,0 +1,8 @@ +package co.nilin.opex.referral.ports.postgres.repository + +import co.nilin.opex.referral.ports.postgres.dao.PaymentRecord +import org.springframework.data.repository.reactive.ReactiveCrudRepository +import org.springframework.stereotype.Repository + +@Repository +interface PaymentRecordRepository : ReactiveCrudRepository \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentStatusRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentStatusRepository.kt new file mode 100644 index 000000000..959fcebeb --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentStatusRepository.kt @@ -0,0 +1,8 @@ +package co.nilin.opex.referral.ports.postgres.repository + +import co.nilin.opex.referral.ports.postgres.dao.PaymentStatus +import org.springframework.data.repository.reactive.ReactiveCrudRepository +import org.springframework.stereotype.Repository + +@Repository +interface PaymentStatusRepository : ReactiveCrudRepository \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index fd353cfe0..36e078744 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -17,16 +17,27 @@ CREATE TABLE IF NOT EXISTS referral_code_references ( UNIQUE(referent_uuid, referral_code_id) ); +CREATE TABLE IF NOT EXISTS payment_status ( + status VARCHAR(20) PRIMARY KEY +); + CREATE TABLE IF NOT EXISTS commission_rewards ( id BIGSERIAL PRIMARY KEY, referrer_uuid VARCHAR(72) NOT NULL, referent_uuid VARCHAR(72) NOT NULL, referral_code VARCHAR(72) NOT NULL REFERENCES referral_codes(code), rich_trade_id INTEGER NOT NULL, + referent_order_side VARCHAR(20) NOT NULL, referrer_share DECIMAL NOT NULL, referent_share DECIMAL NOT NULL, - checkout_date DATE, - is_checked_out BOOLEAN NOT NULL GENERATED ALWAYS AS (checkout_date IS NOT NULL) STORED + UNIQUE(rich_trade_id, referrer_uuid, referent_uuid, referent_order_side) +); + +CREATE TABLE IF NOT EXISTS payment_records ( + id BIGSERIAL PRIMARY KEY, + commission_rewards_id BIGINTEGER NOT NULL REFERENCES commission_rewards(id), + update_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + payment_status VARCHAR(20) NOT NULL REFERENCES payment_status(status) DEFAULT 'pending' ); -CREATE INDEX IF NOT EXISTS is_checked_index ON commission_rewards(is_checked_out); +CREATE INDEX IF NOT EXISTS payment_status_index ON payment_records(status); From cc8acd58a321a013d82bd15ee88d210dc6abce2a Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 25 Dec 2021 11:15:28 +0330 Subject: [PATCH 072/169] Add commission reward insert trigger --- .../src/main/resources/schema.sql | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 36e078744..61e52fefd 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -35,9 +35,19 @@ CREATE TABLE IF NOT EXISTS commission_rewards ( CREATE TABLE IF NOT EXISTS payment_records ( id BIGSERIAL PRIMARY KEY, - commission_rewards_id BIGINTEGER NOT NULL REFERENCES commission_rewards(id), - update_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + commission_rewards_id BIGINT NOT NULL REFERENCES commission_rewards(id), + create_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, payment_status VARCHAR(20) NOT NULL REFERENCES payment_status(status) DEFAULT 'pending' ); -CREATE INDEX IF NOT EXISTS payment_status_index ON payment_records(status); +CREATE INDEX IF NOT EXISTS payment_records_status_index ON payment_records(payment_status); + +CREATE OR REPLACE FUNCTION on_insert_commission_rewards() RETURNS TRIGGER AS $$ BEGIN + INSERT INTO payment_records(commission_rewards_id) VALUES (NEW.id); + RETURN NEW; +END; $$ LANGUAGE 'plpgsql'; + +CREATE OR REPLACE TRIGGER commission_rewards_insert AFTER INSERT +ON commission_rewards +FOR EACH ROW +EXECUTE PROCEDURE on_insert_commission_rewards(); From f00d9c4bea6d73187cfdea8b1ad0e335b3fcd1c9 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 25 Dec 2021 12:14:52 +0330 Subject: [PATCH 073/169] Add payment_status initial data --- .../src/main/resources/data.sql | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql index 1494b0f01..c8652c0cf 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql @@ -1,4 +1,3 @@ -INSERT INTO - configs(name, referral_commission_reward) -VALUES - ('default', 0.3) ON CONFLICT DO NOTHING; \ No newline at end of file +INSERT INTO configs(name, referral_commission_reward) VALUES ('default', 0.3) ON CONFLICT DO NOTHING; + +INSERT INTO payment_status(status) VALUES ('pending'), ('checked_out') ON CONFLICT DO NOTHING; \ No newline at end of file From 71804245ed6789bf233d2d5719ea8f23c8fe810d Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 26 Dec 2021 17:02:13 +0330 Subject: [PATCH 074/169] Add payment handler --- .../opex/referral/app/config/AppConfig.kt | 6 ++-- .../app/controller/CommissionController.kt | 4 +++ .../core/api/CommissionRewardCalculator.kt | 2 +- .../referral/core/model/CommissionReward.kt | 4 ++- .../opex/referral/core/model/PaymentRecord.kt | 6 ++++ .../referral/core/model/PaymentStatuses.kt | 6 ++++ .../service/CommissionRewardCalculatorImpl.kt | 9 +++-- .../core/spi/CommissionPaymentHandler.kt | 9 +++++ .../ports/postgres/dao/CommissionReward.kt | 9 +++-- .../ports/postgres/dao/PaymentRecord.kt | 22 ++++++++++-- .../ports/postgres/dao/PaymentStatus.kt | 5 ++- .../impl/CommissionPaymentHandlerImpl.kt | 35 +++++++++++++++++++ .../impl/CommissionRewardHandlerImpl.kt | 1 + .../impl/CommissionRewardPersisterImpl.kt | 6 ++-- .../repository/PaymentRecordRepository.kt | 16 ++++++++- .../src/main/resources/schema.sql | 8 ++--- 16 files changed, 121 insertions(+), 27 deletions(-) create mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentRecord.kt create mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentStatuses.kt create mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt index 10d4e1f58..4347bac93 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt @@ -41,9 +41,9 @@ class AppConfig { timestamp: Long ) { runBlocking(AppDispatchers.kafkaExecutor) { - val makeCommission = commissionRewardCalculator.calculate(richTrade.makerUuid, richTrade) - val takerCommission = commissionRewardCalculator.calculate(richTrade.makerUuid, richTrade) - commissionRewardPersister.save(makeCommission) + val makerCommission = commissionRewardCalculator.calculate(richTrade.makerOuid, richTrade) + val takerCommission = commissionRewardCalculator.calculate(richTrade.takerOuid, richTrade) + commissionRewardPersister.save(makerCommission) commissionRewardPersister.save(takerCommission) } } diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt index 45e2830f7..ac3602e2f 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt @@ -1,5 +1,6 @@ package co.nilin.opex.referral.app.controller +import co.nilin.opex.matching.engine.core.model.OrderDirection import co.nilin.opex.referral.core.spi.CommissionRewardHandler import org.springframework.web.bind.annotation.* import java.math.BigDecimal @@ -11,6 +12,7 @@ class CommissionController(private val commissionRewardHandler: CommissionReward var referentUuid: String, var referralCode: String, var richTrade: Long, + var referentOrderDirection: OrderDirection, var referrerShare: BigDecimal, var referentShare: BigDecimal, ) @@ -25,6 +27,7 @@ class CommissionController(private val commissionRewardHandler: CommissionReward it.referentUuid, it.referralCode, it.richTrade.first, + it.referentOrderDirection, it.referrerShare, it.referentShare ) @@ -42,6 +45,7 @@ class CommissionController(private val commissionRewardHandler: CommissionReward it.referentUuid, it.referralCode, it.richTrade.first, + it.referentOrderDirection, it.referrerShare, it.referentShare ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/CommissionRewardCalculator.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/CommissionRewardCalculator.kt index 4da3c8d68..7b32029c2 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/CommissionRewardCalculator.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/CommissionRewardCalculator.kt @@ -4,5 +4,5 @@ import co.nilin.opex.accountant.core.inout.RichTrade import co.nilin.opex.referral.core.model.CommissionReward interface CommissionRewardCalculator { - suspend fun calculate(uuid: String, richTrade: RichTrade): CommissionReward + suspend fun calculate(ouid: String, richTrade: RichTrade): CommissionReward } \ No newline at end of file diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt index 8eb45ab87..4d3123bbf 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt @@ -1,6 +1,7 @@ package co.nilin.opex.referral.core.model import co.nilin.opex.accountant.core.inout.RichTrade +import co.nilin.opex.matching.engine.core.model.OrderDirection import java.math.BigDecimal data class CommissionReward( @@ -8,6 +9,7 @@ data class CommissionReward( var referentUuid: String, var referralCode: String, var richTrade: Pair, + var referentOrderDirection: OrderDirection, var referrerShare: BigDecimal, - var referentShare: BigDecimal, + var referentShare: BigDecimal ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentRecord.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentRecord.kt new file mode 100644 index 000000000..809c22868 --- /dev/null +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentRecord.kt @@ -0,0 +1,6 @@ +package co.nilin.opex.referral.core.model + +data class PaymentRecord( + var commissionReward: CommissionReward, + var paymentStatus: PaymentStatuses +) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentStatuses.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentStatuses.kt new file mode 100644 index 000000000..a6d61e2c0 --- /dev/null +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentStatuses.kt @@ -0,0 +1,6 @@ +package co.nilin.opex.referral.core.model + +enum class PaymentStatuses { + PENDING, + CHECKED_OUT +} diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt index cce9491bf..317ca700e 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt @@ -11,16 +11,19 @@ import java.math.BigDecimal class CommissionRewardCalculatorImpl( private val referenceHandler: ReferenceHandler ) : CommissionRewardCalculator { - override suspend fun calculate(uuid: String, richTrade: RichTrade): CommissionReward { - if (uuid != richTrade.makerUuid && uuid != richTrade.takerUuid) throw IllegalArgumentException("Variable uuid is not in trade") + override suspend fun calculate(ouid: String, richTrade: RichTrade): CommissionReward { + if (ouid != richTrade.makerOuid && ouid != richTrade.takerOuid) throw IllegalArgumentException("Order is not correct") + val uuid = if (ouid == richTrade.makerOuid) richTrade.makerUuid else richTrade.takerUuid val reference = referenceHandler.findByReferentUuid(uuid) ?: throw IllegalArgumentException("No referral entity found for uuid ($uuid)") - val commission = if (uuid == richTrade.makerUuid) richTrade.makerCommision else richTrade.takerCommision + val commission = if (ouid == richTrade.makerOuid) richTrade.makerCommision else richTrade.takerCommision + val direction = if (ouid == richTrade.makerOuid) richTrade.makerDirection else richTrade.takerDirection return CommissionReward( reference.referralCode.uuid, reference.referentUuid, reference.referralCode.code, richTrade.id to richTrade, + direction, commission * (BigDecimal.ONE - reference.referralCode.referentCommission), commission * reference.referralCode.referentCommission ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt new file mode 100644 index 000000000..de3c30b2f --- /dev/null +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt @@ -0,0 +1,9 @@ +package co.nilin.opex.referral.core.spi + +import co.nilin.opex.referral.core.model.PaymentRecord +import co.nilin.opex.referral.core.model.PaymentStatuses + +interface CommissionPaymentHandler { + suspend fun findCommissionsByStatus(paymentStatus: PaymentStatuses): List + suspend fun updatePaymentStatus(id: Long, value: PaymentStatuses) +} diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt index 6ea585a31..ed6dc70fd 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt @@ -1,7 +1,7 @@ package co.nilin.opex.referral.ports.postgres.dao +import co.nilin.opex.matching.engine.core.model.OrderDirection import org.springframework.data.annotation.Id -import org.springframework.data.relational.core.mapping.Column import org.springframework.data.relational.core.mapping.Table import java.math.BigDecimal @@ -12,9 +12,8 @@ data class CommissionReward( var referentUuid: String, var referralCode: String, var richTradeId: Long, + var referentOrderDirection: OrderDirection, var referrerShare: BigDecimal, var referentShare: BigDecimal, - var checkoutDate: Long?, -) { - val isCheckedOut: Boolean get() = checkoutDate != null -} +) + diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt index efd660e89..c4e214aa3 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt @@ -1,12 +1,28 @@ package co.nilin.opex.referral.ports.postgres.dao +import co.nilin.opex.matching.engine.core.model.OrderDirection +import co.nilin.opex.referral.core.model.PaymentStatuses import org.springframework.data.annotation.Id import org.springframework.data.relational.core.mapping.Table +import java.math.BigDecimal @Table("payment_records") data class PaymentRecord( @Id var id: Long?, - var commission_rewards_id: Long, - var update_date: Long, - var payment_status: String + var commissionRewardsId: Long, + var createDate: Long, + var paymentStatus: PaymentStatuses ) + +data class PaymentRecordProjected( + @Id var id: Long?, + var referrerUuid: String, + var referentUuid: String, + var referralCode: String, + var richTradeId: Long, + var referentOrderDirection: OrderDirection, + var referrerShare: BigDecimal, + var referentShare: BigDecimal, + var createDate: Long, + var paymentStatus: PaymentStatuses +) \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentStatus.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentStatus.kt index 9b2625f72..2add55af3 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentStatus.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentStatus.kt @@ -1,9 +1,8 @@ package co.nilin.opex.referral.ports.postgres.dao +import co.nilin.opex.referral.core.model.PaymentStatuses import org.springframework.data.annotation.Id import org.springframework.data.relational.core.mapping.Table @Table("payment_status") -data class PaymentStatus( - @Id var status: String? -) +data class PaymentStatus(@Id var status: PaymentStatuses) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt new file mode 100644 index 000000000..4eb58bd39 --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt @@ -0,0 +1,35 @@ +package co.nilin.opex.referral.ports.postgres.impl + +import co.nilin.opex.referral.core.model.CommissionReward +import co.nilin.opex.referral.core.model.PaymentRecord +import co.nilin.opex.referral.core.model.PaymentStatuses +import co.nilin.opex.referral.core.spi.CommissionPaymentHandler +import co.nilin.opex.referral.ports.postgres.repository.PaymentRecordRepository +import kotlinx.coroutines.reactive.awaitSingleOrDefault +import org.springframework.stereotype.Service + +@Service +class CommissionPaymentHandlerImpl( + private val paymentRecordRepository: PaymentRecordRepository +) : CommissionPaymentHandler { + override suspend fun findCommissionsByStatus(paymentStatus: PaymentStatuses): List { + return paymentRecordRepository.findByPaymentStatusProjected(paymentStatus).map { + PaymentRecord( + CommissionReward( + it.referrerUuid, + it.referentUuid, + it.referralCode, + Pair(it.richTradeId, null), + it.referentOrderDirection, + it.referrerShare, + it.referentShare + ), + it.paymentStatus + ) + }.collectList().awaitSingleOrDefault(emptyList()) + } + + override suspend fun updatePaymentStatus(id: Long, value: PaymentStatuses) { + paymentRecordRepository.updatePaymentStatusById(id, value) + } +} diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt index 51ab170da..0ca9f86f9 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt @@ -26,6 +26,7 @@ class CommissionRewardHandlerImpl( it.referentUuid, it.referralCode, Pair(it.richTradeId, null), + it.referentOrderDirection, it.referrerShare, it.referentShare ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt index 1798d6109..5af425d4e 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt @@ -17,10 +17,10 @@ class CommissionRewardPersisterImpl(private val commissionRewardRepository: Comm commissionReward.referentUuid, commissionReward.referralCode, commissionReward.richTrade.first, + commissionReward.referentOrderDirection, commissionReward.referrerShare, - commissionReward.referentShare, - null + commissionReward.referentShare ) ).awaitSingleOrNull() } -} \ No newline at end of file +} diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt index 408e2a77e..676967cee 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt @@ -1,8 +1,22 @@ package co.nilin.opex.referral.ports.postgres.repository +import co.nilin.opex.referral.core.model.PaymentStatuses import co.nilin.opex.referral.ports.postgres.dao.PaymentRecord +import co.nilin.opex.referral.ports.postgres.dao.PaymentRecordProjected +import org.springframework.data.r2dbc.repository.Modifying +import org.springframework.data.r2dbc.repository.Query import org.springframework.data.repository.reactive.ReactiveCrudRepository import org.springframework.stereotype.Repository +import reactor.core.publisher.Flux @Repository -interface PaymentRecordRepository : ReactiveCrudRepository \ No newline at end of file +interface PaymentRecordRepository : ReactiveCrudRepository { + suspend fun findByPaymentStatus(paymentStatus: PaymentStatuses): Flux + + @Query("SELECT * FROM payment_records LEFT JOIN commission_rewards ON commission_rewards_id = commission_rewards.id WHERE payment_status = :paymentStatus") + suspend fun findByPaymentStatusProjected(paymentStatus: PaymentStatuses): Flux + + @Modifying + @Query("UPDATE payment_records SET payment_status = :paymentStatus WHERE id = :id") + suspend fun updatePaymentStatusById(id: Long, paymentStatus: PaymentStatuses) +} \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 61e52fefd..690618e3d 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -26,18 +26,18 @@ CREATE TABLE IF NOT EXISTS commission_rewards ( referrer_uuid VARCHAR(72) NOT NULL, referent_uuid VARCHAR(72) NOT NULL, referral_code VARCHAR(72) NOT NULL REFERENCES referral_codes(code), - rich_trade_id INTEGER NOT NULL, - referent_order_side VARCHAR(20) NOT NULL, + rich_trade_id BIGINT NOT NULL, + referent_order_direction VARCHAR(20) NOT NULL, referrer_share DECIMAL NOT NULL, referent_share DECIMAL NOT NULL, - UNIQUE(rich_trade_id, referrer_uuid, referent_uuid, referent_order_side) + CONSTRAINT reward_once_constraint UNIQUE (rich_trade_id, referrer_uuid, referent_uuid, referent_order_direction) ); CREATE TABLE IF NOT EXISTS payment_records ( id BIGSERIAL PRIMARY KEY, commission_rewards_id BIGINT NOT NULL REFERENCES commission_rewards(id), create_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - payment_status VARCHAR(20) NOT NULL REFERENCES payment_status(status) DEFAULT 'pending' + payment_status VARCHAR(20) NOT NULL DEFAULT 'pending' REFERENCES payment_status(status) ); CREATE INDEX IF NOT EXISTS payment_records_status_index ON payment_records(payment_status); From 4ede6fe69dd9fffa4af5318167543cda9ca54868 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 27 Dec 2021 11:42:12 +0330 Subject: [PATCH 075/169] Add referral loop checking --- .../referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt | 3 +++ .../referral/ports/postgres/repository/ReferenceRepository.kt | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index 842d8ac66..f672d5664 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -60,6 +60,9 @@ class ReferralCodeHandlerImpl( val referralCode = referralCodeRepository.findByCode(code).awaitSingleOrNull() ?: throw Exception("Referral code doesn't exist") if (referentUuid == referralCode.uuid) throw Exception("Can't assign referral code to referrer") + val referents = referenceRepository.findByReferrerUuid(referentUuid) + val isChild = referents.any { it.referentUuid == referralCode.uuid }.awaitSingle() + if (isChild) throw Exception("Referrer can't be child of referent") val reference = Reference(null, referentUuid, referralCode.id!!) referenceRepository.save(reference).awaitSingleOrNull() } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt index 23d1c8e87..e6ad6a71a 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/ReferenceRepository.kt @@ -5,6 +5,7 @@ import org.springframework.data.r2dbc.repository.Query import org.springframework.data.repository.reactive.ReactiveCrudRepository import org.springframework.stereotype.Repository import reactor.core.publisher.Flux +import reactor.core.publisher.Mono @Repository interface ReferenceRepository : ReactiveCrudRepository { @@ -13,7 +14,7 @@ interface ReferenceRepository : ReactiveCrudRepository { @Query("SELECT * FROM referral_code_references LEFT JOIN referral_codes ON referral_code_id = referral_codes.id WHERE referral_codes.uuid = :uuid") fun findByReferrerUuid(referrerUuid: String): Flux - fun findByReferentUuid(referrerUuid: String): Flux + fun findByReferentUuid(referrerUuid: String): Mono fun deleteByReferentUuid(referrerUuid: String) fun deleteByReferralCodeId(id: Long): Flux } From 543d7b38a29fd8b12b643accc92689d33ab4ae25 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 27 Dec 2021 12:47:24 +0330 Subject: [PATCH 076/169] Add mocked symbol price calculator interface --- .../opex/referral/core/api/SymbolPriceCalculator.kt | 7 +++++++ .../opex/referral/core/model/CommissionReward.kt | 3 ++- .../co/nilin/opex/referral/core/model/Config.kt | 3 ++- .../core/service/CommissionRewardCalculatorImpl.kt | 12 ++++++++++-- .../core/service/MockedSymbolPriceCalculator.kt | 9 +++++++++ .../referral/ports/postgres/dao/CommissionReward.kt | 1 + .../nilin/opex/referral/ports/postgres/dao/Config.kt | 1 + .../referral/ports/postgres/dao/PaymentRecord.kt | 1 + .../postgres/impl/CommissionPaymentHandlerImpl.kt | 3 ++- .../postgres/impl/CommissionRewardHandlerImpl.kt | 3 ++- .../postgres/impl/CommissionRewardPersisterImpl.kt | 3 ++- .../ports/postgres/impl/ConfigHandlerImpl.kt | 3 ++- .../src/main/resources/schema.sql | 4 +++- 13 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/SymbolPriceCalculator.kt create mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/MockedSymbolPriceCalculator.kt diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/SymbolPriceCalculator.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/SymbolPriceCalculator.kt new file mode 100644 index 000000000..04f07660b --- /dev/null +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/SymbolPriceCalculator.kt @@ -0,0 +1,7 @@ +package co.nilin.opex.referral.core.api + +import java.math.BigDecimal + +interface SymbolPriceCalculator { + suspend fun getPrice(symbol: String): BigDecimal +} \ No newline at end of file diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt index 4d3123bbf..197fe4494 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt @@ -11,5 +11,6 @@ data class CommissionReward( var richTrade: Pair, var referentOrderDirection: OrderDirection, var referrerShare: BigDecimal, - var referentShare: BigDecimal + var referentShare: BigDecimal, + var paymentAssetSymbol: String ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt index 232505686..ebc4830e3 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt @@ -4,5 +4,6 @@ import java.math.BigDecimal data class Config( var name: String, - var referralCommissionReward: BigDecimal + var referralCommissionReward: BigDecimal, + var paymentAssetSymbol: String ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt index 317ca700e..7fafe756a 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt @@ -2,21 +2,28 @@ package co.nilin.opex.referral.core.service import co.nilin.opex.accountant.core.inout.RichTrade import co.nilin.opex.referral.core.api.CommissionRewardCalculator +import co.nilin.opex.referral.core.api.SymbolPriceCalculator import co.nilin.opex.referral.core.model.CommissionReward +import co.nilin.opex.referral.core.spi.ConfigHandler import co.nilin.opex.referral.core.spi.ReferenceHandler import org.springframework.stereotype.Service import java.math.BigDecimal @Service class CommissionRewardCalculatorImpl( + private val configHandler: ConfigHandler, + private val symbolPriceCalculator: SymbolPriceCalculator, private val referenceHandler: ReferenceHandler ) : CommissionRewardCalculator { override suspend fun calculate(ouid: String, richTrade: RichTrade): CommissionReward { + val config = configHandler.findConfig("default")!! if (ouid != richTrade.makerOuid && ouid != richTrade.takerOuid) throw IllegalArgumentException("Order is not correct") val uuid = if (ouid == richTrade.makerOuid) richTrade.makerUuid else richTrade.takerUuid val reference = referenceHandler.findByReferentUuid(uuid) ?: throw IllegalArgumentException("No referral entity found for uuid ($uuid)") - val commission = if (ouid == richTrade.makerOuid) richTrade.makerCommision else richTrade.takerCommision + val commission = + if (ouid == richTrade.makerOuid) richTrade.makerCommision * symbolPriceCalculator.getPrice(richTrade.makerCommisionAsset) + else richTrade.takerCommision * symbolPriceCalculator.getPrice(richTrade.takerCommisionAsset) val direction = if (ouid == richTrade.makerOuid) richTrade.makerDirection else richTrade.takerDirection return CommissionReward( reference.referralCode.uuid, @@ -25,7 +32,8 @@ class CommissionRewardCalculatorImpl( richTrade.id to richTrade, direction, commission * (BigDecimal.ONE - reference.referralCode.referentCommission), - commission * reference.referralCode.referentCommission + commission * reference.referralCode.referentCommission, + config.paymentAssetSymbol ) } } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/MockedSymbolPriceCalculator.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/MockedSymbolPriceCalculator.kt new file mode 100644 index 000000000..08478c6da --- /dev/null +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/MockedSymbolPriceCalculator.kt @@ -0,0 +1,9 @@ +package co.nilin.opex.referral.core.service + +import co.nilin.opex.referral.core.api.SymbolPriceCalculator +import java.math.BigDecimal + +// TODO Must be replaced with actual price calculator +class MockedSymbolPriceCalculator : SymbolPriceCalculator { + override suspend fun getPrice(symbol: String): BigDecimal = BigDecimal.ONE +} \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt index ed6dc70fd..32ef2c9d5 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt @@ -15,5 +15,6 @@ data class CommissionReward( var referentOrderDirection: OrderDirection, var referrerShare: BigDecimal, var referentShare: BigDecimal, + var paymentAssetSymbol: String ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt index b7fc7adfa..5b69c8e2d 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt @@ -8,4 +8,5 @@ import java.math.BigDecimal data class Config( @Id var name: String, var referralCommissionReward: BigDecimal, + var paymentAssetSymbol: String ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt index c4e214aa3..31baf67f2 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt @@ -23,6 +23,7 @@ data class PaymentRecordProjected( var referentOrderDirection: OrderDirection, var referrerShare: BigDecimal, var referentShare: BigDecimal, + var paymentAssetSymbol: String, var createDate: Long, var paymentStatus: PaymentStatuses ) \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt index 4eb58bd39..d08f5f709 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt @@ -22,7 +22,8 @@ class CommissionPaymentHandlerImpl( Pair(it.richTradeId, null), it.referentOrderDirection, it.referrerShare, - it.referentShare + it.referentShare, + it.paymentAssetSymbol ), it.paymentStatus ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt index 0ca9f86f9..c4a97b822 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt @@ -28,7 +28,8 @@ class CommissionRewardHandlerImpl( Pair(it.richTradeId, null), it.referentOrderDirection, it.referrerShare, - it.referentShare + it.referentShare, + it.paymentAssetSymbol ) }.collectList().awaitSingleOrDefault(emptyList()) } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt index 5af425d4e..801c447ba 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt @@ -19,7 +19,8 @@ class CommissionRewardPersisterImpl(private val commissionRewardRepository: Comm commissionReward.richTrade.first, commissionReward.referentOrderDirection, commissionReward.referrerShare, - commissionReward.referentShare + commissionReward.referentShare, + commissionReward.paymentAssetSymbol ) ).awaitSingleOrNull() } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt index 3b4cd945e..f5b102e43 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt @@ -9,6 +9,7 @@ import org.springframework.stereotype.Service @Service class ConfigHandlerImpl(private val configRepository: ConfigRepository) : ConfigHandler { override suspend fun findConfig(name: String): Config? { - return configRepository.findById(name).map { Config(it.name, it.referralCommissionReward) }.awaitSingleOrNull() + return configRepository.findById(name) + .map { Config(it.name, it.referralCommissionReward, it.paymentAssetSymbol) }.awaitSingleOrNull() } } \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 690618e3d..21396295d 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -1,6 +1,7 @@ CREATE TABLE IF NOT EXISTS configs ( name VARCHAR(72) PRIMARY KEY, - referral_commission_reward DECIMAL NOT NULL + referral_commission_reward DECIMAL NOT NULL, + payment_asset_symbol VARCHAR(20) NOT NULL ); CREATE TABLE IF NOT EXISTS referral_codes ( @@ -30,6 +31,7 @@ CREATE TABLE IF NOT EXISTS commission_rewards ( referent_order_direction VARCHAR(20) NOT NULL, referrer_share DECIMAL NOT NULL, referent_share DECIMAL NOT NULL, + payment_asset_symbol VARCHAR(20) NOT NULL, CONSTRAINT reward_once_constraint UNIQUE (rich_trade_id, referrer_uuid, referent_uuid, referent_order_direction) ); From eb0a288191be057a1813bf61c17036e5a4305c3d Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 29 Dec 2021 15:20:21 +0330 Subject: [PATCH 077/169] Refactor schema.sql --- .../src/main/resources/schema.sql | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 21396295d..371d8a124 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -32,18 +32,21 @@ CREATE TABLE IF NOT EXISTS commission_rewards ( referrer_share DECIMAL NOT NULL, referent_share DECIMAL NOT NULL, payment_asset_symbol VARCHAR(20) NOT NULL, + create_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, CONSTRAINT reward_once_constraint UNIQUE (rich_trade_id, referrer_uuid, referent_uuid, referent_order_direction) ); CREATE TABLE IF NOT EXISTS payment_records ( id BIGSERIAL PRIMARY KEY, commission_rewards_id BIGINT NOT NULL REFERENCES commission_rewards(id), - create_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, payment_status VARCHAR(20) NOT NULL DEFAULT 'pending' REFERENCES payment_status(status) ); CREATE INDEX IF NOT EXISTS payment_records_status_index ON payment_records(payment_status); +CREATE OR REPLACE VIEW payment_records_projected SELECT DISTINCT ON (commission_rewards_id) * FROM payment_records LEFT JOIN commission_rewards ON commission_rewards_id = commission_rewards.id ORDER BY create_date DESC; + CREATE OR REPLACE FUNCTION on_insert_commission_rewards() RETURNS TRIGGER AS $$ BEGIN INSERT INTO payment_records(commission_rewards_id) VALUES (NEW.id); RETURN NEW; From 4bbaa5c1639e4a5fde058ac9e3ed0b431df78456 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 29 Dec 2021 17:13:04 +0330 Subject: [PATCH 078/169] Redesign commission reward entity --- .../opex/referral/app/config/AppConfig.kt | 8 +-- .../app/controller/CommissionController.kt | 18 +++--- .../app/controller/ReportController.kt | 2 +- .../core/api/CommissionRewardCalculator.kt | 2 +- .../referral/core/model/CommissionReward.kt | 8 +-- .../opex/referral/core/model/PaymentRecord.kt | 3 +- .../service/CommissionRewardCalculatorImpl.kt | 44 ++++++++++---- .../opex/referral/core/spi/CheckoutHandler.kt | 5 ++ .../core/spi/CommissionPaymentHandler.kt | 3 + .../ports/postgres/dao/CommissionReward.kt | 8 +-- .../ports/postgres/dao/PaymentRecord.kt | 8 +-- .../impl/CommissionPaymentHandlerImpl.kt | 58 +++++++++++++++++-- .../impl/CommissionRewardHandlerImpl.kt | 8 +-- .../impl/CommissionRewardPersisterImpl.kt | 5 +- .../repository/PaymentRecordRepository.kt | 31 ++++++++-- .../src/main/resources/schema.sql | 7 +-- 16 files changed, 157 insertions(+), 61 deletions(-) create mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CheckoutHandler.kt diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt index 4347bac93..750c8f004 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt @@ -41,10 +41,10 @@ class AppConfig { timestamp: Long ) { runBlocking(AppDispatchers.kafkaExecutor) { - val makerCommission = commissionRewardCalculator.calculate(richTrade.makerOuid, richTrade) - val takerCommission = commissionRewardCalculator.calculate(richTrade.takerOuid, richTrade) - commissionRewardPersister.save(makerCommission) - commissionRewardPersister.save(takerCommission) + val makerCommissions = commissionRewardCalculator.calculate(richTrade.makerOuid, richTrade) + val takerCommissions = commissionRewardCalculator.calculate(richTrade.takerOuid, richTrade) + makerCommissions.forEach { commissionRewardPersister.save(it) } + takerCommissions.forEach { commissionRewardPersister.save(it) } } } } diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt index ac3602e2f..fafbc65ef 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt @@ -8,13 +8,13 @@ import java.math.BigDecimal @RestController class CommissionController(private val commissionRewardHandler: CommissionRewardHandler) { data class CommissionRewardBody( - var referrerUuid: String, + var rewardedUuid: String, var referentUuid: String, var referralCode: String, var richTrade: Long, var referentOrderDirection: OrderDirection, - var referrerShare: BigDecimal, - var referentShare: BigDecimal, + var share: BigDecimal, + var createDate: Long ) @GetMapping("/commissions/{code}") @@ -23,13 +23,13 @@ class CommissionController(private val commissionRewardHandler: CommissionReward ): List { return commissionRewardHandler.findCommissions(referralCode = code).map { CommissionRewardBody( - it.referrerUuid, + it.rewardedUuid, it.referentUuid, it.referralCode, it.richTrade.first, it.referentOrderDirection, - it.referrerShare, - it.referentShare + it.share, + it.createDate ) } } @@ -41,13 +41,13 @@ class CommissionController(private val commissionRewardHandler: CommissionReward ): List { return commissionRewardHandler.findCommissions(referentUuid = referentUuid, referrerUuid = referrerUuid).map { CommissionRewardBody( - it.referrerUuid, + it.rewardedUuid, it.referentUuid, it.referralCode, it.richTrade.first, it.referentOrderDirection, - it.referrerShare, - it.referentShare + it.share, + it.createDate ) } } diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt index f6d7c6ef0..04a37e0c2 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt @@ -22,6 +22,6 @@ class ReportController( suspend fun getReportByCode(@PathVariable code: String): ReportBody { val referencesCount = referenceHandler.findByCode(code).size.toLong() val commissions = commissionRewardHandler.findCommissions(referralCode = code) - return ReportBody(code, referencesCount, commissions.sumOf { it.referrerShare }) + return ReportBody(code, referencesCount, commissions.sumOf { it.share }) } } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/CommissionRewardCalculator.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/CommissionRewardCalculator.kt index 7b32029c2..93f81ce82 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/CommissionRewardCalculator.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/CommissionRewardCalculator.kt @@ -4,5 +4,5 @@ import co.nilin.opex.accountant.core.inout.RichTrade import co.nilin.opex.referral.core.model.CommissionReward interface CommissionRewardCalculator { - suspend fun calculate(ouid: String, richTrade: RichTrade): CommissionReward + suspend fun calculate(ouid: String, richTrade: RichTrade): List } \ No newline at end of file diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt index 197fe4494..5fa64390a 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt @@ -5,12 +5,12 @@ import co.nilin.opex.matching.engine.core.model.OrderDirection import java.math.BigDecimal data class CommissionReward( - var referrerUuid: String, + var rewardedUuid: String, var referentUuid: String, var referralCode: String, var richTrade: Pair, var referentOrderDirection: OrderDirection, - var referrerShare: BigDecimal, - var referentShare: BigDecimal, - var paymentAssetSymbol: String + var share: BigDecimal, + var paymentAssetSymbol: String, + var createDate: Long ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentRecord.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentRecord.kt index 809c22868..de85a9a47 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentRecord.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentRecord.kt @@ -2,5 +2,6 @@ package co.nilin.opex.referral.core.model data class PaymentRecord( var commissionReward: CommissionReward, - var paymentStatus: PaymentStatuses + var paymentStatus: PaymentStatuses, + var updateDate: Long ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt index 7fafe756a..2e0ed37e3 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt @@ -15,7 +15,7 @@ class CommissionRewardCalculatorImpl( private val symbolPriceCalculator: SymbolPriceCalculator, private val referenceHandler: ReferenceHandler ) : CommissionRewardCalculator { - override suspend fun calculate(ouid: String, richTrade: RichTrade): CommissionReward { + override suspend fun calculate(ouid: String, richTrade: RichTrade): List { val config = configHandler.findConfig("default")!! if (ouid != richTrade.makerOuid && ouid != richTrade.takerOuid) throw IllegalArgumentException("Order is not correct") val uuid = if (ouid == richTrade.makerOuid) richTrade.makerUuid else richTrade.takerUuid @@ -25,15 +25,37 @@ class CommissionRewardCalculatorImpl( if (ouid == richTrade.makerOuid) richTrade.makerCommision * symbolPriceCalculator.getPrice(richTrade.makerCommisionAsset) else richTrade.takerCommision * symbolPriceCalculator.getPrice(richTrade.takerCommisionAsset) val direction = if (ouid == richTrade.makerOuid) richTrade.makerDirection else richTrade.takerDirection - return CommissionReward( - reference.referralCode.uuid, - reference.referentUuid, - reference.referralCode.code, - richTrade.id to richTrade, - direction, - commission * (BigDecimal.ONE - reference.referralCode.referentCommission), - commission * reference.referralCode.referentCommission, - config.paymentAssetSymbol - ) + val ret = mutableListOf() + if (commission > BigDecimal.ZERO) { + if (reference.referralCode.referentCommission < BigDecimal.ONE) { + ret.add( + CommissionReward( + reference.referralCode.uuid, + reference.referentUuid, + reference.referralCode.code, + richTrade.id to richTrade, + direction, + commission * (BigDecimal.ONE - reference.referralCode.referentCommission), + config.paymentAssetSymbol, + System.currentTimeMillis() / 1000 + ) + ) + } + if (reference.referralCode.referentCommission > BigDecimal.ZERO) { + ret.add( + CommissionReward( + reference.referentUuid, + reference.referentUuid, + reference.referralCode.code, + richTrade.id to richTrade, + direction, + commission * reference.referralCode.referentCommission, + config.paymentAssetSymbol, + System.currentTimeMillis() / 1000 + ) + ) + } + } + return ret } } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CheckoutHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CheckoutHandler.kt new file mode 100644 index 000000000..f776cacc5 --- /dev/null +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CheckoutHandler.kt @@ -0,0 +1,5 @@ +package co.nilin.opex.referral.core.spi + +interface CheckoutHandler { + suspend fun checkoutById(id: Long) +} diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt index de3c30b2f..42c00b725 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt @@ -2,8 +2,11 @@ package co.nilin.opex.referral.core.spi import co.nilin.opex.referral.core.model.PaymentRecord import co.nilin.opex.referral.core.model.PaymentStatuses +import java.math.BigDecimal interface CommissionPaymentHandler { suspend fun findCommissionsByStatus(paymentStatus: PaymentStatuses): List + suspend fun findUserCommissionsWhereTotalGreaterAndEqualTo(uuid: String, value: BigDecimal): List + suspend fun findCommissionsWherePendingDateLessOrEqualThan(date: Long): List suspend fun updatePaymentStatus(id: Long, value: PaymentStatuses) } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt index 32ef2c9d5..8323b6352 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt @@ -8,13 +8,13 @@ import java.math.BigDecimal @Table("commission_rewards") data class CommissionReward( @Id var id: Long?, - var referrerUuid: String, + var rewardedUuid: String, var referentUuid: String, var referralCode: String, var richTradeId: Long, var referentOrderDirection: OrderDirection, - var referrerShare: BigDecimal, - var referentShare: BigDecimal, - var paymentAssetSymbol: String + var share: BigDecimal, + var paymentAssetSymbol: String, + var createDate: Long? = null ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt index 31baf67f2..a1b36f64e 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt @@ -10,20 +10,20 @@ import java.math.BigDecimal data class PaymentRecord( @Id var id: Long?, var commissionRewardsId: Long, - var createDate: Long, + var updateDate: Long, var paymentStatus: PaymentStatuses ) data class PaymentRecordProjected( @Id var id: Long?, - var referrerUuid: String, + var rewardedUuid: String, var referentUuid: String, var referralCode: String, var richTradeId: Long, var referentOrderDirection: OrderDirection, - var referrerShare: BigDecimal, - var referentShare: BigDecimal, + var share: BigDecimal, var paymentAssetSymbol: String, var createDate: Long, + var updateDate: Long, var paymentStatus: PaymentStatuses ) \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt index d08f5f709..df128c658 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt @@ -5,8 +5,10 @@ import co.nilin.opex.referral.core.model.PaymentRecord import co.nilin.opex.referral.core.model.PaymentStatuses import co.nilin.opex.referral.core.spi.CommissionPaymentHandler import co.nilin.opex.referral.ports.postgres.repository.PaymentRecordRepository +import kotlinx.coroutines.reactive.awaitSingle import kotlinx.coroutines.reactive.awaitSingleOrDefault import org.springframework.stereotype.Service +import java.math.BigDecimal @Service class CommissionPaymentHandlerImpl( @@ -16,20 +18,66 @@ class CommissionPaymentHandlerImpl( return paymentRecordRepository.findByPaymentStatusProjected(paymentStatus).map { PaymentRecord( CommissionReward( - it.referrerUuid, + it.rewardedUuid, it.referentUuid, it.referralCode, Pair(it.richTradeId, null), it.referentOrderDirection, - it.referrerShare, - it.referentShare, - it.paymentAssetSymbol + it.share, + it.paymentAssetSymbol, + it.createDate ), - it.paymentStatus + it.paymentStatus, + it.updateDate ) }.collectList().awaitSingleOrDefault(emptyList()) } + override suspend fun findUserCommissionsWhereTotalGreaterAndEqualTo( + uuid: String, + value: BigDecimal + ): List { + return paymentRecordRepository.findWhereTotalReferrerShareMoreThanProjected(uuid, value) + .collectList().awaitSingle().map { + PaymentRecord( + CommissionReward( + it.rewardedUuid, + it.referentUuid, + it.referralCode, + Pair(it.richTradeId, null), + it.referentOrderDirection, + it.share, + it.paymentAssetSymbol, + it.createDate + ), + it.paymentStatus, + it.updateDate + ) + } + } + + override suspend fun findCommissionsWherePendingDateLessOrEqualThan(date: Long): List { + return paymentRecordRepository.findByPaymentStatusWhereCreateDateLessThanProjected( + PaymentStatuses.PENDING, + date + ).collectList().awaitSingle().map { + PaymentRecord( + CommissionReward( + it.rewardedUuid, + it.referentUuid, + it.referralCode, + Pair(it.richTradeId, null), + it.referentOrderDirection, + it.share, + it.paymentAssetSymbol, + it.createDate + ), + it.paymentStatus, + it.updateDate + ) + } + } + override suspend fun updatePaymentStatus(id: Long, value: PaymentStatuses) { paymentRecordRepository.updatePaymentStatusById(id, value) } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt index c4a97b822..78c77592e 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt @@ -22,14 +22,14 @@ class CommissionRewardHandlerImpl( referentUuid ).map { CommissionReward( - it.referrerUuid, + it.rewardedUuid, it.referentUuid, it.referralCode, Pair(it.richTradeId, null), it.referentOrderDirection, - it.referrerShare, - it.referentShare, - it.paymentAssetSymbol + it.share, + it.paymentAssetSymbol, + it.createDate!! ) }.collectList().awaitSingleOrDefault(emptyList()) } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt index 801c447ba..268f74b91 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt @@ -13,13 +13,12 @@ class CommissionRewardPersisterImpl(private val commissionRewardRepository: Comm commissionRewardRepository.save( co.nilin.opex.referral.ports.postgres.dao.CommissionReward( null, - commissionReward.referrerUuid, + commissionReward.rewardedUuid, commissionReward.referentUuid, commissionReward.referralCode, commissionReward.richTrade.first, commissionReward.referentOrderDirection, - commissionReward.referrerShare, - commissionReward.referentShare, + commissionReward.share, commissionReward.paymentAssetSymbol ) ).awaitSingleOrNull() diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt index 676967cee..2fdd820d7 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt @@ -8,15 +8,34 @@ import org.springframework.data.r2dbc.repository.Query import org.springframework.data.repository.reactive.ReactiveCrudRepository import org.springframework.stereotype.Repository import reactor.core.publisher.Flux +import java.math.BigDecimal @Repository -interface PaymentRecordRepository : ReactiveCrudRepository { +interface PaymentRecordRepository : PaymentRecordProjectedRepository, ReactiveCrudRepository { suspend fun findByPaymentStatus(paymentStatus: PaymentStatuses): Flux - - @Query("SELECT * FROM payment_records LEFT JOIN commission_rewards ON commission_rewards_id = commission_rewards.id WHERE payment_status = :paymentStatus") - suspend fun findByPaymentStatusProjected(paymentStatus: PaymentStatuses): Flux + suspend fun findByPaymentStatusWhereCreateDateLessThan( + paymentStatus: PaymentStatuses, + createData: Long + ): Flux @Modifying - @Query("UPDATE payment_records SET payment_status = :paymentStatus WHERE id = :id") + @Query("INSERT INTO payment_records(commission_reward_id, payment_status) VALUES (:id, :paymentStatus)") suspend fun updatePaymentStatusById(id: Long, paymentStatus: PaymentStatuses) -} \ No newline at end of file +} + +interface PaymentRecordProjectedRepository { + @Query("SELECT * FROM payment_records_projected WHERE payment_status = :paymentStatus") + suspend fun findByPaymentStatusProjected(paymentStatus: PaymentStatuses): Flux + + @Query("SELECT * FROM payment_records_projected WHERE payment_status = :paymentStatus AND create_date < :createDate") + suspend fun findByPaymentStatusWhereCreateDateLessThanProjected( + paymentStatus: PaymentStatuses, + createData: Long + ): Flux + + @Query("SELECT *, SUM(share) AS acc_share OVER (PARTITION BY uuid) FROM payment_records_projected WHERE payment_status = 'pending' AND acc_share >= :value") + suspend fun findWhereTotalReferrerShareMoreThanProjected( + referrerUuid: String, + value: BigDecimal + ): Flux +} diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 371d8a124..0ea7b2926 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -24,16 +24,15 @@ CREATE TABLE IF NOT EXISTS payment_status ( CREATE TABLE IF NOT EXISTS commission_rewards ( id BIGSERIAL PRIMARY KEY, - referrer_uuid VARCHAR(72) NOT NULL, + rewarded_uuid VARCHAR(72) NOT NULL, referent_uuid VARCHAR(72) NOT NULL, referral_code VARCHAR(72) NOT NULL REFERENCES referral_codes(code), rich_trade_id BIGINT NOT NULL, referent_order_direction VARCHAR(20) NOT NULL, - referrer_share DECIMAL NOT NULL, - referent_share DECIMAL NOT NULL, + share DECIMAL NOT NULL, payment_asset_symbol VARCHAR(20) NOT NULL, create_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - CONSTRAINT reward_once_constraint UNIQUE (rich_trade_id, referrer_uuid, referent_uuid, referent_order_direction) + CONSTRAINT reward_once_constraint UNIQUE (rich_trade_id, rewarded_uuid, referent_order_direction) ); CREATE TABLE IF NOT EXISTS payment_records ( From 2dc96424f6dfe4ba22d2a668c47d75de654de3fa Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 1 Jan 2022 12:06:43 +0330 Subject: [PATCH 079/169] Add checkout handler initial implementation --- .../referral/core/model/CommissionReward.kt | 1 + .../nilin/opex/referral/core/model/Config.kt | 3 +- .../opex/referral/core/model/PaymentRecord.kt | 1 + .../service/CommissionRewardCalculatorImpl.kt | 2 + .../opex/referral/core/spi/CheckoutHandler.kt | 3 +- .../core/spi/CommissionPaymentHandler.kt | 2 + .../referral/ports/postgres/dao/Config.kt | 3 +- .../ports/postgres/dao/PaymentRecord.kt | 2 + .../postgres/impl/CheckoutHandlerImpl.kt | 33 ++++++++++++++++ .../impl/CommissionPaymentHandlerImpl.kt | 39 +++++++++++++++++-- .../impl/CommissionRewardHandlerImpl.kt | 5 ++- .../impl/CommissionRewardPersisterImpl.kt | 2 +- .../ports/postgres/impl/ConfigHandlerImpl.kt | 3 +- .../repository/CommissionRewardRepository.kt | 12 +++--- .../repository/PaymentRecordRepository.kt | 11 +++++- .../src/main/resources/schema.sql | 8 +++- 16 files changed, 109 insertions(+), 21 deletions(-) create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CheckoutHandlerImpl.kt diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt index 5fa64390a..13c88465e 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt @@ -5,6 +5,7 @@ import co.nilin.opex.matching.engine.core.model.OrderDirection import java.math.BigDecimal data class CommissionReward( + var id: Long, var rewardedUuid: String, var referentUuid: String, var referralCode: String, diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt index ebc4830e3..5cd259cfb 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt @@ -5,5 +5,6 @@ import java.math.BigDecimal data class Config( var name: String, var referralCommissionReward: BigDecimal, - var paymentAssetSymbol: String + var paymentAssetSymbol: String, + var minPaymentAmount: BigDecimal ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentRecord.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentRecord.kt index de85a9a47..deca362aa 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentRecord.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentRecord.kt @@ -3,5 +3,6 @@ package co.nilin.opex.referral.core.model data class PaymentRecord( var commissionReward: CommissionReward, var paymentStatus: PaymentStatuses, + var transferRef: String?, var updateDate: Long ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt index 2e0ed37e3..7603723c5 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt @@ -30,6 +30,7 @@ class CommissionRewardCalculatorImpl( if (reference.referralCode.referentCommission < BigDecimal.ONE) { ret.add( CommissionReward( + 0, reference.referralCode.uuid, reference.referentUuid, reference.referralCode.code, @@ -44,6 +45,7 @@ class CommissionRewardCalculatorImpl( if (reference.referralCode.referentCommission > BigDecimal.ZERO) { ret.add( CommissionReward( + 0, reference.referentUuid, reference.referentUuid, reference.referralCode.code, diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CheckoutHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CheckoutHandler.kt index f776cacc5..d74a8b387 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CheckoutHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CheckoutHandler.kt @@ -1,5 +1,6 @@ package co.nilin.opex.referral.core.spi interface CheckoutHandler { - suspend fun checkoutById(id: Long) + suspend fun checkoutById(uuid: String) + suspend fun checkoutEveryCandidate() } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt index 42c00b725..2daee0158 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt @@ -7,6 +7,8 @@ import java.math.BigDecimal interface CommissionPaymentHandler { suspend fun findCommissionsByStatus(paymentStatus: PaymentStatuses): List suspend fun findUserCommissionsWhereTotalGreaterAndEqualTo(uuid: String, value: BigDecimal): List + suspend fun findAllCommissionsWhereTotalGreaterAndEqualTo(value: BigDecimal): List suspend fun findCommissionsWherePendingDateLessOrEqualThan(date: Long): List suspend fun updatePaymentStatus(id: Long, value: PaymentStatuses) + suspend fun checkout(id: Long, transferRef: String) } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt index 5b69c8e2d..277d450eb 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt @@ -8,5 +8,6 @@ import java.math.BigDecimal data class Config( @Id var name: String, var referralCommissionReward: BigDecimal, - var paymentAssetSymbol: String + var paymentAssetSymbol: String, + var minPaymentAmount: BigDecimal ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt index a1b36f64e..41a805492 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt @@ -10,6 +10,7 @@ import java.math.BigDecimal data class PaymentRecord( @Id var id: Long?, var commissionRewardsId: Long, + var transferRef: String?, var updateDate: Long, var paymentStatus: PaymentStatuses ) @@ -23,6 +24,7 @@ data class PaymentRecordProjected( var referentOrderDirection: OrderDirection, var share: BigDecimal, var paymentAssetSymbol: String, + var transferRef: String?, var createDate: Long, var updateDate: Long, var paymentStatus: PaymentStatuses diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CheckoutHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CheckoutHandlerImpl.kt new file mode 100644 index 000000000..18ba9430e --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CheckoutHandlerImpl.kt @@ -0,0 +1,33 @@ +package co.nilin.opex.referral.ports.postgres.impl + +import co.nilin.opex.referral.core.spi.CheckoutHandler +import co.nilin.opex.referral.core.spi.CommissionPaymentHandler +import co.nilin.opex.referral.core.spi.ConfigHandler +import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.launch +import java.util.* + +class CheckoutHandlerImpl( + private val configHandler: ConfigHandler, + private val paymentHandler: CommissionPaymentHandler +) : CheckoutHandler { + override suspend fun checkoutById(uuid: String) { + val min = configHandler.findConfig("default")!!.minPaymentAmount + val commissions = paymentHandler.findUserCommissionsWhereTotalGreaterAndEqualTo(uuid, min) + val transferRef = UUID.randomUUID().toString() + coroutineScope { + commissions.forEach { + launch { + //TODO Call wallet transfer api if successful + paymentHandler.checkout(it.commissionReward.id, transferRef) + } + } + } + } + + override suspend fun checkoutEveryCandidate() { + //TODO Fill checkout queue with valid candidates + //TODO Do the payments + //TODO Update payment status for each payed commission reward + } +} diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt index df128c658..0038351c0 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt @@ -11,13 +11,13 @@ import org.springframework.stereotype.Service import java.math.BigDecimal @Service -class CommissionPaymentHandlerImpl( - private val paymentRecordRepository: PaymentRecordRepository -) : CommissionPaymentHandler { +class CommissionPaymentHandlerImpl(private val paymentRecordRepository: PaymentRecordRepository) : + CommissionPaymentHandler { override suspend fun findCommissionsByStatus(paymentStatus: PaymentStatuses): List { return paymentRecordRepository.findByPaymentStatusProjected(paymentStatus).map { PaymentRecord( CommissionReward( + it.id!!, it.rewardedUuid, it.referentUuid, it.referralCode, @@ -28,6 +28,7 @@ class CommissionPaymentHandlerImpl( it.createDate ), it.paymentStatus, + it.transferRef, it.updateDate ) }.collectList().awaitSingleOrDefault(emptyList()) @@ -37,10 +38,11 @@ class CommissionPaymentHandlerImpl( uuid: String, value: BigDecimal ): List { - return paymentRecordRepository.findWhereTotalReferrerShareMoreThanProjected(uuid, value) + return paymentRecordRepository.findByUuidWhereTotalShareMoreThanProjected(uuid, value) .collectList().awaitSingle().map { PaymentRecord( CommissionReward( + it.id!!, it.rewardedUuid, it.referentUuid, it.referralCode, @@ -51,6 +53,29 @@ class CommissionPaymentHandlerImpl( it.createDate ), it.paymentStatus, + it.transferRef, + it.updateDate + ) + } + } + + override suspend fun findAllCommissionsWhereTotalGreaterAndEqualTo(value: BigDecimal): List { + return paymentRecordRepository.findAllWhereTotalShareMoreThanProjected(value) + .collectList().awaitSingle().map { + PaymentRecord( + CommissionReward( + it.id!!, + it.rewardedUuid, + it.referentUuid, + it.referralCode, + Pair(it.richTradeId, null), + it.referentOrderDirection, + it.share, + it.paymentAssetSymbol, + it.createDate + ), + it.paymentStatus, + it.transferRef, it.updateDate ) } @@ -63,6 +88,7 @@ class CommissionPaymentHandlerImpl( ).collectList().awaitSingle().map { PaymentRecord( CommissionReward( + it.id!!, it.rewardedUuid, it.referentUuid, it.referralCode, @@ -73,6 +99,7 @@ class CommissionPaymentHandlerImpl( it.createDate ), it.paymentStatus, + it.transferRef, it.updateDate ) } @@ -81,4 +108,8 @@ class CommissionPaymentHandlerImpl( override suspend fun updatePaymentStatus(id: Long, value: PaymentStatuses) { paymentRecordRepository.updatePaymentStatusById(id, value) } + + override suspend fun checkout(id: Long, transferRef: String) { + paymentRecordRepository.checkout(id, transferRef) + } } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt index 78c77592e..e95c41cf8 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt @@ -16,12 +16,13 @@ class CommissionRewardHandlerImpl( referrerUuid: String?, referentUuid: String? ): List { - return commissionRewardRepository.findByReferralCodeAndReferrerUuidAndReferentUuid( + return commissionRewardRepository.findByReferralCodeAndRewardedUuidAndReferentUuid( referralCode, referrerUuid, referentUuid ).map { CommissionReward( + it.id!!, it.rewardedUuid, it.referentUuid, it.referralCode, @@ -35,7 +36,7 @@ class CommissionRewardHandlerImpl( } override suspend fun deleteCommissions(referralCode: String?, referrerUuid: String?, referentUuid: String?) { - commissionRewardRepository.deleteByReferralCodeAndReferrerUuidAndReferentUuid( + commissionRewardRepository.deleteByReferralCodeAndRewardedUuidAndReferentUuid( referralCode, referrerUuid, referentUuid diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt index 268f74b91..0ae760d4d 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt @@ -12,7 +12,7 @@ class CommissionRewardPersisterImpl(private val commissionRewardRepository: Comm override suspend fun save(commissionReward: CommissionReward) { commissionRewardRepository.save( co.nilin.opex.referral.ports.postgres.dao.CommissionReward( - null, + if (commissionReward.id == 0L) null else commissionReward.id, commissionReward.rewardedUuid, commissionReward.referentUuid, commissionReward.referralCode, diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt index f5b102e43..1049b37b3 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt @@ -10,6 +10,7 @@ import org.springframework.stereotype.Service class ConfigHandlerImpl(private val configRepository: ConfigRepository) : ConfigHandler { override suspend fun findConfig(name: String): Config? { return configRepository.findById(name) - .map { Config(it.name, it.referralCommissionReward, it.paymentAssetSymbol) }.awaitSingleOrNull() + .map { Config(it.name, it.referralCommissionReward, it.paymentAssetSymbol, it.minPaymentAmount) } + .awaitSingleOrNull() } } \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CommissionRewardRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CommissionRewardRepository.kt index e543ce64a..d2fef125b 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CommissionRewardRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CommissionRewardRepository.kt @@ -9,17 +9,17 @@ import reactor.core.publisher.Mono @Repository interface CommissionRewardRepository : ReactiveCrudRepository { - @Query("SELECT * FROM commission_rewards WHERE (:code is null OR referral_code = :code) AND (:referrerUuid is null OR referrer_uuid = :referrerUuid) AND (:referentUuid is null OR referent_uuid = :referentUuid)") - fun findByReferralCodeAndReferrerUuidAndReferentUuid( + @Query("SELECT * FROM commission_rewards WHERE (:code is null OR referral_code = :code) AND (:rewardedUuid is null OR rewarded_uuid = :rewardedUuid) AND (:referentUuid is null OR referent_uuid = :referentUuid)") + fun findByReferralCodeAndRewardedUuidAndReferentUuid( code: String?, - referrerUuid: String?, + rewardedUuid: String?, referentUuid: String? ): Flux - @Query("DELETE FROM commission_rewards WHERE (:code is null OR referral_code = :code) AND (:referrerUuid is null OR referrer_uuid = :referrer_uuid) AND (:referentUuid is null OR referent_uuid = :referentUuid)") - fun deleteByReferralCodeAndReferrerUuidAndReferentUuid( + @Query("DELETE FROM commission_rewards WHERE (:code is null OR referral_code = :code) AND (:rewardedUuid is null OR rewarded_uuid = :rewardedUuid) AND (:referentUuid is null OR referent_uuid = :referentUuid)") + fun deleteByReferralCodeAndRewardedUuidAndReferentUuid( code: String?, - referrerUuid: String?, + rewardedUuid: String?, referentUuid: String? ): Mono } \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt index 2fdd820d7..66b21ac78 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt @@ -21,6 +21,10 @@ interface PaymentRecordRepository : PaymentRecordProjectedRepository, ReactiveCr @Modifying @Query("INSERT INTO payment_records(commission_reward_id, payment_status) VALUES (:id, :paymentStatus)") suspend fun updatePaymentStatusById(id: Long, paymentStatus: PaymentStatuses) + + @Modifying + @Query("INSERT INTO payment_records(commission_reward_id, transfer_ref) VALUES (:id, :transferRef)") + suspend fun checkout(id: Long, transferRef: String) } interface PaymentRecordProjectedRepository { @@ -34,8 +38,11 @@ interface PaymentRecordProjectedRepository { ): Flux @Query("SELECT *, SUM(share) AS acc_share OVER (PARTITION BY uuid) FROM payment_records_projected WHERE payment_status = 'pending' AND acc_share >= :value") - suspend fun findWhereTotalReferrerShareMoreThanProjected( - referrerUuid: String, + suspend fun findAllWhereTotalShareMoreThanProjected(value: BigDecimal): Flux + + @Query("SELECT *, SUM(share) AS acc_share OVER (PARTITION BY uuid) FROM payment_records_projected WHERE payment_status = 'pending' AND acc_share >= :value AND uuid = :uuid") + suspend fun findByUuidWhereTotalShareMoreThanProjected( + uuid: String, value: BigDecimal ): Flux } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 0ea7b2926..95b83f8bf 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -1,7 +1,8 @@ CREATE TABLE IF NOT EXISTS configs ( name VARCHAR(72) PRIMARY KEY, referral_commission_reward DECIMAL NOT NULL, - payment_asset_symbol VARCHAR(20) NOT NULL + payment_asset_symbol VARCHAR(20) NOT NULL, + min_payment_amount DECIMAL NOT NULL ); CREATE TABLE IF NOT EXISTS referral_codes ( @@ -38,13 +39,16 @@ CREATE TABLE IF NOT EXISTS commission_rewards ( CREATE TABLE IF NOT EXISTS payment_records ( id BIGSERIAL PRIMARY KEY, commission_rewards_id BIGINT NOT NULL REFERENCES commission_rewards(id), + transfer_ref VARCHAR(255), update_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, payment_status VARCHAR(20) NOT NULL DEFAULT 'pending' REFERENCES payment_status(status) ); CREATE INDEX IF NOT EXISTS payment_records_status_index ON payment_records(payment_status); -CREATE OR REPLACE VIEW payment_records_projected SELECT DISTINCT ON (commission_rewards_id) * FROM payment_records LEFT JOIN commission_rewards ON commission_rewards_id = commission_rewards.id ORDER BY create_date DESC; +DROP VIEW IF EXISTS payment_records_projected; + +CREATE VIEW payment_records_projected SELECT DISTINCT ON (commission_rewards_id) * FROM payment_records LEFT JOIN commission_rewards ON commission_rewards_id = commission_rewards.id ORDER BY create_date DESC; CREATE OR REPLACE FUNCTION on_insert_commission_rewards() RETURNS TRIGGER AS $$ BEGIN INSERT INTO payment_records(commission_rewards_id) VALUES (NEW.id); From d9acb061949e09faa564dec0cad1f683a3db214d Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 2 Jan 2022 13:00:13 +0330 Subject: [PATCH 080/169] Add wallet proxy module --- referral/pom.xml | 1 + .../src/main/resources/application.yml | 2 + .../referral-wallet-proxy/pom.xml | 82 +++++++++++++++++++ .../wallet/proxy/config/WebClientConfig.kt | 38 +++++++++ .../wallet/proxy}/impl/CheckoutHandlerImpl.kt | 2 +- .../wallet/proxy/proxy/WalletProxyImpl.kt | 65 +++++++++++++++ 6 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 referral/referral-ports/referral-wallet-proxy/pom.xml create mode 100644 referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/config/WebClientConfig.kt rename referral/referral-ports/{referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres => referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy}/impl/CheckoutHandlerImpl.kt (95%) create mode 100644 referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/proxy/WalletProxyImpl.kt diff --git a/referral/pom.xml b/referral/pom.xml index 71d58c1c9..0bb9bf8f1 100644 --- a/referral/pom.xml +++ b/referral/pom.xml @@ -18,6 +18,7 @@ referral-core referral-ports/referral-persister-postgres referral-ports/referral-eventlistener-kafka + referral-ports/referral-wallet-proxy diff --git a/referral/referral-app/src/main/resources/application.yml b/referral/referral-app/src/main/resources/application.yml index 051d0e92b..c42eef766 100644 --- a/referral/referral-app/src/main/resources/application.yml +++ b/referral/referral-app/src/main/resources/application.yml @@ -28,5 +28,7 @@ spring: healthCheckInterval: 20s prefer-ip-address: true app: + wallet: + url: lb://opex-wallet/ auth: cert-url: lb://opex-auth/auth/realms/opex/protocol/openid-connect/certs \ No newline at end of file diff --git a/referral/referral-ports/referral-wallet-proxy/pom.xml b/referral/referral-ports/referral-wallet-proxy/pom.xml new file mode 100644 index 000000000..072b2869e --- /dev/null +++ b/referral/referral-ports/referral-wallet-proxy/pom.xml @@ -0,0 +1,82 @@ + + + 4.0.0 + + + referral + co.nilin.opex.referral + 1.0-SNAPSHOT + ../../pom.xml + + + + 2020.0.2 + + + co.nilin.opex.referral.ports.wallet.proxy + referral-wallet-proxy + referral-wallet-proxy + + + + org.jetbrains.kotlin + kotlin-reflect + + + org.springframework.boot + spring-boot-starter-data-r2dbc + + + io.r2dbc + r2dbc-postgresql + runtime + + + org.postgresql + postgresql + runtime + + + io.projectreactor.kotlin + reactor-kotlin-extensions + + + org.jetbrains.kotlinx + kotlinx-coroutines-reactor + + + co.nilin.opex.referral.core + referral-core + + + co.nilin.opex.utility.log + logging-handler + + + org.springframework.cloud + spring-cloud-starter-consul-all + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + diff --git a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/config/WebClientConfig.kt b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/config/WebClientConfig.kt new file mode 100644 index 000000000..0604b3cfe --- /dev/null +++ b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/config/WebClientConfig.kt @@ -0,0 +1,38 @@ +package co.nilin.opex.referral.ports.wallet.proxy.config + +import co.nilin.opex.utility.log.CustomLogger +import org.springframework.cloud.client.ServiceInstance +import org.springframework.cloud.client.loadbalancer.LoadBalancerProperties +import org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancer +import org.springframework.cloud.client.loadbalancer.reactive.ReactorLoadBalancerExchangeFilterFunction +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.http.client.reactive.ReactorClientHttpConnector +import org.springframework.web.reactive.function.client.WebClient +import reactor.netty.http.client.HttpClient + +@Configuration +class WebClientConfig { + + @Bean + fun webClient(loadBalancerFactory: ReactiveLoadBalancer.Factory): WebClient { + val logger = CustomLogger(HttpClient::class.java) + return WebClient.builder() + .clientConnector( + ReactorClientHttpConnector( + HttpClient + .create() + .doOnRequest { request, connection -> + connection.addHandlerFirst(logger) + } + ) + ) + .filter( + ReactorLoadBalancerExchangeFilterFunction( + loadBalancerFactory, LoadBalancerProperties(), emptyList() + ) + ) + .build() + } + +} diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CheckoutHandlerImpl.kt b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt similarity index 95% rename from referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CheckoutHandlerImpl.kt rename to referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt index 18ba9430e..3142f2253 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CheckoutHandlerImpl.kt +++ b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt @@ -1,4 +1,4 @@ -package co.nilin.opex.referral.ports.postgres.impl +package co.nilin.opex.referral.ports.wallet.proxy.impl import co.nilin.opex.referral.core.spi.CheckoutHandler import co.nilin.opex.referral.core.spi.CommissionPaymentHandler diff --git a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/proxy/WalletProxyImpl.kt b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/proxy/WalletProxyImpl.kt new file mode 100644 index 000000000..bdb2f98d9 --- /dev/null +++ b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/proxy/WalletProxyImpl.kt @@ -0,0 +1,65 @@ +package co.nilin.opex.referral.ports.wallet.proxy.proxy + +import co.nilin.opex.accountant.core.spi.WalletProxy +import kotlinx.coroutines.reactive.awaitFirst +import org.springframework.beans.factory.annotation.Value +import org.springframework.core.ParameterizedTypeReference +import org.springframework.stereotype.Component +import org.springframework.web.reactive.function.client.WebClient +import java.math.BigDecimal +import java.net.URI + +inline fun typeRef(): ParameterizedTypeReference = object : ParameterizedTypeReference() {} + +data class TransferResult( + val date: Long, + val sourceUuid: String, + val sourceWalletType: String, + val sourceBalanceBeforeAction: Amount, + val sourceBalanceAfterAction: Amount, + val amount: Amount, + val destUuid: String, + val destWalletType: String, + val receivedAmount: Amount +) + +data class Amount(val currency: Currency, val amount: BigDecimal) +data class Currency(val name: String, val symbol: String, val precision: Int) + +@Component +class WalletProxyImpl( + @Value("\${app.wallet.url}") val walletBaseUrl: String, val webClient: WebClient +) : WalletProxy { + override suspend fun transfer( + symbol: String, + senderWalletType: String, + senderUuid: String, + receiverWalletType: String, + receiverUuid: String, + amount: BigDecimal, + description: String?, + transferRef: String? + ) { + webClient.post() + .uri(URI.create("$walletBaseUrl/transfer/${amount}_${symbol}/from/${senderUuid}_${senderWalletType}/to/${receiverUuid}_${receiverWalletType}")) + .header("Content-Type", "application/json") + .retrieve() + .onStatus({ t -> t.isError }, { throw RuntimeException() }) + .bodyToMono(typeRef()) + .log() + .awaitFirst() + } + + override suspend fun canFulfil(symbol: String, walletType: String, uuid: String, amount: BigDecimal): Boolean { + data class BooleanResponse(val result: Boolean) + return webClient.get() + .uri(URI.create("$walletBaseUrl/$uuid/wallet_type/${walletType}/can_withdraw/${amount}_${symbol}")) + .header("Content-Type", "application/json") + .retrieve() + .onStatus({ t -> t.isError }, { it.createException() }) + .bodyToMono(typeRef()) + .log() + .awaitFirst() + .result + } +} \ No newline at end of file From 507c9adcfb6a64a67104aad4195578da9a544085 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 2 Jan 2022 15:50:40 +0330 Subject: [PATCH 081/169] Implement checkout handler --- .../opex/referral/core/spi/CheckoutHandler.kt | 5 +- .../opex/referral/core/spi/WalletProxy.kt | 19 +++++ .../wallet/proxy/impl/CheckoutHandlerImpl.kt | 76 +++++++++++++++++-- 3 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/WalletProxy.kt diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CheckoutHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CheckoutHandler.kt index d74a8b387..c3f64843e 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CheckoutHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CheckoutHandler.kt @@ -1,6 +1,9 @@ package co.nilin.opex.referral.core.spi +import java.math.BigDecimal + interface CheckoutHandler { suspend fun checkoutById(uuid: String) - suspend fun checkoutEveryCandidate() + suspend fun checkoutEveryCandidate(min: BigDecimal) + suspend fun checkoutOlderThan(date: Long) } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/WalletProxy.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/WalletProxy.kt new file mode 100644 index 000000000..ed21c128d --- /dev/null +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/WalletProxy.kt @@ -0,0 +1,19 @@ +package co.nilin.opex.referral.core.spi + +import java.math.BigDecimal + +interface WalletProxy { + + suspend fun transfer( + symbol: String, + senderWalletType: String, + senderUuid: String, + receiverWalletType: String, + receiverUuid: String, + amount: BigDecimal, + description: String?, + transferRef: String? + ) + + suspend fun canFulfil(symbol: String, walletType: String, uuid: String, amount: BigDecimal): Boolean +} \ No newline at end of file diff --git a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt index 3142f2253..0ccfe7149 100644 --- a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt +++ b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt @@ -3,31 +3,91 @@ package co.nilin.opex.referral.ports.wallet.proxy.impl import co.nilin.opex.referral.core.spi.CheckoutHandler import co.nilin.opex.referral.core.spi.CommissionPaymentHandler import co.nilin.opex.referral.core.spi.ConfigHandler +import co.nilin.opex.referral.core.spi.WalletProxy import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.launch +import java.math.BigDecimal import java.util.* class CheckoutHandlerImpl( private val configHandler: ConfigHandler, - private val paymentHandler: CommissionPaymentHandler + private val paymentHandler: CommissionPaymentHandler, + private val walletProxy: WalletProxy ) : CheckoutHandler { override suspend fun checkoutById(uuid: String) { val min = configHandler.findConfig("default")!!.minPaymentAmount val commissions = paymentHandler.findUserCommissionsWhereTotalGreaterAndEqualTo(uuid, min) val transferRef = UUID.randomUUID().toString() coroutineScope { + val totalShare = commissions.sumOf { it.commissionReward.share } + val paymentAsset = commissions.first().commissionReward.paymentAssetSymbol //TODO Handle asset variance + if (walletProxy.canFulfil(paymentAsset, "system", "1", totalShare)) { + walletProxy.transfer( + paymentAsset, + "system", + "1", + "main", + uuid, + totalShare, + "", + transferRef + ) + } commissions.forEach { - launch { - //TODO Call wallet transfer api if successful - paymentHandler.checkout(it.commissionReward.id, transferRef) + launch { paymentHandler.checkout(it.commissionReward.id, transferRef) } + } + } + } + + override suspend fun checkoutEveryCandidate(min: BigDecimal) { + val commissions = paymentHandler.findAllCommissionsWhereTotalGreaterAndEqualTo(min) + .groupBy { it.commissionReward.rewardedUuid } + coroutineScope { + commissions.forEach { (uuid, c) -> + val transferRef = UUID.randomUUID().toString() + coroutineScope { + val totalShare = c.sumOf { it.commissionReward.share } + val paymentAsset = c.first().commissionReward.paymentAssetSymbol //TODO Handle asset variance + if (walletProxy.canFulfil(paymentAsset, "system", "1", totalShare)) { + walletProxy.transfer( + paymentAsset, + "system", + "1", + "main", + uuid, + totalShare, + "", + transferRef + ) + } + c.forEach { launch { paymentHandler.checkout(it.commissionReward.id, transferRef) } } } } } } - override suspend fun checkoutEveryCandidate() { - //TODO Fill checkout queue with valid candidates - //TODO Do the payments - //TODO Update payment status for each payed commission reward + override suspend fun checkoutOlderThan(date: Long) { + val commissions = paymentHandler.findCommissionsWherePendingDateLessOrEqualThan(date) + .groupBy { it.commissionReward.rewardedUuid } + coroutineScope { + commissions.forEach { (uuid, c) -> + val transferRef = UUID.randomUUID().toString() + val totalShare = c.sumOf { it.commissionReward.share } + val paymentAsset = c.first().commissionReward.paymentAssetSymbol //TODO Handle asset variance + if (walletProxy.canFulfil(paymentAsset, "system", "1", totalShare)) { + walletProxy.transfer( + paymentAsset, + "system", + "1", + "main", + uuid, + totalShare, + "", + transferRef + ) + } + c.forEach { launch { paymentHandler.checkout(it.commissionReward.id, transferRef) } } + } + } } } From 6dc970428198a0d83cadba24a5d7fc313e19043f Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 3 Jan 2022 11:55:22 +0330 Subject: [PATCH 082/169] Fix system wallet type for checkout --- .../referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt index 0ccfe7149..fd7edc56b 100644 --- a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt +++ b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt @@ -24,7 +24,7 @@ class CheckoutHandlerImpl( if (walletProxy.canFulfil(paymentAsset, "system", "1", totalShare)) { walletProxy.transfer( paymentAsset, - "system", + "main", "1", "main", uuid, @@ -51,7 +51,7 @@ class CheckoutHandlerImpl( if (walletProxy.canFulfil(paymentAsset, "system", "1", totalShare)) { walletProxy.transfer( paymentAsset, - "system", + "main", "1", "main", uuid, From 26801faad8e453fea8148f74c66dbbd618e796ec Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 3 Jan 2022 12:02:44 +0330 Subject: [PATCH 083/169] Add checkout controller --- .../app/controller/CheckoutController.kt | 18 ++++++++++++++++++ .../wallet/proxy/impl/CheckoutHandlerImpl.kt | 2 ++ .../wallet/proxy/proxy/WalletProxyImpl.kt | 2 +- 3 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt new file mode 100644 index 000000000..9fa802183 --- /dev/null +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt @@ -0,0 +1,18 @@ +package co.nilin.opex.referral.app.controller + +import co.nilin.opex.referral.core.spi.CheckoutHandler +import co.nilin.opex.referral.core.spi.ConfigHandler +import org.springframework.web.bind.annotation.PutMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController +import java.math.BigDecimal + +@RestController +@RequestMapping("checkouts") +class CheckoutController(private val checkoutHandler: CheckoutHandler, private val configHandler: ConfigHandler) { + @PutMapping("/all") + suspend fun checkoutAll() { + val min = configHandler.findConfig("default")!!.minPaymentAmount + checkoutHandler.checkoutEveryCandidate(min) + } +} diff --git a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt index fd7edc56b..123f1b8a1 100644 --- a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt +++ b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt @@ -6,9 +6,11 @@ import co.nilin.opex.referral.core.spi.ConfigHandler import co.nilin.opex.referral.core.spi.WalletProxy import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.launch +import org.springframework.stereotype.Service import java.math.BigDecimal import java.util.* +@Service class CheckoutHandlerImpl( private val configHandler: ConfigHandler, private val paymentHandler: CommissionPaymentHandler, diff --git a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/proxy/WalletProxyImpl.kt b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/proxy/WalletProxyImpl.kt index bdb2f98d9..237b70543 100644 --- a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/proxy/WalletProxyImpl.kt +++ b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/proxy/WalletProxyImpl.kt @@ -62,4 +62,4 @@ class WalletProxyImpl( .awaitFirst() .result } -} \ No newline at end of file +} From 934a352711f68fcc4caf3a80f3f5dd96e643a9e1 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 3 Jan 2022 13:49:03 +0330 Subject: [PATCH 084/169] Fix runtime issues --- referral/pom.xml | 5 +++ referral/referral-app/pom.xml | 4 ++ .../service/MockedSymbolPriceCalculator.kt | 2 + .../repository/PaymentRecordRepository.kt | 6 --- .../src/main/resources/data.sql | 2 +- .../src/main/resources/schema.sql | 19 +++++++++- .../wallet/proxy/config/WebClientConfig.kt | 38 ------------------- .../wallet/proxy/proxy/WalletProxyImpl.kt | 2 +- 8 files changed, 31 insertions(+), 47 deletions(-) delete mode 100644 referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/config/WebClientConfig.kt diff --git a/referral/pom.xml b/referral/pom.xml index 0bb9bf8f1..7d0e2dcc5 100644 --- a/referral/pom.xml +++ b/referral/pom.xml @@ -55,6 +55,11 @@ referral-eventlistener-kafka ${project.version} + + co.nilin.opex.referral.ports.wallet.proxy + referral-wallet-proxy + ${project.version} + co.nilin.opex.utility.error error-handler diff --git a/referral/referral-app/pom.xml b/referral/referral-app/pom.xml index e9b193186..64bb34bfe 100644 --- a/referral/referral-app/pom.xml +++ b/referral/referral-app/pom.xml @@ -71,6 +71,10 @@ co.nilin.opex.referral.ports.postgres referral-persister-postgres + + co.nilin.opex.referral.ports.wallet.proxy + referral-wallet-proxy + co.nilin.opex.utility.log logging-handler diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/MockedSymbolPriceCalculator.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/MockedSymbolPriceCalculator.kt index 08478c6da..7088f6441 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/MockedSymbolPriceCalculator.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/MockedSymbolPriceCalculator.kt @@ -1,9 +1,11 @@ package co.nilin.opex.referral.core.service import co.nilin.opex.referral.core.api.SymbolPriceCalculator +import org.springframework.stereotype.Service import java.math.BigDecimal // TODO Must be replaced with actual price calculator +@Service class MockedSymbolPriceCalculator : SymbolPriceCalculator { override suspend fun getPrice(symbol: String): BigDecimal = BigDecimal.ONE } \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt index 66b21ac78..77eb295a0 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt @@ -12,12 +12,6 @@ import java.math.BigDecimal @Repository interface PaymentRecordRepository : PaymentRecordProjectedRepository, ReactiveCrudRepository { - suspend fun findByPaymentStatus(paymentStatus: PaymentStatuses): Flux - suspend fun findByPaymentStatusWhereCreateDateLessThan( - paymentStatus: PaymentStatuses, - createData: Long - ): Flux - @Modifying @Query("INSERT INTO payment_records(commission_reward_id, payment_status) VALUES (:id, :paymentStatus)") suspend fun updatePaymentStatusById(id: Long, paymentStatus: PaymentStatuses) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql index c8652c0cf..35a86c375 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql @@ -1,3 +1,3 @@ -INSERT INTO configs(name, referral_commission_reward) VALUES ('default', 0.3) ON CONFLICT DO NOTHING; +INSERT INTO configs(name, referral_commission_reward, payment_asset_symbol, min_payment_amount) VALUES ('default', 0.3, 'usdt', 0) ON CONFLICT DO NOTHING; INSERT INTO payment_status(status) VALUES ('pending'), ('checked_out') ON CONFLICT DO NOTHING; \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 95b83f8bf..b860603bb 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -48,7 +48,24 @@ CREATE INDEX IF NOT EXISTS payment_records_status_index ON payment_records(payme DROP VIEW IF EXISTS payment_records_projected; -CREATE VIEW payment_records_projected SELECT DISTINCT ON (commission_rewards_id) * FROM payment_records LEFT JOIN commission_rewards ON commission_rewards_id = commission_rewards.id ORDER BY create_date DESC; +CREATE VIEW payment_records_projected +AS SELECT DISTINCT ON (commission_rewards_id) + payment_records.id, + commission_rewards.id AS commission_rewards_id, + rewarded_uuid, + referent_uuid, + referral_code, + rich_trade_id, + referent_order_direction, + payment_asset_symbol, + create_date, + transfer_ref, + update_date, + payment_status +FROM payment_records +LEFT JOIN commission_rewards +ON commission_rewards_id = commission_rewards.id +ORDER BY commission_rewards_id, create_date DESC; CREATE OR REPLACE FUNCTION on_insert_commission_rewards() RETURNS TRIGGER AS $$ BEGIN INSERT INTO payment_records(commission_rewards_id) VALUES (NEW.id); diff --git a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/config/WebClientConfig.kt b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/config/WebClientConfig.kt deleted file mode 100644 index 0604b3cfe..000000000 --- a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/config/WebClientConfig.kt +++ /dev/null @@ -1,38 +0,0 @@ -package co.nilin.opex.referral.ports.wallet.proxy.config - -import co.nilin.opex.utility.log.CustomLogger -import org.springframework.cloud.client.ServiceInstance -import org.springframework.cloud.client.loadbalancer.LoadBalancerProperties -import org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancer -import org.springframework.cloud.client.loadbalancer.reactive.ReactorLoadBalancerExchangeFilterFunction -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration -import org.springframework.http.client.reactive.ReactorClientHttpConnector -import org.springframework.web.reactive.function.client.WebClient -import reactor.netty.http.client.HttpClient - -@Configuration -class WebClientConfig { - - @Bean - fun webClient(loadBalancerFactory: ReactiveLoadBalancer.Factory): WebClient { - val logger = CustomLogger(HttpClient::class.java) - return WebClient.builder() - .clientConnector( - ReactorClientHttpConnector( - HttpClient - .create() - .doOnRequest { request, connection -> - connection.addHandlerFirst(logger) - } - ) - ) - .filter( - ReactorLoadBalancerExchangeFilterFunction( - loadBalancerFactory, LoadBalancerProperties(), emptyList() - ) - ) - .build() - } - -} diff --git a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/proxy/WalletProxyImpl.kt b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/proxy/WalletProxyImpl.kt index 237b70543..43d3c9433 100644 --- a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/proxy/WalletProxyImpl.kt +++ b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/proxy/WalletProxyImpl.kt @@ -1,6 +1,6 @@ package co.nilin.opex.referral.ports.wallet.proxy.proxy -import co.nilin.opex.accountant.core.spi.WalletProxy +import co.nilin.opex.referral.core.spi.WalletProxy import kotlinx.coroutines.reactive.awaitFirst import org.springframework.beans.factory.annotation.Value import org.springframework.core.ParameterizedTypeReference From 75721abd8831b657b7df60c8a5ed03369248a294 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 3 Jan 2022 17:52:20 +0330 Subject: [PATCH 085/169] Fix commission reward date issues --- .../referral/app/controller/CommissionController.kt | 12 +++++++----- .../opex/referral/core/model/CommissionReward.kt | 3 ++- .../nilin/opex/referral/core/model/PaymentRecord.kt | 4 +++- .../core/service/CommissionRewardCalculatorImpl.kt | 5 +++-- .../referral/core/spi/CommissionRewardHandler.kt | 4 ++-- .../referral/ports/postgres/dao/CommissionReward.kt | 4 ++-- .../referral/ports/postgres/dao/PaymentRecord.kt | 7 ++++--- .../postgres/impl/CommissionRewardHandlerImpl.kt | 8 ++++---- .../src/main/resources/schema.sql | 8 ++++---- 9 files changed, 31 insertions(+), 24 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt index fafbc65ef..a6bef037c 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt @@ -4,6 +4,8 @@ import co.nilin.opex.matching.engine.core.model.OrderDirection import co.nilin.opex.referral.core.spi.CommissionRewardHandler import org.springframework.web.bind.annotation.* import java.math.BigDecimal +import java.time.ZoneId +import java.util.* @RestController class CommissionController(private val commissionRewardHandler: CommissionRewardHandler) { @@ -14,7 +16,7 @@ class CommissionController(private val commissionRewardHandler: CommissionReward var richTrade: Long, var referentOrderDirection: OrderDirection, var share: BigDecimal, - var createDate: Long + var createDate: Date ) @GetMapping("/commissions/{code}") @@ -29,17 +31,17 @@ class CommissionController(private val commissionRewardHandler: CommissionReward it.richTrade.first, it.referentOrderDirection, it.share, - it.createDate + Date.from(it.createDate.atZone(ZoneId.systemDefault()).toInstant()) ) } } @GetMapping("/commissions") suspend fun getCommissionsByReferent( - @RequestParam referrerUuid: String?, + @RequestParam rewardedUuid: String?, @RequestParam referentUuid: String? ): List { - return commissionRewardHandler.findCommissions(referentUuid = referentUuid, referrerUuid = referrerUuid).map { + return commissionRewardHandler.findCommissions(referentUuid = referentUuid, rewardedUuid = rewardedUuid).map { CommissionRewardBody( it.rewardedUuid, it.referentUuid, @@ -47,7 +49,7 @@ class CommissionController(private val commissionRewardHandler: CommissionReward it.richTrade.first, it.referentOrderDirection, it.share, - it.createDate + Date.from(it.createDate.atZone(ZoneId.systemDefault()).toInstant()) ) } } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt index 13c88465e..73a0a03e9 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt @@ -3,6 +3,7 @@ package co.nilin.opex.referral.core.model import co.nilin.opex.accountant.core.inout.RichTrade import co.nilin.opex.matching.engine.core.model.OrderDirection import java.math.BigDecimal +import java.time.LocalDateTime data class CommissionReward( var id: Long, @@ -13,5 +14,5 @@ data class CommissionReward( var referentOrderDirection: OrderDirection, var share: BigDecimal, var paymentAssetSymbol: String, - var createDate: Long + var createDate: LocalDateTime ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentRecord.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentRecord.kt index deca362aa..6499dd4c5 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentRecord.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentRecord.kt @@ -1,8 +1,10 @@ package co.nilin.opex.referral.core.model +import java.time.LocalDateTime + data class PaymentRecord( var commissionReward: CommissionReward, var paymentStatus: PaymentStatuses, var transferRef: String?, - var updateDate: Long + var updateDate: LocalDateTime ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt index 7603723c5..77ea56545 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt @@ -8,6 +8,7 @@ import co.nilin.opex.referral.core.spi.ConfigHandler import co.nilin.opex.referral.core.spi.ReferenceHandler import org.springframework.stereotype.Service import java.math.BigDecimal +import java.time.LocalDateTime @Service class CommissionRewardCalculatorImpl( @@ -38,7 +39,7 @@ class CommissionRewardCalculatorImpl( direction, commission * (BigDecimal.ONE - reference.referralCode.referentCommission), config.paymentAssetSymbol, - System.currentTimeMillis() / 1000 + LocalDateTime.now() ) ) } @@ -53,7 +54,7 @@ class CommissionRewardCalculatorImpl( direction, commission * reference.referralCode.referentCommission, config.paymentAssetSymbol, - System.currentTimeMillis() / 1000 + LocalDateTime.now() ) ) } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardHandler.kt index fcac37ecd..0f23b1b49 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionRewardHandler.kt @@ -5,13 +5,13 @@ import co.nilin.opex.referral.core.model.CommissionReward interface CommissionRewardHandler { suspend fun findCommissions( referralCode: String? = null, - referrerUuid: String? = null, + rewardedUuid: String? = null, referentUuid: String? = null ): List suspend fun deleteCommissions( referralCode: String? = null, - referrerUuid: String? = null, + rewardedUuid: String? = null, referentUuid: String? = null ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt index 8323b6352..f95bef747 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt @@ -4,6 +4,7 @@ import co.nilin.opex.matching.engine.core.model.OrderDirection import org.springframework.data.annotation.Id import org.springframework.data.relational.core.mapping.Table import java.math.BigDecimal +import java.time.LocalDateTime @Table("commission_rewards") data class CommissionReward( @@ -15,6 +16,5 @@ data class CommissionReward( var referentOrderDirection: OrderDirection, var share: BigDecimal, var paymentAssetSymbol: String, - var createDate: Long? = null + var createDate: LocalDateTime? = null ) - diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt index 41a805492..2160d4237 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt @@ -5,13 +5,14 @@ import co.nilin.opex.referral.core.model.PaymentStatuses import org.springframework.data.annotation.Id import org.springframework.data.relational.core.mapping.Table import java.math.BigDecimal +import java.time.LocalDateTime @Table("payment_records") data class PaymentRecord( @Id var id: Long?, var commissionRewardsId: Long, var transferRef: String?, - var updateDate: Long, + var updateDate: LocalDateTime, var paymentStatus: PaymentStatuses ) @@ -25,7 +26,7 @@ data class PaymentRecordProjected( var share: BigDecimal, var paymentAssetSymbol: String, var transferRef: String?, - var createDate: Long, - var updateDate: Long, + var createDate: LocalDateTime, + var updateDate: LocalDateTime, var paymentStatus: PaymentStatuses ) \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt index e95c41cf8..842468c45 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt @@ -13,12 +13,12 @@ class CommissionRewardHandlerImpl( ) : CommissionRewardHandler { override suspend fun findCommissions( referralCode: String?, - referrerUuid: String?, + rewardedUuid: String?, referentUuid: String? ): List { return commissionRewardRepository.findByReferralCodeAndRewardedUuidAndReferentUuid( referralCode, - referrerUuid, + rewardedUuid, referentUuid ).map { CommissionReward( @@ -35,10 +35,10 @@ class CommissionRewardHandlerImpl( }.collectList().awaitSingleOrDefault(emptyList()) } - override suspend fun deleteCommissions(referralCode: String?, referrerUuid: String?, referentUuid: String?) { + override suspend fun deleteCommissions(referralCode: String?, rewardedUuid: String?, referentUuid: String?) { commissionRewardRepository.deleteByReferralCodeAndRewardedUuidAndReferentUuid( referralCode, - referrerUuid, + rewardedUuid, referentUuid ).awaitSingleOrNull() } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index b860603bb..1a32983b6 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -58,14 +58,14 @@ AS SELECT DISTINCT ON (commission_rewards_id) rich_trade_id, referent_order_direction, payment_asset_symbol, - create_date, + payment_status, transfer_ref, - update_date, - payment_status + create_date, + update_date FROM payment_records LEFT JOIN commission_rewards ON commission_rewards_id = commission_rewards.id -ORDER BY commission_rewards_id, create_date DESC; +ORDER BY commission_rewards_id, update_date DESC; CREATE OR REPLACE FUNCTION on_insert_commission_rewards() RETURNS TRIGGER AS $$ BEGIN INSERT INTO payment_records(commission_rewards_id) VALUES (NEW.id); From a1f9a39d404f06b20489f79cb03ee1f6a894ce9b Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 3 Jan 2022 18:25:40 +0330 Subject: [PATCH 086/169] Fix payment record schema --- .../app/controller/CheckoutController.kt | 23 +++++++++++++------ .../ports/postgres/dao/PaymentRecord.kt | 1 + .../src/main/resources/schema.sql | 1 + 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt index 9fa802183..46cc0b794 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt @@ -1,18 +1,27 @@ package co.nilin.opex.referral.app.controller +import co.nilin.opex.referral.core.model.PaymentRecord +import co.nilin.opex.referral.core.model.PaymentStatuses import co.nilin.opex.referral.core.spi.CheckoutHandler +import co.nilin.opex.referral.core.spi.CommissionPaymentHandler import co.nilin.opex.referral.core.spi.ConfigHandler -import org.springframework.web.bind.annotation.PutMapping -import org.springframework.web.bind.annotation.RequestMapping -import org.springframework.web.bind.annotation.RestController -import java.math.BigDecimal +import org.springframework.web.bind.annotation.* @RestController -@RequestMapping("checkouts") -class CheckoutController(private val checkoutHandler: CheckoutHandler, private val configHandler: ConfigHandler) { - @PutMapping("/all") +@RequestMapping("/checkouts") +class CheckoutController( + private val checkoutHandler: CheckoutHandler, + private val configHandler: ConfigHandler, + private val paymentHandler: CommissionPaymentHandler +) { + @PutMapping("/checkout-all") suspend fun checkoutAll() { val min = configHandler.findConfig("default")!!.minPaymentAmount checkoutHandler.checkoutEveryCandidate(min) } + + @GetMapping + suspend fun get(@RequestParam status: PaymentStatuses): List { + return paymentHandler.findCommissionsByStatus(status) + } } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt index 2160d4237..c30147e67 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt @@ -18,6 +18,7 @@ data class PaymentRecord( data class PaymentRecordProjected( @Id var id: Long?, + var commissionRewardsId: Long, var rewardedUuid: String, var referentUuid: String, var referralCode: String, diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 1a32983b6..09eab6a36 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -58,6 +58,7 @@ AS SELECT DISTINCT ON (commission_rewards_id) rich_trade_id, referent_order_direction, payment_asset_symbol, + share, payment_status, transfer_ref, create_date, From 56432174f9138b4158b52c8670707c7b47a2a82d Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 4 Jan 2022 10:09:19 +0330 Subject: [PATCH 087/169] Fix payment status initial data --- .../referral-persister-postgres/src/main/resources/data.sql | 2 +- .../referral-persister-postgres/src/main/resources/schema.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql index 35a86c375..5c6046a6b 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql @@ -1,3 +1,3 @@ INSERT INTO configs(name, referral_commission_reward, payment_asset_symbol, min_payment_amount) VALUES ('default', 0.3, 'usdt', 0) ON CONFLICT DO NOTHING; -INSERT INTO payment_status(status) VALUES ('pending'), ('checked_out') ON CONFLICT DO NOTHING; \ No newline at end of file +INSERT INTO payment_status(status) VALUES ('PENDING'), ('CHECKED_OUT') ON CONFLICT DO NOTHING; \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 09eab6a36..4bedefd75 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -41,7 +41,7 @@ CREATE TABLE IF NOT EXISTS payment_records ( commission_rewards_id BIGINT NOT NULL REFERENCES commission_rewards(id), transfer_ref VARCHAR(255), update_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - payment_status VARCHAR(20) NOT NULL DEFAULT 'pending' REFERENCES payment_status(status) + payment_status VARCHAR(20) NOT NULL DEFAULT 'PENDING' REFERENCES payment_status(status) ); CREATE INDEX IF NOT EXISTS payment_records_status_index ON payment_records(payment_status); From 38e5a7c9de2b60408a40db7a2868372873c457e1 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 4 Jan 2022 11:53:28 +0330 Subject: [PATCH 088/169] Fix find payments query --- .../app/controller/CheckoutController.kt | 39 +++++++++++++++++-- .../repository/PaymentRecordRepository.kt | 22 ++++++++++- 2 files changed, 56 insertions(+), 5 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt index 46cc0b794..0f70fb708 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt @@ -1,11 +1,14 @@ package co.nilin.opex.referral.app.controller -import co.nilin.opex.referral.core.model.PaymentRecord +import co.nilin.opex.matching.engine.core.model.OrderDirection import co.nilin.opex.referral.core.model.PaymentStatuses import co.nilin.opex.referral.core.spi.CheckoutHandler import co.nilin.opex.referral.core.spi.CommissionPaymentHandler import co.nilin.opex.referral.core.spi.ConfigHandler import org.springframework.web.bind.annotation.* +import java.math.BigDecimal +import java.time.ZoneId +import java.util.* @RestController @RequestMapping("/checkouts") @@ -14,6 +17,21 @@ class CheckoutController( private val configHandler: ConfigHandler, private val paymentHandler: CommissionPaymentHandler ) { + data class PaymentRecordBody( + var commissionRewardsId: Long, + var rewardedUuid: String, + var referentUuid: String, + var referralCode: String, + var richTrade: Long, + var referentOrderDirection: OrderDirection, + var share: BigDecimal, + var paymentAssetSymbol: String, + var createDate: Date, + var paymentStatus: PaymentStatuses, + var transferRef: String?, + var updateDate: Date + ) + @PutMapping("/checkout-all") suspend fun checkoutAll() { val min = configHandler.findConfig("default")!!.minPaymentAmount @@ -21,7 +39,22 @@ class CheckoutController( } @GetMapping - suspend fun get(@RequestParam status: PaymentStatuses): List { - return paymentHandler.findCommissionsByStatus(status) + suspend fun get(@RequestParam status: PaymentStatuses): List { + return paymentHandler.findCommissionsByStatus(status).map { + PaymentRecordBody( + it.commissionReward.id, + it.commissionReward.rewardedUuid, + it.commissionReward.referentUuid, + it.commissionReward.referralCode, + it.commissionReward.richTrade.first, + it.commissionReward.referentOrderDirection, + it.commissionReward.share, + it.commissionReward.paymentAssetSymbol, + Date.from(it.commissionReward.createDate.atZone(ZoneId.systemDefault()).toInstant()), + it.paymentStatus, + it.transferRef, + Date.from(it.updateDate.atZone(ZoneId.systemDefault()).toInstant()) + ) + } } } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt index 77eb295a0..46ee36ec7 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt @@ -31,10 +31,28 @@ interface PaymentRecordProjectedRepository { createData: Long ): Flux - @Query("SELECT *, SUM(share) AS acc_share OVER (PARTITION BY uuid) FROM payment_records_projected WHERE payment_status = 'pending' AND acc_share >= :value") + @Query( + """ + WITH s AS ( + SELECT *, SUM(share) OVER (PARTITION BY rewarded_uuid) AS acc_share + FROM payment_records_projected + WHERE payment_status = 'PENDING' + ) + SELECT * FROM s WHERE acc_share >= :value + """ + ) suspend fun findAllWhereTotalShareMoreThanProjected(value: BigDecimal): Flux - @Query("SELECT *, SUM(share) AS acc_share OVER (PARTITION BY uuid) FROM payment_records_projected WHERE payment_status = 'pending' AND acc_share >= :value AND uuid = :uuid") + @Query( + """ + WITH s AS ( + SELECT *, SUM(share) OVER (PARTITION BY rewarded_uuid) AS acc_share + FROM payment_records_projected + WHERE payment_status = 'PENDING' AND rewarded_uuid = :uuid + ) + SELECT * FROM s WHERE acc_share >= :value + """ + ) suspend fun findByUuidWhereTotalShareMoreThanProjected( uuid: String, value: BigDecimal From 6ae51de825c8f5eca10fec817e9932de9df70d2e Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 4 Jan 2022 12:31:29 +0330 Subject: [PATCH 089/169] Fix update payment status queries --- .../ports/postgres/repository/PaymentRecordRepository.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt index 46ee36ec7..1fc4455c9 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt @@ -13,11 +13,11 @@ import java.math.BigDecimal @Repository interface PaymentRecordRepository : PaymentRecordProjectedRepository, ReactiveCrudRepository { @Modifying - @Query("INSERT INTO payment_records(commission_reward_id, payment_status) VALUES (:id, :paymentStatus)") + @Query("INSERT INTO payment_records(commission_rewards_id, payment_status) VALUES (:id, :paymentStatus)") suspend fun updatePaymentStatusById(id: Long, paymentStatus: PaymentStatuses) @Modifying - @Query("INSERT INTO payment_records(commission_reward_id, transfer_ref) VALUES (:id, :transferRef)") + @Query("INSERT INTO payment_records(commission_rewards_id, transfer_ref, payment_status) VALUES (:id, :transferRef, 'CHECKED_OUT')") suspend fun checkout(id: Long, transferRef: String) } From f87a4a52e500833f6e4a6b0341ffd77aa86e3b2d Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 4 Jan 2022 12:47:03 +0330 Subject: [PATCH 090/169] Fix commission reward id mapping issue --- .../ports/postgres/impl/CommissionPaymentHandlerImpl.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt index 0038351c0..6780e6a69 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt @@ -17,7 +17,7 @@ class CommissionPaymentHandlerImpl(private val paymentRecordRepository: PaymentR return paymentRecordRepository.findByPaymentStatusProjected(paymentStatus).map { PaymentRecord( CommissionReward( - it.id!!, + it.commissionRewardsId, it.rewardedUuid, it.referentUuid, it.referralCode, @@ -42,7 +42,7 @@ class CommissionPaymentHandlerImpl(private val paymentRecordRepository: PaymentR .collectList().awaitSingle().map { PaymentRecord( CommissionReward( - it.id!!, + it.commissionRewardsId, it.rewardedUuid, it.referentUuid, it.referralCode, @@ -64,7 +64,7 @@ class CommissionPaymentHandlerImpl(private val paymentRecordRepository: PaymentR .collectList().awaitSingle().map { PaymentRecord( CommissionReward( - it.id!!, + it.commissionRewardsId, it.rewardedUuid, it.referentUuid, it.referralCode, @@ -88,7 +88,7 @@ class CommissionPaymentHandlerImpl(private val paymentRecordRepository: PaymentR ).collectList().awaitSingle().map { PaymentRecord( CommissionReward( - it.id!!, + it.commissionRewardsId, it.rewardedUuid, it.referentUuid, it.referralCode, From 336ef572aa367c0209df35667a715b97952bed70 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 4 Jan 2022 13:58:34 +0330 Subject: [PATCH 091/169] Fix transfer reference issue in wallet --- .../wallet/proxy/impl/CheckoutHandlerImpl.kt | 16 ++++++++-------- .../ports/wallet/proxy/proxy/WalletProxyImpl.kt | 2 +- .../wallet/app/controller/TransferController.kt | 4 ++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt index 123f1b8a1..9f2a5b212 100644 --- a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt +++ b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt @@ -34,9 +34,9 @@ class CheckoutHandlerImpl( "", transferRef ) - } - commissions.forEach { - launch { paymentHandler.checkout(it.commissionReward.id, transferRef) } + commissions.forEach { + launch { paymentHandler.checkout(it.commissionReward.id, transferRef) } + } } } } @@ -50,7 +50,7 @@ class CheckoutHandlerImpl( coroutineScope { val totalShare = c.sumOf { it.commissionReward.share } val paymentAsset = c.first().commissionReward.paymentAssetSymbol //TODO Handle asset variance - if (walletProxy.canFulfil(paymentAsset, "system", "1", totalShare)) { + if (walletProxy.canFulfil(paymentAsset, "main", "1", totalShare)) { walletProxy.transfer( paymentAsset, "main", @@ -61,8 +61,8 @@ class CheckoutHandlerImpl( "", transferRef ) + c.forEach { launch { paymentHandler.checkout(it.commissionReward.id, transferRef) } } } - c.forEach { launch { paymentHandler.checkout(it.commissionReward.id, transferRef) } } } } } @@ -76,10 +76,10 @@ class CheckoutHandlerImpl( val transferRef = UUID.randomUUID().toString() val totalShare = c.sumOf { it.commissionReward.share } val paymentAsset = c.first().commissionReward.paymentAssetSymbol //TODO Handle asset variance - if (walletProxy.canFulfil(paymentAsset, "system", "1", totalShare)) { + if (walletProxy.canFulfil(paymentAsset, "main", "1", totalShare)) { walletProxy.transfer( paymentAsset, - "system", + "main", "1", "main", uuid, @@ -87,8 +87,8 @@ class CheckoutHandlerImpl( "", transferRef ) + c.forEach { launch { paymentHandler.checkout(it.commissionReward.id, transferRef) } } } - c.forEach { launch { paymentHandler.checkout(it.commissionReward.id, transferRef) } } } } } diff --git a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/proxy/WalletProxyImpl.kt b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/proxy/WalletProxyImpl.kt index 43d3c9433..d8c36212e 100644 --- a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/proxy/WalletProxyImpl.kt +++ b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/proxy/WalletProxyImpl.kt @@ -41,7 +41,7 @@ class WalletProxyImpl( transferRef: String? ) { webClient.post() - .uri(URI.create("$walletBaseUrl/transfer/${amount}_${symbol}/from/${senderUuid}_${senderWalletType}/to/${receiverUuid}_${receiverWalletType}")) + .uri(URI.create("$walletBaseUrl/transfer/${amount}_${symbol}/from/${senderUuid}_${senderWalletType}/to/${receiverUuid}_${receiverWalletType}?description=$description&transferRef=$transferRef")) .header("Content-Type", "application/json") .retrieve() .onStatus({ t -> t.isError }, { throw RuntimeException() }) diff --git a/wallet/wallet-app/src/main/kotlin/co/nilin/opex/wallet/app/controller/TransferController.kt b/wallet/wallet-app/src/main/kotlin/co/nilin/opex/wallet/app/controller/TransferController.kt index 55ad09520..760e15679 100644 --- a/wallet/wallet-app/src/main/kotlin/co/nilin/opex/wallet/app/controller/TransferController.kt +++ b/wallet/wallet-app/src/main/kotlin/co/nilin/opex/wallet/app/controller/TransferController.kt @@ -43,8 +43,8 @@ class TransferController( @PathVariable("receiverWalletType") receiverWalletType: String, @PathVariable("receiverUuid") receiverUuid: String, @PathVariable("amount") amount: BigDecimal, - @PathVariable("description") description: String?, - @PathVariable("transferRef") transferRef: String? + @RequestParam("description") description: String?, + @RequestParam("transferRef") transferRef: String? ): TransferResult { if (senderWalletType == "cashout" || receiverWalletType == "cashout") throw OpexException(OpexError.InvalidCashOutUsage) From 45754681a4972377e6d6ee82d5120f6798f06241 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 4 Jan 2022 15:36:59 +0330 Subject: [PATCH 092/169] Add security contexts --- .../referral/app/config/SecurityConfig.kt | 13 +++++- .../app/controller/ReferralController.kt | 46 ++++++++++++++++--- .../app/controller/ReportController.kt | 15 +++++- 3 files changed, 65 insertions(+), 9 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt index e4f74d9c3..156a2e533 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt @@ -1,9 +1,12 @@ package co.nilin.opex.referral.app.config +import net.minidev.json.JSONArray import org.springframework.beans.factory.annotation.Value import org.springframework.context.annotation.Bean +import org.springframework.security.authorization.AuthorizationDecision import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity import org.springframework.security.config.web.server.ServerHttpSecurity +import org.springframework.security.oauth2.jwt.Jwt import org.springframework.security.oauth2.jwt.NimbusReactiveJwtDecoder import org.springframework.security.oauth2.jwt.ReactiveJwtDecoder import org.springframework.security.web.server.SecurityWebFilterChain @@ -19,7 +22,15 @@ class SecurityConfig(private val webClient: WebClient) { http.csrf().disable() .authorizeExchange() - .pathMatchers("/**").permitAll() + .pathMatchers("/codes", "/checkouts", "/commissions/**").access { mono, _ -> + mono.map { auth -> + auth.authorities.any { authority -> authority.authority == "SCOPE_trust" } && ((auth.principal as Jwt).claims["groups"] as JSONArray) + .contains("finance-admin") + }.map { granted -> + AuthorizationDecision(granted) + } + } + .pathMatchers("/**").hasAuthority("SCOPE_trust") .anyExchange().authenticated() .and() .oauth2ResourceServer() diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index b4db0de73..55ca225d5 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -4,6 +4,8 @@ import co.nilin.opex.referral.core.spi.ReferenceHandler import co.nilin.opex.referral.core.spi.ReferralCodeHandler import co.nilin.opex.utility.error.data.OpexError import co.nilin.opex.utility.error.data.OpexException +import org.springframework.security.core.annotation.CurrentSecurityContext +import org.springframework.security.core.context.SecurityContext import org.springframework.web.bind.annotation.* import java.math.BigDecimal @@ -28,28 +30,55 @@ class ReferralController( ) @PostMapping("/codes") - suspend fun generateReferralCode(@RequestBody body: PostReferralBody): String { + suspend fun generateReferralCode( + @RequestBody body: PostReferralBody, + @CurrentSecurityContext securityContext: SecurityContext + ): String { + if (body.uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) return referralCodeHandler.generateReferralCode(body.uuid, body.referentCommission) } @PatchMapping("/codes/{code}") - suspend fun updateReferralCodeByCode(@PathVariable code: String, @RequestBody body: PatchReferralBody) { + suspend fun updateReferralCodeByCode( + @PathVariable code: String, + @RequestBody body: PatchReferralBody, + @CurrentSecurityContext securityContext: SecurityContext + ) { + val referralCode = referralCodeHandler.findByCode(code) ?: throw OpexException( + OpexError.BadRequest, + "Referral code is invalid" + ) + if (referralCode.uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) referralCodeHandler.updateCommissions(code, body.referentCommission) } @PutMapping("/codes/{code}/assign") - suspend fun assignReferrer(@PathVariable code: String, @RequestParam uuid: String) { + suspend fun assignReferrer( + @PathVariable code: String, + @RequestParam uuid: String, + @CurrentSecurityContext securityContext: SecurityContext + ) { + if (uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) referralCodeHandler.assign(code, uuid) } @GetMapping("/codes/{code}") - suspend fun getReferralCodeByCode(@PathVariable code: String): ReferralCodeBody { + suspend fun getReferralCodeByCode( + @PathVariable code: String, + @CurrentSecurityContext securityContext: SecurityContext + ): ReferralCodeBody { val referralCode = referralCodeHandler.findByCode(code) ?: throw OpexException(OpexError.NotFound) + if (referralCode.uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) return ReferralCodeBody(referralCode.uuid, referralCode.code, referralCode.referentCommission) } @GetMapping("/codes/{code}/references") - suspend fun getReferenceByCode(@PathVariable code: String): List { + suspend fun getReferenceByCode( + @PathVariable code: String, + @CurrentSecurityContext securityContext: SecurityContext + ): List { + val referralCode = referralCodeHandler.findByCode(code) ?: throw OpexException(OpexError.NotFound) + if (referralCode.uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) return referenceHandler.findByCode(code).map { it.referentUuid } } @@ -59,7 +88,12 @@ class ReferralController( } @DeleteMapping("/codes/{code}") - suspend fun deleteReferralCode(@PathVariable code: String) { + suspend fun deleteReferralCode( + @PathVariable code: String, + @CurrentSecurityContext securityContext: SecurityContext + ) { + val referralCode = referralCodeHandler.findByCode(code) ?: throw OpexException(OpexError.NotFound) + if (referralCode.uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) referralCodeHandler.deleteByCode(code) } } diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt index 04a37e0c2..7b90702be 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt @@ -2,6 +2,11 @@ package co.nilin.opex.referral.app.controller import co.nilin.opex.referral.core.spi.CommissionRewardHandler import co.nilin.opex.referral.core.spi.ReferenceHandler +import co.nilin.opex.referral.core.spi.ReferralCodeHandler +import co.nilin.opex.utility.error.data.OpexError +import co.nilin.opex.utility.error.data.OpexException +import org.springframework.security.core.annotation.CurrentSecurityContext +import org.springframework.security.core.context.SecurityContext import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.RestController @@ -10,7 +15,8 @@ import java.math.BigDecimal @RestController class ReportController( private val commissionRewardHandler: CommissionRewardHandler, - private val referenceHandler: ReferenceHandler + private val referenceHandler: ReferenceHandler, + private val referralCodeHandler: ReferralCodeHandler ) { data class ReportBody( val code: String, @@ -19,7 +25,12 @@ class ReportController( ) @GetMapping("/reports/{code}") - suspend fun getReportByCode(@PathVariable code: String): ReportBody { + suspend fun getReportByCode( + @PathVariable code: String, + @CurrentSecurityContext securityContext: SecurityContext + ): ReportBody { + val referralCode = referralCodeHandler.findByCode(code) ?: throw OpexException(OpexError.NotFound) + if (referralCode.uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) val referencesCount = referenceHandler.findByCode(code).size.toLong() val commissions = commissionRewardHandler.findCommissions(referralCode = code) return ReportBody(code, referencesCount, commissions.sumOf { it.share }) From cea14dec482e2b3e3c318c526c241ee1faef25c8 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 4 Jan 2022 15:45:06 +0330 Subject: [PATCH 093/169] Add real time checkouts --- .../co/nilin/opex/referral/app/config/AppConfig.kt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt index 750c8f004..3c0296c92 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt @@ -2,6 +2,7 @@ package co.nilin.opex.referral.app.config import co.nilin.opex.accountant.core.inout.RichTrade import co.nilin.opex.referral.core.api.CommissionRewardCalculator +import co.nilin.opex.referral.core.spi.CheckoutHandler import co.nilin.opex.referral.core.spi.CommissionRewardPersister import co.nilin.opex.referral.ports.kafka.listener.consumer.RichTradeKafkaListener import co.nilin.opex.referral.ports.kafka.listener.spi.RichTradeListener @@ -15,9 +16,10 @@ class AppConfig { @Bean fun referralListener( commissionRewardPersister: CommissionRewardPersister, - commissionRewardCalculator: CommissionRewardCalculator + commissionRewardCalculator: CommissionRewardCalculator, + checkoutHandler: CheckoutHandler ): ReferralListenerImpl { - return ReferralListenerImpl(commissionRewardPersister, commissionRewardCalculator) + return ReferralListenerImpl(commissionRewardPersister, commissionRewardCalculator, checkoutHandler) } @Autowired @@ -30,7 +32,8 @@ class AppConfig { class ReferralListenerImpl( private val commissionRewardPersister: CommissionRewardPersister, - private val commissionRewardCalculator: CommissionRewardCalculator + private val commissionRewardCalculator: CommissionRewardCalculator, + private val checkoutHandler: CheckoutHandler ) : RichTradeListener { override fun id() = "ReferralListener" @@ -45,6 +48,8 @@ class AppConfig { val takerCommissions = commissionRewardCalculator.calculate(richTrade.takerOuid, richTrade) makerCommissions.forEach { commissionRewardPersister.save(it) } takerCommissions.forEach { commissionRewardPersister.save(it) } + checkoutHandler.checkoutById(richTrade.makerUuid) + checkoutHandler.checkoutById(richTrade.takerUuid) } } } From 310fa4ea31751fe1e878610adff14a0530fac34e Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 4 Jan 2022 16:33:08 +0330 Subject: [PATCH 094/169] Add payment schedule --- .../referral/app/service/PaymentSchedule.kt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/service/PaymentSchedule.kt diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/service/PaymentSchedule.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/service/PaymentSchedule.kt new file mode 100644 index 000000000..5d51128c7 --- /dev/null +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/service/PaymentSchedule.kt @@ -0,0 +1,19 @@ +package co.nilin.opex.referral.app.service + +import co.nilin.opex.referral.core.spi.CheckoutHandler +import co.nilin.opex.referral.core.spi.ConfigHandler +import kotlinx.coroutines.runBlocking +import org.springframework.scheduling.annotation.Scheduled +import org.springframework.stereotype.Service + +@Service +class PaymentSchedule(private val checkoutHandler: CheckoutHandler, private val configHandler: ConfigHandler) { + @Scheduled(fixedDelay = 12 * 60 * 60 * 1000) + fun pay() { + runBlocking { + val config = configHandler.findConfig("default")!! + val minDate = System.currentTimeMillis() / 1000 + checkoutHandler.checkoutOlderThan(minDate) + } + } +} From 9918669063ec5f2cfa1e280f742cbbf866fd8faa Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Tue, 4 Jan 2022 16:59:10 +0330 Subject: [PATCH 095/169] Add payment window to config --- .../nilin/opex/referral/app/service/PaymentSchedule.kt | 4 +++- .../kotlin/co/nilin/opex/referral/core/model/Config.kt | 3 ++- .../co/nilin/opex/referral/core/spi/CheckoutHandler.kt | 3 ++- .../opex/referral/core/spi/CommissionPaymentHandler.kt | 3 ++- .../nilin/opex/referral/ports/postgres/dao/Config.kt | 3 ++- .../postgres/impl/CommissionPaymentHandlerImpl.kt | 3 ++- .../referral/ports/postgres/impl/ConfigHandlerImpl.kt | 10 +++++++++- .../postgres/repository/PaymentRecordRepository.kt | 3 ++- .../src/main/resources/schema.sql | 3 ++- .../ports/wallet/proxy/impl/CheckoutHandlerImpl.kt | 2 +- 10 files changed, 27 insertions(+), 10 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/service/PaymentSchedule.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/service/PaymentSchedule.kt index 5d51128c7..e8a9e8069 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/service/PaymentSchedule.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/service/PaymentSchedule.kt @@ -5,6 +5,8 @@ import co.nilin.opex.referral.core.spi.ConfigHandler import kotlinx.coroutines.runBlocking import org.springframework.scheduling.annotation.Scheduled import org.springframework.stereotype.Service +import java.sql.Timestamp +import java.util.* @Service class PaymentSchedule(private val checkoutHandler: CheckoutHandler, private val configHandler: ConfigHandler) { @@ -12,7 +14,7 @@ class PaymentSchedule(private val checkoutHandler: CheckoutHandler, private val fun pay() { runBlocking { val config = configHandler.findConfig("default")!! - val minDate = System.currentTimeMillis() / 1000 + val minDate = Date.from(Timestamp(Date().time / 1000 - config.paymentWindowSeconds * 1000).toInstant()) checkoutHandler.checkoutOlderThan(minDate) } } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt index 5cd259cfb..cc399fbaf 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt @@ -6,5 +6,6 @@ data class Config( var name: String, var referralCommissionReward: BigDecimal, var paymentAssetSymbol: String, - var minPaymentAmount: BigDecimal + var minPaymentAmount: BigDecimal, + var paymentWindowSeconds: Int ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CheckoutHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CheckoutHandler.kt index c3f64843e..4499f4d0f 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CheckoutHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CheckoutHandler.kt @@ -1,9 +1,10 @@ package co.nilin.opex.referral.core.spi import java.math.BigDecimal +import java.util.* interface CheckoutHandler { suspend fun checkoutById(uuid: String) suspend fun checkoutEveryCandidate(min: BigDecimal) - suspend fun checkoutOlderThan(date: Long) + suspend fun checkoutOlderThan(date: Date) } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt index 2daee0158..4e24d016b 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt @@ -3,12 +3,13 @@ package co.nilin.opex.referral.core.spi import co.nilin.opex.referral.core.model.PaymentRecord import co.nilin.opex.referral.core.model.PaymentStatuses import java.math.BigDecimal +import java.util.* interface CommissionPaymentHandler { suspend fun findCommissionsByStatus(paymentStatus: PaymentStatuses): List suspend fun findUserCommissionsWhereTotalGreaterAndEqualTo(uuid: String, value: BigDecimal): List suspend fun findAllCommissionsWhereTotalGreaterAndEqualTo(value: BigDecimal): List - suspend fun findCommissionsWherePendingDateLessOrEqualThan(date: Long): List + suspend fun findCommissionsWherePendingDateLessOrEqualThan(date: Date): List suspend fun updatePaymentStatus(id: Long, value: PaymentStatuses) suspend fun checkout(id: Long, transferRef: String) } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt index 277d450eb..60df4cea0 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt @@ -9,5 +9,6 @@ data class Config( @Id var name: String, var referralCommissionReward: BigDecimal, var paymentAssetSymbol: String, - var minPaymentAmount: BigDecimal + var minPaymentAmount: BigDecimal, + var paymentWindowSeconds: Int ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt index 6780e6a69..2c3bb2045 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt @@ -9,6 +9,7 @@ import kotlinx.coroutines.reactive.awaitSingle import kotlinx.coroutines.reactive.awaitSingleOrDefault import org.springframework.stereotype.Service import java.math.BigDecimal +import java.util.* @Service class CommissionPaymentHandlerImpl(private val paymentRecordRepository: PaymentRecordRepository) : @@ -81,7 +82,7 @@ class CommissionPaymentHandlerImpl(private val paymentRecordRepository: PaymentR } } - override suspend fun findCommissionsWherePendingDateLessOrEqualThan(date: Long): List { + override suspend fun findCommissionsWherePendingDateLessOrEqualThan(date: Date): List { return paymentRecordRepository.findByPaymentStatusWhereCreateDateLessThanProjected( PaymentStatuses.PENDING, date diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt index 1049b37b3..2c4ae72bc 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt @@ -10,7 +10,15 @@ import org.springframework.stereotype.Service class ConfigHandlerImpl(private val configRepository: ConfigRepository) : ConfigHandler { override suspend fun findConfig(name: String): Config? { return configRepository.findById(name) - .map { Config(it.name, it.referralCommissionReward, it.paymentAssetSymbol, it.minPaymentAmount) } + .map { + Config( + it.name, + it.referralCommissionReward, + it.paymentAssetSymbol, + it.minPaymentAmount, + it.paymentWindowSeconds + ) + } .awaitSingleOrNull() } } \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt index 1fc4455c9..55a5e1656 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt @@ -9,6 +9,7 @@ import org.springframework.data.repository.reactive.ReactiveCrudRepository import org.springframework.stereotype.Repository import reactor.core.publisher.Flux import java.math.BigDecimal +import java.util.* @Repository interface PaymentRecordRepository : PaymentRecordProjectedRepository, ReactiveCrudRepository { @@ -28,7 +29,7 @@ interface PaymentRecordProjectedRepository { @Query("SELECT * FROM payment_records_projected WHERE payment_status = :paymentStatus AND create_date < :createDate") suspend fun findByPaymentStatusWhereCreateDateLessThanProjected( paymentStatus: PaymentStatuses, - createData: Long + createData: Date ): Flux @Query( diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 4bedefd75..6e8f21843 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -2,7 +2,8 @@ CREATE TABLE IF NOT EXISTS configs ( name VARCHAR(72) PRIMARY KEY, referral_commission_reward DECIMAL NOT NULL, payment_asset_symbol VARCHAR(20) NOT NULL, - min_payment_amount DECIMAL NOT NULL + min_payment_amount DECIMAL NOT NULL, + payment_window_seconds INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS referral_codes ( diff --git a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt index 9f2a5b212..e0dad79a2 100644 --- a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt +++ b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt @@ -68,7 +68,7 @@ class CheckoutHandlerImpl( } } - override suspend fun checkoutOlderThan(date: Long) { + override suspend fun checkoutOlderThan(date: Date) { val commissions = paymentHandler.findCommissionsWherePendingDateLessOrEqualThan(date) .groupBy { it.commissionReward.rewardedUuid } coroutineScope { From 0d1288beb6fed24d742558479d51941df7199dca Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 5 Jan 2022 10:00:27 +0330 Subject: [PATCH 096/169] Improve report controller --- .../opex/referral/app/config/AppConfig.kt | 2 +- .../app/controller/ReportController.kt | 26 +++++++++++++++---- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt index 3c0296c92..98eb67bb1 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt @@ -49,7 +49,7 @@ class AppConfig { makerCommissions.forEach { commissionRewardPersister.save(it) } takerCommissions.forEach { commissionRewardPersister.save(it) } checkoutHandler.checkoutById(richTrade.makerUuid) - checkoutHandler.checkoutById(richTrade.takerUuid) + if (richTrade.makerUuid != richTrade.takerUuid) checkoutHandler.checkoutById(richTrade.takerUuid) } } } diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt index 7b90702be..1ae640ac4 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt @@ -18,21 +18,37 @@ class ReportController( private val referenceHandler: ReferenceHandler, private val referralCodeHandler: ReferralCodeHandler ) { - data class ReportBody( + data class ReferralCodeReportBody( val code: String, val referentsCount: Long, - val referrerShare: BigDecimal + val share: BigDecimal ) - @GetMapping("/reports/{code}") + data class ReferrerReportBody( + val referentsCount: Long, + val share: BigDecimal + ) + + @GetMapping("/reports/codes/{code}") suspend fun getReportByCode( @PathVariable code: String, @CurrentSecurityContext securityContext: SecurityContext - ): ReportBody { + ): ReferralCodeReportBody { val referralCode = referralCodeHandler.findByCode(code) ?: throw OpexException(OpexError.NotFound) if (referralCode.uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) val referencesCount = referenceHandler.findByCode(code).size.toLong() val commissions = commissionRewardHandler.findCommissions(referralCode = code) - return ReportBody(code, referencesCount, commissions.sumOf { it.share }) + return ReferralCodeReportBody(code, referencesCount, commissions.sumOf { it.share }) + } + + @GetMapping("/reports/users/{rewardedUuid}") + suspend fun getReportByReferrerUuid( + @PathVariable rewardedUuid: String, + @CurrentSecurityContext securityContext: SecurityContext + ): ReferrerReportBody { + if (rewardedUuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) + val referencesCount = referenceHandler.findByReferrerUuid(rewardedUuid).size.toLong() + val commissions = commissionRewardHandler.findCommissions(rewardedUuid = rewardedUuid) + return ReferrerReportBody(referencesCount, commissions.sumOf { it.share }) } } From 8e62d0afd208985d548f49074c1bdc58b3239afa Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 5 Jan 2022 12:54:59 +0330 Subject: [PATCH 097/169] Add referral code unique index --- .../referral-persister-postgres/src/main/resources/schema.sql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 6e8f21843..2bd1e63e5 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -1,7 +1,7 @@ CREATE TABLE IF NOT EXISTS configs ( name VARCHAR(72) PRIMARY KEY, referral_commission_reward DECIMAL NOT NULL, - payment_asset_symbol VARCHAR(20) NOT NULL, + payment_currency VARCHAR(20) NOT NULL, min_payment_amount DECIMAL NOT NULL, payment_window_seconds INTEGER NOT NULL ); @@ -13,6 +13,8 @@ CREATE TABLE IF NOT EXISTS referral_codes ( referent_commission DECIMAL NOT NULL ); +CREATE UNIQUE INDEX IF NOT EXISTS code_index ON referral_codes(code); + CREATE TABLE IF NOT EXISTS referral_code_references ( id SERIAL PRIMARY KEY, referent_uuid VARCHAR(72) NOT NULL UNIQUE, From 2acde3cf1b2c3c27a6d609e3c56a68f626413b74 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 5 Jan 2022 12:55:50 +0330 Subject: [PATCH 098/169] Refactor payment currency logic --- .../app/controller/CheckoutController.kt | 2 -- .../referral/core/model/CommissionReward.kt | 1 - .../nilin/opex/referral/core/model/Config.kt | 2 +- .../service/CommissionRewardCalculatorImpl.kt | 3 --- .../ports/postgres/dao/CommissionReward.kt | 1 - .../referral/ports/postgres/dao/Config.kt | 2 +- .../ports/postgres/dao/PaymentRecord.kt | 1 - .../impl/CommissionPaymentHandlerImpl.kt | 4 ---- .../impl/CommissionRewardHandlerImpl.kt | 1 - .../impl/CommissionRewardPersisterImpl.kt | 3 +-- .../ports/postgres/impl/ConfigHandlerImpl.kt | 2 +- .../wallet/proxy/impl/CheckoutHandlerImpl.kt | 20 +++++++++---------- 12 files changed, 14 insertions(+), 28 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt index 0f70fb708..f4bc59c1b 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt @@ -25,7 +25,6 @@ class CheckoutController( var richTrade: Long, var referentOrderDirection: OrderDirection, var share: BigDecimal, - var paymentAssetSymbol: String, var createDate: Date, var paymentStatus: PaymentStatuses, var transferRef: String?, @@ -49,7 +48,6 @@ class CheckoutController( it.commissionReward.richTrade.first, it.commissionReward.referentOrderDirection, it.commissionReward.share, - it.commissionReward.paymentAssetSymbol, Date.from(it.commissionReward.createDate.atZone(ZoneId.systemDefault()).toInstant()), it.paymentStatus, it.transferRef, diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt index 73a0a03e9..d73a0ae41 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt @@ -13,6 +13,5 @@ data class CommissionReward( var richTrade: Pair, var referentOrderDirection: OrderDirection, var share: BigDecimal, - var paymentAssetSymbol: String, var createDate: LocalDateTime ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt index cc399fbaf..dde0cab9d 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt @@ -5,7 +5,7 @@ import java.math.BigDecimal data class Config( var name: String, var referralCommissionReward: BigDecimal, - var paymentAssetSymbol: String, + var paymentCurrency: String, var minPaymentAmount: BigDecimal, var paymentWindowSeconds: Int ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt index 77ea56545..583a20759 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt @@ -17,7 +17,6 @@ class CommissionRewardCalculatorImpl( private val referenceHandler: ReferenceHandler ) : CommissionRewardCalculator { override suspend fun calculate(ouid: String, richTrade: RichTrade): List { - val config = configHandler.findConfig("default")!! if (ouid != richTrade.makerOuid && ouid != richTrade.takerOuid) throw IllegalArgumentException("Order is not correct") val uuid = if (ouid == richTrade.makerOuid) richTrade.makerUuid else richTrade.takerUuid val reference = referenceHandler.findByReferentUuid(uuid) @@ -38,7 +37,6 @@ class CommissionRewardCalculatorImpl( richTrade.id to richTrade, direction, commission * (BigDecimal.ONE - reference.referralCode.referentCommission), - config.paymentAssetSymbol, LocalDateTime.now() ) ) @@ -53,7 +51,6 @@ class CommissionRewardCalculatorImpl( richTrade.id to richTrade, direction, commission * reference.referralCode.referentCommission, - config.paymentAssetSymbol, LocalDateTime.now() ) ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt index f95bef747..344d8a91d 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt @@ -15,6 +15,5 @@ data class CommissionReward( var richTradeId: Long, var referentOrderDirection: OrderDirection, var share: BigDecimal, - var paymentAssetSymbol: String, var createDate: LocalDateTime? = null ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt index 60df4cea0..a35313139 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt @@ -8,7 +8,7 @@ import java.math.BigDecimal data class Config( @Id var name: String, var referralCommissionReward: BigDecimal, - var paymentAssetSymbol: String, + var paymentCurrency: String, var minPaymentAmount: BigDecimal, var paymentWindowSeconds: Int ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt index c30147e67..6d79dd3c4 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt @@ -25,7 +25,6 @@ data class PaymentRecordProjected( var richTradeId: Long, var referentOrderDirection: OrderDirection, var share: BigDecimal, - var paymentAssetSymbol: String, var transferRef: String?, var createDate: LocalDateTime, var updateDate: LocalDateTime, diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt index 2c3bb2045..909181e6c 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt @@ -25,7 +25,6 @@ class CommissionPaymentHandlerImpl(private val paymentRecordRepository: PaymentR Pair(it.richTradeId, null), it.referentOrderDirection, it.share, - it.paymentAssetSymbol, it.createDate ), it.paymentStatus, @@ -50,7 +49,6 @@ class CommissionPaymentHandlerImpl(private val paymentRecordRepository: PaymentR Pair(it.richTradeId, null), it.referentOrderDirection, it.share, - it.paymentAssetSymbol, it.createDate ), it.paymentStatus, @@ -72,7 +70,6 @@ class CommissionPaymentHandlerImpl(private val paymentRecordRepository: PaymentR Pair(it.richTradeId, null), it.referentOrderDirection, it.share, - it.paymentAssetSymbol, it.createDate ), it.paymentStatus, @@ -96,7 +93,6 @@ class CommissionPaymentHandlerImpl(private val paymentRecordRepository: PaymentR Pair(it.richTradeId, null), it.referentOrderDirection, it.share, - it.paymentAssetSymbol, it.createDate ), it.paymentStatus, diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt index 842468c45..a0e0eaf5e 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt @@ -29,7 +29,6 @@ class CommissionRewardHandlerImpl( Pair(it.richTradeId, null), it.referentOrderDirection, it.share, - it.paymentAssetSymbol, it.createDate!! ) }.collectList().awaitSingleOrDefault(emptyList()) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt index 0ae760d4d..0779b68e5 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt @@ -18,8 +18,7 @@ class CommissionRewardPersisterImpl(private val commissionRewardRepository: Comm commissionReward.referralCode, commissionReward.richTrade.first, commissionReward.referentOrderDirection, - commissionReward.share, - commissionReward.paymentAssetSymbol + commissionReward.share ) ).awaitSingleOrNull() } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt index 2c4ae72bc..a35472cdb 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt @@ -14,7 +14,7 @@ class ConfigHandlerImpl(private val configRepository: ConfigRepository) : Config Config( it.name, it.referralCommissionReward, - it.paymentAssetSymbol, + it.paymentCurrency, it.minPaymentAmount, it.paymentWindowSeconds ) diff --git a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt index e0dad79a2..1acb4c625 100644 --- a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt +++ b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt @@ -17,15 +17,15 @@ class CheckoutHandlerImpl( private val walletProxy: WalletProxy ) : CheckoutHandler { override suspend fun checkoutById(uuid: String) { - val min = configHandler.findConfig("default")!!.minPaymentAmount + val config = configHandler.findConfig("default")!! + val min = config.minPaymentAmount val commissions = paymentHandler.findUserCommissionsWhereTotalGreaterAndEqualTo(uuid, min) val transferRef = UUID.randomUUID().toString() coroutineScope { val totalShare = commissions.sumOf { it.commissionReward.share } - val paymentAsset = commissions.first().commissionReward.paymentAssetSymbol //TODO Handle asset variance - if (walletProxy.canFulfil(paymentAsset, "system", "1", totalShare)) { + if (walletProxy.canFulfil(config.paymentCurrency, "system", "1", totalShare)) { walletProxy.transfer( - paymentAsset, + config.paymentCurrency, "main", "1", "main", @@ -42,6 +42,7 @@ class CheckoutHandlerImpl( } override suspend fun checkoutEveryCandidate(min: BigDecimal) { + val config = configHandler.findConfig("default")!! val commissions = paymentHandler.findAllCommissionsWhereTotalGreaterAndEqualTo(min) .groupBy { it.commissionReward.rewardedUuid } coroutineScope { @@ -49,10 +50,9 @@ class CheckoutHandlerImpl( val transferRef = UUID.randomUUID().toString() coroutineScope { val totalShare = c.sumOf { it.commissionReward.share } - val paymentAsset = c.first().commissionReward.paymentAssetSymbol //TODO Handle asset variance - if (walletProxy.canFulfil(paymentAsset, "main", "1", totalShare)) { + if (walletProxy.canFulfil(config.paymentCurrency, "main", "1", totalShare)) { walletProxy.transfer( - paymentAsset, + config.paymentCurrency, "main", "1", "main", @@ -69,16 +69,16 @@ class CheckoutHandlerImpl( } override suspend fun checkoutOlderThan(date: Date) { + val config = configHandler.findConfig("default")!! val commissions = paymentHandler.findCommissionsWherePendingDateLessOrEqualThan(date) .groupBy { it.commissionReward.rewardedUuid } coroutineScope { commissions.forEach { (uuid, c) -> val transferRef = UUID.randomUUID().toString() val totalShare = c.sumOf { it.commissionReward.share } - val paymentAsset = c.first().commissionReward.paymentAssetSymbol //TODO Handle asset variance - if (walletProxy.canFulfil(paymentAsset, "main", "1", totalShare)) { + if (walletProxy.canFulfil(config.paymentCurrency, "main", "1", totalShare)) { walletProxy.transfer( - paymentAsset, + config.paymentCurrency, "main", "1", "main", From 51350d093658783c482c8a09c26b6987de426bb8 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 5 Jan 2022 15:07:16 +0330 Subject: [PATCH 099/169] Rename payment to checkout --- .../app/controller/CheckoutController.kt | 14 ++--- .../{PaymentRecord.kt => CheckoutRecord.kt} | 4 +- .../{PaymentStatuses.kt => CheckoutState.kt} | 2 +- .../service/CommissionRewardCalculatorImpl.kt | 2 - .../service/MockedSymbolPriceCalculator.kt | 2 +- .../core/spi/CommissionPaymentHandler.kt | 14 ++--- .../opex/referral/core/spi/WalletProxy.kt | 1 - .../{PaymentRecord.kt => CheckoutRecord.kt} | 10 +-- .../{PaymentStatus.kt => CheckoutState.kt} | 6 +- .../impl/CommissionPaymentHandlerImpl.kt | 48 +++++++-------- .../repository/CheckoutRecordRepository.kt | 61 +++++++++++++++++++ ...pository.kt => CheckoutStateRepository.kt} | 4 +- .../repository/PaymentRecordRepository.kt | 61 ------------------- .../src/main/resources/data.sql | 2 +- .../src/main/resources/schema.sql | 23 ++++--- 15 files changed, 125 insertions(+), 129 deletions(-) rename referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/{PaymentRecord.kt => CheckoutRecord.kt} (73%) rename referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/{PaymentStatuses.kt => CheckoutState.kt} (71%) rename referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/{PaymentRecord.kt => CheckoutRecord.kt} (80%) rename referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/{PaymentStatus.kt => CheckoutState.kt} (53%) create mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CheckoutRecordRepository.kt rename referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/{PaymentStatusRepository.kt => CheckoutStateRepository.kt} (57%) delete mode 100644 referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt index f4bc59c1b..75e9dddfe 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt @@ -1,7 +1,7 @@ package co.nilin.opex.referral.app.controller import co.nilin.opex.matching.engine.core.model.OrderDirection -import co.nilin.opex.referral.core.model.PaymentStatuses +import co.nilin.opex.referral.core.model.CheckoutState import co.nilin.opex.referral.core.spi.CheckoutHandler import co.nilin.opex.referral.core.spi.CommissionPaymentHandler import co.nilin.opex.referral.core.spi.ConfigHandler @@ -17,7 +17,7 @@ class CheckoutController( private val configHandler: ConfigHandler, private val paymentHandler: CommissionPaymentHandler ) { - data class PaymentRecordBody( + data class CheckoutRecordBody( var commissionRewardsId: Long, var rewardedUuid: String, var referentUuid: String, @@ -26,7 +26,7 @@ class CheckoutController( var referentOrderDirection: OrderDirection, var share: BigDecimal, var createDate: Date, - var paymentStatus: PaymentStatuses, + var checkoutState: CheckoutState, var transferRef: String?, var updateDate: Date ) @@ -38,9 +38,9 @@ class CheckoutController( } @GetMapping - suspend fun get(@RequestParam status: PaymentStatuses): List { - return paymentHandler.findCommissionsByStatus(status).map { - PaymentRecordBody( + suspend fun get(@RequestParam status: CheckoutState): List { + return paymentHandler.findCommissionsByCheckoutState(status).map { + CheckoutRecordBody( it.commissionReward.id, it.commissionReward.rewardedUuid, it.commissionReward.referentUuid, @@ -49,7 +49,7 @@ class CheckoutController( it.commissionReward.referentOrderDirection, it.commissionReward.share, Date.from(it.commissionReward.createDate.atZone(ZoneId.systemDefault()).toInstant()), - it.paymentStatus, + it.checkoutState, it.transferRef, Date.from(it.updateDate.atZone(ZoneId.systemDefault()).toInstant()) ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentRecord.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CheckoutRecord.kt similarity index 73% rename from referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentRecord.kt rename to referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CheckoutRecord.kt index 6499dd4c5..cef7417d0 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentRecord.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CheckoutRecord.kt @@ -2,9 +2,9 @@ package co.nilin.opex.referral.core.model import java.time.LocalDateTime -data class PaymentRecord( +data class CheckoutRecord( var commissionReward: CommissionReward, - var paymentStatus: PaymentStatuses, + var checkoutState: CheckoutState, var transferRef: String?, var updateDate: LocalDateTime ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentStatuses.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CheckoutState.kt similarity index 71% rename from referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentStatuses.kt rename to referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CheckoutState.kt index a6d61e2c0..10eb79524 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/PaymentStatuses.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CheckoutState.kt @@ -1,6 +1,6 @@ package co.nilin.opex.referral.core.model -enum class PaymentStatuses { +enum class CheckoutState { PENDING, CHECKED_OUT } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt index 583a20759..70f63e501 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt @@ -4,7 +4,6 @@ import co.nilin.opex.accountant.core.inout.RichTrade import co.nilin.opex.referral.core.api.CommissionRewardCalculator import co.nilin.opex.referral.core.api.SymbolPriceCalculator import co.nilin.opex.referral.core.model.CommissionReward -import co.nilin.opex.referral.core.spi.ConfigHandler import co.nilin.opex.referral.core.spi.ReferenceHandler import org.springframework.stereotype.Service import java.math.BigDecimal @@ -12,7 +11,6 @@ import java.time.LocalDateTime @Service class CommissionRewardCalculatorImpl( - private val configHandler: ConfigHandler, private val symbolPriceCalculator: SymbolPriceCalculator, private val referenceHandler: ReferenceHandler ) : CommissionRewardCalculator { diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/MockedSymbolPriceCalculator.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/MockedSymbolPriceCalculator.kt index 7088f6441..349820311 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/MockedSymbolPriceCalculator.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/MockedSymbolPriceCalculator.kt @@ -4,7 +4,7 @@ import co.nilin.opex.referral.core.api.SymbolPriceCalculator import org.springframework.stereotype.Service import java.math.BigDecimal -// TODO Must be replaced with actual price calculator +//TODO Must be replaced with actual price calculator @Service class MockedSymbolPriceCalculator : SymbolPriceCalculator { override suspend fun getPrice(symbol: String): BigDecimal = BigDecimal.ONE diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt index 4e24d016b..723e7d6bf 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt @@ -1,15 +1,15 @@ package co.nilin.opex.referral.core.spi -import co.nilin.opex.referral.core.model.PaymentRecord -import co.nilin.opex.referral.core.model.PaymentStatuses +import co.nilin.opex.referral.core.model.CheckoutRecord +import co.nilin.opex.referral.core.model.CheckoutState import java.math.BigDecimal import java.util.* interface CommissionPaymentHandler { - suspend fun findCommissionsByStatus(paymentStatus: PaymentStatuses): List - suspend fun findUserCommissionsWhereTotalGreaterAndEqualTo(uuid: String, value: BigDecimal): List - suspend fun findAllCommissionsWhereTotalGreaterAndEqualTo(value: BigDecimal): List - suspend fun findCommissionsWherePendingDateLessOrEqualThan(date: Date): List - suspend fun updatePaymentStatus(id: Long, value: PaymentStatuses) + suspend fun findCommissionsByCheckoutState(checkoutState: CheckoutState): List + suspend fun findUserCommissionsWhereTotalGreaterAndEqualTo(uuid: String, value: BigDecimal): List + suspend fun findAllCommissionsWhereTotalGreaterAndEqualTo(value: BigDecimal): List + suspend fun findCommissionsWherePendingDateLessOrEqualThan(date: Date): List + suspend fun updateCheckoutState(id: Long, value: CheckoutState) suspend fun checkout(id: Long, transferRef: String) } diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/WalletProxy.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/WalletProxy.kt index ed21c128d..bc192405d 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/WalletProxy.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/WalletProxy.kt @@ -3,7 +3,6 @@ package co.nilin.opex.referral.core.spi import java.math.BigDecimal interface WalletProxy { - suspend fun transfer( symbol: String, senderWalletType: String, diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutRecord.kt similarity index 80% rename from referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt rename to referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutRecord.kt index 6d79dd3c4..09f1b07a8 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentRecord.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutRecord.kt @@ -1,22 +1,22 @@ package co.nilin.opex.referral.ports.postgres.dao import co.nilin.opex.matching.engine.core.model.OrderDirection -import co.nilin.opex.referral.core.model.PaymentStatuses +import co.nilin.opex.referral.core.model.CheckoutState import org.springframework.data.annotation.Id import org.springframework.data.relational.core.mapping.Table import java.math.BigDecimal import java.time.LocalDateTime @Table("payment_records") -data class PaymentRecord( +data class CheckoutRecord( @Id var id: Long?, var commissionRewardsId: Long, var transferRef: String?, var updateDate: LocalDateTime, - var paymentStatus: PaymentStatuses + var checkoutState: CheckoutState ) -data class PaymentRecordProjected( +data class CheckoutRecordProjected( @Id var id: Long?, var commissionRewardsId: Long, var rewardedUuid: String, @@ -28,5 +28,5 @@ data class PaymentRecordProjected( var transferRef: String?, var createDate: LocalDateTime, var updateDate: LocalDateTime, - var paymentStatus: PaymentStatuses + var checkoutState: CheckoutState ) \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentStatus.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutState.kt similarity index 53% rename from referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentStatus.kt rename to referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutState.kt index 2add55af3..291542748 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/PaymentStatus.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutState.kt @@ -1,8 +1,8 @@ package co.nilin.opex.referral.ports.postgres.dao -import co.nilin.opex.referral.core.model.PaymentStatuses +import co.nilin.opex.referral.core.model.CheckoutState import org.springframework.data.annotation.Id import org.springframework.data.relational.core.mapping.Table -@Table("payment_status") -data class PaymentStatus(@Id var status: PaymentStatuses) +@Table("checkout_status") +data class CheckoutState(@Id var state: CheckoutState) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt index 909181e6c..258d88e08 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt @@ -1,10 +1,10 @@ package co.nilin.opex.referral.ports.postgres.impl +import co.nilin.opex.referral.core.model.CheckoutRecord +import co.nilin.opex.referral.core.model.CheckoutState import co.nilin.opex.referral.core.model.CommissionReward -import co.nilin.opex.referral.core.model.PaymentRecord -import co.nilin.opex.referral.core.model.PaymentStatuses import co.nilin.opex.referral.core.spi.CommissionPaymentHandler -import co.nilin.opex.referral.ports.postgres.repository.PaymentRecordRepository +import co.nilin.opex.referral.ports.postgres.repository.CheckoutRecordRepository import kotlinx.coroutines.reactive.awaitSingle import kotlinx.coroutines.reactive.awaitSingleOrDefault import org.springframework.stereotype.Service @@ -12,11 +12,11 @@ import java.math.BigDecimal import java.util.* @Service -class CommissionPaymentHandlerImpl(private val paymentRecordRepository: PaymentRecordRepository) : +class CommissionPaymentHandlerImpl(private val checkoutRecordRepository: CheckoutRecordRepository) : CommissionPaymentHandler { - override suspend fun findCommissionsByStatus(paymentStatus: PaymentStatuses): List { - return paymentRecordRepository.findByPaymentStatusProjected(paymentStatus).map { - PaymentRecord( + override suspend fun findCommissionsByCheckoutState(checkoutState: CheckoutState): List { + return checkoutRecordRepository.findByCheckoutStateProjected(checkoutState).map { + CheckoutRecord( CommissionReward( it.commissionRewardsId, it.rewardedUuid, @@ -27,7 +27,7 @@ class CommissionPaymentHandlerImpl(private val paymentRecordRepository: PaymentR it.share, it.createDate ), - it.paymentStatus, + it.checkoutState, it.transferRef, it.updateDate ) @@ -37,10 +37,10 @@ class CommissionPaymentHandlerImpl(private val paymentRecordRepository: PaymentR override suspend fun findUserCommissionsWhereTotalGreaterAndEqualTo( uuid: String, value: BigDecimal - ): List { - return paymentRecordRepository.findByUuidWhereTotalShareMoreThanProjected(uuid, value) + ): List { + return checkoutRecordRepository.findByUuidWhereTotalShareMoreThanProjected(uuid, value) .collectList().awaitSingle().map { - PaymentRecord( + CheckoutRecord( CommissionReward( it.commissionRewardsId, it.rewardedUuid, @@ -51,17 +51,17 @@ class CommissionPaymentHandlerImpl(private val paymentRecordRepository: PaymentR it.share, it.createDate ), - it.paymentStatus, + it.checkoutState, it.transferRef, it.updateDate ) } } - override suspend fun findAllCommissionsWhereTotalGreaterAndEqualTo(value: BigDecimal): List { - return paymentRecordRepository.findAllWhereTotalShareMoreThanProjected(value) + override suspend fun findAllCommissionsWhereTotalGreaterAndEqualTo(value: BigDecimal): List { + return checkoutRecordRepository.findAllWhereTotalShareMoreThanProjected(value) .collectList().awaitSingle().map { - PaymentRecord( + CheckoutRecord( CommissionReward( it.commissionRewardsId, it.rewardedUuid, @@ -72,19 +72,19 @@ class CommissionPaymentHandlerImpl(private val paymentRecordRepository: PaymentR it.share, it.createDate ), - it.paymentStatus, + it.checkoutState, it.transferRef, it.updateDate ) } } - override suspend fun findCommissionsWherePendingDateLessOrEqualThan(date: Date): List { - return paymentRecordRepository.findByPaymentStatusWhereCreateDateLessThanProjected( - PaymentStatuses.PENDING, + override suspend fun findCommissionsWherePendingDateLessOrEqualThan(date: Date): List { + return checkoutRecordRepository.findByCheckoutStateWhereCreateDateLessThanProjected( + CheckoutState.PENDING, date ).collectList().awaitSingle().map { - PaymentRecord( + CheckoutRecord( CommissionReward( it.commissionRewardsId, it.rewardedUuid, @@ -95,18 +95,18 @@ class CommissionPaymentHandlerImpl(private val paymentRecordRepository: PaymentR it.share, it.createDate ), - it.paymentStatus, + it.checkoutState, it.transferRef, it.updateDate ) } } - override suspend fun updatePaymentStatus(id: Long, value: PaymentStatuses) { - paymentRecordRepository.updatePaymentStatusById(id, value) + override suspend fun updateCheckoutState(id: Long, value: CheckoutState) { + checkoutRecordRepository.updateCheckoutStateById(id, value) } override suspend fun checkout(id: Long, transferRef: String) { - paymentRecordRepository.checkout(id, transferRef) + checkoutRecordRepository.checkout(id, transferRef) } } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CheckoutRecordRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CheckoutRecordRepository.kt new file mode 100644 index 000000000..3b8d117cc --- /dev/null +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CheckoutRecordRepository.kt @@ -0,0 +1,61 @@ +package co.nilin.opex.referral.ports.postgres.repository + +import co.nilin.opex.referral.core.model.CheckoutState +import co.nilin.opex.referral.ports.postgres.dao.CheckoutRecord +import co.nilin.opex.referral.ports.postgres.dao.CheckoutRecordProjected +import org.springframework.data.r2dbc.repository.Modifying +import org.springframework.data.r2dbc.repository.Query +import org.springframework.data.repository.reactive.ReactiveCrudRepository +import org.springframework.stereotype.Repository +import reactor.core.publisher.Flux +import java.math.BigDecimal +import java.util.* + +@Repository +interface CheckoutRecordRepository : CheckoutRecordProjectedRepository, ReactiveCrudRepository { + @Modifying + @Query("INSERT INTO checkout_records(commission_rewards_id, checkout_state) VALUES (:id, :checkoutState)") + suspend fun updateCheckoutStateById(id: Long, checkoutState: CheckoutState) + + @Modifying + @Query("INSERT INTO checkout_records(commission_rewards_id, transfer_ref, checkout_state) VALUES (:id, :transferRef, 'CHECKED_OUT')") + suspend fun checkout(id: Long, transferRef: String) +} + +interface CheckoutRecordProjectedRepository { + @Query("SELECT * FROM checkout_records_projected WHERE checkout_state = :checkoutState") + suspend fun findByCheckoutStateProjected(checkoutState: CheckoutState): Flux + + @Query("SELECT * FROM checkout_records_projected WHERE checkout_state = :checkoutState AND create_date < :createDate") + suspend fun findByCheckoutStateWhereCreateDateLessThanProjected( + checkoutState: CheckoutState, + createData: Date + ): Flux + + @Query( + """ + WITH s AS ( + SELECT *, SUM(share) OVER (PARTITION BY rewarded_uuid) AS acc_share + FROM checkout_records_projected + WHERE checkout_state = 'PENDING' + ) + SELECT * FROM s WHERE acc_share >= :value + """ + ) + suspend fun findAllWhereTotalShareMoreThanProjected(value: BigDecimal): Flux + + @Query( + """ + WITH s AS ( + SELECT *, SUM(share) OVER (PARTITION BY rewarded_uuid) AS acc_share + FROM checkout_records_projected + WHERE checkout_state = 'PENDING' AND rewarded_uuid = :uuid + ) + SELECT * FROM s WHERE acc_share >= :value + """ + ) + suspend fun findByUuidWhereTotalShareMoreThanProjected( + uuid: String, + value: BigDecimal + ): Flux +} diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentStatusRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CheckoutStateRepository.kt similarity index 57% rename from referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentStatusRepository.kt rename to referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CheckoutStateRepository.kt index 959fcebeb..343e7d407 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentStatusRepository.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/CheckoutStateRepository.kt @@ -1,8 +1,8 @@ package co.nilin.opex.referral.ports.postgres.repository -import co.nilin.opex.referral.ports.postgres.dao.PaymentStatus +import co.nilin.opex.referral.ports.postgres.dao.CheckoutState import org.springframework.data.repository.reactive.ReactiveCrudRepository import org.springframework.stereotype.Repository @Repository -interface PaymentStatusRepository : ReactiveCrudRepository \ No newline at end of file +interface CheckoutStateRepository : ReactiveCrudRepository \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt deleted file mode 100644 index 55a5e1656..000000000 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/repository/PaymentRecordRepository.kt +++ /dev/null @@ -1,61 +0,0 @@ -package co.nilin.opex.referral.ports.postgres.repository - -import co.nilin.opex.referral.core.model.PaymentStatuses -import co.nilin.opex.referral.ports.postgres.dao.PaymentRecord -import co.nilin.opex.referral.ports.postgres.dao.PaymentRecordProjected -import org.springframework.data.r2dbc.repository.Modifying -import org.springframework.data.r2dbc.repository.Query -import org.springframework.data.repository.reactive.ReactiveCrudRepository -import org.springframework.stereotype.Repository -import reactor.core.publisher.Flux -import java.math.BigDecimal -import java.util.* - -@Repository -interface PaymentRecordRepository : PaymentRecordProjectedRepository, ReactiveCrudRepository { - @Modifying - @Query("INSERT INTO payment_records(commission_rewards_id, payment_status) VALUES (:id, :paymentStatus)") - suspend fun updatePaymentStatusById(id: Long, paymentStatus: PaymentStatuses) - - @Modifying - @Query("INSERT INTO payment_records(commission_rewards_id, transfer_ref, payment_status) VALUES (:id, :transferRef, 'CHECKED_OUT')") - suspend fun checkout(id: Long, transferRef: String) -} - -interface PaymentRecordProjectedRepository { - @Query("SELECT * FROM payment_records_projected WHERE payment_status = :paymentStatus") - suspend fun findByPaymentStatusProjected(paymentStatus: PaymentStatuses): Flux - - @Query("SELECT * FROM payment_records_projected WHERE payment_status = :paymentStatus AND create_date < :createDate") - suspend fun findByPaymentStatusWhereCreateDateLessThanProjected( - paymentStatus: PaymentStatuses, - createData: Date - ): Flux - - @Query( - """ - WITH s AS ( - SELECT *, SUM(share) OVER (PARTITION BY rewarded_uuid) AS acc_share - FROM payment_records_projected - WHERE payment_status = 'PENDING' - ) - SELECT * FROM s WHERE acc_share >= :value - """ - ) - suspend fun findAllWhereTotalShareMoreThanProjected(value: BigDecimal): Flux - - @Query( - """ - WITH s AS ( - SELECT *, SUM(share) OVER (PARTITION BY rewarded_uuid) AS acc_share - FROM payment_records_projected - WHERE payment_status = 'PENDING' AND rewarded_uuid = :uuid - ) - SELECT * FROM s WHERE acc_share >= :value - """ - ) - suspend fun findByUuidWhereTotalShareMoreThanProjected( - uuid: String, - value: BigDecimal - ): Flux -} diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql index 5c6046a6b..d9fb630c9 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql @@ -1,3 +1,3 @@ INSERT INTO configs(name, referral_commission_reward, payment_asset_symbol, min_payment_amount) VALUES ('default', 0.3, 'usdt', 0) ON CONFLICT DO NOTHING; -INSERT INTO payment_status(status) VALUES ('PENDING'), ('CHECKED_OUT') ON CONFLICT DO NOTHING; \ No newline at end of file +INSERT INTO checkout_states(status) VALUES ('PENDING'), ('CHECKED_OUT') ON CONFLICT DO NOTHING; \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 2bd1e63e5..72b555c09 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -22,8 +22,8 @@ CREATE TABLE IF NOT EXISTS referral_code_references ( UNIQUE(referent_uuid, referral_code_id) ); -CREATE TABLE IF NOT EXISTS payment_status ( - status VARCHAR(20) PRIMARY KEY +CREATE TABLE IF NOT EXISTS checkout_states ( + state VARCHAR(20) PRIMARY KEY ); CREATE TABLE IF NOT EXISTS commission_rewards ( @@ -34,26 +34,25 @@ CREATE TABLE IF NOT EXISTS commission_rewards ( rich_trade_id BIGINT NOT NULL, referent_order_direction VARCHAR(20) NOT NULL, share DECIMAL NOT NULL, - payment_asset_symbol VARCHAR(20) NOT NULL, create_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, CONSTRAINT reward_once_constraint UNIQUE (rich_trade_id, rewarded_uuid, referent_order_direction) ); -CREATE TABLE IF NOT EXISTS payment_records ( +CREATE TABLE IF NOT EXISTS checkout_records ( id BIGSERIAL PRIMARY KEY, commission_rewards_id BIGINT NOT NULL REFERENCES commission_rewards(id), transfer_ref VARCHAR(255), update_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - payment_status VARCHAR(20) NOT NULL DEFAULT 'PENDING' REFERENCES payment_status(status) + checkout_state VARCHAR(20) NOT NULL DEFAULT 'PENDING' REFERENCES checkout_states(status) ); -CREATE INDEX IF NOT EXISTS payment_records_status_index ON payment_records(payment_status); +CREATE INDEX IF NOT EXISTS checkout_records_state_index ON payment_records(checkout_state); -DROP VIEW IF EXISTS payment_records_projected; +DROP VIEW IF EXISTS checkout_records_projected; -CREATE VIEW payment_records_projected +CREATE VIEW checkout_records_projected AS SELECT DISTINCT ON (commission_rewards_id) - payment_records.id, + checkout_records.id, commission_rewards.id AS commission_rewards_id, rewarded_uuid, referent_uuid, @@ -62,17 +61,17 @@ AS SELECT DISTINCT ON (commission_rewards_id) referent_order_direction, payment_asset_symbol, share, - payment_status, + checkout_state, transfer_ref, create_date, update_date -FROM payment_records +FROM checkout_records LEFT JOIN commission_rewards ON commission_rewards_id = commission_rewards.id ORDER BY commission_rewards_id, update_date DESC; CREATE OR REPLACE FUNCTION on_insert_commission_rewards() RETURNS TRIGGER AS $$ BEGIN - INSERT INTO payment_records(commission_rewards_id) VALUES (NEW.id); + INSERT INTO checkout_records(commission_rewards_id) VALUES (NEW.id); RETURN NEW; END; $$ LANGUAGE 'plpgsql'; From 4c74960e950bd099127d41dd50db69f6c9ca3f6c Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 5 Jan 2022 15:08:39 +0330 Subject: [PATCH 100/169] Fix data init script --- .../referral-persister-postgres/src/main/resources/data.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql index d9fb630c9..351699f4f 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql @@ -1,3 +1,3 @@ -INSERT INTO configs(name, referral_commission_reward, payment_asset_symbol, min_payment_amount) VALUES ('default', 0.3, 'usdt', 0) ON CONFLICT DO NOTHING; +INSERT INTO configs(name, referral_commission_reward, payment_currency, min_payment_amount) VALUES ('default', 0.3, 'usdt', 0) ON CONFLICT DO NOTHING; -INSERT INTO checkout_states(status) VALUES ('PENDING'), ('CHECKED_OUT') ON CONFLICT DO NOTHING; \ No newline at end of file +INSERT INTO checkout_states(state) VALUES ('PENDING'), ('CHECKED_OUT') ON CONFLICT DO NOTHING; \ No newline at end of file From bc40a7d3c4d0156973e1cc540c7fd241aeaada0d Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 5 Jan 2022 15:10:46 +0330 Subject: [PATCH 101/169] Fix table names --- .../co/nilin/opex/referral/ports/postgres/dao/CheckoutRecord.kt | 2 +- .../co/nilin/opex/referral/ports/postgres/dao/CheckoutState.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutRecord.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutRecord.kt index 09f1b07a8..03dc082c7 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutRecord.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutRecord.kt @@ -7,7 +7,7 @@ import org.springframework.data.relational.core.mapping.Table import java.math.BigDecimal import java.time.LocalDateTime -@Table("payment_records") +@Table("checkout_records") data class CheckoutRecord( @Id var id: Long?, var commissionRewardsId: Long, diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutState.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutState.kt index 291542748..f18de05c4 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutState.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutState.kt @@ -4,5 +4,5 @@ import co.nilin.opex.referral.core.model.CheckoutState import org.springframework.data.annotation.Id import org.springframework.data.relational.core.mapping.Table -@Table("checkout_status") +@Table("checkout_states") data class CheckoutState(@Id var state: CheckoutState) From b05fc6417b318b92dae56bfc94eabc2a27af1929 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 5 Jan 2022 15:11:53 +0330 Subject: [PATCH 102/169] Rename commission reward id --- .../opex/referral/ports/postgres/dao/CheckoutRecord.kt | 4 ++-- .../ports/postgres/impl/CommissionPaymentHandlerImpl.kt | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutRecord.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutRecord.kt index 03dc082c7..140dd0bb9 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutRecord.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutRecord.kt @@ -10,7 +10,7 @@ import java.time.LocalDateTime @Table("checkout_records") data class CheckoutRecord( @Id var id: Long?, - var commissionRewardsId: Long, + var commissionRewardId: Long, var transferRef: String?, var updateDate: LocalDateTime, var checkoutState: CheckoutState @@ -18,7 +18,7 @@ data class CheckoutRecord( data class CheckoutRecordProjected( @Id var id: Long?, - var commissionRewardsId: Long, + var commissionRewardId: Long, var rewardedUuid: String, var referentUuid: String, var referralCode: String, diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt index 258d88e08..c468e3f68 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt @@ -18,7 +18,7 @@ class CommissionPaymentHandlerImpl(private val checkoutRecordRepository: Checkou return checkoutRecordRepository.findByCheckoutStateProjected(checkoutState).map { CheckoutRecord( CommissionReward( - it.commissionRewardsId, + it.commissionRewardId, it.rewardedUuid, it.referentUuid, it.referralCode, @@ -42,7 +42,7 @@ class CommissionPaymentHandlerImpl(private val checkoutRecordRepository: Checkou .collectList().awaitSingle().map { CheckoutRecord( CommissionReward( - it.commissionRewardsId, + it.commissionRewardId, it.rewardedUuid, it.referentUuid, it.referralCode, @@ -63,7 +63,7 @@ class CommissionPaymentHandlerImpl(private val checkoutRecordRepository: Checkou .collectList().awaitSingle().map { CheckoutRecord( CommissionReward( - it.commissionRewardsId, + it.commissionRewardId, it.rewardedUuid, it.referentUuid, it.referralCode, @@ -86,7 +86,7 @@ class CommissionPaymentHandlerImpl(private val checkoutRecordRepository: Checkou ).collectList().awaitSingle().map { CheckoutRecord( CommissionReward( - it.commissionRewardsId, + it.commissionRewardId, it.rewardedUuid, it.referentUuid, it.referralCode, From 5f6157b062ee5c4270ac2a8a0c0f3c5f66b8885c Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 5 Jan 2022 15:56:41 +0330 Subject: [PATCH 103/169] Rename payment handler --- .../app/controller/CheckoutController.kt | 6 +++--- ...aymentHandler.kt => CheckoutRecordHandler.kt} | 2 +- ...ndlerImpl.kt => CheckoutRecordHandlerImpl.kt} | 6 +++--- .../wallet/proxy/impl/CheckoutHandlerImpl.kt | 16 ++++++++-------- 4 files changed, 15 insertions(+), 15 deletions(-) rename referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/{CommissionPaymentHandler.kt => CheckoutRecordHandler.kt} (95%) rename referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/{CommissionPaymentHandlerImpl.kt => CheckoutRecordHandlerImpl.kt} (95%) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt index 75e9dddfe..57b51245f 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt @@ -3,7 +3,7 @@ package co.nilin.opex.referral.app.controller import co.nilin.opex.matching.engine.core.model.OrderDirection import co.nilin.opex.referral.core.model.CheckoutState import co.nilin.opex.referral.core.spi.CheckoutHandler -import co.nilin.opex.referral.core.spi.CommissionPaymentHandler +import co.nilin.opex.referral.core.spi.CheckoutRecordHandler import co.nilin.opex.referral.core.spi.ConfigHandler import org.springframework.web.bind.annotation.* import java.math.BigDecimal @@ -15,7 +15,7 @@ import java.util.* class CheckoutController( private val checkoutHandler: CheckoutHandler, private val configHandler: ConfigHandler, - private val paymentHandler: CommissionPaymentHandler + private val checkoutRecordHandler: CheckoutRecordHandler ) { data class CheckoutRecordBody( var commissionRewardsId: Long, @@ -39,7 +39,7 @@ class CheckoutController( @GetMapping suspend fun get(@RequestParam status: CheckoutState): List { - return paymentHandler.findCommissionsByCheckoutState(status).map { + return checkoutRecordHandler.findCommissionsByCheckoutState(status).map { CheckoutRecordBody( it.commissionReward.id, it.commissionReward.rewardedUuid, diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CheckoutRecordHandler.kt similarity index 95% rename from referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt rename to referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CheckoutRecordHandler.kt index 723e7d6bf..11f5ff355 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CommissionPaymentHandler.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/CheckoutRecordHandler.kt @@ -5,7 +5,7 @@ import co.nilin.opex.referral.core.model.CheckoutState import java.math.BigDecimal import java.util.* -interface CommissionPaymentHandler { +interface CheckoutRecordHandler { suspend fun findCommissionsByCheckoutState(checkoutState: CheckoutState): List suspend fun findUserCommissionsWhereTotalGreaterAndEqualTo(uuid: String, value: BigDecimal): List suspend fun findAllCommissionsWhereTotalGreaterAndEqualTo(value: BigDecimal): List diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CheckoutRecordHandlerImpl.kt similarity index 95% rename from referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt rename to referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CheckoutRecordHandlerImpl.kt index c468e3f68..8573c0034 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionPaymentHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CheckoutRecordHandlerImpl.kt @@ -3,7 +3,7 @@ package co.nilin.opex.referral.ports.postgres.impl import co.nilin.opex.referral.core.model.CheckoutRecord import co.nilin.opex.referral.core.model.CheckoutState import co.nilin.opex.referral.core.model.CommissionReward -import co.nilin.opex.referral.core.spi.CommissionPaymentHandler +import co.nilin.opex.referral.core.spi.CheckoutRecordHandler import co.nilin.opex.referral.ports.postgres.repository.CheckoutRecordRepository import kotlinx.coroutines.reactive.awaitSingle import kotlinx.coroutines.reactive.awaitSingleOrDefault @@ -12,8 +12,8 @@ import java.math.BigDecimal import java.util.* @Service -class CommissionPaymentHandlerImpl(private val checkoutRecordRepository: CheckoutRecordRepository) : - CommissionPaymentHandler { +class CheckoutRecordHandlerImpl(private val checkoutRecordRepository: CheckoutRecordRepository) : + CheckoutRecordHandler { override suspend fun findCommissionsByCheckoutState(checkoutState: CheckoutState): List { return checkoutRecordRepository.findByCheckoutStateProjected(checkoutState).map { CheckoutRecord( diff --git a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt index 1acb4c625..00eba3067 100644 --- a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt +++ b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt @@ -1,7 +1,7 @@ package co.nilin.opex.referral.ports.wallet.proxy.impl import co.nilin.opex.referral.core.spi.CheckoutHandler -import co.nilin.opex.referral.core.spi.CommissionPaymentHandler +import co.nilin.opex.referral.core.spi.CheckoutRecordHandler import co.nilin.opex.referral.core.spi.ConfigHandler import co.nilin.opex.referral.core.spi.WalletProxy import kotlinx.coroutines.coroutineScope @@ -13,13 +13,13 @@ import java.util.* @Service class CheckoutHandlerImpl( private val configHandler: ConfigHandler, - private val paymentHandler: CommissionPaymentHandler, + private val checkoutRecordHandler: CheckoutRecordHandler, private val walletProxy: WalletProxy ) : CheckoutHandler { override suspend fun checkoutById(uuid: String) { val config = configHandler.findConfig("default")!! val min = config.minPaymentAmount - val commissions = paymentHandler.findUserCommissionsWhereTotalGreaterAndEqualTo(uuid, min) + val commissions = checkoutRecordHandler.findUserCommissionsWhereTotalGreaterAndEqualTo(uuid, min) val transferRef = UUID.randomUUID().toString() coroutineScope { val totalShare = commissions.sumOf { it.commissionReward.share } @@ -35,7 +35,7 @@ class CheckoutHandlerImpl( transferRef ) commissions.forEach { - launch { paymentHandler.checkout(it.commissionReward.id, transferRef) } + launch { checkoutRecordHandler.checkout(it.commissionReward.id, transferRef) } } } } @@ -43,7 +43,7 @@ class CheckoutHandlerImpl( override suspend fun checkoutEveryCandidate(min: BigDecimal) { val config = configHandler.findConfig("default")!! - val commissions = paymentHandler.findAllCommissionsWhereTotalGreaterAndEqualTo(min) + val commissions = checkoutRecordHandler.findAllCommissionsWhereTotalGreaterAndEqualTo(min) .groupBy { it.commissionReward.rewardedUuid } coroutineScope { commissions.forEach { (uuid, c) -> @@ -61,7 +61,7 @@ class CheckoutHandlerImpl( "", transferRef ) - c.forEach { launch { paymentHandler.checkout(it.commissionReward.id, transferRef) } } + c.forEach { launch { checkoutRecordHandler.checkout(it.commissionReward.id, transferRef) } } } } } @@ -70,7 +70,7 @@ class CheckoutHandlerImpl( override suspend fun checkoutOlderThan(date: Date) { val config = configHandler.findConfig("default")!! - val commissions = paymentHandler.findCommissionsWherePendingDateLessOrEqualThan(date) + val commissions = checkoutRecordHandler.findCommissionsWherePendingDateLessOrEqualThan(date) .groupBy { it.commissionReward.rewardedUuid } coroutineScope { commissions.forEach { (uuid, c) -> @@ -87,7 +87,7 @@ class CheckoutHandlerImpl( "", transferRef ) - c.forEach { launch { paymentHandler.checkout(it.commissionReward.id, transferRef) } } + c.forEach { launch { checkoutRecordHandler.checkout(it.commissionReward.id, transferRef) } } } } } From d22eaa8c99825b4cd69d9436b2e0719cce38ab4f Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 5 Jan 2022 16:29:13 +0330 Subject: [PATCH 104/169] Rename payment schedule --- .../app/service/{PaymentSchedule.kt => CheckoutSchedule.kt} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/service/{PaymentSchedule.kt => CheckoutSchedule.kt} (85%) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/service/PaymentSchedule.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/service/CheckoutSchedule.kt similarity index 85% rename from referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/service/PaymentSchedule.kt rename to referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/service/CheckoutSchedule.kt index e8a9e8069..1dd36a61a 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/service/PaymentSchedule.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/service/CheckoutSchedule.kt @@ -9,7 +9,7 @@ import java.sql.Timestamp import java.util.* @Service -class PaymentSchedule(private val checkoutHandler: CheckoutHandler, private val configHandler: ConfigHandler) { +class CheckoutSchedule(private val checkoutHandler: CheckoutHandler, private val configHandler: ConfigHandler) { @Scheduled(fixedDelay = 12 * 60 * 60 * 1000) fun pay() { runBlocking { From 20f11e6f672572085c84993864f41385b07704c2 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 8 Jan 2022 11:02:43 +0330 Subject: [PATCH 105/169] Fix database schema bugs --- .../referral-persister-postgres/src/main/resources/data.sql | 2 +- .../src/main/resources/schema.sql | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql index 351699f4f..52bcf6f3f 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql @@ -1,3 +1,3 @@ -INSERT INTO configs(name, referral_commission_reward, payment_currency, min_payment_amount) VALUES ('default', 0.3, 'usdt', 0) ON CONFLICT DO NOTHING; +INSERT INTO configs(name, referral_commission_reward, payment_currency, min_payment_amount, payment_window_seconds) VALUES ('default', 0.3, 'usdt', 0, 604800) ON CONFLICT DO NOTHING; INSERT INTO checkout_states(state) VALUES ('PENDING'), ('CHECKED_OUT') ON CONFLICT DO NOTHING; \ No newline at end of file diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 72b555c09..b0bed7d5e 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -43,10 +43,10 @@ CREATE TABLE IF NOT EXISTS checkout_records ( commission_rewards_id BIGINT NOT NULL REFERENCES commission_rewards(id), transfer_ref VARCHAR(255), update_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - checkout_state VARCHAR(20) NOT NULL DEFAULT 'PENDING' REFERENCES checkout_states(status) + checkout_state VARCHAR(20) NOT NULL DEFAULT 'PENDING' REFERENCES checkout_states(state) ); -CREATE INDEX IF NOT EXISTS checkout_records_state_index ON payment_records(checkout_state); +CREATE INDEX IF NOT EXISTS checkout_records_state_index ON checkout_records(checkout_state); DROP VIEW IF EXISTS checkout_records_projected; @@ -59,7 +59,6 @@ AS SELECT DISTINCT ON (commission_rewards_id) referral_code, rich_trade_id, referent_order_direction, - payment_asset_symbol, share, checkout_state, transfer_ref, From 7fe2c7ef7d4ca5a5a75c44b10ea3dba98a268cc0 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 8 Jan 2022 11:17:21 +0330 Subject: [PATCH 106/169] Add error handling for important parts --- .../app/controller/ReferralController.kt | 24 ++++++++++++++++--- .../postgres/impl/ReferralCodeHandlerImpl.kt | 4 ++-- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index 55ca225d5..0d7f37a0f 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -35,7 +35,13 @@ class ReferralController( @CurrentSecurityContext securityContext: SecurityContext ): String { if (body.uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) - return referralCodeHandler.generateReferralCode(body.uuid, body.referentCommission) + try { + return referralCodeHandler.generateReferralCode(body.uuid, body.referentCommission) + } catch (e: IllegalArgumentException) { + throw OpexException(OpexError.BadRequest, e.message) + } catch (e: Exception) { + throw OpexException(OpexError.InternalServerError, e.message) + } } @PatchMapping("/codes/{code}") @@ -49,7 +55,13 @@ class ReferralController( "Referral code is invalid" ) if (referralCode.uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) - referralCodeHandler.updateCommissions(code, body.referentCommission) + try { + referralCodeHandler.updateCommissions(code, body.referentCommission) + } catch (e: IllegalArgumentException) { + throw OpexException(OpexError.BadRequest, e.message) + } catch (e: Exception) { + throw OpexException(OpexError.BadRequest, e.message) + } } @PutMapping("/codes/{code}/assign") @@ -59,7 +71,13 @@ class ReferralController( @CurrentSecurityContext securityContext: SecurityContext ) { if (uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) - referralCodeHandler.assign(code, uuid) + try { + referralCodeHandler.assign(code, uuid) + } catch (e: IllegalArgumentException) { + throw OpexException(OpexError.BadRequest, e.message) + } catch (e: Exception) { + throw OpexException(OpexError.BadRequest, e.message) + } } @GetMapping("/codes/{code}") diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index f672d5664..005e3a320 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -58,8 +58,8 @@ class ReferralCodeHandlerImpl( override suspend fun assign(code: String, referentUuid: String) { val referralCode = referralCodeRepository.findByCode(code).awaitSingleOrNull() - ?: throw Exception("Referral code doesn't exist") - if (referentUuid == referralCode.uuid) throw Exception("Can't assign referral code to referrer") + ?: throw IllegalArgumentException("Referral code doesn't exist") + if (referentUuid == referralCode.uuid) throw IllegalArgumentException("Can't assign referral code to referrer") val referents = referenceRepository.findByReferrerUuid(referentUuid) val isChild = referents.any { it.referentUuid == referralCode.uuid }.awaitSingle() if (isChild) throw Exception("Referrer can't be child of referent") From ef1cc4a00d698179bb04667f8d243ccd6e5d9ad1 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 8 Jan 2022 15:59:53 +0330 Subject: [PATCH 107/169] Fix referral controller error handlers --- .../nilin/opex/referral/app/controller/ReferralController.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index 0d7f37a0f..cf8e421a6 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -60,7 +60,7 @@ class ReferralController( } catch (e: IllegalArgumentException) { throw OpexException(OpexError.BadRequest, e.message) } catch (e: Exception) { - throw OpexException(OpexError.BadRequest, e.message) + throw OpexException(OpexError.InternalServerError, e.message) } } @@ -76,7 +76,7 @@ class ReferralController( } catch (e: IllegalArgumentException) { throw OpexException(OpexError.BadRequest, e.message) } catch (e: Exception) { - throw OpexException(OpexError.BadRequest, e.message) + throw OpexException(OpexError.InternalServerError, e.message) } } From e093e074d8ad70a22e3be867b87eb6738ec73da6 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 8 Jan 2022 16:00:35 +0330 Subject: [PATCH 108/169] Fix checkout time calculation --- .../co/nilin/opex/referral/app/service/CheckoutSchedule.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/service/CheckoutSchedule.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/service/CheckoutSchedule.kt index 1dd36a61a..ff514574b 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/service/CheckoutSchedule.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/service/CheckoutSchedule.kt @@ -14,7 +14,7 @@ class CheckoutSchedule(private val checkoutHandler: CheckoutHandler, private val fun pay() { runBlocking { val config = configHandler.findConfig("default")!! - val minDate = Date.from(Timestamp(Date().time / 1000 - config.paymentWindowSeconds * 1000).toInstant()) + val minDate = Date.from(Timestamp(Date().time - config.paymentWindowSeconds * 1000).toInstant()) checkoutHandler.checkoutOlderThan(minDate) } } From 25303f02a55a52c14a3436ed8efb912a7e332fbc Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 8 Jan 2022 16:25:02 +0330 Subject: [PATCH 109/169] Fix ReferralCodeHandlerImpl.kt exceptions --- .../referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index 005e3a320..c0de4e928 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -62,7 +62,7 @@ class ReferralCodeHandlerImpl( if (referentUuid == referralCode.uuid) throw IllegalArgumentException("Can't assign referral code to referrer") val referents = referenceRepository.findByReferrerUuid(referentUuid) val isChild = referents.any { it.referentUuid == referralCode.uuid }.awaitSingle() - if (isChild) throw Exception("Referrer can't be child of referent") + if (isChild) throw IllegalArgumentException("Referrer can't be child of referent") val reference = Reference(null, referentUuid, referralCode.id!!) referenceRepository.save(reference).awaitSingleOrNull() } From 03ff7622f063338ec95f0eac6f80d2e5e0ec03c3 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 15 Jan 2022 13:40:02 +0330 Subject: [PATCH 110/169] Add accountant proxy to referral module --- referral/pom.xml | 1 + .../referral/app/config/SecurityConfig.kt | 23 +++--- .../src/main/resources/application.yml | 2 + .../opex/referral/core/spi/AccountantProxy.kt | 7 ++ .../referral-accountant-proxy/pom.xml | 72 +++++++++++++++++++ .../proxy/proxy/AccountantProxyImpl.kt | 28 ++++++++ 6 files changed, 120 insertions(+), 13 deletions(-) create mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/AccountantProxy.kt create mode 100644 referral/referral-ports/referral-accountant-proxy/pom.xml create mode 100644 referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/proxy/AccountantProxyImpl.kt diff --git a/referral/pom.xml b/referral/pom.xml index 7d0e2dcc5..067b80d47 100644 --- a/referral/pom.xml +++ b/referral/pom.xml @@ -19,6 +19,7 @@ referral-ports/referral-persister-postgres referral-ports/referral-eventlistener-kafka referral-ports/referral-wallet-proxy + referral-ports/referral-accountant-proxy diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt index 156a2e533..54a9e545d 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt @@ -1,12 +1,9 @@ package co.nilin.opex.referral.app.config -import net.minidev.json.JSONArray import org.springframework.beans.factory.annotation.Value import org.springframework.context.annotation.Bean -import org.springframework.security.authorization.AuthorizationDecision import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity import org.springframework.security.config.web.server.ServerHttpSecurity -import org.springframework.security.oauth2.jwt.Jwt import org.springframework.security.oauth2.jwt.NimbusReactiveJwtDecoder import org.springframework.security.oauth2.jwt.ReactiveJwtDecoder import org.springframework.security.web.server.SecurityWebFilterChain @@ -19,18 +16,18 @@ class SecurityConfig(private val webClient: WebClient) { @Bean fun springSecurityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain? { - http.csrf().disable() .authorizeExchange() - .pathMatchers("/codes", "/checkouts", "/commissions/**").access { mono, _ -> - mono.map { auth -> - auth.authorities.any { authority -> authority.authority == "SCOPE_trust" } && ((auth.principal as Jwt).claims["groups"] as JSONArray) - .contains("finance-admin") - }.map { granted -> - AuthorizationDecision(granted) - } - } - .pathMatchers("/**").hasAuthority("SCOPE_trust") +// .pathMatchers("/codes", "/checkouts", "/commissions/**").access { mono, _ -> +// mono.map { auth -> +// auth.authorities.any { authority -> authority.authority == "SCOPE_trust" } && ((auth.principal as Jwt).claims["groups"] as JSONArray) +// .contains("finance-admin") +// }.map { granted -> +// AuthorizationDecision(granted) +// } +// } +// .pathMatchers("/**").hasAuthority("SCOPE_trust") + .pathMatchers("/**").permitAll() .anyExchange().authenticated() .and() .oauth2ResourceServer() diff --git a/referral/referral-app/src/main/resources/application.yml b/referral/referral-app/src/main/resources/application.yml index c42eef766..54386e4a2 100644 --- a/referral/referral-app/src/main/resources/application.yml +++ b/referral/referral-app/src/main/resources/application.yml @@ -30,5 +30,7 @@ spring: app: wallet: url: lb://opex-wallet/ + accountant: + url: lb://opex-accountant/ auth: cert-url: lb://opex-auth/auth/realms/opex/protocol/openid-connect/certs \ No newline at end of file diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/AccountantProxy.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/AccountantProxy.kt new file mode 100644 index 000000000..5ce86f368 --- /dev/null +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/AccountantProxy.kt @@ -0,0 +1,7 @@ +package co.nilin.opex.referral.core.spi + +import co.nilin.opex.accountant.core.model.PairConfig + +interface AccountantProxy { + suspend fun fetchPairConfigs(): List +} \ No newline at end of file diff --git a/referral/referral-ports/referral-accountant-proxy/pom.xml b/referral/referral-ports/referral-accountant-proxy/pom.xml new file mode 100644 index 000000000..2b9598391 --- /dev/null +++ b/referral/referral-ports/referral-accountant-proxy/pom.xml @@ -0,0 +1,72 @@ + + + 4.0.0 + + + referral + co.nilin.opex.referral + 1.0-SNAPSHOT + ../../pom.xml + + + + 2020.0.2 + + + co.nilin.opex.referral.ports.accountant.proxy + referral-accountant-proxy + referral-accountant-proxy + + + + org.jetbrains.kotlin + kotlin-reflect + + + org.springframework.boot + spring-boot-starter + + + io.projectreactor.kotlin + reactor-kotlin-extensions + + + org.jetbrains.kotlinx + kotlinx-coroutines-reactor + + + co.nilin.opex.referral.core + referral-core + + + co.nilin.opex.utility.log + logging-handler + + + org.springframework.cloud + spring-cloud-starter-consul-all + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + diff --git a/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/proxy/AccountantProxyImpl.kt b/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/proxy/AccountantProxyImpl.kt new file mode 100644 index 000000000..c2ed90c59 --- /dev/null +++ b/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/proxy/AccountantProxyImpl.kt @@ -0,0 +1,28 @@ +package co.nilin.opex.referral.ports.accountant.proxy.proxy + +import co.nilin.opex.accountant.core.model.PairConfig +import co.nilin.opex.referral.core.spi.AccountantProxy +import kotlinx.coroutines.reactive.awaitFirst +import org.springframework.beans.factory.annotation.Value +import org.springframework.core.ParameterizedTypeReference +import org.springframework.stereotype.Component +import org.springframework.web.reactive.function.client.WebClient +import java.net.URI + +inline fun typeRef(): ParameterizedTypeReference = object : ParameterizedTypeReference() {} + +@Component +class AccountantProxyImpl( + @Value("\${app.accountant.url}") val accountantBaseUrl: String, val webClient: WebClient +) : AccountantProxy { + override suspend fun fetchPairConfigs(): List { + return webClient.get() + .uri(URI.create("$accountantBaseUrl/config/all")) + .header("Content-Type", "application/json") + .retrieve() + .onStatus({ t -> t.isError }, { it.createException() }) + .bodyToMono(typeRef>()) + .log() + .awaitFirst() + } +} From 1eeff0c078e7da42ae6d6a641eb5cfdbab3b10ce Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 15 Jan 2022 13:41:02 +0330 Subject: [PATCH 111/169] Fix postgres referral port conflict --- Deployment/docker-compose.override.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Deployment/docker-compose.override.yml b/Deployment/docker-compose.override.yml index 5f1d02aa1..71d34385e 100644 --- a/Deployment/docker-compose.override.yml +++ b/Deployment/docker-compose.override.yml @@ -53,7 +53,7 @@ services: - opex postgres-referral: ports: - - 127.0.0.1:5439:5432 + - 127.0.0.1:5489:5432 networks: - opex accountant: From b70e4535d531b25d9f0992a495c99592022d192d Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 15 Jan 2022 14:55:52 +0330 Subject: [PATCH 112/169] Add symbol calculator to accountant proxy --- .../service/MockedSymbolPriceCalculator.kt | 11 ----------- .../proxy/impl/SymbolPriceCalculator.kt | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+), 11 deletions(-) delete mode 100644 referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/MockedSymbolPriceCalculator.kt create mode 100644 referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculator.kt diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/MockedSymbolPriceCalculator.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/MockedSymbolPriceCalculator.kt deleted file mode 100644 index 349820311..000000000 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/MockedSymbolPriceCalculator.kt +++ /dev/null @@ -1,11 +0,0 @@ -package co.nilin.opex.referral.core.service - -import co.nilin.opex.referral.core.api.SymbolPriceCalculator -import org.springframework.stereotype.Service -import java.math.BigDecimal - -//TODO Must be replaced with actual price calculator -@Service -class MockedSymbolPriceCalculator : SymbolPriceCalculator { - override suspend fun getPrice(symbol: String): BigDecimal = BigDecimal.ONE -} \ No newline at end of file diff --git a/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculator.kt b/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculator.kt new file mode 100644 index 000000000..61a875872 --- /dev/null +++ b/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculator.kt @@ -0,0 +1,18 @@ +package co.nilin.opex.referral.ports.accountant.proxy.impl + +import co.nilin.opex.referral.core.api.SymbolPriceCalculator +import co.nilin.opex.referral.core.spi.AccountantProxy +import co.nilin.opex.referral.core.spi.ConfigHandler +import org.springframework.stereotype.Service +import java.math.BigDecimal + +@Service +class SymbolPriceCalculator(private val accountantProxy: AccountantProxy, private val configHandler: ConfigHandler) : + SymbolPriceCalculator { + override suspend fun getPrice(symbol: String): BigDecimal { + val out = configHandler.findConfig("default")!!.paymentCurrency + val pair = accountantProxy.fetchPairConfigs() + .find { (it.leftSideWalletSymbol == symbol && it.rightSideWalletSymbol == out) || (it.leftSideWalletSymbol == out && it.rightSideWalletSymbol == symbol) } + return BigDecimal.ZERO + } +} \ No newline at end of file From fe1f9d64cdbe700eaba7ddaa018c5b655a25d512 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 15 Jan 2022 16:58:23 +0330 Subject: [PATCH 113/169] Fix symbol calculator --- .../co/nilin/opex/accountant/core/model/PairConfig.kt | 3 ++- .../ports/accountant/proxy/impl/SymbolPriceCalculator.kt | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/accountant/accountant-core/src/main/kotlin/co/nilin/opex/accountant/core/model/PairConfig.kt b/accountant/accountant-core/src/main/kotlin/co/nilin/opex/accountant/core/model/PairConfig.kt index 6df4d4e82..45c302334 100644 --- a/accountant/accountant-core/src/main/kotlin/co/nilin/opex/accountant/core/model/PairConfig.kt +++ b/accountant/accountant-core/src/main/kotlin/co/nilin/opex/accountant/core/model/PairConfig.kt @@ -5,5 +5,6 @@ class PairConfig( val leftSideWalletSymbol: String, //can be same as pair left side val rightSideWalletSymbol: String, //can be same as pair right side val leftSideFraction: Double, - val rightSideFraction: Double + val rightSideFraction: Double, + val rate: Double = Double.NaN ) \ No newline at end of file diff --git a/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculator.kt b/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculator.kt index 61a875872..7962453e5 100644 --- a/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculator.kt +++ b/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculator.kt @@ -13,6 +13,8 @@ class SymbolPriceCalculator(private val accountantProxy: AccountantProxy, privat val out = configHandler.findConfig("default")!!.paymentCurrency val pair = accountantProxy.fetchPairConfigs() .find { (it.leftSideWalletSymbol == symbol && it.rightSideWalletSymbol == out) || (it.leftSideWalletSymbol == out && it.rightSideWalletSymbol == symbol) } - return BigDecimal.ZERO + ?: return BigDecimal.ZERO + if (pair.rate.isNaN()) return BigDecimal.ZERO + return if (symbol == pair.leftSideWalletSymbol) pair.rate.toBigDecimal() else BigDecimal.ONE / pair.rate.toBigDecimal() } -} \ No newline at end of file +} From a035587f99693ac2807ce4e658e23af5bbfa44c4 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 16 Jan 2022 11:47:16 +0330 Subject: [PATCH 114/169] Set initial pairConfig.rate to 0 --- .../kotlin/co/nilin/opex/accountant/core/model/PairConfig.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accountant/accountant-core/src/main/kotlin/co/nilin/opex/accountant/core/model/PairConfig.kt b/accountant/accountant-core/src/main/kotlin/co/nilin/opex/accountant/core/model/PairConfig.kt index 45c302334..7d1672e58 100644 --- a/accountant/accountant-core/src/main/kotlin/co/nilin/opex/accountant/core/model/PairConfig.kt +++ b/accountant/accountant-core/src/main/kotlin/co/nilin/opex/accountant/core/model/PairConfig.kt @@ -6,5 +6,5 @@ class PairConfig( val rightSideWalletSymbol: String, //can be same as pair right side val leftSideFraction: Double, val rightSideFraction: Double, - val rate: Double = Double.NaN + val rate: Double = 0.0 ) \ No newline at end of file From dc7699c814f10acff7e49a784e4e0fa8467f15a3 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 16 Jan 2022 12:18:52 +0330 Subject: [PATCH 115/169] Add storage module's volume --- Deployment/docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Deployment/docker-compose.yml b/Deployment/docker-compose.yml index 659503052..6c323688e 100644 --- a/Deployment/docker-compose.yml +++ b/Deployment/docker-compose.yml @@ -282,6 +282,8 @@ services: - CONSUL_HOST=consul depends_on: - consul + volumes: + - $DATA/storage-data:/opex-storage deploy: restart_policy: condition: on-failure From 20639813e9e0d4bdbb7a823dd56ed1da16feae3e Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 26 Feb 2022 22:02:29 +0330 Subject: [PATCH 116/169] referral: Use last price instead of static rate in SymbolPriceCalculatorImpl.kt --- .../opex/referral/core/spi/AccountantProxy.kt | 6 +++--- .../proxy/impl/SymbolPriceCalculator.kt | 20 ------------------ .../proxy/impl/SymbolPriceCalculatorImpl.kt | 21 +++++++++++++++++++ .../proxy/proxy/AccountantProxyImpl.kt | 14 +++++++++---- 4 files changed, 34 insertions(+), 27 deletions(-) delete mode 100644 referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculator.kt create mode 100644 referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculatorImpl.kt diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/AccountantProxy.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/AccountantProxy.kt index 5ce86f368..cf5746aeb 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/AccountantProxy.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/AccountantProxy.kt @@ -1,7 +1,7 @@ package co.nilin.opex.referral.core.spi -import co.nilin.opex.accountant.core.model.PairConfig +import java.math.BigDecimal interface AccountantProxy { - suspend fun fetchPairConfigs(): List -} \ No newline at end of file + suspend fun fetchLastPrice(pairSymbol: String): BigDecimal? +} diff --git a/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculator.kt b/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculator.kt deleted file mode 100644 index 7962453e5..000000000 --- a/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculator.kt +++ /dev/null @@ -1,20 +0,0 @@ -package co.nilin.opex.referral.ports.accountant.proxy.impl - -import co.nilin.opex.referral.core.api.SymbolPriceCalculator -import co.nilin.opex.referral.core.spi.AccountantProxy -import co.nilin.opex.referral.core.spi.ConfigHandler -import org.springframework.stereotype.Service -import java.math.BigDecimal - -@Service -class SymbolPriceCalculator(private val accountantProxy: AccountantProxy, private val configHandler: ConfigHandler) : - SymbolPriceCalculator { - override suspend fun getPrice(symbol: String): BigDecimal { - val out = configHandler.findConfig("default")!!.paymentCurrency - val pair = accountantProxy.fetchPairConfigs() - .find { (it.leftSideWalletSymbol == symbol && it.rightSideWalletSymbol == out) || (it.leftSideWalletSymbol == out && it.rightSideWalletSymbol == symbol) } - ?: return BigDecimal.ZERO - if (pair.rate.isNaN()) return BigDecimal.ZERO - return if (symbol == pair.leftSideWalletSymbol) pair.rate.toBigDecimal() else BigDecimal.ONE / pair.rate.toBigDecimal() - } -} diff --git a/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculatorImpl.kt b/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculatorImpl.kt new file mode 100644 index 000000000..151edd684 --- /dev/null +++ b/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculatorImpl.kt @@ -0,0 +1,21 @@ +package co.nilin.opex.referral.ports.accountant.proxy.impl + +import co.nilin.opex.referral.core.api.SymbolPriceCalculator +import co.nilin.opex.referral.core.spi.AccountantProxy +import co.nilin.opex.referral.core.spi.ConfigHandler +import org.springframework.stereotype.Service +import java.math.BigDecimal + +@Service +class SymbolPriceCalculatorImpl( + private val accountantProxy: AccountantProxy, + private val configHandler: ConfigHandler +) : + SymbolPriceCalculator { + override suspend fun getPrice(symbol: String): BigDecimal { + val out = configHandler.findConfig("default")!!.paymentCurrency + return accountantProxy.fetchLastPrice("$symbol$out") ?: accountantProxy.fetchLastPrice("$out$symbol") + ?.takeIf { it > BigDecimal.ZERO } + ?.let { BigDecimal.ONE / it } ?: BigDecimal.ZERO + } +} diff --git a/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/proxy/AccountantProxyImpl.kt b/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/proxy/AccountantProxyImpl.kt index c2ed90c59..40f77cb72 100644 --- a/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/proxy/AccountantProxyImpl.kt +++ b/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/proxy/AccountantProxyImpl.kt @@ -1,28 +1,34 @@ package co.nilin.opex.referral.ports.accountant.proxy.proxy -import co.nilin.opex.accountant.core.model.PairConfig import co.nilin.opex.referral.core.spi.AccountantProxy import kotlinx.coroutines.reactive.awaitFirst import org.springframework.beans.factory.annotation.Value import org.springframework.core.ParameterizedTypeReference import org.springframework.stereotype.Component import org.springframework.web.reactive.function.client.WebClient +import java.math.BigDecimal import java.net.URI +data class PriceTickerResponse( + val symbol: String?, + val price: String? +) + inline fun typeRef(): ParameterizedTypeReference = object : ParameterizedTypeReference() {} @Component class AccountantProxyImpl( @Value("\${app.accountant.url}") val accountantBaseUrl: String, val webClient: WebClient ) : AccountantProxy { - override suspend fun fetchPairConfigs(): List { - return webClient.get() + override suspend fun fetchLastPrice(pairSymbol: String): BigDecimal? { + val list = webClient.get() .uri(URI.create("$accountantBaseUrl/config/all")) .header("Content-Type", "application/json") .retrieve() .onStatus({ t -> t.isError }, { it.createException() }) - .bodyToMono(typeRef>()) + .bodyToMono(typeRef>()) .log() .awaitFirst() + return list.first().price?.let { BigDecimal(it) } } } From 8fa4aa651c94629bbb6a2b98c635c20d759f34c0 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sat, 26 Feb 2022 22:12:52 +0330 Subject: [PATCH 117/169] referral: Update Dockerfile --- referral/referral-app/Dockerfile | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/referral/referral-app/Dockerfile b/referral/referral-app/Dockerfile index f2cbd4c26..6053984ee 100644 --- a/referral/referral-app/Dockerfile +++ b/referral/referral-app/Dockerfile @@ -1,5 +1,4 @@ -FROM openjdk:8-jdk-alpine -VOLUME /tmp +FROM openjdk:11 ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar -ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app.jar"] \ No newline at end of file +ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app.jar"] From 0a5dd2c43853ab708d341e3b0d12cf1722dd5246 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 27 Feb 2022 12:49:27 +0330 Subject: [PATCH 118/169] referral: Cleanup maven configs --- referral/pom.xml | 5 +++-- referral/referral-app/pom.xml | 6 +----- .../referral-ports/referral-accountant-proxy/pom.xml | 12 ------------ .../referral-ports/referral-wallet-proxy/pom.xml | 4 ---- 4 files changed, 4 insertions(+), 23 deletions(-) diff --git a/referral/pom.xml b/referral/pom.xml index 067b80d47..348b6f20c 100644 --- a/referral/pom.xml +++ b/referral/pom.xml @@ -2,12 +2,13 @@ + 4.0.0 + OPEX-Core co.nilin.opex 1.0-SNAPSHOT - 4.0.0 co.nilin.opex.referral referral @@ -78,4 +79,4 @@ - \ No newline at end of file + diff --git a/referral/referral-app/pom.xml b/referral/referral-app/pom.xml index 64bb34bfe..8df273c94 100644 --- a/referral/referral-app/pom.xml +++ b/referral/referral-app/pom.xml @@ -13,10 +13,6 @@ co.nilin.opex.referral.app referral-app - - 2020.0.2 - - com.fasterxml.jackson.module @@ -109,4 +105,4 @@ - \ No newline at end of file + diff --git a/referral/referral-ports/referral-accountant-proxy/pom.xml b/referral/referral-ports/referral-accountant-proxy/pom.xml index 2b9598391..2c9a483f4 100644 --- a/referral/referral-ports/referral-accountant-proxy/pom.xml +++ b/referral/referral-ports/referral-accountant-proxy/pom.xml @@ -11,10 +11,6 @@ ../../pom.xml - - 2020.0.2 - - co.nilin.opex.referral.ports.accountant.proxy referral-accountant-proxy referral-accountant-proxy @@ -50,14 +46,6 @@ - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - - diff --git a/referral/referral-ports/referral-wallet-proxy/pom.xml b/referral/referral-ports/referral-wallet-proxy/pom.xml index 072b2869e..d091424e7 100644 --- a/referral/referral-ports/referral-wallet-proxy/pom.xml +++ b/referral/referral-ports/referral-wallet-proxy/pom.xml @@ -11,10 +11,6 @@ ../../pom.xml - - 2020.0.2 - - co.nilin.opex.referral.ports.wallet.proxy referral-wallet-proxy referral-wallet-proxy From c792a1edd6e9d6c5f6e8a46909a893ced3dac942 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 27 Feb 2022 13:35:46 +0330 Subject: [PATCH 119/169] referral: Fix build issues --- .../referral/ports/kafka/listener/config/KafkaConfig.kt | 4 ++-- .../ports/postgres/impl/ReferralCodeHandlerImpl.kt | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/config/KafkaConfig.kt b/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/config/KafkaConfig.kt index b48244b92..4d01523e1 100644 --- a/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/config/KafkaConfig.kt +++ b/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/config/KafkaConfig.kt @@ -74,7 +74,7 @@ class KafkaConfig { val containerProps = ContainerProperties(Pattern.compile("richTrade")) containerProps.messageListener = richTradeListener val container = ConcurrentMessageListenerContainer(consumerFactory, containerProps) - container.beanName = "ReferralRichTradeKafkaListenerContainer" + container.setBeanName("ReferralRichTradeKafkaListenerContainer") container.start() } @@ -82,4 +82,4 @@ class KafkaConfig { fun createTopics(applicationContext: GenericApplicationContext) { applicationContext.registerBean("topic_richTrade", NewTopic::class.java, "richTrade", 10, 1) } -} \ No newline at end of file +} diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index c0de4e928..34715a39b 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -6,8 +6,7 @@ import co.nilin.opex.referral.ports.postgres.dao.Reference import co.nilin.opex.referral.ports.postgres.repository.ReferenceRepository import co.nilin.opex.referral.ports.postgres.repository.ReferralCodeRepository import kotlinx.coroutines.reactive.awaitSingle -import kotlinx.coroutines.reactive.awaitSingleOrDefault -import kotlinx.coroutines.reactive.awaitSingleOrNull +import kotlinx.coroutines.reactor.awaitSingleOrNull import org.springframework.stereotype.Service import java.math.BigDecimal import java.math.BigInteger @@ -23,7 +22,7 @@ class ReferralCodeHandlerImpl( ): String { if (referentCommission < BigDecimal.ZERO || referentCommission > BigDecimal.ONE) throw IllegalArgumentException("Commission value must be in range of [0, 1]") - val lastId = referralCodeRepository.findMaxId().awaitSingleOrDefault(-1) + 1 + val lastId = referralCodeRepository.findMaxId().awaitSingleOrNull()?.let { it + 1 } ?: 0 val codeInteger = BigInteger.TEN.pow(7).toLong() + lastId if (codeInteger >= BigInteger.TEN.pow(8).toLong()) throw Exception("No referral code available") val code = codeInteger.toString() @@ -47,7 +46,7 @@ class ReferralCodeHandlerImpl( override suspend fun findByReferrerUuid(uuid: String): List { return referralCodeRepository.findByUuid(uuid).map { ReferralCode(it.uuid, it.code, it.referentCommission) } .collectList() - .awaitSingleOrNull() + .awaitSingleOrNull() ?: emptyList() } override suspend fun findByCode(code: String): ReferralCode? { From a491928392ceb5873a5166ccba0d9e8d40e30e5d Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 27 Feb 2022 14:37:40 +0330 Subject: [PATCH 120/169] referral: Add vault and docker-compose config --- docker-compose.yml | 35 +++++++++++++++++++ referral/referral-app/pom.xml | 4 +++ .../opex/util/vault/VaultUserIdMechanism.kt | 9 +++++ .../src/main/resources/application-docker.yml | 10 ------ .../src/main/resources/application.yml | 28 +++++++++++---- resources/vault/workflow-vault.sh | 5 ++- 6 files changed, 74 insertions(+), 17 deletions(-) create mode 100644 referral/referral-app/src/main/kotlin/co/nilin/opex/util/vault/VaultUserIdMechanism.kt delete mode 100644 referral/referral-app/src/main/resources/application-docker.yml diff --git a/docker-compose.yml b/docker-compose.yml index 517874716..ab1f31d59 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -231,6 +231,20 @@ services: deploy: restart_policy: condition: on-failure + postgres-referral: + image: "postgres" + environment: + - POSTGRES_USER=${DB_USER:-opex} + - POSTGRES_PASSWORD=${DB_PASS:-hiopex} + - POSTGRES_DB=opex_referral + - POSTGRES_BACKUP_USER=${DB_BACKUP_USER:-opex_backup} + - POSTGRES_BACKUP_PASSWORD=${DB_BACKUP_PASS:-hiopex} + volumes: + - ./resources/postgres/init-backup-user.sh:/docker-entrypoint-initdb.d/init-backup-user.sh + - $DATA/referral-data:/var/lib/postgresql/data/ + deploy: + restart_policy: + condition: on-failure accountant: build: context: accountant/accountant-app @@ -451,6 +465,26 @@ services: deploy: restart_policy: condition: on-failure + referral: + build: + context: referral/referral-app + environment: + - JAVA_OPTS=-Xmx256m -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=1044 + - CONSUL_HOST=consul + - DB_IP_PORT=postgres-referral + - KAFKA_IP_PORT=kafka-1:29092,kafka-2:29092,kafka-3:29092 + - BACKEND_USER=${BACKEND_USER} + - VAULT_HOST=vault + depends_on: + - kafka-1 + - kafka-2 + - kafka-3 + - consul + - postgres-referral + - vault + deploy: + restart_policy: + condition: on-failure admin: build: context: admin/admin-app @@ -468,6 +502,7 @@ services: - kafka-2 - kafka-3 - consul + - vault networks: - default deploy: diff --git a/referral/referral-app/pom.xml b/referral/referral-app/pom.xml index 8df273c94..d4f49d29a 100644 --- a/referral/referral-app/pom.xml +++ b/referral/referral-app/pom.xml @@ -83,6 +83,10 @@ co.nilin.opex.utility.interceptors interceptors + + org.springframework.cloud + spring-cloud-starter-vault-config + diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/util/vault/VaultUserIdMechanism.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/util/vault/VaultUserIdMechanism.kt new file mode 100644 index 000000000..e9efaf92a --- /dev/null +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/util/vault/VaultUserIdMechanism.kt @@ -0,0 +1,9 @@ +package co.nilin.opex.util.vault + +import org.springframework.vault.authentication.AppIdUserIdMechanism + +class VaultUserIdMechanism() : AppIdUserIdMechanism { + override fun createUserId(): String { + return System.getenv("BACKEND_USER") + } +} \ No newline at end of file diff --git a/referral/referral-app/src/main/resources/application-docker.yml b/referral/referral-app/src/main/resources/application-docker.yml deleted file mode 100644 index 93f5390e0..000000000 --- a/referral/referral-app/src/main/resources/application-docker.yml +++ /dev/null @@ -1,10 +0,0 @@ -spring: - kafka: - bootstrap-servers: ${KAFKA_IP_PORT} - r2dbc: - url: r2dbc:postgresql://${DB_IP_PORT}/opex_referral - username: opex - password: hiopex - cloud: - consul: - host: ${CONSUL_HOST} \ No newline at end of file diff --git a/referral/referral-app/src/main/resources/application.yml b/referral/referral-app/src/main/resources/application.yml index 54386e4a2..54a6fa8d9 100644 --- a/referral/referral-app/src/main/resources/application.yml +++ b/referral/referral-app/src/main/resources/application.yml @@ -1,4 +1,4 @@ -server.port: 8097 +server.port: 8080 logging: level: co.nilin: DEBUG @@ -9,28 +9,44 @@ spring: main: allow-bean-definition-overriding: false kafka: - bootstrap-servers: 192.168.178.29:9092 + bootstrap-servers: ${KAFKA_IP_PORT:localhost:9092} consumer: group-id: referral r2dbc: - url: r2dbc:postgresql://localhost/opex_referral - username: opex - password: hiopex + url: r2dbc:postgresql://${DB_IP_PORT:localhost}/opex_referral + username: ${dbusername:opex} + password: ${dbpassword:hiopex} initialization-mode: always cloud: bootstrap: enabled: true + vault: + host: ${VAULT_HOST} + port: 8200 + scheme: http + authentication: APPID + app-id: + user-id: co.nilin.opex.util.vault.VaultUserIdMechanism + fail-fast: true + kv: + enabled: true + backend: secret + profile-separator: '/' + application-name: ${spring.application.name} consul: + host: ${CONSUL_HOST:localhost} port: 8500 discovery: #healthCheckPath: ${management.context-path}/health instance-id: ${spring.application.name}:${server.port} healthCheckInterval: 20s prefer-ip-address: true + config: + import: vault://secret/${spring.application.name} app: wallet: url: lb://opex-wallet/ accountant: url: lb://opex-accountant/ auth: - cert-url: lb://opex-auth/auth/realms/opex/protocol/openid-connect/certs \ No newline at end of file + cert-url: lb://opex-auth/auth/realms/opex/protocol/openid-connect/certs diff --git a/resources/vault/workflow-vault.sh b/resources/vault/workflow-vault.sh index b4c39cb69..33a401311 100755 --- a/resources/vault/workflow-vault.sh +++ b/resources/vault/workflow-vault.sh @@ -60,8 +60,9 @@ vault write auth/app-id/map/app-id/opex-websocket value=backend-policy display_n vault write auth/app-id/map/app-id/opex-payment value=backend-policy display_name=opex-payment vault write auth/app-id/map/app-id/opex-admin value=backend-policy display_name=opex-admin vault write auth/app-id/map/app-id/opex-chain-scan-gateway value=backend-policy display_name=opex-chain-scan-gateway +vault write auth/app-id/map/app-id/opex-referral value=backend-policy display_name=opex-referral echo 'enable user-id' -vault write auth/app-id/map/user-id/${BACKEND_USER} value=opex-wallet,opex-websocket,opex-eventlog,opex-auth,opex-accountant,opex-api,opex-bc-gateway,opex-payment,opex-admin,opex-chain-scan-gateway +vault write auth/app-id/map/user-id/${BACKEND_USER} value=opex-wallet,opex-websocket,opex-eventlog,opex-auth,opex-accountant,opex-api,opex-bc-gateway,opex-payment,opex-admin,opex-chain-scan-gateway,opex-referral echo 'check login appid' vault write auth/app-id/login/opex-accountant user_id=${BACKEND_USER} vault write auth/app-id/login/opex-api user_id=${BACKEND_USER} @@ -73,6 +74,7 @@ vault write auth/app-id/login/opex-websocket user_id=${BACKEND_USER} vault write auth/app-id/login/opex-payment user_id=${BACKEND_USER} vault write auth/app-id/login/opex-admin user_id=${BACKEND_USER} vault write auth/app-id/login/opex-chain-scan-gateway user_id=${BACKEND_USER} +vault write auth/app-id/login/opex-referral user_id=${BACKEND_USER} # ## Add secret values @@ -88,6 +90,7 @@ vault kv put secret/opex-websocket dbusername=${DB_USER} dbpassword=${DB_PASS} d vault kv put secret/opex-payment dbusername=${DB_USER} dbpassword=${DB_PASS} db_backup_username=${DB_BACKUP_USERNAME} db_backup_pass=${DB_BACKUP_PASS} vandar_api_key=${VANDAR_API_KEY} vault kv put secret/opex-admin keycloak_client_secret=${KEYCLOAK_CLIENT_SECRET} vault kv put secret/opex-chain-scan-gateway dbusername=${DB_USER} dbpassword=${DB_PASS} +vault kv put secret/opex-referral dbusername=${DB_USER} dbpassword=${DB_PASS} db_backup_username=${DB_BACKUP_USERNAME} db_backup_pass=${DB_BACKUP_PASS} # Keep alive while pidof vault >/dev/null; do From d67400066774283d558596315ddfec8795aa41cf Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 27 Feb 2022 15:13:58 +0330 Subject: [PATCH 121/169] referral: Expose database ports --- docker-compose.dev.yml | 5 ++++- docker-compose.override.yml | 5 ++++- docker-compose.yml | 2 ++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 80ab2c255..062d9d812 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -25,4 +25,7 @@ services: - "5446:5432" postgres-bc-gateway: ports: - - "5447:5432" \ No newline at end of file + - "5447:5432" + postgres-referral: + ports: + - "5448:5432" diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 8c374f16f..5ff138293 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -25,4 +25,7 @@ services: - "5436:5432" postgres-bc-gateway: ports: - - "5437:5432" \ No newline at end of file + - "5437:5432" + postgres-referral: + ports: + - "5438:5432" diff --git a/docker-compose.yml b/docker-compose.yml index ab1f31d59..c84308c25 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -476,6 +476,8 @@ services: - BACKEND_USER=${BACKEND_USER} - VAULT_HOST=vault depends_on: + - auth + - accountant - kafka-1 - kafka-2 - kafka-3 From e1ab6b58fde002a0c6222926d66e72d66a302b88 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 27 Feb 2022 15:52:11 +0330 Subject: [PATCH 122/169] docker-compose: Refactor service dependencies --- docker-compose.yml | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index c84308c25..8231c94f1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -119,6 +119,8 @@ services: environment: - VAULT_URL_DEFAULT=http://vault:8200 - VAULT_AUTH_DEFAULT=USERNAMEPASSWORD + depends_on: + - vault consul: image: consul environment: @@ -252,7 +254,6 @@ services: - JAVA_OPTS=-Xmx256m -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 - SPRING_PROFILES_ACTIVE=scheduled - KAFKA_IP_PORT=kafka-1:29092,kafka-2:29092,kafka-3:29092 - - REDIS_HOST=redis - CONSUL_HOST=consul - DB_IP_PORT=postgres-accountant - BACKEND_USER=${BACKEND_USER} @@ -260,11 +261,10 @@ services: networks: - default depends_on: - - zookeeper - kafka-1 - kafka-2 - kafka-3 - - redis + - wallet - consul - vault - postgres-accountant @@ -274,7 +274,6 @@ services: environment: - JAVA_OPTS=-Xmx256m - KAFKA_IP_PORT=kafka-1:29092,kafka-2:29092,kafka-3:29092 - - REDIS_HOST=redis - CONSUL_HOST=consul - DB_IP_PORT=postgres-eventlog - BACKEND_USER=${BACKEND_USER} @@ -282,11 +281,9 @@ services: networks: - default depends_on: - - zookeeper - kafka-1 - kafka-2 - kafka-3 - - redis - consul - vault - postgres-eventlog @@ -300,7 +297,6 @@ services: networks: - default depends_on: - - zookeeper - kafka-1 - kafka-2 - kafka-3 @@ -311,23 +307,21 @@ services: environment: - JAVA_OPTS=-Xmx256m -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 - KAFKA_IP_PORT=kafka-1:29092,kafka-2:29092,kafka-3:29092 - - REDIS_HOST=redis - CONSUL_HOST=consul networks: - default depends_on: - - zookeeper - kafka-1 - kafka-2 - kafka-3 - consul + - matching-engine auth: build: context: user-management/keycloak-gateway environment: - JAVA_OPTS=-Xmx256m -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 - KAFKA_IP_PORT=kafka-1:29092,kafka-2:29092,kafka-3:29092 - - REDIS_HOST=redis - CONSUL_HOST=consul - DB_IP_PORT=postgres-auth - PROXY_ADDRESS_FORWARDING=true @@ -338,11 +332,9 @@ services: - VAULT_URL=http://vault:8200 - VAULT_HOST=vault depends_on: - - zookeeper - kafka-1 - kafka-2 - kafka-3 - - redis - consul - vault - postgres-auth @@ -357,17 +349,14 @@ services: environment: - JAVA_OPTS=-Xmx256m -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 - KAFKA_IP_PORT=kafka-1:29092,kafka-2:29092,kafka-3:29092 - - REDIS_HOST=redis - CONSUL_HOST=consul - DB_IP_PORT=postgres-wallet - BACKEND_USER=${BACKEND_USER} - VAULT_HOST=vault depends_on: - - zookeeper - kafka-1 - kafka-2 - kafka-3 - - redis - consul - vault - postgres-wallet @@ -382,17 +371,20 @@ services: environment: - JAVA_OPTS=-Xmx256m -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 - KAFKA_IP_PORT=kafka-1:29092,kafka-2:29092,kafka-3:29092 - - REDIS_HOST=redis - CONSUL_HOST=consul - DB_IP_PORT=postgres-api - BACKEND_USER=${BACKEND_USER} - VAULT_HOST=vault depends_on: - - zookeeper - kafka-1 - kafka-2 - kafka-3 - - redis + - accountant + - matching-gateway + - wallet + - bc-gateway + - auth + - referral - consul - vault - postgres-api @@ -412,7 +404,6 @@ services: - BACKEND_USER=${BACKEND_USER} - VAULT_HOST=vault depends_on: - - zookeeper - kafka-1 - kafka-2 - kafka-3 @@ -436,11 +427,10 @@ services: - BACKEND_USER=${BACKEND_USER} - VAULT_HOST=vault depends_on: - - zookeeper - kafka-1 - kafka-2 - kafka-3 - - redis + - wallet - consul - vault - postgres-bc-gateway @@ -499,7 +489,6 @@ services: volumes: - $DATA/admin-data:/admin depends_on: - - zookeeper - kafka-1 - kafka-2 - kafka-3 From 1a5b52002706adfcb8a4dab015049945a48dae55 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 27 Feb 2022 15:52:34 +0330 Subject: [PATCH 123/169] redis: Remove redundant redis configs --- accountant/accountant-app/src/main/resources/application.yml | 3 --- api/api-app/src/main/resources/application.yml | 5 +---- bc-gateway/bc-gateway-app/src/main/resources/application.yml | 5 +---- .../matching-gateway-app/src/main/resources/application.yml | 4 ++-- wallet/wallet-app/src/main/resources/application.yml | 3 --- 5 files changed, 4 insertions(+), 16 deletions(-) diff --git a/accountant/accountant-app/src/main/resources/application.yml b/accountant/accountant-app/src/main/resources/application.yml index 0107e6aaa..6e5e58484 100644 --- a/accountant/accountant-app/src/main/resources/application.yml +++ b/accountant/accountant-app/src/main/resources/application.yml @@ -13,9 +13,6 @@ spring: bootstrap-servers: ${KAFKA_IP_PORT:localhost:9092} consumer: group-id: accountant - redis: - hostname: ${REDIS_HOST:localhost} - port: 6379 r2dbc: url: r2dbc:postgresql://${DB_IP_PORT:localhost}/opex_accountant username: ${dbusername:opex} diff --git a/api/api-app/src/main/resources/application.yml b/api/api-app/src/main/resources/application.yml index cf33eb4c5..60c623626 100644 --- a/api/api-app/src/main/resources/application.yml +++ b/api/api-app/src/main/resources/application.yml @@ -13,9 +13,6 @@ spring: bootstrap-servers: ${KAFKA_IP_PORT:localhost:9092} consumer: group-id: api - redis: - host: ${REDIS_HOST:localhost} - port: 6379 r2dbc: url: r2dbc:postgresql://${DB_IP_PORT:localhost}/opex_api username: ${dbusername:opex} @@ -59,4 +56,4 @@ app: auth: cert-url: lb://opex-auth/auth/realms/opex/protocol/openid-connect/certs -swagger.authUrl: https://api.opex.dev \ No newline at end of file +swagger.authUrl: https://api.opex.dev diff --git a/bc-gateway/bc-gateway-app/src/main/resources/application.yml b/bc-gateway/bc-gateway-app/src/main/resources/application.yml index f754b5bc4..94738b868 100644 --- a/bc-gateway/bc-gateway-app/src/main/resources/application.yml +++ b/bc-gateway/bc-gateway-app/src/main/resources/application.yml @@ -9,9 +9,6 @@ spring: bootstrap-servers: ${KAFKA_IP_PORT:localhost:9092} consumer: group-id: bc-gateway - redis: - host: ${REDIS_HOST:localhost} - port: 6379 r2dbc: url: r2dbc:postgresql://${DB_IP_PORT:localhost}/opex_bc_gateway username: ${dbusername:opex} @@ -53,4 +50,4 @@ app: auth: cert-url: lb://opex-auth/auth/realms/opex/protocol/openid-connect/certs wallet: - url: lb://opex-wallet \ No newline at end of file + url: lb://opex-wallet diff --git a/matching-gateway/matching-gateway-app/src/main/resources/application.yml b/matching-gateway/matching-gateway-app/src/main/resources/application.yml index e544263a4..02a759094 100644 --- a/matching-gateway/matching-gateway-app/src/main/resources/application.yml +++ b/matching-gateway/matching-gateway-app/src/main/resources/application.yml @@ -5,7 +5,7 @@ logging: reactor.netty.http.client: DEBUG spring: application: - name: opex-gateway + name: opex-matching-gateway main: allow-bean-definition-overriding: false kafka: @@ -28,4 +28,4 @@ app: accountant: url: lb://opex-accountant auth: - cert-url: lb://opex-auth/auth/realms/opex/protocol/openid-connect/certs \ No newline at end of file + cert-url: lb://opex-auth/auth/realms/opex/protocol/openid-connect/certs diff --git a/wallet/wallet-app/src/main/resources/application.yml b/wallet/wallet-app/src/main/resources/application.yml index ac2eff360..55dd8c5cd 100644 --- a/wallet/wallet-app/src/main/resources/application.yml +++ b/wallet/wallet-app/src/main/resources/application.yml @@ -9,9 +9,6 @@ spring: bootstrap-servers: ${KAFKA_IP_PORT:localhost:9092} consumer: group-id: wallet - redis: - host: ${REDIS_HOST:localhost} - port: 6379 r2dbc: url: r2dbc:postgresql://${DB_IP_PORT:localhost}/opex_wallet username: ${dbusername:opex} From 5affefa0e3dbe3acf17cd7e96831c9fbca067acd Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 27 Feb 2022 16:15:07 +0330 Subject: [PATCH 124/169] consul: Fix matching-gateway address --- api/api-app/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/api-app/src/main/resources/application.yml b/api/api-app/src/main/resources/application.yml index 60c623626..a1487f4d9 100644 --- a/api/api-app/src/main/resources/application.yml +++ b/api/api-app/src/main/resources/application.yml @@ -48,7 +48,7 @@ app: accountant: url: lb://opex-accountant matching-gateway: - url: lb://opex-gateway + url: lb://opex-matching-gateway wallet: url: lb://opex-wallet opex-bc-gateway: From 221dbd66d0a287480f707831a8cb28a62a2b934f Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 27 Feb 2022 16:22:22 +0330 Subject: [PATCH 125/169] bc-gateway: Fix chain scan gateway address --- .../bc-gateway-persister-postgres/src/main/resources/data.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bc-gateway/bc-gateway-ports/bc-gateway-persister-postgres/src/main/resources/data.sql b/bc-gateway/bc-gateway-ports/bc-gateway-persister-postgres/src/main/resources/data.sql index 8f4e93d4b..c3d81febd 100644 --- a/bc-gateway/bc-gateway-ports/bc-gateway-persister-postgres/src/main/resources/data.sql +++ b/bc-gateway/bc-gateway-ports/bc-gateway-persister-postgres/src/main/resources/data.sql @@ -40,8 +40,8 @@ ON CONFLICT DO NOTHING; SELECT setval(pg_get_serial_sequence('currency_implementations', 'id'), (SELECT MAX(id) FROM currency_implementations)); INSERT INTO chain_endpoints(id, chain_name, endpoint_url) -VALUES (1, 'bitcoin', 'lb://gateway/bitcoin/transfers'), - (2, 'ethereum', 'lb://gateway/eth/transfers') +VALUES (1, 'bitcoin', 'lb://chain-scan-gateway/bitcoin/transfers'), + (2, 'ethereum', 'lb://chain-scan-gateway/eth/transfers') ON CONFLICT DO NOTHING; INSERT INTO chain_sync_schedules From cc3b4fdc486f117dc691f86ef8760f0bdc4ba0f1 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 27 Feb 2022 17:12:07 +0330 Subject: [PATCH 126/169] referral: Add accountant proxy dependency --- referral/pom.xml | 5 +++++ referral/referral-app/pom.xml | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/referral/pom.xml b/referral/pom.xml index 348b6f20c..450c662db 100644 --- a/referral/pom.xml +++ b/referral/pom.xml @@ -57,6 +57,11 @@ referral-eventlistener-kafka ${project.version} + + co.nilin.opex.referral.ports.accountant.proxy + referral-accountant-proxy + ${project.version} + co.nilin.opex.referral.ports.wallet.proxy referral-wallet-proxy diff --git a/referral/referral-app/pom.xml b/referral/referral-app/pom.xml index d4f49d29a..344fddc57 100644 --- a/referral/referral-app/pom.xml +++ b/referral/referral-app/pom.xml @@ -67,6 +67,10 @@ co.nilin.opex.referral.ports.postgres referral-persister-postgres + + co.nilin.opex.referral.ports.accountant.proxy + referral-accountant-proxy + co.nilin.opex.referral.ports.wallet.proxy referral-wallet-proxy From 74843ad847dd258625cc2e6785cd7ba47cde52b6 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 27 Feb 2022 17:44:06 +0330 Subject: [PATCH 127/169] referral: Fix create trigger statement --- .../referral-persister-postgres/src/main/resources/schema.sql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index b0bed7d5e..559fbea4d 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -74,7 +74,9 @@ CREATE OR REPLACE FUNCTION on_insert_commission_rewards() RETURNS TRIGGER AS $$ RETURN NEW; END; $$ LANGUAGE 'plpgsql'; -CREATE OR REPLACE TRIGGER commission_rewards_insert AFTER INSERT +DROP TRIGGER IF EXISTS commission_rewards_insert ON commission_rewards CASCADE; + +CREATE TRIGGER commission_rewards_insert AFTER INSERT ON commission_rewards FOR EACH ROW EXECUTE PROCEDURE on_insert_commission_rewards(); From fcf1e8c95e62333a8b41a48b6c3cc3de4fedf035 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 27 Feb 2022 18:26:29 +0330 Subject: [PATCH 128/169] vault: Fix chain-scan-gateway name --- resources/vault/workflow-vault.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/vault/workflow-vault.sh b/resources/vault/workflow-vault.sh index 33a401311..461f5a4d5 100755 --- a/resources/vault/workflow-vault.sh +++ b/resources/vault/workflow-vault.sh @@ -59,10 +59,10 @@ vault write auth/app-id/map/app-id/opex-wallet value=backend-policy display_name vault write auth/app-id/map/app-id/opex-websocket value=backend-policy display_name=opex-websocket vault write auth/app-id/map/app-id/opex-payment value=backend-policy display_name=opex-payment vault write auth/app-id/map/app-id/opex-admin value=backend-policy display_name=opex-admin -vault write auth/app-id/map/app-id/opex-chain-scan-gateway value=backend-policy display_name=opex-chain-scan-gateway +vault write auth/app-id/map/app-id/chain-scan-gateway value=backend-policy display_name=chain-scan-gateway vault write auth/app-id/map/app-id/opex-referral value=backend-policy display_name=opex-referral echo 'enable user-id' -vault write auth/app-id/map/user-id/${BACKEND_USER} value=opex-wallet,opex-websocket,opex-eventlog,opex-auth,opex-accountant,opex-api,opex-bc-gateway,opex-payment,opex-admin,opex-chain-scan-gateway,opex-referral +vault write auth/app-id/map/user-id/${BACKEND_USER} value=opex-wallet,opex-websocket,opex-eventlog,opex-auth,opex-accountant,opex-api,opex-bc-gateway,opex-payment,opex-admin,chain-scan-gateway,opex-referral echo 'check login appid' vault write auth/app-id/login/opex-accountant user_id=${BACKEND_USER} vault write auth/app-id/login/opex-api user_id=${BACKEND_USER} @@ -73,7 +73,7 @@ vault write auth/app-id/login/opex-wallet user_id=${BACKEND_USER} vault write auth/app-id/login/opex-websocket user_id=${BACKEND_USER} vault write auth/app-id/login/opex-payment user_id=${BACKEND_USER} vault write auth/app-id/login/opex-admin user_id=${BACKEND_USER} -vault write auth/app-id/login/opex-chain-scan-gateway user_id=${BACKEND_USER} +vault write auth/app-id/login/chain-scan-gateway user_id=${BACKEND_USER} vault write auth/app-id/login/opex-referral user_id=${BACKEND_USER} # @@ -89,7 +89,7 @@ vault kv put secret/opex-wallet dbusername=${DB_USER} dbpassword=${DB_PASS} db_b vault kv put secret/opex-websocket dbusername=${DB_USER} dbpassword=${DB_PASS} db_backup_username=${DB_BACKUP_USERNAME} db_backup_pass=${DB_BACKUP_PASS} vault kv put secret/opex-payment dbusername=${DB_USER} dbpassword=${DB_PASS} db_backup_username=${DB_BACKUP_USERNAME} db_backup_pass=${DB_BACKUP_PASS} vandar_api_key=${VANDAR_API_KEY} vault kv put secret/opex-admin keycloak_client_secret=${KEYCLOAK_CLIENT_SECRET} -vault kv put secret/opex-chain-scan-gateway dbusername=${DB_USER} dbpassword=${DB_PASS} +vault kv put secret/chain-scan-gateway dbusername=${DB_USER} dbpassword=${DB_PASS} vault kv put secret/opex-referral dbusername=${DB_USER} dbpassword=${DB_PASS} db_backup_username=${DB_BACKUP_USERNAME} db_backup_pass=${DB_BACKUP_PASS} # Keep alive From 3ffc103f5ee449bba7180fc9d4cb9d4cdb9c3843 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 27 Feb 2022 19:13:45 +0330 Subject: [PATCH 129/169] referral: Enable allow-circular-references --- referral/referral-app/src/main/resources/application.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/referral/referral-app/src/main/resources/application.yml b/referral/referral-app/src/main/resources/application.yml index 54a6fa8d9..b65b36e54 100644 --- a/referral/referral-app/src/main/resources/application.yml +++ b/referral/referral-app/src/main/resources/application.yml @@ -8,6 +8,7 @@ spring: name: opex-referral main: allow-bean-definition-overriding: false + allow-circular-references: true kafka: bootstrap-servers: ${KAFKA_IP_PORT:localhost:9092} consumer: From 768f24e74b6fd02a599f0154466e042fb6babdf1 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 27 Feb 2022 19:53:17 +0330 Subject: [PATCH 130/169] bc-gateway: Add bsc to chains --- .../src/main/resources/data.sql | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/bc-gateway/bc-gateway-ports/bc-gateway-persister-postgres/src/main/resources/data.sql b/bc-gateway/bc-gateway-ports/bc-gateway-persister-postgres/src/main/resources/data.sql index c3d81febd..a68de402e 100644 --- a/bc-gateway/bc-gateway-ports/bc-gateway-persister-postgres/src/main/resources/data.sql +++ b/bc-gateway/bc-gateway-ports/bc-gateway-persister-postgres/src/main/resources/data.sql @@ -19,7 +19,8 @@ SELECT setval(pg_get_serial_sequence('address_types', 'id'), (SELECT MAX(id) FRO INSERT INTO chain_address_types(chain_name, addr_type_id) VALUES ('bitcoin', 1), - ('ethereum', 2) + ('ethereum', 2), + ('bsc', 2) ON CONFLICT DO NOTHING; INSERT INTO currency_implementations(id, @@ -41,12 +42,14 @@ SELECT setval(pg_get_serial_sequence('currency_implementations', 'id'), (SELECT INSERT INTO chain_endpoints(id, chain_name, endpoint_url) VALUES (1, 'bitcoin', 'lb://chain-scan-gateway/bitcoin/transfers'), - (2, 'ethereum', 'lb://chain-scan-gateway/eth/transfers') + (2, 'ethereum', 'lb://chain-scan-gateway/eth/transfers'), + (2, 'bsc', 'lb://chain-scan-gateway/bsc/transfers') ON CONFLICT DO NOTHING; INSERT INTO chain_sync_schedules VALUES ('bitcoin', CURRENT_DATE, 600, 60), - ('ethereum', CURRENT_DATE, 90, 60) + ('ethereum', CURRENT_DATE, 90, 60), + ('bsc', CURRENT_DATE, 90, 60) ON CONFLICT DO NOTHING; INSERT INTO wallet_sync_schedules From 4831a9da347bca356a1ce0c98d7738cd52c4a13b Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 27 Feb 2022 20:12:37 +0330 Subject: [PATCH 131/169] docker-compose: Add missing auth in depends_on fields --- docker-compose.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 8231c94f1..fa066d4d2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -314,6 +314,7 @@ services: - kafka-1 - kafka-2 - kafka-3 + - auth - consul - matching-engine auth: @@ -357,6 +358,7 @@ services: - kafka-1 - kafka-2 - kafka-3 + - auth - consul - vault - postgres-wallet @@ -407,6 +409,7 @@ services: - kafka-1 - kafka-2 - kafka-3 + - auth - consul - vault - postgres-api @@ -430,6 +433,7 @@ services: - kafka-1 - kafka-2 - kafka-3 + - auth - wallet - consul - vault @@ -449,6 +453,7 @@ services: volumes: - $DATA/storage-data:/storage depends_on: + - auth - consul networks: - default @@ -493,6 +498,7 @@ services: - kafka-2 - kafka-3 - consul + - auth - vault networks: - default From a8152fe77fb96bb7f6651112decbbf7f0b1c6027 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 27 Feb 2022 20:54:59 +0330 Subject: [PATCH 132/169] bc-gateway: Fix chain_endpoints schema --- .../bc-gateway-persister-postgres/src/main/resources/data.sql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bc-gateway/bc-gateway-ports/bc-gateway-persister-postgres/src/main/resources/data.sql b/bc-gateway/bc-gateway-ports/bc-gateway-persister-postgres/src/main/resources/data.sql index a68de402e..d28213b91 100644 --- a/bc-gateway/bc-gateway-ports/bc-gateway-persister-postgres/src/main/resources/data.sql +++ b/bc-gateway/bc-gateway-ports/bc-gateway-persister-postgres/src/main/resources/data.sql @@ -43,9 +43,11 @@ SELECT setval(pg_get_serial_sequence('currency_implementations', 'id'), (SELECT INSERT INTO chain_endpoints(id, chain_name, endpoint_url) VALUES (1, 'bitcoin', 'lb://chain-scan-gateway/bitcoin/transfers'), (2, 'ethereum', 'lb://chain-scan-gateway/eth/transfers'), - (2, 'bsc', 'lb://chain-scan-gateway/bsc/transfers') + (3, 'bsc', 'lb://chain-scan-gateway/bsc/transfers') ON CONFLICT DO NOTHING; +SELECT setval(pg_get_serial_sequence('chain_endpoints', 'id'), (SELECT MAX(id) FROM chain_endpoints)); + INSERT INTO chain_sync_schedules VALUES ('bitcoin', CURRENT_DATE, 600, 60), ('ethereum', CURRENT_DATE, 90, 60), From 06cfd207b4325a5a494e248539c645e3e68e6dde Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 27 Feb 2022 22:38:45 +0330 Subject: [PATCH 133/169] bc-gateway: Fix web client --- .../co/nilin/opex/bcgateway/app/config/WebClientConfig.kt | 3 --- .../bcgateway/ports/postgres/impl/ChainEndpointHandlerImpl.kt | 3 ++- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/config/WebClientConfig.kt b/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/config/WebClientConfig.kt index 70e11ad58..0efc5a1e6 100644 --- a/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/config/WebClientConfig.kt +++ b/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/config/WebClientConfig.kt @@ -12,7 +12,6 @@ import org.springframework.web.reactive.function.client.WebClient @Configuration class WebClientConfig { - @Bean @Qualifier("loadBalanced") fun loadBalancedWebClient(loadBalancerFactory: ReactiveLoadBalancer.Factory): WebClient { @@ -26,7 +25,6 @@ class WebClientConfig { } @Bean - fun webClient(): WebClient { return WebClient.builder() .exchangeStrategies( @@ -36,5 +34,4 @@ class WebClientConfig { ) .build() } - } diff --git a/bc-gateway/bc-gateway-ports/bc-gateway-persister-postgres/src/main/kotlin/co/nilin/opex/bcgateway/ports/postgres/impl/ChainEndpointHandlerImpl.kt b/bc-gateway/bc-gateway-ports/bc-gateway-persister-postgres/src/main/kotlin/co/nilin/opex/bcgateway/ports/postgres/impl/ChainEndpointHandlerImpl.kt index 59c3643d0..4bb18cbc5 100644 --- a/bc-gateway/bc-gateway-ports/bc-gateway-persister-postgres/src/main/kotlin/co/nilin/opex/bcgateway/ports/postgres/impl/ChainEndpointHandlerImpl.kt +++ b/bc-gateway/bc-gateway-ports/bc-gateway-persister-postgres/src/main/kotlin/co/nilin/opex/bcgateway/ports/postgres/impl/ChainEndpointHandlerImpl.kt @@ -10,12 +10,13 @@ import co.nilin.opex.bcgateway.ports.postgres.model.ChainEndpointModel import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.toList import kotlinx.coroutines.reactive.awaitFirstOrNull +import org.springframework.beans.factory.annotation.Qualifier import org.springframework.stereotype.Component import org.springframework.web.reactive.function.client.WebClient @Component class ChainEndpointHandlerImpl( - private val webClient: WebClient, + @Qualifier("loadBalanced") private val webClient: WebClient, private val chainRepository: ChainRepository, private val endpointRepository: ChainEndpointRepository ) : ChainEndpointHandler { From c98c5b6ea65841bc93e057f6bc314bc53516fdf4 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 27 Feb 2022 22:52:12 +0330 Subject: [PATCH 134/169] bc-gateway: Fix security configs --- .../co/nilin/opex/bcgateway/app/config/SecurityConfig.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/config/SecurityConfig.kt b/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/config/SecurityConfig.kt index ccd180c93..6783a6078 100644 --- a/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/config/SecurityConfig.kt +++ b/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/config/SecurityConfig.kt @@ -21,6 +21,10 @@ class SecurityConfig(@Qualifier("loadBalanced") private val webClient: WebClient fun springSecurityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain? { http.csrf().disable() .authorizeExchange() + .pathMatchers("/hello").permitAll() + .pathMatchers("/actuator/**").permitAll() + .pathMatchers("/swagger-ui/**").permitAll() + .pathMatchers("/swagger-resources/**").permitAll() .pathMatchers("/filter/**").hasAuthority("SCOPE_trust") .pathMatchers("/admin/**").hasRole("SCOPE_trust", "system-admin") .pathMatchers("/address/**").permitAll() From 4553b1f0710a6a6dae41f9efe80abbfa17948461 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 27 Feb 2022 23:29:50 +0330 Subject: [PATCH 135/169] referral: Add postgres version fix --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index fa066d4d2..2fd79dd58 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -234,7 +234,7 @@ services: restart_policy: condition: on-failure postgres-referral: - image: "postgres" + image: postgres:14-alpine environment: - POSTGRES_USER=${DB_USER:-opex} - POSTGRES_PASSWORD=${DB_PASS:-hiopex} From 5728b13de3037ab9354cdddf2ce063abc91616d4 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Sun, 27 Feb 2022 23:48:05 +0330 Subject: [PATCH 136/169] referral: Enable security config --- .../opex/referral/app/config/SecurityConfig.kt | 12 +++--------- .../nilin/opex/referral/app/utils/Extensions.kt | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 9 deletions(-) create mode 100644 referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/utils/Extensions.kt diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt index 54a9e545d..61b5c68d4 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt @@ -1,5 +1,6 @@ package co.nilin.opex.referral.app.config +import co.nilin.opex.referral.app.utils.hasRole import org.springframework.beans.factory.annotation.Value import org.springframework.context.annotation.Bean import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity @@ -18,15 +19,8 @@ class SecurityConfig(private val webClient: WebClient) { fun springSecurityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain? { http.csrf().disable() .authorizeExchange() -// .pathMatchers("/codes", "/checkouts", "/commissions/**").access { mono, _ -> -// mono.map { auth -> -// auth.authorities.any { authority -> authority.authority == "SCOPE_trust" } && ((auth.principal as Jwt).claims["groups"] as JSONArray) -// .contains("finance-admin") -// }.map { granted -> -// AuthorizationDecision(granted) -// } -// } -// .pathMatchers("/**").hasAuthority("SCOPE_trust") + .pathMatchers("/codes", "/checkouts", "/commissions/**").hasRole("SCOPE_trust", "finance-admin") + .pathMatchers("/**").hasAuthority("SCOPE_trust") .pathMatchers("/**").permitAll() .anyExchange().authenticated() .and() diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/utils/Extensions.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/utils/Extensions.kt new file mode 100644 index 000000000..45bdb566e --- /dev/null +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/utils/Extensions.kt @@ -0,0 +1,17 @@ +package co.nilin.opex.referral.app.utils + +import com.nimbusds.jose.shaded.json.JSONArray +import org.springframework.security.authorization.AuthorizationDecision +import org.springframework.security.config.web.server.ServerHttpSecurity +import org.springframework.security.oauth2.jwt.Jwt + +fun ServerHttpSecurity.AuthorizeExchangeSpec.Access.hasRole( + authority: String, + role: String +): ServerHttpSecurity.AuthorizeExchangeSpec = access { mono, _ -> + mono.map { auth -> + val hasAuthority = auth.authorities.any { it.authority == authority } + val hasRole = ((auth.principal as Jwt).claims["roles"] as JSONArray?)?.contains(role) == true + AuthorizationDecision(hasAuthority && hasRole) + } +} From 58327fbebc975bf64c7e1f0202912e165587e40e Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 28 Feb 2022 12:00:24 +0330 Subject: [PATCH 137/169] referral: Disable authorization for public routes --- .../co/nilin/opex/referral/app/config/SecurityConfig.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt index 61b5c68d4..5d84d670f 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt @@ -19,9 +19,12 @@ class SecurityConfig(private val webClient: WebClient) { fun springSecurityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain? { http.csrf().disable() .authorizeExchange() + .pathMatchers("/hello").permitAll() + .pathMatchers("/actuator/**").permitAll() + .pathMatchers("/swagger-ui/**").permitAll() + .pathMatchers("/swagger-resources/**").permitAll() .pathMatchers("/codes", "/checkouts", "/commissions/**").hasRole("SCOPE_trust", "finance-admin") .pathMatchers("/**").hasAuthority("SCOPE_trust") - .pathMatchers("/**").permitAll() .anyExchange().authenticated() .and() .oauth2ResourceServer() From 2e5ec663ade43f32ac53e7214612761a97b9fc15 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 28 Feb 2022 14:39:04 +0330 Subject: [PATCH 138/169] referral: Fix authorization in security config --- .../co/nilin/opex/referral/app/config/SecurityConfig.kt | 4 +++- .../co/nilin/opex/referral/app/controller/ReportController.kt | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt index 5d84d670f..5eaa938ad 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt @@ -3,6 +3,7 @@ package co.nilin.opex.referral.app.config import co.nilin.opex.referral.app.utils.hasRole import org.springframework.beans.factory.annotation.Value import org.springframework.context.annotation.Bean +import org.springframework.http.HttpMethod import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity import org.springframework.security.config.web.server.ServerHttpSecurity import org.springframework.security.oauth2.jwt.NimbusReactiveJwtDecoder @@ -23,7 +24,8 @@ class SecurityConfig(private val webClient: WebClient) { .pathMatchers("/actuator/**").permitAll() .pathMatchers("/swagger-ui/**").permitAll() .pathMatchers("/swagger-resources/**").permitAll() - .pathMatchers("/codes", "/checkouts", "/commissions/**").hasRole("SCOPE_trust", "finance-admin") + .pathMatchers(HttpMethod.GET, "/codes").hasRole("SCOPE_trust", "finance-admin") + .pathMatchers("/checkouts/**", "/commissions/**").hasRole("SCOPE_trust", "finance-admin") .pathMatchers("/**").hasAuthority("SCOPE_trust") .anyExchange().authenticated() .and() diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt index 1ae640ac4..f5f8a7322 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt @@ -42,7 +42,7 @@ class ReportController( } @GetMapping("/reports/users/{rewardedUuid}") - suspend fun getReportByReferrerUuid( + suspend fun getReportByRewardedUuid( @PathVariable rewardedUuid: String, @CurrentSecurityContext securityContext: SecurityContext ): ReferrerReportBody { From 9ae8e7f5667de308fcf39f53d84741d56eebbe63 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 28 Feb 2022 15:42:30 +0330 Subject: [PATCH 139/169] referral: Remove `No referral entity found` exception in calculate() --- .../referral/core/service/CommissionRewardCalculatorImpl.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt index 70f63e501..dfbe64fae 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt @@ -18,7 +18,7 @@ class CommissionRewardCalculatorImpl( if (ouid != richTrade.makerOuid && ouid != richTrade.takerOuid) throw IllegalArgumentException("Order is not correct") val uuid = if (ouid == richTrade.makerOuid) richTrade.makerUuid else richTrade.takerUuid val reference = referenceHandler.findByReferentUuid(uuid) - ?: throw IllegalArgumentException("No referral entity found for uuid ($uuid)") + ?: return emptyList() val commission = if (ouid == richTrade.makerOuid) richTrade.makerCommision * symbolPriceCalculator.getPrice(richTrade.makerCommisionAsset) else richTrade.takerCommision * symbolPriceCalculator.getPrice(richTrade.takerCommisionAsset) From b35af947ec37390d29ba2a7f74977e049e7f5f99 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 28 Feb 2022 16:03:33 +0330 Subject: [PATCH 140/169] referral: Fix id issue and increase referral code range --- .../referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt index 34715a39b..4aa950e96 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferralCodeHandlerImpl.kt @@ -22,9 +22,9 @@ class ReferralCodeHandlerImpl( ): String { if (referentCommission < BigDecimal.ZERO || referentCommission > BigDecimal.ONE) throw IllegalArgumentException("Commission value must be in range of [0, 1]") - val lastId = referralCodeRepository.findMaxId().awaitSingleOrNull()?.let { it + 1 } ?: 0 - val codeInteger = BigInteger.TEN.pow(7).toLong() + lastId - if (codeInteger >= BigInteger.TEN.pow(8).toLong()) throw Exception("No referral code available") + val lastId = referralCodeRepository.findMaxId().awaitSingleOrNull() ?: 0 + val codeInteger = BigInteger.TEN.pow(4).toLong() + lastId + if (codeInteger >= BigInteger.TEN.pow(10).toLong()) throw Exception("No referral code available") val code = codeInteger.toString() val referralCode = co.nilin.opex.referral.ports.postgres.dao.ReferralCode(null, uuid, code, referentCommission) referralCodeRepository.save(referralCode).awaitSingleOrNull() From 027f0cfb5be4cd7078d39a09ccb017e5416eb866 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 28 Feb 2022 16:36:50 +0330 Subject: [PATCH 141/169] referral: Add get my referral codes controller --- .../opex/referral/app/controller/ReferralController.kt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index cf8e421a6..b2a71f05d 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -80,6 +80,12 @@ class ReferralController( } } + @GetMapping("/me/codes") + suspend fun getMyReferralCodes(@CurrentSecurityContext securityContext: SecurityContext): List { + return referralCodeHandler.findByReferrerUuid(securityContext.authentication.name) + .map { ReferralCodeBody(it.uuid, it.code, it.referentCommission) } + } + @GetMapping("/codes/{code}") suspend fun getReferralCodeByCode( @PathVariable code: String, From f279fa73fc6cc40fed76d4d9e88f3fbec4bbbd66 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 28 Feb 2022 17:05:02 +0330 Subject: [PATCH 142/169] referral: Restrict getting references to admin only --- .../opex/referral/app/config/SecurityConfig.kt | 3 ++- .../referral/app/controller/ReferralController.kt | 13 +++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt index 5eaa938ad..85e0b6ef5 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt @@ -25,7 +25,8 @@ class SecurityConfig(private val webClient: WebClient) { .pathMatchers("/swagger-ui/**").permitAll() .pathMatchers("/swagger-resources/**").permitAll() .pathMatchers(HttpMethod.GET, "/codes").hasRole("SCOPE_trust", "finance-admin") - .pathMatchers("/checkouts/**", "/commissions/**").hasRole("SCOPE_trust", "finance-admin") + .pathMatchers("/checkouts/**", "/commissions/**", "/codes/*/references") + .hasRole("SCOPE_trust", "finance-admin") .pathMatchers("/**").hasAuthority("SCOPE_trust") .anyExchange().authenticated() .and() diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index b2a71f05d..bce00c9f3 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -71,12 +71,11 @@ class ReferralController( @CurrentSecurityContext securityContext: SecurityContext ) { if (uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) - try { - referralCodeHandler.assign(code, uuid) - } catch (e: IllegalArgumentException) { - throw OpexException(OpexError.BadRequest, e.message) - } catch (e: Exception) { - throw OpexException(OpexError.InternalServerError, e.message) + referralCodeHandler.runCatching { assign(code, uuid) }.onFailure { e -> + when (e) { + is IllegalArgumentException -> throw OpexException(OpexError.BadRequest, e.message) + else -> throw OpexException(OpexError.InternalServerError, e.message) + } } } @@ -101,8 +100,6 @@ class ReferralController( @PathVariable code: String, @CurrentSecurityContext securityContext: SecurityContext ): List { - val referralCode = referralCodeHandler.findByCode(code) ?: throw OpexException(OpexError.NotFound) - if (referralCode.uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) return referenceHandler.findByCode(code).map { it.referentUuid } } From b0fae96671c24387472d368a30437350e03075dc Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 28 Feb 2022 18:49:27 +0330 Subject: [PATCH 143/169] referral: Replace accountant proxy with api proxy This creates cyclic dependency. We should fix this after refactoring api service. --- .../referral-app/src/main/resources/application.yml | 4 ++-- .../core/spi/{AccountantProxy.kt => ApiProxy.kt} | 2 +- .../accountant/proxy/impl/SymbolPriceCalculatorImpl.kt | 6 +++--- .../proxy/{AccountantProxyImpl.kt => ApiProxyImpl.kt} | 10 +++++----- 4 files changed, 11 insertions(+), 11 deletions(-) rename referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/{AccountantProxy.kt => ApiProxy.kt} (82%) rename referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/proxy/{AccountantProxyImpl.kt => ApiProxyImpl.kt} (79%) diff --git a/referral/referral-app/src/main/resources/application.yml b/referral/referral-app/src/main/resources/application.yml index b65b36e54..6c032f3d3 100644 --- a/referral/referral-app/src/main/resources/application.yml +++ b/referral/referral-app/src/main/resources/application.yml @@ -47,7 +47,7 @@ spring: app: wallet: url: lb://opex-wallet/ - accountant: - url: lb://opex-accountant/ + api: + url: lb://opex-api/ auth: cert-url: lb://opex-auth/auth/realms/opex/protocol/openid-connect/certs diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/AccountantProxy.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ApiProxy.kt similarity index 82% rename from referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/AccountantProxy.kt rename to referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ApiProxy.kt index cf5746aeb..cb0483fca 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/AccountantProxy.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/spi/ApiProxy.kt @@ -2,6 +2,6 @@ package co.nilin.opex.referral.core.spi import java.math.BigDecimal -interface AccountantProxy { +interface ApiProxy { suspend fun fetchLastPrice(pairSymbol: String): BigDecimal? } diff --git a/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculatorImpl.kt b/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculatorImpl.kt index 151edd684..5a11d17eb 100644 --- a/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculatorImpl.kt +++ b/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculatorImpl.kt @@ -1,20 +1,20 @@ package co.nilin.opex.referral.ports.accountant.proxy.impl import co.nilin.opex.referral.core.api.SymbolPriceCalculator -import co.nilin.opex.referral.core.spi.AccountantProxy +import co.nilin.opex.referral.core.spi.ApiProxy import co.nilin.opex.referral.core.spi.ConfigHandler import org.springframework.stereotype.Service import java.math.BigDecimal @Service class SymbolPriceCalculatorImpl( - private val accountantProxy: AccountantProxy, + private val apiProxy: ApiProxy, private val configHandler: ConfigHandler ) : SymbolPriceCalculator { override suspend fun getPrice(symbol: String): BigDecimal { val out = configHandler.findConfig("default")!!.paymentCurrency - return accountantProxy.fetchLastPrice("$symbol$out") ?: accountantProxy.fetchLastPrice("$out$symbol") + return apiProxy.fetchLastPrice("$symbol$out") ?: apiProxy.fetchLastPrice("$out$symbol") ?.takeIf { it > BigDecimal.ZERO } ?.let { BigDecimal.ONE / it } ?: BigDecimal.ZERO } diff --git a/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/proxy/AccountantProxyImpl.kt b/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/proxy/ApiProxyImpl.kt similarity index 79% rename from referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/proxy/AccountantProxyImpl.kt rename to referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/proxy/ApiProxyImpl.kt index 40f77cb72..590844217 100644 --- a/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/proxy/AccountantProxyImpl.kt +++ b/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/proxy/ApiProxyImpl.kt @@ -1,6 +1,6 @@ package co.nilin.opex.referral.ports.accountant.proxy.proxy -import co.nilin.opex.referral.core.spi.AccountantProxy +import co.nilin.opex.referral.core.spi.ApiProxy import kotlinx.coroutines.reactive.awaitFirst import org.springframework.beans.factory.annotation.Value import org.springframework.core.ParameterizedTypeReference @@ -17,12 +17,12 @@ data class PriceTickerResponse( inline fun typeRef(): ParameterizedTypeReference = object : ParameterizedTypeReference() {} @Component -class AccountantProxyImpl( - @Value("\${app.accountant.url}") val accountantBaseUrl: String, val webClient: WebClient -) : AccountantProxy { +class ApiProxyImpl( + @Value("\${app.api.url}") val apiBaseUrl: String, val webClient: WebClient +) : ApiProxy { override suspend fun fetchLastPrice(pairSymbol: String): BigDecimal? { val list = webClient.get() - .uri(URI.create("$accountantBaseUrl/config/all")) + .uri(URI.create("$apiBaseUrl/v3/ticker/price?symbol=${pairSymbol.uppercase()}")) .header("Content-Type", "application/json") .retrieve() .onStatus({ t -> t.isError }, { it.createException() }) From e88c3b42c20bf4cce0ec32414910239bdbfd33f8 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 28 Feb 2022 19:33:22 +0330 Subject: [PATCH 144/169] referral: Fix same asset fee bug --- .../accountant/proxy/impl/SymbolPriceCalculatorImpl.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculatorImpl.kt b/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculatorImpl.kt index 5a11d17eb..7546e7b2a 100644 --- a/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculatorImpl.kt +++ b/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculatorImpl.kt @@ -10,12 +10,12 @@ import java.math.BigDecimal class SymbolPriceCalculatorImpl( private val apiProxy: ApiProxy, private val configHandler: ConfigHandler -) : - SymbolPriceCalculator { +) : SymbolPriceCalculator { override suspend fun getPrice(symbol: String): BigDecimal { val out = configHandler.findConfig("default")!!.paymentCurrency - return apiProxy.fetchLastPrice("$symbol$out") ?: apiProxy.fetchLastPrice("$out$symbol") - ?.takeIf { it > BigDecimal.ZERO } - ?.let { BigDecimal.ONE / it } ?: BigDecimal.ZERO + return if (out == symbol) BigDecimal.ONE else + apiProxy.fetchLastPrice("$symbol$out") ?: apiProxy.fetchLastPrice("$out$symbol") + ?.takeIf { it > BigDecimal.ZERO } + ?.let { BigDecimal.ONE / it } ?: BigDecimal.ZERO } } From 3178361b1b18c38a070cf82911baa40c6b94128f Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 28 Feb 2022 20:03:18 +0330 Subject: [PATCH 145/169] referral: Fix findByReferrerUuid() --- .../ports/postgres/impl/ReferenceHandlerImpl.kt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt index aa867ace5..bb0accd0f 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ReferenceHandlerImpl.kt @@ -5,8 +5,8 @@ import co.nilin.opex.referral.core.model.ReferralCode import co.nilin.opex.referral.core.spi.ReferenceHandler import co.nilin.opex.referral.ports.postgres.repository.ReferenceRepository import co.nilin.opex.referral.ports.postgres.repository.ReferralCodeRepository -import kotlinx.coroutines.reactive.awaitSingle -import kotlinx.coroutines.reactive.awaitSingleOrNull +import kotlinx.coroutines.reactor.awaitSingle +import kotlinx.coroutines.reactor.awaitSingleOrNull import org.springframework.stereotype.Service @Service @@ -33,11 +33,11 @@ class ReferenceHandlerImpl( } override suspend fun findByReferrerUuid(uuid: String): List { - val ref = referenceRepository.findByReferrerUuid(uuid).collectList().awaitSingle() - val referralCode = referralCodeRepository.findByUuid(uuid).map { - ReferralCode(it.uuid, it.code, it.referentCommission) - }.awaitSingle() - return ref.map { Reference(referralCode, it.referentUuid) } + val referralCode = referralCodeRepository.findByUuid(uuid) + .map { it.id!! to ReferralCode(it.uuid, it.code, it.referentCommission) } + .collectList().awaitSingle().toMap() + return if (referralCode.isNotEmpty()) referenceRepository.findByReferrerUuid(uuid).collectList().awaitSingle() + .map { Reference(referralCode.getValue(it.referralCodeId), it.referentUuid) } else emptyList() } override suspend fun findByCode(code: String): List { From 659677eeab2a9af71c0960ea98e214e87158ac29 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 28 Feb 2022 20:22:32 +0330 Subject: [PATCH 146/169] referral: Rename referral-accountant-proxy to referral-api-proxy --- referral/pom.xml | 6 +++--- referral/referral-app/pom.xml | 4 ++-- .../pom.xml | 6 +++--- .../ports/api}/proxy/impl/SymbolPriceCalculatorImpl.kt | 2 +- .../opex/referral/ports/api}/proxy/proxy/ApiProxyImpl.kt | 2 +- referral/referral-ports/referral-persister-postgres/pom.xml | 3 +-- 6 files changed, 11 insertions(+), 12 deletions(-) rename referral/referral-ports/{referral-accountant-proxy => referral-api-proxy}/pom.xml (92%) rename referral/referral-ports/{referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant => referral-api-proxy/src/main/kotlin/co/nilin/opex/referral/ports/api}/proxy/impl/SymbolPriceCalculatorImpl.kt (93%) rename referral/referral-ports/{referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant => referral-api-proxy/src/main/kotlin/co/nilin/opex/referral/ports/api}/proxy/proxy/ApiProxyImpl.kt (95%) diff --git a/referral/pom.xml b/referral/pom.xml index 450c662db..d010dd142 100644 --- a/referral/pom.xml +++ b/referral/pom.xml @@ -20,7 +20,7 @@ referral-ports/referral-persister-postgres referral-ports/referral-eventlistener-kafka referral-ports/referral-wallet-proxy - referral-ports/referral-accountant-proxy + referral-ports/referral-api-proxy @@ -58,8 +58,8 @@ ${project.version} - co.nilin.opex.referral.ports.accountant.proxy - referral-accountant-proxy + co.nilin.opex.referral.ports.api.proxy + referral-api-proxy ${project.version} diff --git a/referral/referral-app/pom.xml b/referral/referral-app/pom.xml index 344fddc57..fbd40a9d7 100644 --- a/referral/referral-app/pom.xml +++ b/referral/referral-app/pom.xml @@ -68,8 +68,8 @@ referral-persister-postgres - co.nilin.opex.referral.ports.accountant.proxy - referral-accountant-proxy + co.nilin.opex.referral.ports.api.proxy + referral-api-proxy co.nilin.opex.referral.ports.wallet.proxy diff --git a/referral/referral-ports/referral-accountant-proxy/pom.xml b/referral/referral-ports/referral-api-proxy/pom.xml similarity index 92% rename from referral/referral-ports/referral-accountant-proxy/pom.xml rename to referral/referral-ports/referral-api-proxy/pom.xml index 2c9a483f4..1beb0ee61 100644 --- a/referral/referral-ports/referral-accountant-proxy/pom.xml +++ b/referral/referral-ports/referral-api-proxy/pom.xml @@ -11,9 +11,9 @@ ../../pom.xml - co.nilin.opex.referral.ports.accountant.proxy - referral-accountant-proxy - referral-accountant-proxy + co.nilin.opex.referral.ports.api.proxy + referral-api-proxy + referral-api-proxy diff --git a/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculatorImpl.kt b/referral/referral-ports/referral-api-proxy/src/main/kotlin/co/nilin/opex/referral/ports/api/proxy/impl/SymbolPriceCalculatorImpl.kt similarity index 93% rename from referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculatorImpl.kt rename to referral/referral-ports/referral-api-proxy/src/main/kotlin/co/nilin/opex/referral/ports/api/proxy/impl/SymbolPriceCalculatorImpl.kt index 7546e7b2a..edf685da7 100644 --- a/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/impl/SymbolPriceCalculatorImpl.kt +++ b/referral/referral-ports/referral-api-proxy/src/main/kotlin/co/nilin/opex/referral/ports/api/proxy/impl/SymbolPriceCalculatorImpl.kt @@ -1,4 +1,4 @@ -package co.nilin.opex.referral.ports.accountant.proxy.impl +package co.nilin.opex.referral.ports.api.proxy.impl import co.nilin.opex.referral.core.api.SymbolPriceCalculator import co.nilin.opex.referral.core.spi.ApiProxy diff --git a/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/proxy/ApiProxyImpl.kt b/referral/referral-ports/referral-api-proxy/src/main/kotlin/co/nilin/opex/referral/ports/api/proxy/proxy/ApiProxyImpl.kt similarity index 95% rename from referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/proxy/ApiProxyImpl.kt rename to referral/referral-ports/referral-api-proxy/src/main/kotlin/co/nilin/opex/referral/ports/api/proxy/proxy/ApiProxyImpl.kt index 590844217..78906dfc2 100644 --- a/referral/referral-ports/referral-accountant-proxy/src/main/kotlin/co/nilin/opex/referral/ports/accountant/proxy/proxy/ApiProxyImpl.kt +++ b/referral/referral-ports/referral-api-proxy/src/main/kotlin/co/nilin/opex/referral/ports/api/proxy/proxy/ApiProxyImpl.kt @@ -1,4 +1,4 @@ -package co.nilin.opex.referral.ports.accountant.proxy.proxy +package co.nilin.opex.referral.ports.api.proxy.proxy import co.nilin.opex.referral.core.spi.ApiProxy import kotlinx.coroutines.reactive.awaitFirst diff --git a/referral/referral-ports/referral-persister-postgres/pom.xml b/referral/referral-ports/referral-persister-postgres/pom.xml index a962e0546..b84759bc9 100644 --- a/referral/referral-ports/referral-persister-postgres/pom.xml +++ b/referral/referral-ports/referral-persister-postgres/pom.xml @@ -15,7 +15,6 @@ referral-persister-postgres referral-persister-postgres - org.jetbrains.kotlin @@ -48,4 +47,4 @@ referral-core - \ No newline at end of file + From b95efa127fe390ff18f8643fdde07aa3aa32e515 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 28 Feb 2022 20:44:36 +0330 Subject: [PATCH 147/169] referral: Add maximum referral code limit --- .../app/controller/ReferralController.kt | 43 ++++++++++--------- .../nilin/opex/referral/core/model/Config.kt | 3 +- .../referral/ports/postgres/dao/Config.kt | 3 +- .../ports/postgres/impl/ConfigHandlerImpl.kt | 7 +-- .../src/main/resources/data.sql | 4 +- .../src/main/resources/schema.sql | 3 +- 6 files changed, 35 insertions(+), 28 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index bce00c9f3..c789a187b 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -1,5 +1,6 @@ package co.nilin.opex.referral.app.controller +import co.nilin.opex.referral.core.spi.ConfigHandler import co.nilin.opex.referral.core.spi.ReferenceHandler import co.nilin.opex.referral.core.spi.ReferralCodeHandler import co.nilin.opex.utility.error.data.OpexError @@ -12,7 +13,8 @@ import java.math.BigDecimal @RestController class ReferralController( private val referralCodeHandler: ReferralCodeHandler, - private val referenceHandler: ReferenceHandler + private val referenceHandler: ReferenceHandler, + private val configHandler: ConfigHandler ) { data class PostReferralBody( val uuid: String, @@ -29,19 +31,30 @@ class ReferralController( val referentCommission: BigDecimal ) + private val badRequestOrThrow: (Throwable) -> Unit = { e -> + when (e) { + is IllegalArgumentException -> throw OpexException(OpexError.BadRequest, e.message) + is OpexException -> throw e + else -> throw OpexException(OpexError.InternalServerError, e.message) + } + } + @PostMapping("/codes") suspend fun generateReferralCode( @RequestBody body: PostReferralBody, @CurrentSecurityContext securityContext: SecurityContext ): String { if (body.uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) - try { - return referralCodeHandler.generateReferralCode(body.uuid, body.referentCommission) - } catch (e: IllegalArgumentException) { - throw OpexException(OpexError.BadRequest, e.message) - } catch (e: Exception) { - throw OpexException(OpexError.InternalServerError, e.message) + return referralCodeHandler.runCatching { + val maxReferralCodePerUser = configHandler.findConfig("default")!!.maxReferralCodePerUser + val count = referralCodeHandler.findByReferrerUuid(body.uuid).size + if (count > maxReferralCodePerUser) throw OpexException( + OpexError.Forbidden, + "You have reached maximum number of referral codes" + ) + generateReferralCode(body.uuid, body.referentCommission) } + .onFailure(badRequestOrThrow).getOrThrow() } @PatchMapping("/codes/{code}") @@ -55,13 +68,8 @@ class ReferralController( "Referral code is invalid" ) if (referralCode.uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) - try { - referralCodeHandler.updateCommissions(code, body.referentCommission) - } catch (e: IllegalArgumentException) { - throw OpexException(OpexError.BadRequest, e.message) - } catch (e: Exception) { - throw OpexException(OpexError.InternalServerError, e.message) - } + referralCodeHandler.runCatching { updateCommissions(code, body.referentCommission) } + .onFailure(badRequestOrThrow) } @PutMapping("/codes/{code}/assign") @@ -71,12 +79,7 @@ class ReferralController( @CurrentSecurityContext securityContext: SecurityContext ) { if (uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) - referralCodeHandler.runCatching { assign(code, uuid) }.onFailure { e -> - when (e) { - is IllegalArgumentException -> throw OpexException(OpexError.BadRequest, e.message) - else -> throw OpexException(OpexError.InternalServerError, e.message) - } - } + referralCodeHandler.runCatching { assign(code, uuid) }.onFailure(badRequestOrThrow) } @GetMapping("/me/codes") diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt index dde0cab9d..8ed15e4a3 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/Config.kt @@ -7,5 +7,6 @@ data class Config( var referralCommissionReward: BigDecimal, var paymentCurrency: String, var minPaymentAmount: BigDecimal, - var paymentWindowSeconds: Int + var paymentWindowSeconds: Int, + var maxReferralCodePerUser: Int ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt index a35313139..4829f674b 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/Config.kt @@ -10,5 +10,6 @@ data class Config( var referralCommissionReward: BigDecimal, var paymentCurrency: String, var minPaymentAmount: BigDecimal, - var paymentWindowSeconds: Int + var paymentWindowSeconds: Int, + var maxReferralCodePerUser: Int ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt index a35472cdb..9c933fe9f 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/ConfigHandlerImpl.kt @@ -3,7 +3,7 @@ package co.nilin.opex.referral.ports.postgres.impl import co.nilin.opex.referral.core.model.Config import co.nilin.opex.referral.core.spi.ConfigHandler import co.nilin.opex.referral.ports.postgres.repository.ConfigRepository -import kotlinx.coroutines.reactive.awaitSingleOrNull +import kotlinx.coroutines.reactor.awaitSingleOrNull import org.springframework.stereotype.Service @Service @@ -16,9 +16,10 @@ class ConfigHandlerImpl(private val configRepository: ConfigRepository) : Config it.referralCommissionReward, it.paymentCurrency, it.minPaymentAmount, - it.paymentWindowSeconds + it.paymentWindowSeconds, + it.maxReferralCodePerUser ) } .awaitSingleOrNull() } -} \ No newline at end of file +} diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql index 52bcf6f3f..f11e61c8b 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/data.sql @@ -1,3 +1,3 @@ -INSERT INTO configs(name, referral_commission_reward, payment_currency, min_payment_amount, payment_window_seconds) VALUES ('default', 0.3, 'usdt', 0, 604800) ON CONFLICT DO NOTHING; +INSERT INTO configs(name, referral_commission_reward, payment_currency, min_payment_amount, payment_window_seconds, max_referral_code_per_user) VALUES ('default', 0.3, 'usdt', 0, 604800, 20) ON CONFLICT DO NOTHING; -INSERT INTO checkout_states(state) VALUES ('PENDING'), ('CHECKED_OUT') ON CONFLICT DO NOTHING; \ No newline at end of file +INSERT INTO checkout_states(state) VALUES ('PENDING'), ('CHECKED_OUT') ON CONFLICT DO NOTHING; diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index 559fbea4d..d5180f38f 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -3,7 +3,8 @@ CREATE TABLE IF NOT EXISTS configs ( referral_commission_reward DECIMAL NOT NULL, payment_currency VARCHAR(20) NOT NULL, min_payment_amount DECIMAL NOT NULL, - payment_window_seconds INTEGER NOT NULL + payment_window_seconds INTEGER NOT NULL, + max_referral_code_per_user INTEGER NOT NULL ); CREATE TABLE IF NOT EXISTS referral_codes ( From 89f854ca165668e48b970a2cd66216f0c8ebc2d1 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Mon, 28 Feb 2022 21:23:27 +0330 Subject: [PATCH 148/169] referral: Fix maximum referral code limit condition --- .../co/nilin/opex/referral/app/controller/ReferralController.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index c789a187b..c13d747a0 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -48,7 +48,7 @@ class ReferralController( return referralCodeHandler.runCatching { val maxReferralCodePerUser = configHandler.findConfig("default")!!.maxReferralCodePerUser val count = referralCodeHandler.findByReferrerUuid(body.uuid).size - if (count > maxReferralCodePerUser) throw OpexException( + if (count >= maxReferralCodePerUser) throw OpexException( OpexError.Forbidden, "You have reached maximum number of referral codes" ) From 4b8c026076588b3c67f1a34448e7c7683da254d0 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 2 Mar 2022 10:50:57 +0330 Subject: [PATCH 149/169] referral: Add swagger --- .../src/main/resources/application.yml | 1 - referral/referral-app/pom.xml | 5 + .../referral/app/config/SecurityConfig.kt | 1 + .../opex/referral/app/config/SwaggerConfig.kt | 97 +++++++++++++++++++ .../src/main/resources/application.yml | 1 + .../referral-wallet-proxy/pom.xml | 8 -- 6 files changed, 104 insertions(+), 9 deletions(-) create mode 100644 referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt diff --git a/bc-gateway/bc-gateway-app/src/main/resources/application.yml b/bc-gateway/bc-gateway-app/src/main/resources/application.yml index 94738b868..b442ffc7d 100644 --- a/bc-gateway/bc-gateway-app/src/main/resources/application.yml +++ b/bc-gateway/bc-gateway-app/src/main/resources/application.yml @@ -44,7 +44,6 @@ logging: level: org.apache.kafka: ERROR co.nilin: DEBUG - swagger.authUrl: https://api.opex.dev app: auth: diff --git a/referral/referral-app/pom.xml b/referral/referral-app/pom.xml index fbd40a9d7..413dd75b6 100644 --- a/referral/referral-app/pom.xml +++ b/referral/referral-app/pom.xml @@ -91,6 +91,11 @@ org.springframework.cloud spring-cloud-starter-vault-config + + io.springfox + springfox-boot-starter + 3.0.0 + diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt index 85e0b6ef5..d13aed534 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt @@ -24,6 +24,7 @@ class SecurityConfig(private val webClient: WebClient) { .pathMatchers("/actuator/**").permitAll() .pathMatchers("/swagger-ui/**").permitAll() .pathMatchers("/swagger-resources/**").permitAll() + .pathMatchers("/v2/api-docs").permitAll() .pathMatchers(HttpMethod.GET, "/codes").hasRole("SCOPE_trust", "finance-admin") .pathMatchers("/checkouts/**", "/commissions/**", "/codes/*/references") .hasRole("SCOPE_trust", "finance-admin") diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt new file mode 100644 index 000000000..5646c760e --- /dev/null +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt @@ -0,0 +1,97 @@ +package co.nilin.opex.referral.app.config + +import org.springframework.beans.factory.annotation.Value +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.security.core.annotation.AuthenticationPrincipal +import springfox.documentation.builders.ApiInfoBuilder +import springfox.documentation.builders.OAuthBuilder +import springfox.documentation.builders.PathSelectors +import springfox.documentation.builders.RequestParameterBuilder +import springfox.documentation.service.* +import springfox.documentation.spi.DocumentationType +import springfox.documentation.spi.service.contexts.SecurityContext +import springfox.documentation.spring.web.plugins.Docket +import springfox.documentation.swagger.web.SecurityConfiguration +import springfox.documentation.swagger.web.SecurityConfigurationBuilder +import java.security.Principal +import java.util.* + +@Configuration +class SwaggerConfig { + @Value("\${swagger.authUrl}") + private lateinit var authUrl: String + + @Bean + fun opexBCGateway(): Docket { + return Docket(DocumentationType.SWAGGER_2) + .groupName("opex-referral") + .apiInfo(apiInfo()) + .select() + .paths(PathSelectors.regex("^/actuator.*").negate()) + .build() + .globalRequestParameters( + Collections.singletonList( + RequestParameterBuilder() + .name("content-type") + .description("content-type") + .`in`(ParameterType.HEADER) + .required(true) + .build() + ) + ) + .ignoredParameterTypes(AuthenticationPrincipal::class.java, Principal::class.java) + .useDefaultResponseMessages(false) + .securitySchemes(Collections.singletonList(oauth())) + .securityContexts(Collections.singletonList(securityContext())) + } + + private fun apiInfo(): ApiInfo { + return ApiInfoBuilder() + .title("OPEX API") + .description("Backend for opex exchange.") + .license("MIT License") + .licenseUrl("https://github.com/opexdev/Back-end/blob/feature/1-MVP/LICENSE") + .version("0.1") + .build() + } + + private fun oauth(): SecurityScheme { + return OAuthBuilder() + .name("opex") + .grantTypes(grantTypes()) + .scopes(scopes()) + .build() + } + + private fun scopes(): List { + return listOf(AuthorizationScope("openid", "OpenId")) + } + + private fun grantTypes(): List { + val tokenUrl = "$authUrl/auth/realms/opex/protocol/openid-connect/token" + val grantType = ResourceOwnerPasswordCredentialsGrant(tokenUrl) + return Collections.singletonList(grantType) + } + + private fun securityContext(): SecurityContext { + val securityReference = SecurityReference.builder() + .reference("opex") + .scopes(emptyArray()) + .build() + return SecurityContext.builder() + .securityReferences(Collections.singletonList(securityReference)) + .operationSelector { true } + .build() + } + + @Bean + fun securityInfo(): SecurityConfiguration { + return SecurityConfigurationBuilder.builder() + .clientId("admin-cli") + .realm("opex") + .appName("opex") + .scopeSeparator(",") + .build() + } +} diff --git a/referral/referral-app/src/main/resources/application.yml b/referral/referral-app/src/main/resources/application.yml index 6c032f3d3..6cb0ede16 100644 --- a/referral/referral-app/src/main/resources/application.yml +++ b/referral/referral-app/src/main/resources/application.yml @@ -44,6 +44,7 @@ spring: prefer-ip-address: true config: import: vault://secret/${spring.application.name} +swagger.authUrl: https://api.opex.dev app: wallet: url: lb://opex-wallet/ diff --git a/referral/referral-ports/referral-wallet-proxy/pom.xml b/referral/referral-ports/referral-wallet-proxy/pom.xml index d091424e7..854dc2e2e 100644 --- a/referral/referral-ports/referral-wallet-proxy/pom.xml +++ b/referral/referral-ports/referral-wallet-proxy/pom.xml @@ -56,14 +56,6 @@ - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - - From 000865a9da5aff6532f896c23ad07fb73f32b3d8 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 2 Mar 2022 11:14:36 +0330 Subject: [PATCH 150/169] storage: Fix swagger --- .../kotlin/co/nilin/opex/storage/app/config/SecurityConfig.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/storage/storage-app/src/main/kotlin/co/nilin/opex/storage/app/config/SecurityConfig.kt b/storage/storage-app/src/main/kotlin/co/nilin/opex/storage/app/config/SecurityConfig.kt index c5b4017c9..541dd4daf 100644 --- a/storage/storage-app/src/main/kotlin/co/nilin/opex/storage/app/config/SecurityConfig.kt +++ b/storage/storage-app/src/main/kotlin/co/nilin/opex/storage/app/config/SecurityConfig.kt @@ -24,6 +24,7 @@ class SecurityConfig(private val webClient: WebClient) { .pathMatchers("/actuator/**").permitAll() .pathMatchers("/swagger-ui/**").permitAll() .pathMatchers("/swagger-resources/**").permitAll() + .pathMatchers("/v2/api-docs").permitAll() .pathMatchers("/admin/**").hasRole("SCOPE_trust", "finance-admin") .pathMatchers("/**").hasAuthority("SCOPE_trust") .anyExchange().authenticated() From 90e4b791cddb63be429eb7f15afb1bff77ad5c81 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 2 Mar 2022 12:17:10 +0330 Subject: [PATCH 151/169] springfox: Fix configurations --- .../co/nilin/opex/referral/app/ReferralApp.kt | 4 +++- .../opex/referral/app/config/SwaggerConfig.kt | 16 +++++----------- storage/storage-app/pom.xml | 5 +++++ .../co/nilin/opex/storage/app/StorageApp.kt | 2 ++ 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/ReferralApp.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/ReferralApp.kt index 5576ab961..5668e4667 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/ReferralApp.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/ReferralApp.kt @@ -4,12 +4,14 @@ import co.nilin.opex.utility.error.EnableOpexErrorHandler import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication import org.springframework.context.annotation.ComponentScan +import springfox.documentation.swagger2.annotations.EnableSwagger2 @SpringBootApplication @ComponentScan("co.nilin.opex") @EnableOpexErrorHandler +@EnableSwagger2 class ReferralApp fun main(args: Array) { runApplication(*args) -} \ No newline at end of file +} diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt index 5646c760e..aa1f2d69e 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt @@ -4,10 +4,10 @@ import org.springframework.beans.factory.annotation.Value import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.security.core.annotation.AuthenticationPrincipal +import org.springframework.security.core.annotation.CurrentSecurityContext import springfox.documentation.builders.ApiInfoBuilder import springfox.documentation.builders.OAuthBuilder import springfox.documentation.builders.PathSelectors -import springfox.documentation.builders.RequestParameterBuilder import springfox.documentation.service.* import springfox.documentation.spi.DocumentationType import springfox.documentation.spi.service.contexts.SecurityContext @@ -30,17 +30,11 @@ class SwaggerConfig { .select() .paths(PathSelectors.regex("^/actuator.*").negate()) .build() - .globalRequestParameters( - Collections.singletonList( - RequestParameterBuilder() - .name("content-type") - .description("content-type") - .`in`(ParameterType.HEADER) - .required(true) - .build() - ) + .ignoredParameterTypes( + AuthenticationPrincipal::class.java, + CurrentSecurityContext::class.java, + Principal::class.java ) - .ignoredParameterTypes(AuthenticationPrincipal::class.java, Principal::class.java) .useDefaultResponseMessages(false) .securitySchemes(Collections.singletonList(oauth())) .securityContexts(Collections.singletonList(securityContext())) diff --git a/storage/storage-app/pom.xml b/storage/storage-app/pom.xml index dfe70c472..82c4455d8 100644 --- a/storage/storage-app/pom.xml +++ b/storage/storage-app/pom.xml @@ -63,6 +63,11 @@ json-smart 2.4.7 + + io.springfox + springfox-boot-starter + 3.0.0 + diff --git a/storage/storage-app/src/main/kotlin/co/nilin/opex/storage/app/StorageApp.kt b/storage/storage-app/src/main/kotlin/co/nilin/opex/storage/app/StorageApp.kt index f4bf3fd65..91d7b6f21 100644 --- a/storage/storage-app/src/main/kotlin/co/nilin/opex/storage/app/StorageApp.kt +++ b/storage/storage-app/src/main/kotlin/co/nilin/opex/storage/app/StorageApp.kt @@ -4,10 +4,12 @@ import co.nilin.opex.utility.error.EnableOpexErrorHandler import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication import org.springframework.context.annotation.ComponentScan +import springfox.documentation.swagger2.annotations.EnableSwagger2 @SpringBootApplication @ComponentScan("co.nilin.opex") @EnableOpexErrorHandler +@EnableSwagger2 class StorageApp fun main(args: Array) { From 3b610ef611388f0fe22b7b12a7adfb9b0efe2cf6 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 2 Mar 2022 12:46:25 +0330 Subject: [PATCH 152/169] referral: Add api doc to referral controller --- .../app/controller/ReferralController.kt | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index c13d747a0..40c3afa53 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -5,6 +5,10 @@ import co.nilin.opex.referral.core.spi.ReferenceHandler import co.nilin.opex.referral.core.spi.ReferralCodeHandler import co.nilin.opex.utility.error.data.OpexError import co.nilin.opex.utility.error.data.OpexException +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.Example +import io.swagger.annotations.ExampleProperty import org.springframework.security.core.annotation.CurrentSecurityContext import org.springframework.security.core.context.SecurityContext import org.springframework.web.bind.annotation.* @@ -39,6 +43,17 @@ class ReferralController( } } + @ApiOperation(value = "Create new referral code", notes = "Send user information to create new referral code. referentCommission is a value in range [0, 1].") + @ApiResponse( + message = "OK", + code = 200, + examples = Example( + ExampleProperty( + value = "10000", + mediaType = "application/json" + ) + ) + ) @PostMapping("/codes") suspend fun generateReferralCode( @RequestBody body: PostReferralBody, @@ -57,6 +72,11 @@ class ReferralController( .onFailure(badRequestOrThrow).getOrThrow() } + @ApiOperation( + value = "Update referral code", + notes = "Edit referral code properties. The id code is immutable, you can not change it. referentCommission is a value in range [0, 1]." + ) + @ApiResponse(message = "OK", code = 200) @PatchMapping("/codes/{code}") suspend fun updateReferralCodeByCode( @PathVariable code: String, @@ -72,6 +92,11 @@ class ReferralController( .onFailure(badRequestOrThrow) } + @ApiOperation( + value = "Refer a user by referral code", + notes = "Referrer can not be one of your referents. Also can not refer yourself." + ) + @ApiResponse(message = "OK", code = 200) @PutMapping("/codes/{code}/assign") suspend fun assignReferrer( @PathVariable code: String, @@ -82,12 +107,34 @@ class ReferralController( referralCodeHandler.runCatching { assign(code, uuid) }.onFailure(badRequestOrThrow) } + @ApiOperation(value = "Get my referral codes", notes = "Get all of your referral codes.") + @ApiResponse( + message = "OK", + code = 200, + examples = Example( + ExampleProperty( + value = "[{ \"uuid\": \"b3e4f2bd-15c6-4912-bdef-161445a98193\", \"code\": \"10000\", \"referentCommission\": 0}]", + mediaType = "application/json" + ) + ) + ) @GetMapping("/me/codes") suspend fun getMyReferralCodes(@CurrentSecurityContext securityContext: SecurityContext): List { return referralCodeHandler.findByReferrerUuid(securityContext.authentication.name) .map { ReferralCodeBody(it.uuid, it.code, it.referentCommission) } } + @ApiOperation(value = "Get referral codes info", notes = "Get referral codes info.") + @ApiResponse( + message = "OK", + code = 200, + examples = Example( + ExampleProperty( + value = "{ \"uuid\": \"b3e4f2bd-15c6-4912-bdef-161445a98193\", \"code\": \"10000\", \"referentCommission\": 0}", + mediaType = "application/json" + ) + ) + ) @GetMapping("/codes/{code}") suspend fun getReferralCodeByCode( @PathVariable code: String, @@ -98,6 +145,17 @@ class ReferralController( return ReferralCodeBody(referralCode.uuid, referralCode.code, referralCode.referentCommission) } + @ApiOperation(value = "Get referral code's references", notes = "Get uuid of all referral code's references.") + @ApiResponse( + message = "OK", + code = 200, + examples = Example( + ExampleProperty( + value = "[\"b3e4f2bd-15c6-4912-bdef-161445a98193\"]", + mediaType = "application/json" + ) + ) + ) @GetMapping("/codes/{code}/references") suspend fun getReferenceByCode( @PathVariable code: String, @@ -106,11 +164,24 @@ class ReferralController( return referenceHandler.findByCode(code).map { it.referentUuid } } + @ApiOperation(value = "Get all referral codes", notes = "Get all of referral codes.") + @ApiResponse( + message = "OK", + code = 200, + examples = Example( + ExampleProperty( + value = "[{ \"uuid\": \"b3e4f2bd-15c6-4912-bdef-161445a98193\", \"code\": \"10000\", \"referentCommission\": 0}]", + mediaType = "application/json" + ) + ) + ) @GetMapping("/codes") suspend fun getAllReferralCodes(): List { return referralCodeHandler.findAll().map { ReferralCodeBody(it.uuid, it.code, it.referentCommission) } } + @ApiOperation(value = "Delete referral code", notes = "Delete referral codes by its id.") + @ApiResponse(message = "OK", code = 200) @DeleteMapping("/codes/{code}") suspend fun deleteReferralCode( @PathVariable code: String, From 9798715b85cf6032d7ca192cc0102acaf2b7c7ee Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 2 Mar 2022 12:59:03 +0330 Subject: [PATCH 153/169] referral: Add api doc to commission controller --- .../app/controller/CommissionController.kt | 68 ++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt index a6bef037c..2b84310bc 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt @@ -2,6 +2,10 @@ package co.nilin.opex.referral.app.controller import co.nilin.opex.matching.engine.core.model.OrderDirection import co.nilin.opex.referral.core.spi.CommissionRewardHandler +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.Example +import io.swagger.annotations.ExampleProperty import org.springframework.web.bind.annotation.* import java.math.BigDecimal import java.time.ZoneId @@ -19,6 +23,32 @@ class CommissionController(private val commissionRewardHandler: CommissionReward var createDate: Date ) + @ApiOperation( + value = "Get all commissions by referral code", + notes = "Get all commissions by referral code." + ) + @ApiResponse( + message = "OK", + code = 200, + examples = Example( + ExampleProperty( + value = """ + [ + { + "rewardedUuid": "b3e4f2bd-15c6-4912-bdef-161445a98193", + "referentUuid": "a5e510f9-bda8-4ecb-b500-0980f525dc52", + "referralCode": "10000", + "richTrade": 1, + "referentOrderDirection": BID, + "share": 0.01, + "createDate": 1646213088 + } + ] + """, + mediaType = "application/json" + ) + ) + ) @GetMapping("/commissions/{code}") suspend fun getCommissionsByReferrerAndCode( @PathVariable code: String @@ -36,8 +66,34 @@ class CommissionController(private val commissionRewardHandler: CommissionReward } } + @ApiOperation( + value = "Get all commissions", + notes = "Get all commissions by referer or referent." + ) + @ApiResponse( + message = "OK", + code = 200, + examples = Example( + ExampleProperty( + value = """ + [ + { + "rewardedUuid": "b3e4f2bd-15c6-4912-bdef-161445a98193", + "referentUuid": "a5e510f9-bda8-4ecb-b500-0980f525dc52", + "referralCode": "10000", + "richTrade": 1, + "referentOrderDirection": BID, + "share": 0.01, + "createDate": 1646213088 + } + ] + """, + mediaType = "application/json" + ) + ) + ) @GetMapping("/commissions") - suspend fun getCommissionsByReferent( + suspend fun getCommissions( @RequestParam rewardedUuid: String?, @RequestParam referentUuid: String? ): List { @@ -54,6 +110,11 @@ class CommissionController(private val commissionRewardHandler: CommissionReward } } + @ApiOperation( + value = "Batch delete commissions", + notes = "Delete commissions base on given information." + ) + @ApiResponse(message = "OK", code = 200) @DeleteMapping("/commissions") suspend fun deleteCommissions( @RequestParam code: String?, @@ -63,6 +124,11 @@ class CommissionController(private val commissionRewardHandler: CommissionReward commissionRewardHandler.deleteCommissions(code, referrerUuid, referentUuid) } + @ApiOperation( + value = "Delete commission record", + notes = "Delete commission record by id." + ) + @ApiResponse(message = "OK", code = 200) @DeleteMapping("/commissions/{id}") suspend fun deleteCommissionById(@PathVariable id: Long) { commissionRewardHandler.deleteCommissionById(id) From 210fcae17f7b1344be360f6bf441b3b91fa5ee6f Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 2 Mar 2022 13:33:54 +0330 Subject: [PATCH 154/169] referral: Add api doc to report controller --- .../app/controller/ReportController.kt | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt index f5f8a7322..d8f854a4f 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt @@ -5,6 +5,10 @@ import co.nilin.opex.referral.core.spi.ReferenceHandler import co.nilin.opex.referral.core.spi.ReferralCodeHandler import co.nilin.opex.utility.error.data.OpexError import co.nilin.opex.utility.error.data.OpexException +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.Example +import io.swagger.annotations.ExampleProperty import org.springframework.security.core.annotation.CurrentSecurityContext import org.springframework.security.core.context.SecurityContext import org.springframework.web.bind.annotation.GetMapping @@ -29,6 +33,26 @@ class ReportController( val share: BigDecimal ) + @ApiOperation( + value = "Get report by referral code", + notes = "Get report by referral code." + ) + @ApiResponse( + message = "OK", + code = 200, + examples = Example( + ExampleProperty( + value = """ + { + "code": "10000", + "referentsCount": 1, + "share": 0.001 + } + """, + mediaType = "application/json" + ) + ) + ) @GetMapping("/reports/codes/{code}") suspend fun getReportByCode( @PathVariable code: String, @@ -41,6 +65,26 @@ class ReportController( return ReferralCodeReportBody(code, referencesCount, commissions.sumOf { it.share }) } + @ApiOperation( + value = "Get report by uuid", + notes = "Get report by uuid." + ) + @ApiResponse( + message = "OK", + code = 200, + examples = Example( + ExampleProperty( + value = """ + { + "code": "10000", + "referentsCount": 1, + "share": 0.001 + } + """, + mediaType = "application/json" + ) + ) + ) @GetMapping("/reports/users/{rewardedUuid}") suspend fun getReportByRewardedUuid( @PathVariable rewardedUuid: String, From 9cedfd35f48c1589fca388e4e170ec0e428e833a Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 2 Mar 2022 13:36:01 +0330 Subject: [PATCH 155/169] referral: Add api doc to checkout controller --- .../app/controller/CheckoutController.kt | 43 +++++++++++++++++++ .../app/controller/CommissionController.kt | 4 +- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt index 57b51245f..510c0bb41 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt @@ -5,6 +5,10 @@ import co.nilin.opex.referral.core.model.CheckoutState import co.nilin.opex.referral.core.spi.CheckoutHandler import co.nilin.opex.referral.core.spi.CheckoutRecordHandler import co.nilin.opex.referral.core.spi.ConfigHandler +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.Example +import io.swagger.annotations.ExampleProperty import org.springframework.web.bind.annotation.* import java.math.BigDecimal import java.time.ZoneId @@ -31,12 +35,51 @@ class CheckoutController( var updateDate: Date ) + @ApiOperation( + value = "Checkout pending commissions", + notes = "Checkout pending commissions." + ) + @ApiResponse( + message = "OK", + code = 200, + examples = Example() + ) @PutMapping("/checkout-all") suspend fun checkoutAll() { val min = configHandler.findConfig("default")!!.minPaymentAmount checkoutHandler.checkoutEveryCandidate(min) } + @ApiOperation( + value = "Get all checkouts", + notes = "Get all checkouts by status." + ) + @ApiResponse( + message = "OK", + code = 200, + examples = Example( + ExampleProperty( + value = """ + [ + { + "commissionRewardsId": 1, + "rewardedUuid": "b3e4f2bd-15c6-4912-bdef-161445a98193", + "referentUuid": "a5e510f9-bda8-4ecb-b500-0980f525dc52", + "referralCode": "10000", + "richTrade": 1, + "referentOrderDirection": "BID", + "share": 0.001, + "createDate": 1646213088, + "checkoutState": "PENDING", + "transferRef": "wallet-transaction-id", + "updateDate": 1646213088 + } + ] + """, + mediaType = "application/json" + ) + ) + ) @GetMapping suspend fun get(@RequestParam status: CheckoutState): List { return checkoutRecordHandler.findCommissionsByCheckoutState(status).map { diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt index 2b84310bc..eab925abb 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt @@ -39,7 +39,7 @@ class CommissionController(private val commissionRewardHandler: CommissionReward "referentUuid": "a5e510f9-bda8-4ecb-b500-0980f525dc52", "referralCode": "10000", "richTrade": 1, - "referentOrderDirection": BID, + "referentOrderDirection": "BID", "share": 0.01, "createDate": 1646213088 } @@ -82,7 +82,7 @@ class CommissionController(private val commissionRewardHandler: CommissionReward "referentUuid": "a5e510f9-bda8-4ecb-b500-0980f525dc52", "referralCode": "10000", "richTrade": 1, - "referentOrderDirection": BID, + "referentOrderDirection": "BID", "share": 0.01, "createDate": 1646213088 } From fa4e9952e983ebe52f9398b7fa56edadd9808431 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 2 Mar 2022 15:34:15 +0330 Subject: [PATCH 156/169] springfox: Remove redundant @EnableSwagger2 --- api/api-app/src/main/kotlin/co/nilin/opex/api/app/ApiApp.kt | 1 - .../co/nilin/opex/matching/gateway/app/MatchingGatewayApp.kt | 3 +-- .../src/main/kotlin/co/nilin/opex/referral/app/ReferralApp.kt | 1 - .../src/main/kotlin/co/nilin/opex/storage/app/StorageApp.kt | 1 - .../src/main/kotlin/co/nilin/opex/wallet/app/WalletApp.kt | 2 -- 5 files changed, 1 insertion(+), 7 deletions(-) diff --git a/api/api-app/src/main/kotlin/co/nilin/opex/api/app/ApiApp.kt b/api/api-app/src/main/kotlin/co/nilin/opex/api/app/ApiApp.kt index 60cf684dd..ba5850a24 100644 --- a/api/api-app/src/main/kotlin/co/nilin/opex/api/app/ApiApp.kt +++ b/api/api-app/src/main/kotlin/co/nilin/opex/api/app/ApiApp.kt @@ -7,7 +7,6 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2 @SpringBootApplication @ComponentScan("co.nilin.opex") -@EnableSwagger2 class ApiApp fun main(args: Array) { diff --git a/matching-gateway/matching-gateway-app/src/main/kotlin/co/nilin/opex/matching/gateway/app/MatchingGatewayApp.kt b/matching-gateway/matching-gateway-app/src/main/kotlin/co/nilin/opex/matching/gateway/app/MatchingGatewayApp.kt index b3c3545f5..e27767f48 100644 --- a/matching-gateway/matching-gateway-app/src/main/kotlin/co/nilin/opex/matching/gateway/app/MatchingGatewayApp.kt +++ b/matching-gateway/matching-gateway-app/src/main/kotlin/co/nilin/opex/matching/gateway/app/MatchingGatewayApp.kt @@ -9,9 +9,8 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2 @SpringBootApplication @ComponentScan("co.nilin.opex") @EnableOpexErrorHandler -@EnableSwagger2 class MatchingGatewayApp fun main(args: Array) { runApplication(*args) -} \ No newline at end of file +} diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/ReferralApp.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/ReferralApp.kt index 5668e4667..c78cf218d 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/ReferralApp.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/ReferralApp.kt @@ -9,7 +9,6 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2 @SpringBootApplication @ComponentScan("co.nilin.opex") @EnableOpexErrorHandler -@EnableSwagger2 class ReferralApp fun main(args: Array) { diff --git a/storage/storage-app/src/main/kotlin/co/nilin/opex/storage/app/StorageApp.kt b/storage/storage-app/src/main/kotlin/co/nilin/opex/storage/app/StorageApp.kt index 91d7b6f21..3a469332f 100644 --- a/storage/storage-app/src/main/kotlin/co/nilin/opex/storage/app/StorageApp.kt +++ b/storage/storage-app/src/main/kotlin/co/nilin/opex/storage/app/StorageApp.kt @@ -9,7 +9,6 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2 @SpringBootApplication @ComponentScan("co.nilin.opex") @EnableOpexErrorHandler -@EnableSwagger2 class StorageApp fun main(args: Array) { diff --git a/wallet/wallet-app/src/main/kotlin/co/nilin/opex/wallet/app/WalletApp.kt b/wallet/wallet-app/src/main/kotlin/co/nilin/opex/wallet/app/WalletApp.kt index e4b061ee7..24f105e0b 100644 --- a/wallet/wallet-app/src/main/kotlin/co/nilin/opex/wallet/app/WalletApp.kt +++ b/wallet/wallet-app/src/main/kotlin/co/nilin/opex/wallet/app/WalletApp.kt @@ -4,11 +4,9 @@ import co.nilin.opex.utility.error.EnableOpexErrorHandler import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication import org.springframework.context.annotation.ComponentScan -import springfox.documentation.swagger2.annotations.EnableSwagger2 @SpringBootApplication @ComponentScan("co.nilin.opex") -@EnableSwagger2 @EnableOpexErrorHandler class WalletApp From 0138f94de529f39b5e7e75c6d740ed50367499e7 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 2 Mar 2022 18:43:19 +0330 Subject: [PATCH 157/169] referral: Fix checkout controller doc --- .../opex/referral/app/config/SwaggerConfig.kt | 7 +++ .../app/controller/CheckoutController.kt | 44 ++++++++++--------- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt index aa1f2d69e..faf55396b 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt @@ -1,5 +1,8 @@ package co.nilin.opex.referral.app.config +import co.nilin.opex.referral.app.controller.CheckoutController +import com.fasterxml.classmate.TypeResolver +import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Value import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration @@ -22,6 +25,9 @@ class SwaggerConfig { @Value("\${swagger.authUrl}") private lateinit var authUrl: String + @Autowired + private lateinit var typeResolver: TypeResolver + @Bean fun opexBCGateway(): Docket { return Docket(DocumentationType.SWAGGER_2) @@ -30,6 +36,7 @@ class SwaggerConfig { .select() .paths(PathSelectors.regex("^/actuator.*").negate()) .build() + .additionalModels(typeResolver.resolve(CheckoutController.CheckoutRecordBody::class.java)) .ignoredParameterTypes( AuthenticationPrincipal::class.java, CurrentSecurityContext::class.java, diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt index 510c0bb41..8d931bde4 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CheckoutController.kt @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiOperation import io.swagger.annotations.ApiResponse import io.swagger.annotations.Example import io.swagger.annotations.ExampleProperty +import org.springframework.http.MediaType import org.springframework.web.bind.annotation.* import java.math.BigDecimal import java.time.ZoneId @@ -41,10 +42,9 @@ class CheckoutController( ) @ApiResponse( message = "OK", - code = 200, - examples = Example() + code = 200 ) - @PutMapping("/checkout-all") + @PutMapping("/checkout-all", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun checkoutAll() { val min = configHandler.findConfig("default")!!.minPaymentAmount checkoutHandler.checkoutEveryCandidate(min) @@ -57,30 +57,32 @@ class CheckoutController( @ApiResponse( message = "OK", code = 200, + response = CheckoutRecordBody::class, + responseContainer = "List", examples = Example( ExampleProperty( + mediaType = "application/json", value = """ - [ - { - "commissionRewardsId": 1, - "rewardedUuid": "b3e4f2bd-15c6-4912-bdef-161445a98193", - "referentUuid": "a5e510f9-bda8-4ecb-b500-0980f525dc52", - "referralCode": "10000", - "richTrade": 1, - "referentOrderDirection": "BID", - "share": 0.001, - "createDate": 1646213088, - "checkoutState": "PENDING", - "transferRef": "wallet-transaction-id", - "updateDate": 1646213088 - } - ] - """, - mediaType = "application/json" +[ + { + "commissionRewardsId": 1, + "rewardedUuid": "b3e4f2bd-15c6-4912-bdef-161445a98193", + "referentUuid": "a5e510f9-bda8-4ecb-b500-0980f525dc52", + "referralCode": "10000", + "richTrade": 1, + "referentOrderDirection": "BID", + "share": 0.001, + "createDate": 1646213088, + "checkoutState": "PENDING", + "transferRef": "wallet-transaction-id", + "updateDate": 1646213088 + } +] + """ ) ) ) - @GetMapping + @GetMapping(produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun get(@RequestParam status: CheckoutState): List { return checkoutRecordHandler.findCommissionsByCheckoutState(status).map { CheckoutRecordBody( From a52588d1e8aa66cedfc9eeb44ca0bc09ac44ef32 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 2 Mar 2022 18:50:44 +0330 Subject: [PATCH 158/169] referral: Fix commission controller doc --- .../opex/referral/app/config/SwaggerConfig.kt | 6 +- .../app/controller/CommissionController.kt | 65 ++++++++++--------- 2 files changed, 40 insertions(+), 31 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt index faf55396b..9f0cec8fd 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt @@ -1,6 +1,7 @@ package co.nilin.opex.referral.app.config import co.nilin.opex.referral.app.controller.CheckoutController +import co.nilin.opex.referral.app.controller.CommissionController import com.fasterxml.classmate.TypeResolver import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Value @@ -36,7 +37,10 @@ class SwaggerConfig { .select() .paths(PathSelectors.regex("^/actuator.*").negate()) .build() - .additionalModels(typeResolver.resolve(CheckoutController.CheckoutRecordBody::class.java)) + .additionalModels( + typeResolver.resolve(CheckoutController.CheckoutRecordBody::class.java), + typeResolver.resolve(CommissionController.CommissionRewardBody::class.java) + ) .ignoredParameterTypes( AuthenticationPrincipal::class.java, CurrentSecurityContext::class.java, diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt index eab925abb..b0ad87613 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt @@ -6,6 +6,7 @@ import io.swagger.annotations.ApiOperation import io.swagger.annotations.ApiResponse import io.swagger.annotations.Example import io.swagger.annotations.ExampleProperty +import org.springframework.http.MediaType import org.springframework.web.bind.annotation.* import java.math.BigDecimal import java.time.ZoneId @@ -30,26 +31,28 @@ class CommissionController(private val commissionRewardHandler: CommissionReward @ApiResponse( message = "OK", code = 200, + response = CommissionRewardBody::class, + responseContainer = "List", examples = Example( ExampleProperty( + mediaType = "application/json", value = """ - [ - { - "rewardedUuid": "b3e4f2bd-15c6-4912-bdef-161445a98193", - "referentUuid": "a5e510f9-bda8-4ecb-b500-0980f525dc52", - "referralCode": "10000", - "richTrade": 1, - "referentOrderDirection": "BID", - "share": 0.01, - "createDate": 1646213088 - } - ] - """, - mediaType = "application/json" +[ + { + "rewardedUuid": "b3e4f2bd-15c6-4912-bdef-161445a98193", + "referentUuid": "a5e510f9-bda8-4ecb-b500-0980f525dc52", + "referralCode": "10000", + "richTrade": 1, + "referentOrderDirection": "BID", + "share": 0.01, + "createDate": 1646213088 + } +] + """ ) ) ) - @GetMapping("/commissions/{code}") + @GetMapping("/commissions/{code}", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun getCommissionsByReferrerAndCode( @PathVariable code: String ): List { @@ -73,26 +76,28 @@ class CommissionController(private val commissionRewardHandler: CommissionReward @ApiResponse( message = "OK", code = 200, + response = CommissionRewardBody::class, + responseContainer = "List", examples = Example( ExampleProperty( + mediaType = "application/json", value = """ - [ - { - "rewardedUuid": "b3e4f2bd-15c6-4912-bdef-161445a98193", - "referentUuid": "a5e510f9-bda8-4ecb-b500-0980f525dc52", - "referralCode": "10000", - "richTrade": 1, - "referentOrderDirection": "BID", - "share": 0.01, - "createDate": 1646213088 - } - ] - """, - mediaType = "application/json" +[ + { + "rewardedUuid": "b3e4f2bd-15c6-4912-bdef-161445a98193", + "referentUuid": "a5e510f9-bda8-4ecb-b500-0980f525dc52", + "referralCode": "10000", + "richTrade": 1, + "referentOrderDirection": "BID", + "share": 0.01, + "createDate": 1646213088 + } +] + """ ) ) ) - @GetMapping("/commissions") + @GetMapping("/commissions", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun getCommissions( @RequestParam rewardedUuid: String?, @RequestParam referentUuid: String? @@ -115,7 +120,7 @@ class CommissionController(private val commissionRewardHandler: CommissionReward notes = "Delete commissions base on given information." ) @ApiResponse(message = "OK", code = 200) - @DeleteMapping("/commissions") + @DeleteMapping("/commissions", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun deleteCommissions( @RequestParam code: String?, @RequestParam referrerUuid: String?, @@ -129,7 +134,7 @@ class CommissionController(private val commissionRewardHandler: CommissionReward notes = "Delete commission record by id." ) @ApiResponse(message = "OK", code = 200) - @DeleteMapping("/commissions/{id}") + @DeleteMapping("/commissions/{id}", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun deleteCommissionById(@PathVariable id: Long) { commissionRewardHandler.deleteCommissionById(id) } From 8bc449a92a442c5472135a36843dcaae83b8b041 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 2 Mar 2022 19:01:18 +0330 Subject: [PATCH 159/169] referral: Fix referral controller doc --- .../opex/referral/app/config/SwaggerConfig.kt | 4 +- .../app/controller/ReferralController.kt | 70 ++++++++++++++----- 2 files changed, 55 insertions(+), 19 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt index 9f0cec8fd..5e479832e 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt @@ -2,6 +2,7 @@ package co.nilin.opex.referral.app.config import co.nilin.opex.referral.app.controller.CheckoutController import co.nilin.opex.referral.app.controller.CommissionController +import co.nilin.opex.referral.app.controller.ReferralController import com.fasterxml.classmate.TypeResolver import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Value @@ -39,7 +40,8 @@ class SwaggerConfig { .build() .additionalModels( typeResolver.resolve(CheckoutController.CheckoutRecordBody::class.java), - typeResolver.resolve(CommissionController.CommissionRewardBody::class.java) + typeResolver.resolve(CommissionController.CommissionRewardBody::class.java), + typeResolver.resolve(ReferralController.ReferralCodeBody::class.java) ) .ignoredParameterTypes( AuthenticationPrincipal::class.java, diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt index 40c3afa53..de874c93d 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiOperation import io.swagger.annotations.ApiResponse import io.swagger.annotations.Example import io.swagger.annotations.ExampleProperty +import org.springframework.http.MediaType import org.springframework.security.core.annotation.CurrentSecurityContext import org.springframework.security.core.context.SecurityContext import org.springframework.web.bind.annotation.* @@ -43,18 +44,22 @@ class ReferralController( } } - @ApiOperation(value = "Create new referral code", notes = "Send user information to create new referral code. referentCommission is a value in range [0, 1].") + @ApiOperation( + value = "Create new referral code", + notes = "Send user information to create new referral code. referentCommission is a value in range [0, 1]." + ) @ApiResponse( message = "OK", code = 200, + response = String::class, examples = Example( ExampleProperty( - value = "10000", - mediaType = "application/json" + mediaType = "application/json", + value = "10000" ) ) ) - @PostMapping("/codes") + @PostMapping("/codes", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun generateReferralCode( @RequestBody body: PostReferralBody, @CurrentSecurityContext securityContext: SecurityContext @@ -77,7 +82,7 @@ class ReferralController( notes = "Edit referral code properties. The id code is immutable, you can not change it. referentCommission is a value in range [0, 1]." ) @ApiResponse(message = "OK", code = 200) - @PatchMapping("/codes/{code}") + @PatchMapping("/codes/{code}", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun updateReferralCodeByCode( @PathVariable code: String, @RequestBody body: PatchReferralBody, @@ -97,7 +102,7 @@ class ReferralController( notes = "Referrer can not be one of your referents. Also can not refer yourself." ) @ApiResponse(message = "OK", code = 200) - @PutMapping("/codes/{code}/assign") + @PutMapping("/codes/{code}/assign", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun assignReferrer( @PathVariable code: String, @RequestParam uuid: String, @@ -111,14 +116,24 @@ class ReferralController( @ApiResponse( message = "OK", code = 200, + response = ReferralCodeBody::class, + responseContainer = "List", examples = Example( ExampleProperty( - value = "[{ \"uuid\": \"b3e4f2bd-15c6-4912-bdef-161445a98193\", \"code\": \"10000\", \"referentCommission\": 0}]", - mediaType = "application/json" + mediaType = "application/json", + value = """ +[ + { + "uuid": "b3e4f2bd-15c6-4912-bdef-161445a98193", + "code": "10000", + "referentCommission": 0 + } +] + """, ) ) ) - @GetMapping("/me/codes") + @GetMapping("/me/codes", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun getMyReferralCodes(@CurrentSecurityContext securityContext: SecurityContext): List { return referralCodeHandler.findByReferrerUuid(securityContext.authentication.name) .map { ReferralCodeBody(it.uuid, it.code, it.referentCommission) } @@ -128,14 +143,21 @@ class ReferralController( @ApiResponse( message = "OK", code = 200, + response = ReferralCodeBody::class, examples = Example( ExampleProperty( - value = "{ \"uuid\": \"b3e4f2bd-15c6-4912-bdef-161445a98193\", \"code\": \"10000\", \"referentCommission\": 0}", - mediaType = "application/json" + mediaType = "application/json", + value = """ +{ + "uuid": "b3e4f2bd-15c6-4912-bdef-161445a98193", + "code": "10000", + "referentCommission": 0 +} + """, ) ) ) - @GetMapping("/codes/{code}") + @GetMapping("/codes/{code}", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun getReferralCodeByCode( @PathVariable code: String, @CurrentSecurityContext securityContext: SecurityContext @@ -149,14 +171,16 @@ class ReferralController( @ApiResponse( message = "OK", code = 200, + response = String::class, + responseContainer = "List", examples = Example( ExampleProperty( + mediaType = "application/json", value = "[\"b3e4f2bd-15c6-4912-bdef-161445a98193\"]", - mediaType = "application/json" ) ) ) - @GetMapping("/codes/{code}/references") + @GetMapping("/codes/{code}/references", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun getReferenceByCode( @PathVariable code: String, @CurrentSecurityContext securityContext: SecurityContext @@ -168,21 +192,31 @@ class ReferralController( @ApiResponse( message = "OK", code = 200, + response = ReferralCodeBody::class, + responseContainer = "List", examples = Example( ExampleProperty( - value = "[{ \"uuid\": \"b3e4f2bd-15c6-4912-bdef-161445a98193\", \"code\": \"10000\", \"referentCommission\": 0}]", - mediaType = "application/json" + mediaType = "application/json", + value = """ +[ + { + "uuid": "b3e4f2bd-15c6-4912-bdef-161445a98193", + "code": "10000", + "referentCommission": 0 + } +] + """, ) ) ) - @GetMapping("/codes") + @GetMapping("/codes", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun getAllReferralCodes(): List { return referralCodeHandler.findAll().map { ReferralCodeBody(it.uuid, it.code, it.referentCommission) } } @ApiOperation(value = "Delete referral code", notes = "Delete referral codes by its id.") @ApiResponse(message = "OK", code = 200) - @DeleteMapping("/codes/{code}") + @DeleteMapping("/codes/{code}", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun deleteReferralCode( @PathVariable code: String, @CurrentSecurityContext securityContext: SecurityContext From e1c77d0127751b09e07d5ae9fc43aaab3caca778 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Wed, 2 Mar 2022 19:06:27 +0330 Subject: [PATCH 160/169] referral: Fix report controller doc --- .../opex/referral/app/config/SwaggerConfig.kt | 5 +++- .../app/controller/ReportController.kt | 30 ++++++++++--------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt index 5e479832e..188a798dc 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt @@ -3,6 +3,7 @@ package co.nilin.opex.referral.app.config import co.nilin.opex.referral.app.controller.CheckoutController import co.nilin.opex.referral.app.controller.CommissionController import co.nilin.opex.referral.app.controller.ReferralController +import co.nilin.opex.referral.app.controller.ReportController import com.fasterxml.classmate.TypeResolver import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Value @@ -41,7 +42,9 @@ class SwaggerConfig { .additionalModels( typeResolver.resolve(CheckoutController.CheckoutRecordBody::class.java), typeResolver.resolve(CommissionController.CommissionRewardBody::class.java), - typeResolver.resolve(ReferralController.ReferralCodeBody::class.java) + typeResolver.resolve(ReferralController.ReferralCodeBody::class.java), + typeResolver.resolve(ReportController.ReferralCodeReportBody::class.java), + typeResolver.resolve(ReportController.ReferrerReportBody::class.java) ) .ignoredParameterTypes( AuthenticationPrincipal::class.java, diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt index d8f854a4f..420dd0b6e 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt @@ -9,6 +9,7 @@ import io.swagger.annotations.ApiOperation import io.swagger.annotations.ApiResponse import io.swagger.annotations.Example import io.swagger.annotations.ExampleProperty +import org.springframework.http.MediaType import org.springframework.security.core.annotation.CurrentSecurityContext import org.springframework.security.core.context.SecurityContext import org.springframework.web.bind.annotation.GetMapping @@ -40,20 +41,21 @@ class ReportController( @ApiResponse( message = "OK", code = 200, + response = ReferralCodeReportBody::class, examples = Example( ExampleProperty( + mediaType = "application/json", value = """ - { - "code": "10000", - "referentsCount": 1, - "share": 0.001 - } +{ + "code": "10000", + "referentsCount": 1, + "share": 0.001 +} """, - mediaType = "application/json" ) ) ) - @GetMapping("/reports/codes/{code}") + @GetMapping("/reports/codes/{code}", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun getReportByCode( @PathVariable code: String, @CurrentSecurityContext securityContext: SecurityContext @@ -72,20 +74,20 @@ class ReportController( @ApiResponse( message = "OK", code = 200, + response = ReferrerReportBody::class, examples = Example( ExampleProperty( + mediaType = "application/json", value = """ - { - "code": "10000", - "referentsCount": 1, - "share": 0.001 - } +{ + "referentsCount": 1, + "share": 0.001 +} """, - mediaType = "application/json" ) ) ) - @GetMapping("/reports/users/{rewardedUuid}") + @GetMapping("/reports/users/{rewardedUuid}", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun getReportByRewardedUuid( @PathVariable rewardedUuid: String, @CurrentSecurityContext securityContext: SecurityContext From de2ab1d0120c0e885b87089d2a4f4f7f014da382 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Thu, 3 Mar 2022 11:54:18 +0330 Subject: [PATCH 161/169] referral: Refactor referral controller doc Separate referral controller to code and reference controllers --- .../referral/app/config/SecurityConfig.kt | 5 +- .../opex/referral/app/config/SwaggerConfig.kt | 8 +- ...eferralController.kt => CodeController.kt} | 118 +++++------------- .../app/controller/ReferenceController.kt | 92 ++++++++++++++ 4 files changed, 129 insertions(+), 94 deletions(-) rename referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/{ReferralController.kt => CodeController.kt} (54%) create mode 100644 referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferenceController.kt diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt index d13aed534..bb7880a46 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt @@ -3,7 +3,6 @@ package co.nilin.opex.referral.app.config import co.nilin.opex.referral.app.utils.hasRole import org.springframework.beans.factory.annotation.Value import org.springframework.context.annotation.Bean -import org.springframework.http.HttpMethod import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity import org.springframework.security.config.web.server.ServerHttpSecurity import org.springframework.security.oauth2.jwt.NimbusReactiveJwtDecoder @@ -25,9 +24,7 @@ class SecurityConfig(private val webClient: WebClient) { .pathMatchers("/swagger-ui/**").permitAll() .pathMatchers("/swagger-resources/**").permitAll() .pathMatchers("/v2/api-docs").permitAll() - .pathMatchers(HttpMethod.GET, "/codes").hasRole("SCOPE_trust", "finance-admin") - .pathMatchers("/checkouts/**", "/commissions/**", "/codes/*/references") - .hasRole("SCOPE_trust", "finance-admin") + .pathMatchers("/checkouts/**", "/commissions/**").hasRole("SCOPE_trust", "finance-admin") .pathMatchers("/**").hasAuthority("SCOPE_trust") .anyExchange().authenticated() .and() diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt index 188a798dc..a87e66311 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt @@ -1,9 +1,6 @@ package co.nilin.opex.referral.app.config -import co.nilin.opex.referral.app.controller.CheckoutController -import co.nilin.opex.referral.app.controller.CommissionController -import co.nilin.opex.referral.app.controller.ReferralController -import co.nilin.opex.referral.app.controller.ReportController +import co.nilin.opex.referral.app.controller.* import com.fasterxml.classmate.TypeResolver import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.annotation.Value @@ -42,7 +39,8 @@ class SwaggerConfig { .additionalModels( typeResolver.resolve(CheckoutController.CheckoutRecordBody::class.java), typeResolver.resolve(CommissionController.CommissionRewardBody::class.java), - typeResolver.resolve(ReferralController.ReferralCodeBody::class.java), + typeResolver.resolve(CodeController.ReferralCodeBody::class.java), + typeResolver.resolve(ReferenceController.ReferenceBody::class.java), typeResolver.resolve(ReportController.ReferralCodeReportBody::class.java), typeResolver.resolve(ReportController.ReferrerReportBody::class.java) ) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CodeController.kt similarity index 54% rename from referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt rename to referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CodeController.kt index de874c93d..d41e2d784 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferralController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CodeController.kt @@ -5,18 +5,20 @@ import co.nilin.opex.referral.core.spi.ReferenceHandler import co.nilin.opex.referral.core.spi.ReferralCodeHandler import co.nilin.opex.utility.error.data.OpexError import co.nilin.opex.utility.error.data.OpexException +import com.nimbusds.jose.shaded.json.JSONArray import io.swagger.annotations.ApiOperation import io.swagger.annotations.ApiResponse import io.swagger.annotations.Example import io.swagger.annotations.ExampleProperty import org.springframework.http.MediaType -import org.springframework.security.core.annotation.CurrentSecurityContext -import org.springframework.security.core.context.SecurityContext +import org.springframework.security.oauth2.jwt.Jwt import org.springframework.web.bind.annotation.* import java.math.BigDecimal +import java.security.Principal @RestController -class ReferralController( +@RequestMapping("/codes") +class CodeController( private val referralCodeHandler: ReferralCodeHandler, private val referenceHandler: ReferenceHandler, private val configHandler: ConfigHandler @@ -36,7 +38,7 @@ class ReferralController( val referentCommission: BigDecimal ) - private val badRequestOrThrow: (Throwable) -> Unit = { e -> + private val reThrow: (Throwable) -> Unit = { e -> when (e) { is IllegalArgumentException -> throw OpexException(OpexError.BadRequest, e.message) is OpexException -> throw e @@ -59,12 +61,12 @@ class ReferralController( ) ) ) - @PostMapping("/codes", produces = [MediaType.APPLICATION_JSON_VALUE]) + @PostMapping(produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun generateReferralCode( @RequestBody body: PostReferralBody, - @CurrentSecurityContext securityContext: SecurityContext + principal: Principal ): String { - if (body.uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) + if (body.uuid != principal.name) throw OpexException(OpexError.UnAuthorized) return referralCodeHandler.runCatching { val maxReferralCodePerUser = configHandler.findConfig("default")!!.maxReferralCodePerUser val count = referralCodeHandler.findByReferrerUuid(body.uuid).size @@ -73,8 +75,7 @@ class ReferralController( "You have reached maximum number of referral codes" ) generateReferralCode(body.uuid, body.referentCommission) - } - .onFailure(badRequestOrThrow).getOrThrow() + }.onFailure(reThrow).getOrThrow() } @ApiOperation( @@ -82,61 +83,19 @@ class ReferralController( notes = "Edit referral code properties. The id code is immutable, you can not change it. referentCommission is a value in range [0, 1]." ) @ApiResponse(message = "OK", code = 200) - @PatchMapping("/codes/{code}", produces = [MediaType.APPLICATION_JSON_VALUE]) + @PatchMapping("/{code}", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun updateReferralCodeByCode( @PathVariable code: String, @RequestBody body: PatchReferralBody, - @CurrentSecurityContext securityContext: SecurityContext + principal: Principal ) { val referralCode = referralCodeHandler.findByCode(code) ?: throw OpexException( OpexError.BadRequest, "Referral code is invalid" ) - if (referralCode.uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) + if (referralCode.uuid != principal.name) throw OpexException(OpexError.UnAuthorized) referralCodeHandler.runCatching { updateCommissions(code, body.referentCommission) } - .onFailure(badRequestOrThrow) - } - - @ApiOperation( - value = "Refer a user by referral code", - notes = "Referrer can not be one of your referents. Also can not refer yourself." - ) - @ApiResponse(message = "OK", code = 200) - @PutMapping("/codes/{code}/assign", produces = [MediaType.APPLICATION_JSON_VALUE]) - suspend fun assignReferrer( - @PathVariable code: String, - @RequestParam uuid: String, - @CurrentSecurityContext securityContext: SecurityContext - ) { - if (uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) - referralCodeHandler.runCatching { assign(code, uuid) }.onFailure(badRequestOrThrow) - } - - @ApiOperation(value = "Get my referral codes", notes = "Get all of your referral codes.") - @ApiResponse( - message = "OK", - code = 200, - response = ReferralCodeBody::class, - responseContainer = "List", - examples = Example( - ExampleProperty( - mediaType = "application/json", - value = """ -[ - { - "uuid": "b3e4f2bd-15c6-4912-bdef-161445a98193", - "code": "10000", - "referentCommission": 0 - } -] - """, - ) - ) - ) - @GetMapping("/me/codes", produces = [MediaType.APPLICATION_JSON_VALUE]) - suspend fun getMyReferralCodes(@CurrentSecurityContext securityContext: SecurityContext): List { - return referralCodeHandler.findByReferrerUuid(securityContext.authentication.name) - .map { ReferralCodeBody(it.uuid, it.code, it.referentCommission) } + .onFailure(reThrow) } @ApiOperation(value = "Get referral codes info", notes = "Get referral codes info.") @@ -157,37 +116,16 @@ class ReferralController( ) ) ) - @GetMapping("/codes/{code}", produces = [MediaType.APPLICATION_JSON_VALUE]) + @GetMapping("/{code}", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun getReferralCodeByCode( @PathVariable code: String, - @CurrentSecurityContext securityContext: SecurityContext + principal: Principal ): ReferralCodeBody { val referralCode = referralCodeHandler.findByCode(code) ?: throw OpexException(OpexError.NotFound) - if (referralCode.uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) + if (referralCode.uuid != principal.name) throw OpexException(OpexError.UnAuthorized) return ReferralCodeBody(referralCode.uuid, referralCode.code, referralCode.referentCommission) } - @ApiOperation(value = "Get referral code's references", notes = "Get uuid of all referral code's references.") - @ApiResponse( - message = "OK", - code = 200, - response = String::class, - responseContainer = "List", - examples = Example( - ExampleProperty( - mediaType = "application/json", - value = "[\"b3e4f2bd-15c6-4912-bdef-161445a98193\"]", - ) - ) - ) - @GetMapping("/codes/{code}/references", produces = [MediaType.APPLICATION_JSON_VALUE]) - suspend fun getReferenceByCode( - @PathVariable code: String, - @CurrentSecurityContext securityContext: SecurityContext - ): List { - return referenceHandler.findByCode(code).map { it.referentUuid } - } - @ApiOperation(value = "Get all referral codes", notes = "Get all of referral codes.") @ApiResponse( message = "OK", @@ -209,20 +147,30 @@ class ReferralController( ) ) ) - @GetMapping("/codes", produces = [MediaType.APPLICATION_JSON_VALUE]) - suspend fun getAllReferralCodes(): List { - return referralCodeHandler.findAll().map { ReferralCodeBody(it.uuid, it.code, it.referentCommission) } + @GetMapping(produces = [MediaType.APPLICATION_JSON_VALUE]) + suspend fun getAllReferralCodes( + @RequestParam uuid: String?, + principal: Principal + ): List { + return uuid?.takeIf { uuid == principal.name }?.let { id -> + referralCodeHandler.findByReferrerUuid(id).map { ReferralCodeBody(it.uuid, it.code, it.referentCommission) } + } ?: run { + val isAdmin = ((principal as Jwt).claims["roles"] as? JSONArray)?.contains("finance-admin") ?: false + return if (isAdmin) referralCodeHandler.findAll() + .map { ReferralCodeBody(it.uuid, it.code, it.referentCommission) } + else throw OpexException(OpexError.UnAuthorized) + } } @ApiOperation(value = "Delete referral code", notes = "Delete referral codes by its id.") @ApiResponse(message = "OK", code = 200) - @DeleteMapping("/codes/{code}", produces = [MediaType.APPLICATION_JSON_VALUE]) + @DeleteMapping("/{code}", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun deleteReferralCode( @PathVariable code: String, - @CurrentSecurityContext securityContext: SecurityContext + principal: Principal ) { val referralCode = referralCodeHandler.findByCode(code) ?: throw OpexException(OpexError.NotFound) - if (referralCode.uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) + if (referralCode.uuid != principal.name) throw OpexException(OpexError.UnAuthorized) referralCodeHandler.deleteByCode(code) } } diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferenceController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferenceController.kt new file mode 100644 index 000000000..3446f6ab3 --- /dev/null +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferenceController.kt @@ -0,0 +1,92 @@ +package co.nilin.opex.referral.app.controller + +import co.nilin.opex.referral.core.model.Reference +import co.nilin.opex.referral.core.spi.ReferenceHandler +import co.nilin.opex.referral.core.spi.ReferralCodeHandler +import co.nilin.opex.utility.error.data.OpexError +import co.nilin.opex.utility.error.data.OpexException +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.Example +import io.swagger.annotations.ExampleProperty +import org.springframework.http.MediaType +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PutMapping +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.RestController +import java.security.Principal + +@RestController +class ReferenceController( + private val referralCodeHandler: ReferralCodeHandler, + private val referenceHandler: ReferenceHandler +) { + data class ReferenceBody( + var referralCode: String, + var referentUuid: String, + ) + + private val reThrow: (Throwable) -> Unit = { e -> + when (e) { + is IllegalArgumentException -> throw OpexException(OpexError.BadRequest, e.message) + is OpexException -> throw e + else -> throw OpexException(OpexError.InternalServerError, e.message) + } + } + + @ApiOperation( + value = "Refer a user by referral code", + notes = "Referrer can not be one of your referents. Also you can not refer yourself." + ) + @ApiResponse(message = "OK", code = 200) + @PutMapping("/references/assign", produces = [MediaType.APPLICATION_JSON_VALUE]) + suspend fun assignReferrer( + @RequestParam code: String, + @RequestParam uuid: String?, + principal: Principal + ) { + val id = uuid ?: principal.name + if (id != principal.name) throw OpexException(OpexError.UnAuthorized) + referralCodeHandler.runCatching { assign(code, id) }.onFailure(reThrow) + } + + @ApiOperation(value = "Get referral code's references", notes = "Get uuid of all referral code's references.") + @ApiResponse( + message = "OK", + code = 200, + response = String::class, + responseContainer = "List", + examples = Example( + ExampleProperty( + mediaType = "application/json", + value = """ +[ + "b3e4f2bd-15c6-4912-bdef-161445a98193" +] + """, + ) + ) + ) + @GetMapping("/references", produces = [MediaType.APPLICATION_JSON_VALUE]) + suspend fun getReferenceByCodeAndUuid( + @RequestParam uuid: String?, + @RequestParam code: String?, + principal: Principal + ): List { + if ((uuid ?: code == null) || (uuid != null && code != null)) throw OpexException( + OpexError.BadRequest, + "One and only one of (uuid, code) parameters must be provided" + ) + if (uuid != null && uuid != principal.name) throw OpexException(OpexError.UnAuthorized) + code?.let { + val referralCode = referralCodeHandler.findByCode(it) ?: throw OpexException(OpexError.NotFound) + if (referralCode.uuid != principal.name) throw OpexException(OpexError.UnAuthorized) + } + fun List.body() = map { ReferenceBody(it.referralCode.code, it.referentUuid) } + return when (code ?: uuid) { + code -> referenceHandler.findByCode(code!!).body() + uuid -> referenceHandler.findByReferrerUuid(uuid!!).body() + else -> throw IllegalStateException("All of (code, uuid) are null") + } + } +} From 753a7d2b9570800731b112ef6fe33b231f3dd96e Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Thu, 3 Mar 2022 12:00:13 +0330 Subject: [PATCH 162/169] referral: Explicitly determine required fields --- .../co/nilin/opex/referral/app/controller/CodeController.kt | 2 +- .../opex/referral/app/controller/ReferenceController.kt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CodeController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CodeController.kt index d41e2d784..2ccb96575 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CodeController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CodeController.kt @@ -149,7 +149,7 @@ class CodeController( ) @GetMapping(produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun getAllReferralCodes( - @RequestParam uuid: String?, + @RequestParam(required = false) uuid: String?, principal: Principal ): List { return uuid?.takeIf { uuid == principal.name }?.let { id -> diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferenceController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferenceController.kt index 3446f6ab3..4bd1614c6 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferenceController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferenceController.kt @@ -42,7 +42,7 @@ class ReferenceController( @PutMapping("/references/assign", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun assignReferrer( @RequestParam code: String, - @RequestParam uuid: String?, + @RequestParam(required = false) uuid: String?, principal: Principal ) { val id = uuid ?: principal.name @@ -69,8 +69,8 @@ class ReferenceController( ) @GetMapping("/references", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun getReferenceByCodeAndUuid( - @RequestParam uuid: String?, - @RequestParam code: String?, + @RequestParam(required = false) uuid: String?, + @RequestParam(required = false) code: String?, principal: Principal ): List { if ((uuid ?: code == null) || (uuid != null && code != null)) throw OpexException( From 769cbd24ebde0a45edf1787847c0bbda5d586ab3 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Thu, 3 Mar 2022 12:22:28 +0330 Subject: [PATCH 163/169] referral: Refactor reports controller --- .../opex/referral/app/config/SwaggerConfig.kt | 1 - .../app/controller/ReportController.kt | 58 +++---------------- 2 files changed, 8 insertions(+), 51 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt index a87e66311..83f528118 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt @@ -41,7 +41,6 @@ class SwaggerConfig { typeResolver.resolve(CommissionController.CommissionRewardBody::class.java), typeResolver.resolve(CodeController.ReferralCodeBody::class.java), typeResolver.resolve(ReferenceController.ReferenceBody::class.java), - typeResolver.resolve(ReportController.ReferralCodeReportBody::class.java), typeResolver.resolve(ReportController.ReferrerReportBody::class.java) ) .ignoredParameterTypes( diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt index 420dd0b6e..39e310d6d 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReportController.kt @@ -2,7 +2,6 @@ package co.nilin.opex.referral.app.controller import co.nilin.opex.referral.core.spi.CommissionRewardHandler import co.nilin.opex.referral.core.spi.ReferenceHandler -import co.nilin.opex.referral.core.spi.ReferralCodeHandler import co.nilin.opex.utility.error.data.OpexError import co.nilin.opex.utility.error.data.OpexException import io.swagger.annotations.ApiOperation @@ -10,63 +9,22 @@ import io.swagger.annotations.ApiResponse import io.swagger.annotations.Example import io.swagger.annotations.ExampleProperty import org.springframework.http.MediaType -import org.springframework.security.core.annotation.CurrentSecurityContext -import org.springframework.security.core.context.SecurityContext import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.RestController import java.math.BigDecimal +import java.security.Principal @RestController class ReportController( private val commissionRewardHandler: CommissionRewardHandler, - private val referenceHandler: ReferenceHandler, - private val referralCodeHandler: ReferralCodeHandler + private val referenceHandler: ReferenceHandler ) { - data class ReferralCodeReportBody( - val code: String, - val referentsCount: Long, - val share: BigDecimal - ) - data class ReferrerReportBody( val referentsCount: Long, val share: BigDecimal ) - @ApiOperation( - value = "Get report by referral code", - notes = "Get report by referral code." - ) - @ApiResponse( - message = "OK", - code = 200, - response = ReferralCodeReportBody::class, - examples = Example( - ExampleProperty( - mediaType = "application/json", - value = """ -{ - "code": "10000", - "referentsCount": 1, - "share": 0.001 -} - """, - ) - ) - ) - @GetMapping("/reports/codes/{code}", produces = [MediaType.APPLICATION_JSON_VALUE]) - suspend fun getReportByCode( - @PathVariable code: String, - @CurrentSecurityContext securityContext: SecurityContext - ): ReferralCodeReportBody { - val referralCode = referralCodeHandler.findByCode(code) ?: throw OpexException(OpexError.NotFound) - if (referralCode.uuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) - val referencesCount = referenceHandler.findByCode(code).size.toLong() - val commissions = commissionRewardHandler.findCommissions(referralCode = code) - return ReferralCodeReportBody(code, referencesCount, commissions.sumOf { it.share }) - } - @ApiOperation( value = "Get report by uuid", notes = "Get report by uuid." @@ -87,14 +45,14 @@ class ReportController( ) ) ) - @GetMapping("/reports/users/{rewardedUuid}", produces = [MediaType.APPLICATION_JSON_VALUE]) + @GetMapping("/reports/{uuid}", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun getReportByRewardedUuid( - @PathVariable rewardedUuid: String, - @CurrentSecurityContext securityContext: SecurityContext + @PathVariable uuid: String, + principal: Principal ): ReferrerReportBody { - if (rewardedUuid != securityContext.authentication.name) throw OpexException(OpexError.UnAuthorized) - val referencesCount = referenceHandler.findByReferrerUuid(rewardedUuid).size.toLong() - val commissions = commissionRewardHandler.findCommissions(rewardedUuid = rewardedUuid) + if (uuid != principal.name) throw OpexException(OpexError.UnAuthorized) + val referencesCount = referenceHandler.findByReferrerUuid(uuid).size.toLong() + val commissions = commissionRewardHandler.findCommissions(rewardedUuid = uuid) return ReferrerReportBody(referencesCount, commissions.sumOf { it.share }) } } From 5253173595427e75811320c085b98e94eb6ea621 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Thu, 3 Mar 2022 12:26:44 +0330 Subject: [PATCH 164/169] referral: Refactor commissions controller --- .../app/controller/CommissionController.kt | 62 ++++--------------- 1 file changed, 11 insertions(+), 51 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt index b0ad87613..31e0752e9 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/CommissionController.kt @@ -24,51 +24,6 @@ class CommissionController(private val commissionRewardHandler: CommissionReward var createDate: Date ) - @ApiOperation( - value = "Get all commissions by referral code", - notes = "Get all commissions by referral code." - ) - @ApiResponse( - message = "OK", - code = 200, - response = CommissionRewardBody::class, - responseContainer = "List", - examples = Example( - ExampleProperty( - mediaType = "application/json", - value = """ -[ - { - "rewardedUuid": "b3e4f2bd-15c6-4912-bdef-161445a98193", - "referentUuid": "a5e510f9-bda8-4ecb-b500-0980f525dc52", - "referralCode": "10000", - "richTrade": 1, - "referentOrderDirection": "BID", - "share": 0.01, - "createDate": 1646213088 - } -] - """ - ) - ) - ) - @GetMapping("/commissions/{code}", produces = [MediaType.APPLICATION_JSON_VALUE]) - suspend fun getCommissionsByReferrerAndCode( - @PathVariable code: String - ): List { - return commissionRewardHandler.findCommissions(referralCode = code).map { - CommissionRewardBody( - it.rewardedUuid, - it.referentUuid, - it.referralCode, - it.richTrade.first, - it.referentOrderDirection, - it.share, - Date.from(it.createDate.atZone(ZoneId.systemDefault()).toInstant()) - ) - } - } - @ApiOperation( value = "Get all commissions", notes = "Get all commissions by referer or referent." @@ -99,10 +54,15 @@ class CommissionController(private val commissionRewardHandler: CommissionReward ) @GetMapping("/commissions", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun getCommissions( - @RequestParam rewardedUuid: String?, - @RequestParam referentUuid: String? + @RequestParam(required = false) code: String?, + @RequestParam(required = false) rewardedUuid: String?, + @RequestParam(required = false) referentUuid: String? ): List { - return commissionRewardHandler.findCommissions(referentUuid = referentUuid, rewardedUuid = rewardedUuid).map { + return commissionRewardHandler.findCommissions( + referralCode = code, + referentUuid = referentUuid, + rewardedUuid = rewardedUuid + ).map { CommissionRewardBody( it.rewardedUuid, it.referentUuid, @@ -122,9 +82,9 @@ class CommissionController(private val commissionRewardHandler: CommissionReward @ApiResponse(message = "OK", code = 200) @DeleteMapping("/commissions", produces = [MediaType.APPLICATION_JSON_VALUE]) suspend fun deleteCommissions( - @RequestParam code: String?, - @RequestParam referrerUuid: String?, - @RequestParam referentUuid: String? + @RequestParam(required = false) code: String?, + @RequestParam(required = false) referrerUuid: String?, + @RequestParam(required = false) referentUuid: String? ) { commissionRewardHandler.deleteCommissions(code, referrerUuid, referentUuid) } From 6fc3f94f7fddce1641e651f737716b0f8960d7aa Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Thu, 3 Mar 2022 13:05:12 +0330 Subject: [PATCH 165/169] referral: Remove extra constraints from reports controller --- .../referral/app/config/SecurityConfig.kt | 2 +- .../app/controller/ReferenceController.kt | 21 +++++++------------ 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt index bb7880a46..4e4b30233 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt @@ -24,7 +24,7 @@ class SecurityConfig(private val webClient: WebClient) { .pathMatchers("/swagger-ui/**").permitAll() .pathMatchers("/swagger-resources/**").permitAll() .pathMatchers("/v2/api-docs").permitAll() - .pathMatchers("/checkouts/**", "/commissions/**").hasRole("SCOPE_trust", "finance-admin") + .pathMatchers("/checkouts/**", "/commissions/**", "/references").hasRole("SCOPE_trust", "finance-admin") .pathMatchers("/**").hasAuthority("SCOPE_trust") .anyExchange().authenticated() .and() diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferenceController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferenceController.kt index 4bd1614c6..0bc2832a2 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferenceController.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ReferenceController.kt @@ -73,20 +73,13 @@ class ReferenceController( @RequestParam(required = false) code: String?, principal: Principal ): List { - if ((uuid ?: code == null) || (uuid != null && code != null)) throw OpexException( - OpexError.BadRequest, - "One and only one of (uuid, code) parameters must be provided" - ) - if (uuid != null && uuid != principal.name) throw OpexException(OpexError.UnAuthorized) - code?.let { - val referralCode = referralCodeHandler.findByCode(it) ?: throw OpexException(OpexError.NotFound) - if (referralCode.uuid != principal.name) throw OpexException(OpexError.UnAuthorized) - } - fun List.body() = map { ReferenceBody(it.referralCode.code, it.referentUuid) } - return when (code ?: uuid) { - code -> referenceHandler.findByCode(code!!).body() - uuid -> referenceHandler.findByReferrerUuid(uuid!!).body() - else -> throw IllegalStateException("All of (code, uuid) are null") + fun List.res() = map { ReferenceBody(it.referralCode.code, it.referentUuid) } + return when (uuid ?: code) { + null -> throw OpexException(OpexError.BadRequest, "One of (uuid, code) parameters must be provided") + uuid -> referenceHandler.findByReferrerUuid(uuid) + .let { it.takeIf { code == null } ?: it.filter { v -> v.referralCode.code == code } }.res() + code -> referenceHandler.findByCode(code).res() + else -> throw OpexException(OpexError.InternalServerError, "All of (code, uuid) are null") } } } From 017d045ea3cd5ae5489aa7571e788a4e9b037f9b Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Thu, 3 Mar 2022 13:25:00 +0330 Subject: [PATCH 166/169] referral: Add config controller --- .../opex/referral/app/config/SwaggerConfig.kt | 3 +- .../app/controller/ConfigController.kt | 64 +++++++++++++++++++ 2 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ConfigController.kt diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt index 83f528118..b4dcc1ca0 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SwaggerConfig.kt @@ -41,7 +41,8 @@ class SwaggerConfig { typeResolver.resolve(CommissionController.CommissionRewardBody::class.java), typeResolver.resolve(CodeController.ReferralCodeBody::class.java), typeResolver.resolve(ReferenceController.ReferenceBody::class.java), - typeResolver.resolve(ReportController.ReferrerReportBody::class.java) + typeResolver.resolve(ReportController.ReferrerReportBody::class.java), + typeResolver.resolve(ConfigController.ConfigsBody::class.java) ) .ignoredParameterTypes( AuthenticationPrincipal::class.java, diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ConfigController.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ConfigController.kt new file mode 100644 index 000000000..35d91d4bc --- /dev/null +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/controller/ConfigController.kt @@ -0,0 +1,64 @@ +package co.nilin.opex.referral.app.controller + +import co.nilin.opex.referral.core.spi.ConfigHandler +import co.nilin.opex.utility.error.data.OpexError +import co.nilin.opex.utility.error.data.OpexException +import io.swagger.annotations.ApiOperation +import io.swagger.annotations.ApiResponse +import io.swagger.annotations.Example +import io.swagger.annotations.ExampleProperty +import org.springframework.http.MediaType +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController +import java.math.BigDecimal + +@RestController +@RequestMapping("/configs") +class ConfigController( + private val configHandler: ConfigHandler +) { + data class ConfigsBody( + var name: String, + var referralCommissionReward: BigDecimal, + var paymentCurrency: String, + var minPaymentAmount: BigDecimal, + var paymentWindowSeconds: Int, + var maxReferralCodePerUser: Int + ) + + @ApiOperation(value = "Get referral configs", notes = "Get referral configs.") + @ApiResponse( + message = "OK", + code = 200, + response = ConfigsBody::class, + examples = Example( + ExampleProperty( + mediaType = "application/json", + value = """ +{ + "name": "default", + "referralCommissionReward": 0.3, + "paymentCurrency": "usdt", + "minPaymentAmount": 0, + "paymentWindowSeconds": 604800, + "maxReferralCodePerUser": 20 +} + """, + ) + ) + ) + @GetMapping(produces = [MediaType.APPLICATION_JSON_VALUE]) + suspend fun getReferralCodeByCode(): ConfigsBody { + return configHandler.findConfig("default")?.let { + ConfigsBody( + it.name, + it.referralCommissionReward, + it.paymentCurrency, + it.minPaymentAmount, + it.paymentWindowSeconds, + it.maxReferralCodePerUser + ) + } ?: throw OpexException(OpexError.InternalServerError, "Config profile (default) not found") + } +} From a10c0d5e88e418801befc02eed9b256d9cac639d Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Thu, 3 Mar 2022 13:31:38 +0330 Subject: [PATCH 167/169] referral: Remove all /hello permissions --- .../co/nilin/opex/api/ports/binance/config/SecurityConfig.kt | 1 - .../kotlin/co/nilin/opex/bcgateway/app/config/SecurityConfig.kt | 1 - .../co/nilin/opex/matching/gateway/app/config/SecurityConfig.kt | 1 - .../kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt | 1 - .../kotlin/co/nilin/opex/storage/app/config/SecurityConfig.kt | 1 - 5 files changed, 5 deletions(-) diff --git a/api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/api/ports/binance/config/SecurityConfig.kt b/api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/api/ports/binance/config/SecurityConfig.kt index 240c7cd9a..0e36d28e5 100644 --- a/api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/api/ports/binance/config/SecurityConfig.kt +++ b/api/api-ports/api-binance-rest/src/main/kotlin/co/nilin/opex/api/ports/binance/config/SecurityConfig.kt @@ -19,7 +19,6 @@ class SecurityConfig(private val webClient: WebClient) { fun springSecurityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain? { http.csrf().disable() .authorizeExchange() - .pathMatchers("/hello").permitAll() .pathMatchers("/actuator/**").permitAll() .pathMatchers("/swagger-ui/**").permitAll() .pathMatchers("/swagger-resources/**").permitAll() diff --git a/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/config/SecurityConfig.kt b/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/config/SecurityConfig.kt index 6783a6078..525dfd1bc 100644 --- a/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/config/SecurityConfig.kt +++ b/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/config/SecurityConfig.kt @@ -21,7 +21,6 @@ class SecurityConfig(@Qualifier("loadBalanced") private val webClient: WebClient fun springSecurityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain? { http.csrf().disable() .authorizeExchange() - .pathMatchers("/hello").permitAll() .pathMatchers("/actuator/**").permitAll() .pathMatchers("/swagger-ui/**").permitAll() .pathMatchers("/swagger-resources/**").permitAll() diff --git a/matching-gateway/matching-gateway-app/src/main/kotlin/co/nilin/opex/matching/gateway/app/config/SecurityConfig.kt b/matching-gateway/matching-gateway-app/src/main/kotlin/co/nilin/opex/matching/gateway/app/config/SecurityConfig.kt index 0bb36ae95..ed4019789 100644 --- a/matching-gateway/matching-gateway-app/src/main/kotlin/co/nilin/opex/matching/gateway/app/config/SecurityConfig.kt +++ b/matching-gateway/matching-gateway-app/src/main/kotlin/co/nilin/opex/matching/gateway/app/config/SecurityConfig.kt @@ -19,7 +19,6 @@ class SecurityConfig(private val webClient: WebClient) { fun springSecurityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain? { http.csrf().disable() .authorizeExchange() - .pathMatchers("/hello").permitAll() .pathMatchers("/actuator/**").permitAll() .pathMatchers("/swagger-ui/**").permitAll() .pathMatchers("/swagger-resources/**").permitAll() diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt index 4e4b30233..c409a34ee 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/SecurityConfig.kt @@ -19,7 +19,6 @@ class SecurityConfig(private val webClient: WebClient) { fun springSecurityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain? { http.csrf().disable() .authorizeExchange() - .pathMatchers("/hello").permitAll() .pathMatchers("/actuator/**").permitAll() .pathMatchers("/swagger-ui/**").permitAll() .pathMatchers("/swagger-resources/**").permitAll() diff --git a/storage/storage-app/src/main/kotlin/co/nilin/opex/storage/app/config/SecurityConfig.kt b/storage/storage-app/src/main/kotlin/co/nilin/opex/storage/app/config/SecurityConfig.kt index 541dd4daf..aa21afc16 100644 --- a/storage/storage-app/src/main/kotlin/co/nilin/opex/storage/app/config/SecurityConfig.kt +++ b/storage/storage-app/src/main/kotlin/co/nilin/opex/storage/app/config/SecurityConfig.kt @@ -20,7 +20,6 @@ class SecurityConfig(private val webClient: WebClient) { fun springSecurityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain? { http.csrf().disable() .authorizeExchange() - .pathMatchers("/hello").permitAll() .pathMatchers("/actuator/**").permitAll() .pathMatchers("/swagger-ui/**").permitAll() .pathMatchers("/swagger-resources/**").permitAll() From 4e8a2b6278c4a1846679e4a8e66423ee44d66221 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Thu, 3 Mar 2022 13:38:34 +0330 Subject: [PATCH 168/169] referral: Refactor kafka configs --- .../co/nilin/opex/referral/app/config/AppConfig.kt | 2 +- .../ports/kafka/listener/config/KafkaConfig.kt | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt index 98eb67bb1..eafdb3834 100644 --- a/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt +++ b/referral/referral-app/src/main/kotlin/co/nilin/opex/referral/app/config/AppConfig.kt @@ -43,7 +43,7 @@ class AppConfig { offset: Long, timestamp: Long ) { - runBlocking(AppDispatchers.kafkaExecutor) { + runBlocking { val makerCommissions = commissionRewardCalculator.calculate(richTrade.makerOuid, richTrade) val takerCommissions = commissionRewardCalculator.calculate(richTrade.takerOuid, richTrade) makerCommissions.forEach { commissionRewardPersister.save(it) } diff --git a/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/config/KafkaConfig.kt b/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/config/KafkaConfig.kt index 4d01523e1..f36164f8e 100644 --- a/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/config/KafkaConfig.kt +++ b/referral/referral-ports/referral-eventlistener-kafka/src/main/kotlin/co/nilin/opex/referral/ports/kafka/listener/config/KafkaConfig.kt @@ -6,6 +6,7 @@ import co.nilin.opex.referral.ports.kafka.listener.spi.RichTradeListener import org.apache.kafka.clients.admin.NewTopic import org.apache.kafka.clients.consumer.ConsumerConfig import org.apache.kafka.clients.producer.ProducerConfig +import org.apache.kafka.common.config.TopicConfig import org.apache.kafka.common.serialization.StringDeserializer import org.apache.kafka.common.serialization.StringSerializer import org.springframework.beans.factory.annotation.Autowired @@ -15,11 +16,13 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.context.support.GenericApplicationContext +import org.springframework.kafka.config.TopicBuilder import org.springframework.kafka.core.* import org.springframework.kafka.listener.ConcurrentMessageListenerContainer import org.springframework.kafka.listener.ContainerProperties import org.springframework.kafka.support.serializer.JsonDeserializer import org.springframework.kafka.support.serializer.JsonSerializer +import java.util.function.Supplier import java.util.regex.Pattern @Configuration @@ -80,6 +83,12 @@ class KafkaConfig { @Autowired fun createTopics(applicationContext: GenericApplicationContext) { - applicationContext.registerBean("topic_richTrade", NewTopic::class.java, "richTrade", 10, 1) + applicationContext.registerBean("topic_richTrade", NewTopic::class.java, Supplier { + TopicBuilder.name("richTrade") + .partitions(10) + .replicas(3) + .config(TopicConfig.MIN_IN_SYNC_REPLICAS_CONFIG, "2") + .build() + }) } } From 8214292b529a1192e81ed80c5e9904e21352f3c8 Mon Sep 17 00:00:00 2001 From: metalicn20 Date: Thu, 3 Mar 2022 14:04:37 +0330 Subject: [PATCH 169/169] referral: Add payment currency to commission reward record --- .../core/api/SymbolPriceCalculator.kt | 4 +- .../referral/core/model/CommissionReward.kt | 1 + .../service/CommissionRewardCalculatorImpl.kt | 17 +++++- .../proxy/impl/SymbolPriceCalculatorImpl.kt | 13 ++--- .../ports/postgres/dao/CheckoutRecord.kt | 3 +- .../ports/postgres/dao/CommissionReward.kt | 1 + .../impl/CheckoutRecordHandlerImpl.kt | 8 ++- .../impl/CommissionRewardHandlerImpl.kt | 6 +- .../impl/CommissionRewardPersisterImpl.kt | 5 +- .../src/main/resources/schema.sql | 1 + .../wallet/proxy/impl/CheckoutHandlerImpl.kt | 58 ++++--------------- 11 files changed, 49 insertions(+), 68 deletions(-) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/SymbolPriceCalculator.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/SymbolPriceCalculator.kt index 04f07660b..0952039c0 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/SymbolPriceCalculator.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/api/SymbolPriceCalculator.kt @@ -3,5 +3,5 @@ package co.nilin.opex.referral.core.api import java.math.BigDecimal interface SymbolPriceCalculator { - suspend fun getPrice(symbol: String): BigDecimal -} \ No newline at end of file + suspend fun getPrice(symbol: String, paymentCurrency: String): BigDecimal +} diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt index d73a0ae41..c5989cd90 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/model/CommissionReward.kt @@ -13,5 +13,6 @@ data class CommissionReward( var richTrade: Pair, var referentOrderDirection: OrderDirection, var share: BigDecimal, + var paymentCurrency: String, var createDate: LocalDateTime ) diff --git a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt index dfbe64fae..3fdf47101 100644 --- a/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt +++ b/referral/referral-core/src/main/kotlin/co/nilin/opex/referral/core/service/CommissionRewardCalculatorImpl.kt @@ -4,6 +4,7 @@ import co.nilin.opex.accountant.core.inout.RichTrade import co.nilin.opex.referral.core.api.CommissionRewardCalculator import co.nilin.opex.referral.core.api.SymbolPriceCalculator import co.nilin.opex.referral.core.model.CommissionReward +import co.nilin.opex.referral.core.spi.ConfigHandler import co.nilin.opex.referral.core.spi.ReferenceHandler import org.springframework.stereotype.Service import java.math.BigDecimal @@ -12,16 +13,24 @@ import java.time.LocalDateTime @Service class CommissionRewardCalculatorImpl( private val symbolPriceCalculator: SymbolPriceCalculator, - private val referenceHandler: ReferenceHandler + private val referenceHandler: ReferenceHandler, + private val configHandler: ConfigHandler ) : CommissionRewardCalculator { override suspend fun calculate(ouid: String, richTrade: RichTrade): List { if (ouid != richTrade.makerOuid && ouid != richTrade.takerOuid) throw IllegalArgumentException("Order is not correct") + val paymentCurrency = configHandler.findConfig("default")!!.paymentCurrency val uuid = if (ouid == richTrade.makerOuid) richTrade.makerUuid else richTrade.takerUuid val reference = referenceHandler.findByReferentUuid(uuid) ?: return emptyList() val commission = - if (ouid == richTrade.makerOuid) richTrade.makerCommision * symbolPriceCalculator.getPrice(richTrade.makerCommisionAsset) - else richTrade.takerCommision * symbolPriceCalculator.getPrice(richTrade.takerCommisionAsset) + if (ouid == richTrade.makerOuid) richTrade.makerCommision * symbolPriceCalculator.getPrice( + richTrade.makerCommisionAsset, + paymentCurrency + ) + else richTrade.takerCommision * symbolPriceCalculator.getPrice( + richTrade.takerCommisionAsset, + paymentCurrency + ) val direction = if (ouid == richTrade.makerOuid) richTrade.makerDirection else richTrade.takerDirection val ret = mutableListOf() if (commission > BigDecimal.ZERO) { @@ -35,6 +44,7 @@ class CommissionRewardCalculatorImpl( richTrade.id to richTrade, direction, commission * (BigDecimal.ONE - reference.referralCode.referentCommission), + paymentCurrency, LocalDateTime.now() ) ) @@ -49,6 +59,7 @@ class CommissionRewardCalculatorImpl( richTrade.id to richTrade, direction, commission * reference.referralCode.referentCommission, + paymentCurrency, LocalDateTime.now() ) ) diff --git a/referral/referral-ports/referral-api-proxy/src/main/kotlin/co/nilin/opex/referral/ports/api/proxy/impl/SymbolPriceCalculatorImpl.kt b/referral/referral-ports/referral-api-proxy/src/main/kotlin/co/nilin/opex/referral/ports/api/proxy/impl/SymbolPriceCalculatorImpl.kt index edf685da7..c3bddf944 100644 --- a/referral/referral-ports/referral-api-proxy/src/main/kotlin/co/nilin/opex/referral/ports/api/proxy/impl/SymbolPriceCalculatorImpl.kt +++ b/referral/referral-ports/referral-api-proxy/src/main/kotlin/co/nilin/opex/referral/ports/api/proxy/impl/SymbolPriceCalculatorImpl.kt @@ -2,19 +2,14 @@ package co.nilin.opex.referral.ports.api.proxy.impl import co.nilin.opex.referral.core.api.SymbolPriceCalculator import co.nilin.opex.referral.core.spi.ApiProxy -import co.nilin.opex.referral.core.spi.ConfigHandler import org.springframework.stereotype.Service import java.math.BigDecimal @Service -class SymbolPriceCalculatorImpl( - private val apiProxy: ApiProxy, - private val configHandler: ConfigHandler -) : SymbolPriceCalculator { - override suspend fun getPrice(symbol: String): BigDecimal { - val out = configHandler.findConfig("default")!!.paymentCurrency - return if (out == symbol) BigDecimal.ONE else - apiProxy.fetchLastPrice("$symbol$out") ?: apiProxy.fetchLastPrice("$out$symbol") +class SymbolPriceCalculatorImpl(private val apiProxy: ApiProxy) : SymbolPriceCalculator { + override suspend fun getPrice(symbol: String, paymentCurrency: String): BigDecimal { + return if (paymentCurrency == symbol) BigDecimal.ONE else + apiProxy.fetchLastPrice("$symbol$paymentCurrency") ?: apiProxy.fetchLastPrice("$paymentCurrency$symbol") ?.takeIf { it > BigDecimal.ZERO } ?.let { BigDecimal.ONE / it } ?: BigDecimal.ZERO } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutRecord.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutRecord.kt index 140dd0bb9..68ca59c24 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutRecord.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CheckoutRecord.kt @@ -25,8 +25,9 @@ data class CheckoutRecordProjected( var richTradeId: Long, var referentOrderDirection: OrderDirection, var share: BigDecimal, + var paymentCurrency: String, var transferRef: String?, var createDate: LocalDateTime, var updateDate: LocalDateTime, var checkoutState: CheckoutState -) \ No newline at end of file +) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt index 344d8a91d..9e16cd838 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/dao/CommissionReward.kt @@ -15,5 +15,6 @@ data class CommissionReward( var richTradeId: Long, var referentOrderDirection: OrderDirection, var share: BigDecimal, + var paymentCurrency: String, var createDate: LocalDateTime? = null ) diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CheckoutRecordHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CheckoutRecordHandlerImpl.kt index 8573c0034..aa6341826 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CheckoutRecordHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CheckoutRecordHandlerImpl.kt @@ -5,8 +5,8 @@ import co.nilin.opex.referral.core.model.CheckoutState import co.nilin.opex.referral.core.model.CommissionReward import co.nilin.opex.referral.core.spi.CheckoutRecordHandler import co.nilin.opex.referral.ports.postgres.repository.CheckoutRecordRepository +import kotlinx.coroutines.reactive.awaitFirstOrNull import kotlinx.coroutines.reactive.awaitSingle -import kotlinx.coroutines.reactive.awaitSingleOrDefault import org.springframework.stereotype.Service import java.math.BigDecimal import java.util.* @@ -25,13 +25,14 @@ class CheckoutRecordHandlerImpl(private val checkoutRecordRepository: CheckoutRe Pair(it.richTradeId, null), it.referentOrderDirection, it.share, + it.paymentCurrency, it.createDate ), it.checkoutState, it.transferRef, it.updateDate ) - }.collectList().awaitSingleOrDefault(emptyList()) + }.collectList().awaitFirstOrNull() ?: emptyList() } override suspend fun findUserCommissionsWhereTotalGreaterAndEqualTo( @@ -49,6 +50,7 @@ class CheckoutRecordHandlerImpl(private val checkoutRecordRepository: CheckoutRe Pair(it.richTradeId, null), it.referentOrderDirection, it.share, + it.paymentCurrency, it.createDate ), it.checkoutState, @@ -70,6 +72,7 @@ class CheckoutRecordHandlerImpl(private val checkoutRecordRepository: CheckoutRe Pair(it.richTradeId, null), it.referentOrderDirection, it.share, + it.paymentCurrency, it.createDate ), it.checkoutState, @@ -93,6 +96,7 @@ class CheckoutRecordHandlerImpl(private val checkoutRecordRepository: CheckoutRe Pair(it.richTradeId, null), it.referentOrderDirection, it.share, + it.paymentCurrency, it.createDate ), it.checkoutState, diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt index a0e0eaf5e..4f264d83f 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardHandlerImpl.kt @@ -3,8 +3,7 @@ package co.nilin.opex.referral.ports.postgres.impl import co.nilin.opex.referral.core.model.CommissionReward import co.nilin.opex.referral.core.spi.CommissionRewardHandler import co.nilin.opex.referral.ports.postgres.repository.CommissionRewardRepository -import kotlinx.coroutines.reactive.awaitSingleOrDefault -import kotlinx.coroutines.reactive.awaitSingleOrNull +import kotlinx.coroutines.reactor.awaitSingleOrNull import org.springframework.stereotype.Service @Service @@ -29,9 +28,10 @@ class CommissionRewardHandlerImpl( Pair(it.richTradeId, null), it.referentOrderDirection, it.share, + it.paymentCurrency, it.createDate!! ) - }.collectList().awaitSingleOrDefault(emptyList()) + }.collectList().awaitSingleOrNull() ?: emptyList() } override suspend fun deleteCommissions(referralCode: String?, rewardedUuid: String?, referentUuid: String?) { diff --git a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt index 0779b68e5..a0b3982a1 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt +++ b/referral/referral-ports/referral-persister-postgres/src/main/kotlin/co/nilin/opex/referral/ports/postgres/impl/CommissionRewardPersisterImpl.kt @@ -3,7 +3,7 @@ package co.nilin.opex.referral.ports.postgres.impl import co.nilin.opex.referral.core.model.CommissionReward import co.nilin.opex.referral.core.spi.CommissionRewardPersister import co.nilin.opex.referral.ports.postgres.repository.CommissionRewardRepository -import kotlinx.coroutines.reactive.awaitSingleOrNull +import kotlinx.coroutines.reactor.awaitSingleOrNull import org.springframework.stereotype.Service @Service @@ -18,7 +18,8 @@ class CommissionRewardPersisterImpl(private val commissionRewardRepository: Comm commissionReward.referralCode, commissionReward.richTrade.first, commissionReward.referentOrderDirection, - commissionReward.share + commissionReward.share, + commissionReward.paymentCurrency ) ).awaitSingleOrNull() } diff --git a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql index d5180f38f..d4f70e6c9 100644 --- a/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql +++ b/referral/referral-ports/referral-persister-postgres/src/main/resources/schema.sql @@ -35,6 +35,7 @@ CREATE TABLE IF NOT EXISTS commission_rewards ( rich_trade_id BIGINT NOT NULL, referent_order_direction VARCHAR(20) NOT NULL, share DECIMAL NOT NULL, + payment_currency VARCHAR(20) NOT NULL, create_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, CONSTRAINT reward_once_constraint UNIQUE (rich_trade_id, rewarded_uuid, referent_order_direction) ); diff --git a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt index 00eba3067..0224fe63e 100644 --- a/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt +++ b/referral/referral-ports/referral-wallet-proxy/src/main/kotlin/co/nilin/opex/referral/ports/wallet/proxy/impl/CheckoutHandlerImpl.kt @@ -1,5 +1,6 @@ package co.nilin.opex.referral.ports.wallet.proxy.impl +import co.nilin.opex.referral.core.model.CheckoutRecord import co.nilin.opex.referral.core.spi.CheckoutHandler import co.nilin.opex.referral.core.spi.CheckoutRecordHandler import co.nilin.opex.referral.core.spi.ConfigHandler @@ -20,65 +21,30 @@ class CheckoutHandlerImpl( val config = configHandler.findConfig("default")!! val min = config.minPaymentAmount val commissions = checkoutRecordHandler.findUserCommissionsWhereTotalGreaterAndEqualTo(uuid, min) - val transferRef = UUID.randomUUID().toString() - coroutineScope { - val totalShare = commissions.sumOf { it.commissionReward.share } - if (walletProxy.canFulfil(config.paymentCurrency, "system", "1", totalShare)) { - walletProxy.transfer( - config.paymentCurrency, - "main", - "1", - "main", - uuid, - totalShare, - "", - transferRef - ) - commissions.forEach { - launch { checkoutRecordHandler.checkout(it.commissionReward.id, transferRef) } - } - } - } + checkout(uuid, commissions) } override suspend fun checkoutEveryCandidate(min: BigDecimal) { - val config = configHandler.findConfig("default")!! val commissions = checkoutRecordHandler.findAllCommissionsWhereTotalGreaterAndEqualTo(min) .groupBy { it.commissionReward.rewardedUuid } - coroutineScope { - commissions.forEach { (uuid, c) -> - val transferRef = UUID.randomUUID().toString() - coroutineScope { - val totalShare = c.sumOf { it.commissionReward.share } - if (walletProxy.canFulfil(config.paymentCurrency, "main", "1", totalShare)) { - walletProxy.transfer( - config.paymentCurrency, - "main", - "1", - "main", - uuid, - totalShare, - "", - transferRef - ) - c.forEach { launch { checkoutRecordHandler.checkout(it.commissionReward.id, transferRef) } } - } - } - } - } + coroutineScope { commissions.forEach { (uuid, c) -> checkout(uuid, c) } } } override suspend fun checkoutOlderThan(date: Date) { - val config = configHandler.findConfig("default")!! val commissions = checkoutRecordHandler.findCommissionsWherePendingDateLessOrEqualThan(date) .groupBy { it.commissionReward.rewardedUuid } + coroutineScope { commissions.forEach { (uuid, c) -> checkout(uuid, c) } } + } + + private suspend fun checkout(uuid: String, commissions: Iterable) { + val m = commissions.groupBy { it.commissionReward.paymentCurrency } + val transferRef = UUID.randomUUID().toString() coroutineScope { - commissions.forEach { (uuid, c) -> - val transferRef = UUID.randomUUID().toString() + m.forEach { (paymentCurrency, c) -> val totalShare = c.sumOf { it.commissionReward.share } - if (walletProxy.canFulfil(config.paymentCurrency, "main", "1", totalShare)) { + if (walletProxy.canFulfil(paymentCurrency, "main", "1", totalShare)) { walletProxy.transfer( - config.paymentCurrency, + paymentCurrency, "main", "1", "main",