112 lines
5.0 KiB
Kotlin
112 lines
5.0 KiB
Kotlin
package com.android.trisolarisserver.controller
|
|
|
|
import com.android.trisolarisserver.component.PropertyAccess
|
|
import com.android.trisolarisserver.controller.dto.PayuPaymentLinkSettingsResponse
|
|
import com.android.trisolarisserver.controller.dto.PayuPaymentLinkSettingsUpsertRequest
|
|
import com.android.trisolarisserver.models.payment.PayuPaymentLinkSettings
|
|
import com.android.trisolarisserver.models.property.Role
|
|
import com.android.trisolarisserver.repo.PayuPaymentLinkSettingsRepo
|
|
import com.android.trisolarisserver.repo.PropertyRepo
|
|
import com.android.trisolarisserver.security.MyPrincipal
|
|
import org.springframework.http.HttpStatus
|
|
import org.springframework.security.core.annotation.AuthenticationPrincipal
|
|
import org.springframework.web.bind.annotation.GetMapping
|
|
import org.springframework.web.bind.annotation.PathVariable
|
|
import org.springframework.web.bind.annotation.PutMapping
|
|
import org.springframework.web.bind.annotation.RequestBody
|
|
import org.springframework.web.bind.annotation.RequestMapping
|
|
import org.springframework.web.bind.annotation.RestController
|
|
import org.springframework.web.server.ResponseStatusException
|
|
import java.time.OffsetDateTime
|
|
import java.util.UUID
|
|
|
|
@RestController
|
|
@RequestMapping("/properties/{propertyId}/payu-payment-link-settings")
|
|
class PayuPaymentLinkSettingsController(
|
|
private val propertyAccess: PropertyAccess,
|
|
private val propertyRepo: PropertyRepo,
|
|
private val settingsRepo: PayuPaymentLinkSettingsRepo
|
|
) {
|
|
|
|
@GetMapping
|
|
fun getSettings(
|
|
@PathVariable propertyId: UUID,
|
|
@AuthenticationPrincipal principal: MyPrincipal?
|
|
): PayuPaymentLinkSettingsResponse {
|
|
requireRole(propertyAccess, propertyId, principal, Role.ADMIN, Role.MANAGER)
|
|
val settings = settingsRepo.findByPropertyId(propertyId)
|
|
if (settings == null) {
|
|
return PayuPaymentLinkSettingsResponse(
|
|
propertyId = propertyId,
|
|
configured = false,
|
|
merchantId = null,
|
|
isTest = false,
|
|
hasClientId = false,
|
|
hasClientSecret = false,
|
|
hasAccessToken = false
|
|
)
|
|
}
|
|
return settings.toResponse()
|
|
}
|
|
|
|
@PutMapping
|
|
fun upsertSettings(
|
|
@PathVariable propertyId: UUID,
|
|
@AuthenticationPrincipal principal: MyPrincipal?,
|
|
@RequestBody request: PayuPaymentLinkSettingsUpsertRequest
|
|
): PayuPaymentLinkSettingsResponse {
|
|
requireRole(propertyAccess, propertyId, principal, Role.ADMIN, Role.MANAGER)
|
|
val property = propertyRepo.findById(propertyId).orElseThrow {
|
|
ResponseStatusException(HttpStatus.NOT_FOUND, "Property not found")
|
|
}
|
|
val merchantId = request.merchantId.trim().ifBlank {
|
|
throw ResponseStatusException(HttpStatus.BAD_REQUEST, "merchantId required")
|
|
}
|
|
val isTest = request.isTest ?: false
|
|
val existing = settingsRepo.findByPropertyId(propertyId)
|
|
val updated = if (existing == null) {
|
|
PayuPaymentLinkSettings(
|
|
property = property,
|
|
merchantId = merchantId,
|
|
clientId = request.clientId?.trim()?.ifBlank { null },
|
|
clientSecret = request.clientSecret?.trim()?.ifBlank { null },
|
|
accessToken = request.accessToken?.trim()?.ifBlank { null },
|
|
isTest = isTest,
|
|
updatedAt = OffsetDateTime.now()
|
|
)
|
|
} else {
|
|
existing.merchantId = merchantId
|
|
val oldClientId = existing.clientId
|
|
val oldClientSecret = existing.clientSecret
|
|
val oldIsTest = existing.isTest
|
|
if (request.clientId != null) existing.clientId = request.clientId.trim().ifBlank { null }
|
|
if (request.clientSecret != null) existing.clientSecret = request.clientSecret.trim().ifBlank { null }
|
|
if (request.accessToken != null) existing.accessToken = request.accessToken.trim().ifBlank { null }
|
|
existing.isTest = isTest
|
|
val credsChanged = (request.clientId != null && existing.clientId != oldClientId) ||
|
|
(request.clientSecret != null && existing.clientSecret != oldClientSecret) ||
|
|
oldIsTest != isTest
|
|
if (credsChanged) {
|
|
existing.accessToken = null
|
|
existing.tokenExpiresAt = null
|
|
}
|
|
existing.updatedAt = OffsetDateTime.now()
|
|
existing
|
|
}
|
|
return settingsRepo.save(updated).toResponse()
|
|
}
|
|
}
|
|
|
|
private fun PayuPaymentLinkSettings.toResponse(): PayuPaymentLinkSettingsResponse {
|
|
val propertyId = property.id ?: throw ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Property id missing")
|
|
return PayuPaymentLinkSettingsResponse(
|
|
propertyId = propertyId,
|
|
configured = true,
|
|
merchantId = merchantId,
|
|
isTest = isTest,
|
|
hasClientId = !clientId.isNullOrBlank(),
|
|
hasClientSecret = !clientSecret.isNullOrBlank(),
|
|
hasAccessToken = !accessToken.isNullOrBlank()
|
|
)
|
|
}
|