Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<AssignedAddress>)

Expand All @@ -23,4 +35,25 @@ class AddressController(val assignAddressService: AssignAddressService) {
return AssignAddressResponse(assignedAddress)
}

}
/**
* (address, regex, address_type)
*/
@PutMapping("/addresses")
suspend fun putAddresses(@RequestPart("file") file: Mono<FilePart>) {
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)
}
// Do nothing in case of duplication (Or any constraint issue)
runCatching { reservedAddressHandler.addReservedAddress(items) }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<ReservedAddress>)
suspend fun peekReservedAddress(addressType: AddressType): ReservedAddress?
suspend fun remove(reservedAddress: ReservedAddress)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<ReservedAddress>) {
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()
Expand Down