From e8bec37cf7ac8d9b9f4b93005b36ddf55e32be7d Mon Sep 17 00:00:00 2001 From: ebrahimmfadae Date: Mon, 6 Jun 2022 18:00:10 +0430 Subject: [PATCH 1/2] bc-gateway: Add ability to add reserved addresses by file --- .../bcgateway/app/config/SecurityConfig.kt | 1 + .../app/controller/AddressController.kt | 44 ++++++++++++++++--- .../core/spi/ReservedAddressHandler.kt | 1 + .../impl/ReservedAddressHandlerImpl.kt | 13 +++++- 4 files changed, 51 insertions(+), 8 deletions(-) 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 525dfd1bc..ff3cad0d8 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 @@ -28,6 +28,7 @@ class SecurityConfig(@Qualifier("loadBalanced") private val webClient: WebClient .pathMatchers("/admin/**").hasRole("SCOPE_trust", "system-admin") .pathMatchers("/address/**").permitAll() .pathMatchers("/deposit/**").permitAll() + .pathMatchers("/addresses/**").hasRole("SCOPE_trust", "system-admin") .anyExchange().authenticated() .and() .oauth2ResourceServer() diff --git a/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/controller/AddressController.kt b/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/controller/AddressController.kt index e505b99ba..48cb1f61f 100644 --- a/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/controller/AddressController.kt +++ b/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/controller/AddressController.kt @@ -3,13 +3,25 @@ package co.nilin.opex.bcgateway.app.controller import co.nilin.opex.bcgateway.core.api.AssignAddressService import co.nilin.opex.bcgateway.core.model.AssignedAddress import co.nilin.opex.bcgateway.core.model.Currency -import org.springframework.web.bind.annotation.PostMapping -import org.springframework.web.bind.annotation.RequestBody -import org.springframework.web.bind.annotation.RestController +import co.nilin.opex.bcgateway.core.model.ReservedAddress +import co.nilin.opex.bcgateway.core.spi.AddressTypeHandler +import co.nilin.opex.bcgateway.core.spi.ReservedAddressHandler +import co.nilin.opex.utility.error.data.OpexError +import co.nilin.opex.utility.error.data.OpexException +import kotlinx.coroutines.reactive.awaitSingle +import kotlinx.coroutines.reactor.awaitSingleOrNull +import org.springframework.http.codec.multipart.FilePart +import org.springframework.web.bind.annotation.* +import reactor.core.publisher.Mono +import java.io.File +import java.nio.charset.StandardCharsets @RestController -class AddressController(val assignAddressService: AssignAddressService) { - +class AddressController( + private val assignAddressService: AssignAddressService, + private val reservedAddressHandler: ReservedAddressHandler, + private val addressTypeHandler: AddressTypeHandler +) { data class AssignAddressRequest(val uuid: String, val currency: String) data class AssignAddressResponse(val addresses: List) @@ -23,4 +35,24 @@ class AddressController(val assignAddressService: AssignAddressService) { return AssignAddressResponse(assignedAddress) } -} \ No newline at end of file + /** + * (address, regex, address_type) + */ + @PutMapping("/addresses") + suspend fun putAddresses(@RequestPart("file") file: Mono) { + val f = File("reserved.csv") + file.awaitSingle().transferTo(f).awaitSingleOrNull() ?: throw OpexException( + OpexError.BadRequest, + "Invalid File" + ) + val csv = f.readLines(StandardCharsets.UTF_8) + val addressTypes = addressTypeHandler.fetchAll().associateBy { it.type } + val items = csv.map { + val columns = it.split(",") + if (columns.size != 3) throw OpexException(OpexError.BadRequest, "Invalid CSV File") + val at = addressTypes[columns[2]] ?: throw OpexException(OpexError.BadRequest, "Invalid Address Type") + ReservedAddress(columns[0], columns[1], at) + } + reservedAddressHandler.addReservedAddress(items) + } +} diff --git a/bc-gateway/bc-gateway-core/src/main/kotlin/co/nilin/opex/bcgateway/core/spi/ReservedAddressHandler.kt b/bc-gateway/bc-gateway-core/src/main/kotlin/co/nilin/opex/bcgateway/core/spi/ReservedAddressHandler.kt index 67a3c837b..d970c6cb9 100644 --- a/bc-gateway/bc-gateway-core/src/main/kotlin/co/nilin/opex/bcgateway/core/spi/ReservedAddressHandler.kt +++ b/bc-gateway/bc-gateway-core/src/main/kotlin/co/nilin/opex/bcgateway/core/spi/ReservedAddressHandler.kt @@ -4,6 +4,7 @@ import co.nilin.opex.bcgateway.core.model.AddressType import co.nilin.opex.bcgateway.core.model.ReservedAddress interface ReservedAddressHandler { + suspend fun addReservedAddress(list: List) suspend fun peekReservedAddress(addressType: AddressType): ReservedAddress? suspend fun remove(reservedAddress: ReservedAddress) } \ No newline at end of file diff --git a/bc-gateway/bc-gateway-ports/bc-gateway-persister-postgres/src/main/kotlin/co/nilin/opex/bcgateway/ports/postgres/impl/ReservedAddressHandlerImpl.kt b/bc-gateway/bc-gateway-ports/bc-gateway-persister-postgres/src/main/kotlin/co/nilin/opex/bcgateway/ports/postgres/impl/ReservedAddressHandlerImpl.kt index d4071514a..a6c90cb53 100644 --- a/bc-gateway/bc-gateway-ports/bc-gateway-persister-postgres/src/main/kotlin/co/nilin/opex/bcgateway/ports/postgres/impl/ReservedAddressHandlerImpl.kt +++ b/bc-gateway/bc-gateway-ports/bc-gateway-persister-postgres/src/main/kotlin/co/nilin/opex/bcgateway/ports/postgres/impl/ReservedAddressHandlerImpl.kt @@ -2,15 +2,24 @@ package co.nilin.opex.bcgateway.ports.postgres.impl import co.nilin.opex.bcgateway.core.model.AddressType import co.nilin.opex.bcgateway.core.model.ReservedAddress +import co.nilin.opex.bcgateway.core.spi.AddressTypeHandler import co.nilin.opex.bcgateway.core.spi.ReservedAddressHandler import co.nilin.opex.bcgateway.ports.postgres.dao.ReservedAddressRepository +import co.nilin.opex.bcgateway.ports.postgres.model.ReservedAddressModel import kotlinx.coroutines.reactive.awaitFirst import kotlinx.coroutines.reactive.awaitFirstOrNull import org.springframework.stereotype.Component @Component -class ReservedAddressHandlerImpl(private val reservedAddressRepository: ReservedAddressRepository) : - ReservedAddressHandler { +class ReservedAddressHandlerImpl( + private val reservedAddressRepository: ReservedAddressRepository, + private val addressTypeHandler: AddressTypeHandler +) : ReservedAddressHandler { + override suspend fun addReservedAddress(list: List) { + val items = list.map { ReservedAddressModel(null, it.address, it.memo, it.type.id) } + reservedAddressRepository.saveAll(items).collectList().awaitFirst() + } + override suspend fun peekReservedAddress(addressType: AddressType): ReservedAddress? { return reservedAddressRepository.peekFirstAdded(addressType.id) .map { ReservedAddress(it.address, it.memo, addressType) }.awaitFirstOrNull() From 4546913ca87636b6a9c196deb84d8296bfb0a7fb Mon Sep 17 00:00:00 2001 From: ebrahimmfadae Date: Mon, 6 Jun 2022 18:02:41 +0430 Subject: [PATCH 2/2] bc-gateway: Ignore constraint errors when adding address --- .../nilin/opex/bcgateway/app/controller/AddressController.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/controller/AddressController.kt b/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/controller/AddressController.kt index 48cb1f61f..afc7f5272 100644 --- a/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/controller/AddressController.kt +++ b/bc-gateway/bc-gateway-app/src/main/kotlin/co/nilin/opex/bcgateway/app/controller/AddressController.kt @@ -53,6 +53,7 @@ class AddressController( val at = addressTypes[columns[2]] ?: throw OpexException(OpexError.BadRequest, "Invalid Address Type") ReservedAddress(columns[0], columns[1], at) } - reservedAddressHandler.addReservedAddress(items) + // Do nothing in case of duplication (Or any constraint issue) + runCatching { reservedAddressHandler.addReservedAddress(items) } } }