public async Task <IActionResult> PostAsync([FromBody] DemandeReservationDto dto)
        {
            try
            {
                var idVoyage  = new IdVoyage(dto.IdVoyage);
                var passagers =
                    dto.Passagers
                    .Select(p => p.ToDomain())
                    .ToList();

                await _useCase.ReserverAsync(idVoyage, passagers);

                return(Ok());
            }
            catch (EmailInvalideException)
            {
                return(BadRequest("Email invalide"));
            }
            catch (VoyageSansTrainException)
            {
                return(NotFound("Pas de train pour ce voyage"));
            }
            catch (TrainPleinException)
            {
                return(BadRequest("Train plein"));
            }
            catch (VoiturePleineException)
            {
                return(BadRequest("Voiture pleine"));
            }
            catch (Exception)
            {
                return(Problem());
            }
        }
        public async Task <Train> GetTrainDuVoyageAsync(IdVoyage idVoyage)
        {
            var reservations =
                await _dbContext.Set <DbReservation>()
                .Include(r => r.Passagers)
                .Where(r => r.IdVoyage == (int)idVoyage)
                .ToListAsync();

            var voyage = await _voyageUseCase.GetVoyageAsync((int)idVoyage);

            if (voyage == null)
            {
                return(null);
            }

            return(new Train(
                       idVoyage,
                       voyage.Train.Voitures
                       .Select(v =>
                               new Voiture(
                                   new NumeroVoiture(v.Numero),
                                   v.Capacite,
                                   GetNbReservations(reservations, v.Numero)))
                       .ToList()));
        }
        public async Task ReserverAsync(IdVoyage idVoyage, IReadOnlyCollection <Passager> passagers)
        {
            var train = await _trainRepository.GetTrainDuVoyageAsync(idVoyage);

            if (train == null)
            {
                throw new VoyageSansTrainException(idVoyage);
            }

            if (!train.PeutReserver(passagers.Count, SeuilCapacite))
            {
                throw new TrainPleinException();
            }

            var reservation = train.Reserver(passagers, SeuilCapacite);
            await _reservationRepository.SaveAsync(reservation);

            await _notifieur.NotifierReservationValideeAsync(reservation);
        }