From 8ba77232c3d0df98c74b903de2084f9355c1f560 Mon Sep 17 00:00:00 2001 From: androidlover5842 Date: Wed, 28 Jan 2026 18:13:44 +0530 Subject: [PATCH] Return sector0 time data on card revoke --- .../controller/IssuedCards.kt | 25 ++++++++++++++----- .../controller/dto/BookingDtos.kt | 4 +++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/IssuedCards.kt b/src/main/kotlin/com/android/trisolarisserver/controller/IssuedCards.kt index e4b1805..37ad5cf 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/IssuedCards.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/IssuedCards.kt @@ -3,6 +3,7 @@ package com.android.trisolarisserver.controller import com.android.trisolarisserver.component.PropertyAccess import com.android.trisolarisserver.controller.dto.CardPrepareRequest import com.android.trisolarisserver.controller.dto.CardPrepareResponse +import com.android.trisolarisserver.controller.dto.CardRevokeResponse import com.android.trisolarisserver.controller.dto.IssueCardRequest import com.android.trisolarisserver.controller.dto.IssuedCardResponse import com.android.trisolarisserver.models.property.Role @@ -150,19 +151,23 @@ class IssuedCards( } @PostMapping("/cards/{cardId}/revoke") - @ResponseStatus(HttpStatus.NO_CONTENT) fun revoke( @PathVariable propertyId: UUID, @PathVariable cardId: UUID, @AuthenticationPrincipal principal: MyPrincipal? - ) { + ): CardRevokeResponse { requireRevokeActor(propertyId, principal) val card = issuedCardRepo.findByIdAndPropertyId(cardId, propertyId) ?: throw ResponseStatusException(HttpStatus.NOT_FOUND, "Card not found") if (card.revokedAt == null) { - card.revokedAt = OffsetDateTime.now() + val now = nowForProperty(card.property.timezone) + card.revokedAt = now + card.expiresAt = now issuedCardRepo.save(card) } + val key = buildSector0Block2(card.room.roomNumber, card.cardIndex) + val timeData = buildSector0TimeData(card.issuedAt, card.expiresAt, key) + return CardRevokeResponse(timeData = timeData) } private fun parseOffset(value: String?): OffsetDateTime? { @@ -259,12 +264,20 @@ class IssuedCards( expiresAt: OffsetDateTime ): Sector0Payload { val key = buildSector0Block2(roomNumber, cardIndex) - val newData = "0000000000" + formatDateComponents(issuedAt) + formatDateComponents(expiresAt) - val checkSum = calculateChecksum(key + newData) - val finalData = newData + checkSum + val finalData = buildSector0TimeData(issuedAt, expiresAt, key) return Sector0Payload(key, finalData) } + private fun buildSector0TimeData( + issuedAt: OffsetDateTime, + expiresAt: OffsetDateTime, + key: String? = null + ): String { + val newData = "0000000000" + formatDateComponents(issuedAt) + formatDateComponents(expiresAt) + val checkSum = calculateChecksum((key ?: "") + newData) + return newData + checkSum + } + private fun buildSector0Block2(roomNumber: Int, cardID: Int): String { val guestID = cardID + 1 val cardIdStr = cardID.toString().padStart(6, '0') diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/dto/BookingDtos.kt b/src/main/kotlin/com/android/trisolarisserver/controller/dto/BookingDtos.kt index 67bb20e..5c6d404 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/dto/BookingDtos.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/dto/BookingDtos.kt @@ -86,3 +86,7 @@ data class CardPrepareResponse( val sector3Block1: String? = null, val sector3Block2: String? = null ) + +data class CardRevokeResponse( + val timeData: String +)