build guest rating system
This commit is contained in:
@@ -6,6 +6,7 @@ import com.android.trisolarisserver.controller.dto.GuestVehicleRequest
|
||||
import com.android.trisolarisserver.models.booking.Guest
|
||||
import com.android.trisolarisserver.models.booking.GuestVehicle
|
||||
import com.android.trisolarisserver.db.repo.GuestRepo
|
||||
import com.android.trisolarisserver.db.repo.GuestRatingRepo
|
||||
import com.android.trisolarisserver.repo.GuestVehicleRepo
|
||||
import com.android.trisolarisserver.repo.PropertyRepo
|
||||
import com.android.trisolarisserver.security.MyPrincipal
|
||||
@@ -21,7 +22,8 @@ class Guests(
|
||||
private val propertyAccess: PropertyAccess,
|
||||
private val propertyRepo: PropertyRepo,
|
||||
private val guestRepo: GuestRepo,
|
||||
private val guestVehicleRepo: GuestVehicleRepo
|
||||
private val guestVehicleRepo: GuestVehicleRepo,
|
||||
private val guestRatingRepo: GuestRatingRepo
|
||||
) {
|
||||
|
||||
@GetMapping("/search")
|
||||
@@ -52,7 +54,7 @@ class Guests(
|
||||
val vehicle = guestVehicleRepo.findByOrgIdAndVehicleNumberIgnoreCase(orgId, vehicleNumber)
|
||||
if (vehicle != null) guests.add(vehicle.guest)
|
||||
}
|
||||
return guests.toResponse(guestVehicleRepo)
|
||||
return guests.toResponse(guestVehicleRepo, guestRatingRepo)
|
||||
}
|
||||
|
||||
@PostMapping("/{guestId}/vehicles")
|
||||
@@ -85,7 +87,7 @@ class Guests(
|
||||
vehicleNumber = request.vehicleNumber.trim()
|
||||
)
|
||||
guestVehicleRepo.save(vehicle)
|
||||
return setOf(guest).toResponse(guestVehicleRepo).first()
|
||||
return setOf(guest).toResponse(guestVehicleRepo, guestRatingRepo).first()
|
||||
}
|
||||
|
||||
private fun requirePrincipal(principal: MyPrincipal?) {
|
||||
@@ -95,10 +97,22 @@ class Guests(
|
||||
}
|
||||
}
|
||||
|
||||
private fun Set<Guest>.toResponse(guestVehicleRepo: GuestVehicleRepo): List<GuestResponse> {
|
||||
private fun Set<Guest>.toResponse(
|
||||
guestVehicleRepo: GuestVehicleRepo,
|
||||
guestRatingRepo: GuestRatingRepo
|
||||
): List<GuestResponse> {
|
||||
val ids = this.mapNotNull { it.id }
|
||||
val vehicles = if (ids.isEmpty()) emptyList() else guestVehicleRepo.findByGuestIdIn(ids)
|
||||
val vehiclesByGuest = vehicles.groupBy { it.guest.id }
|
||||
val averages = if (ids.isEmpty()) {
|
||||
emptyMap()
|
||||
} else {
|
||||
guestRatingRepo.findAverageScoreByGuestIds(ids).associate { row ->
|
||||
val guestId = row[0] as UUID
|
||||
val avg = row[1] as Double
|
||||
guestId to avg
|
||||
}
|
||||
}
|
||||
return this.map { guest ->
|
||||
GuestResponse(
|
||||
id = guest.id!!,
|
||||
@@ -107,7 +121,8 @@ private fun Set<Guest>.toResponse(guestVehicleRepo: GuestVehicleRepo): List<Gues
|
||||
phoneE164 = guest.phoneE164,
|
||||
nationality = guest.nationality,
|
||||
addressText = guest.addressText,
|
||||
vehicleNumbers = vehiclesByGuest[guest.id]?.map { it.vehicleNumber }?.toSet() ?: emptySet()
|
||||
vehicleNumbers = vehiclesByGuest[guest.id]?.map { it.vehicleNumber }?.toSet() ?: emptySet(),
|
||||
averageScore = averages[guest.id]
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user