public async Task <bool> Handle(AgendarConsultaCommand request, CancellationToken cancellationToken)
        {
            if (!ValidarComando(request))
            {
                return(false);
            }

            var agendaMedica = await _agendaMedicaRepository.ObterAgendaMedica(request.MedicoId);

            var agendamentoPaciente = new AgendamentoPaciente(request.PacienteId, request.DataInicioConsulta);

            if (agendaMedica == null)
            {
                agendaMedica = new AgendaMedica(request.MedicoId);
                agendaMedica.AdicionarAgendamentoPaciente(agendamentoPaciente);
                _agendaMedicaRepository.Adicionar(agendaMedica);
            }
            else if (HorarioAgendamentoNaoDisponivel(request, agendaMedica))
            {
                await _mediatorHandler.PublicarNotificacao(new DomainNotification("Agendamento consulta", "Data não está disponível!"));

                return(false);
            }
            else
            {
                agendaMedica.AdicionarAgendamentoPaciente(agendamentoPaciente);
                _agendaMedicaRepository.AdicionarAgendamentoPaciente(agendamentoPaciente);
            }

            return(await _agendaMedicaRepository.UnitOfWork.Commit());
        }
        public async Task AgendarConsulta_NovaConsulta_ComSucesso()
        {
            //Arrange
            var agendaConsultaCommand = new AgendarConsultaCommand(_medicoId, Guid.NewGuid(), DateTime.Now.AddDays(1));

            var agendaMedica          = new AgendaMedica(_medicoId);
            var agendaMedicaExistente = new AgendamentoPaciente(_pacienteId, DateTime.Now.AddDays(1));

            agendaMedica.AdicionarAgendamentoPaciente(agendaMedicaExistente);

            _mocker.GetMock <IAgendaMedicaRepository>().Setup(r => r.UnitOfWork.Commit()).Returns(Task.FromResult(true));

            //Act
            var result = await _agendaMedicaHandler.Handle(agendaConsultaCommand, CancellationToken.None);

            //Assert
            Assert.True(result);
            _mocker.GetMock <IAgendaMedicaRepository>().Verify(r => r.Adicionar(It.IsAny <AgendaMedica>()), Times.Once);
            _mocker.GetMock <IAgendaMedicaRepository>().Verify(r => r.UnitOfWork.Commit(), Times.Once);
        }
 private bool HorarioAgendamentoNaoDisponivel(AgendarConsultaCommand request, AgendaMedica agendaMedica)
 {
     return(agendaMedica.AgendamentoPaciente.Any(a => request.DataInicioConsulta >= a.DataInicioConsulta &&
                                                 request.DataInicioConsulta <= a.DataInicioConsulta.AddMinutes(_config.TempoMinimoConsulta)));
 }
 public void Adicionar(AgendaMedica agendaMedica)
 {
     _context.AgendaMedica.Add(agendaMedica);
 }