From 36e18f9649dea271f344ac7134e70cd771dd90e1 Mon Sep 17 00:00:00 2001 From: androidlover5842 Date: Thu, 29 Jan 2026 04:02:07 +0530 Subject: [PATCH] Add guest create endpoint --- AGENTS.md | 1 + .../trisolarisserver/controller/Guests.kt | 34 +++++++++++++++++++ .../controller/dto/OrgPropertyDtos.kt | 7 ++++ 3 files changed, 42 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index 719729e..24ff05a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -113,6 +113,7 @@ Card issuing - POST /properties/{propertyId}/rooms/{roomId}/cards/temp Guest APIs +- POST /properties/{propertyId}/guests - /properties/{propertyId}/guests/search?phone=... or ?vehicleNumber=... - /properties/{propertyId}/guests/{guestId}/vehicles (add vehicle) diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/Guests.kt b/src/main/kotlin/com/android/trisolarisserver/controller/Guests.kt index 854c6e1..933c109 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/Guests.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/Guests.kt @@ -1,6 +1,7 @@ package com.android.trisolarisserver.controller import com.android.trisolarisserver.component.PropertyAccess +import com.android.trisolarisserver.controller.dto.GuestCreateRequest import com.android.trisolarisserver.controller.dto.GuestResponse import com.android.trisolarisserver.controller.dto.GuestVehicleRequest import com.android.trisolarisserver.models.booking.Guest @@ -15,6 +16,7 @@ import org.springframework.http.HttpStatus import org.springframework.security.core.annotation.AuthenticationPrincipal import org.springframework.web.bind.annotation.* import org.springframework.web.server.ResponseStatusException +import java.time.OffsetDateTime import java.util.UUID @RestController @@ -28,6 +30,38 @@ class Guests( private val guestRatingRepo: GuestRatingRepo ) { + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + fun createGuest( + @PathVariable propertyId: UUID, + @AuthenticationPrincipal principal: MyPrincipal?, + @RequestBody request: GuestCreateRequest + ): GuestResponse { + requireMember(propertyAccess, propertyId, principal) + val property = requireProperty(propertyRepo, propertyId) + + val phone = request.phoneE164.trim() + if (phone.isBlank()) { + throw ResponseStatusException(HttpStatus.BAD_REQUEST, "phoneE164 required") + } + val existing = guestRepo.findByPropertyIdAndPhoneE164(propertyId, phone) + if (existing != null) { + throw ResponseStatusException(HttpStatus.CONFLICT, "Guest already exists") + } + + val now = OffsetDateTime.now() + val guest = Guest( + property = property, + phoneE164 = phone, + name = request.name?.trim()?.ifBlank { null }, + nationality = request.nationality?.trim()?.ifBlank { null }, + addressText = request.addressText?.trim()?.ifBlank { null }, + updatedAt = now + ) + guestRepo.save(guest) + return setOf(guest).toResponse(guestVehicleRepo, guestRatingRepo).first() + } + @GetMapping("/search") fun search( @PathVariable propertyId: UUID, diff --git a/src/main/kotlin/com/android/trisolarisserver/controller/dto/OrgPropertyDtos.kt b/src/main/kotlin/com/android/trisolarisserver/controller/dto/OrgPropertyDtos.kt index 5d33b99..2807a5d 100644 --- a/src/main/kotlin/com/android/trisolarisserver/controller/dto/OrgPropertyDtos.kt +++ b/src/main/kotlin/com/android/trisolarisserver/controller/dto/OrgPropertyDtos.kt @@ -49,6 +49,13 @@ data class GuestResponse( val averageScore: Double? ) +data class GuestCreateRequest( + val phoneE164: String, + val name: String? = null, + val nationality: String? = null, + val addressText: String? = null +) + data class GuestVehicleRequest( val vehicleNumber: String, val bookingId: UUID