use uuid::Uuid;
use super::event_error::EventResult;
use crate::infrastructure::persistence::event_command_repository::EventCommandRepository;
use crate::infrastructure::persistence::seat_repository::{RegistrationRow, SeatRepository};
pub struct DeskService {
seats: SeatRepository,
events: EventCommandRepository,
}
impl DeskService {
pub fn new(seats: SeatRepository, events: EventCommandRepository) -> Self {
Self { seats, events }
}
pub async fn register_attendee(
&self,
barcode: &str,
event_id: Uuid,
actor: Option<Uuid>,
) -> EventResult<(RegistrationRow, String, String)> {
let reg = self
.seats
.find_by_barcode(barcode.trim())
.await?
.filter(|r| r.active)
.ok_or(super::event_error::EventError::DeskInvalidTicket)?;
if reg.state == "cancel" {
return Err(super::event_error::EventError::DeskCanceledRegistration);
}
if reg.state == "draft" {
return Err(super::event_error::EventError::DeskUnconfirmedRegistration);
}
let event = self.events.find(event_id).await?;
if event.kanban_state == "done"
|| event.kanban_state == "cancel"
|| event.date_end <= chrono::Utc::now()
{
return Err(super::event_error::EventError::DeskNotOngoingEvent);
}
if reg.event_id != event_id {
return Err(super::event_error::EventError::DeskNeedManualConfirmation);
}
if reg.state == "done" {
return Err(super::event_error::EventError::DeskAlreadyRegistered);
}
let (before, after, _active) = self.seats.transition(reg.id, "done", actor).await?;
let refreshed = self.seats.find_registration(reg.id).await?;
Ok((refreshed, before, after))
}
}