diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/RazorpayQrPayments.kt b/src/main/kotlin/com/android/trisolarisserver/controller/RazorpayQrPayments.kt index 1119b12..92a48c6 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/RazorpayQrPayments.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/RazorpayQrPayments.kt @@ -2,6 +2,7 @@ package com.android.trisolarisserver.controller import com.android.trisolarisserver.component.PropertyAccess import com.android.trisolarisserver.controller.dto.RazorpayQrGenerateRequest +import com.android.trisolarisserver.controller.dto.RazorpayQrEventResponse import com.android.trisolarisserver.controller.dto.RazorpayQrGenerateResponse import com.android.trisolarisserver.models.booking.BookingStatus import com.android.trisolarisserver.models.payment.RazorpayQrRequest @@ -9,6 +10,7 @@ import com.android.trisolarisserver.models.property.Role import com.android.trisolarisserver.db.repo.BookingRepo import com.android.trisolarisserver.repo.RazorpayQrRequestRepo import com.android.trisolarisserver.repo.RazorpaySettingsRepo +import com.android.trisolarisserver.repo.RazorpayWebhookLogRepo import com.android.trisolarisserver.security.MyPrincipal import com.fasterxml.jackson.databind.ObjectMapper import org.springframework.http.HttpEntity @@ -38,6 +40,7 @@ class RazorpayQrPayments( private val bookingRepo: BookingRepo, private val settingsRepo: RazorpaySettingsRepo, private val qrRequestRepo: RazorpayQrRequestRepo, + private val webhookLogRepo: RazorpayWebhookLogRepo, private val restTemplate: RestTemplate, private val objectMapper: ObjectMapper ) { @@ -193,6 +196,35 @@ class RazorpayQrPayments( ) } + @GetMapping("/qr/{qrId}/events") + fun qrEvents( + @PathVariable propertyId: UUID, + @PathVariable qrId: String, + @AuthenticationPrincipal principal: MyPrincipal? + ): List { + requireRole(propertyAccess, propertyId, principal, Role.ADMIN, Role.MANAGER, Role.STAFF) + val logs = webhookLogRepo.findByPropertyIdOrderByReceivedAtDesc(propertyId) + val out = mutableListOf() + for (log in logs) { + val payload = log.payload ?: continue + val node = runCatching { objectMapper.readTree(payload) }.getOrNull() ?: continue + val event = node.path("event").asText(null) + val qrEntity = node.path("payload").path("qr_code").path("entity") + val eventQrId = qrEntity.path("id").asText(null) + if (eventQrId != qrId) continue + val status = qrEntity.path("status").asText(null) + out.add( + RazorpayQrEventResponse( + event = event, + qrId = eventQrId, + status = status, + receivedAt = log.receivedAt.toString() + ) + ) + } + return out + } + private fun postJson(url: String, settings: com.android.trisolarisserver.models.payment.RazorpaySettings, json: String): ResponseEntity { val headers = HttpHeaders() headers.contentType = MediaType.APPLICATION_JSON diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/dto/RazorpayDtos.kt b/src/main/kotlin/com/android/trisolarisserver/controller/dto/RazorpayDtos.kt index a54ac6d..16cabc7 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/dto/RazorpayDtos.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/dto/RazorpayDtos.kt @@ -56,3 +56,10 @@ data class RazorpayPaymentLinkCreateResponse( val currency: String, val paymentLink: String? ) + +data class RazorpayQrEventResponse( + val event: String?, + val qrId: String?, + val status: String?, + val receivedAt: String +) diff --git a/src/main/kotlin/com/android/trisolarisserver/repo/RazorpayWebhookLogRepo.kt b/src/main/kotlin/com/android/trisolarisserver/repo/RazorpayWebhookLogRepo.kt index 1bca384..fbfa30f 100644 --- a/src/main/kotlin/com/android/trisolarisserver/repo/RazorpayWebhookLogRepo.kt +++ b/src/main/kotlin/com/android/trisolarisserver/repo/RazorpayWebhookLogRepo.kt @@ -4,4 +4,6 @@ import com.android.trisolarisserver.models.payment.RazorpayWebhookLog import org.springframework.data.jpa.repository.JpaRepository import java.util.UUID -interface RazorpayWebhookLogRepo : JpaRepository +interface RazorpayWebhookLogRepo : JpaRepository { + fun findByPropertyIdOrderByReceivedAtDesc(propertyId: UUID): List +}