Пример #1
0
        public Task <bool> Handle(RegisterApartment request, CancellationToken cancellationToken)
        {
            var found = _apartmentRepository.Any(c => c.Number == request.Number && c.Roof == request.Roof && c.Block == request.Block && c.CondominiumId == request.CondominiumId);

            if (found)
            {
                Mediator.RaiseNotification(new DomainNotification(nameof(Apartment), "Apartamento já existe neste condomínio", NotificationType.Error));

                return(Task.FromResult(false));
            }

            var residents = new List <Resident>();

            var apartmentId = Guid.NewGuid();

            foreach (var residentCommand in request.Residents)
            {
                var contact  = new ContactInfo(residentCommand.PhoneNumber, residentCommand.Email);
                var document = new DocumentInfo(residentCommand.DocumentNumber);

                var newResident = Resident.ResidentFactory.NewResident(User.GetUserId(), residentCommand.Name, residentCommand.Birthday, contact, document, apartmentId);

                if (!newResident.IsValid())
                {
                    Mediator.RaiseNotification(new DomainNotification(nameof(Apartment), $"Informação do residente {newResident.Name} inválida", NotificationType.Error));

                    return(Task.FromResult(false));
                }

                residents.Add(newResident);
            }

            var apartment = Apartment.ApartmentFactory.NewApartment(apartmentId, User.GetUserId(), request.Number, request.Block, request.Roof, request.CondominiumId, residents);

            if (!IsAValidApartment(apartment))
            {
                return(Task.FromResult(false));
            }

            _apartmentRepository.Insert(apartment);

            if (Commit())
            {
                Mediator.RaiseNotification(new DomainNotification(nameof(Apartment), "Operação realizada com sucesso", NotificationType.Info));

                return(Task.FromResult(true));
            }

            Mediator.RaiseNotification(new DomainNotification(nameof(Apartment), "Erro ao realizar a operação", NotificationType.Error));

            return(Task.FromResult(false));
        }