public async Task <IActionResult> Driver([Bind("StartAddress,Locality")][FromBody] DriverDrivePost model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ErrorEnum.InvalidModelState));
            }

            var userName = User.Identity.Name;

            if (userName == null)
            {
                return(Unauthorized(ErrorEnum.NoUserLogIn));
            }

            var user = await userManager.FindByNameAsync(User.Identity.Name);

            Debug.Assert(user != null);

            var userId      = user.Id;
            var lastRequest = await GetLastRequestAsync(userId);

            if (lastRequest != null)
            {
                var lastDrive = await drivesRepository.GetFirstByConditionAsync(d => d.DriverRequestId == lastRequest.Id);

                if (lastDrive != null && lastDrive.Status == Drive.DriveStatus.Open)
                {
                    return(BadRequest(ErrorEnum.DriveAlreadyOpen));
                }
            }

            var driverRequest = await FormatRequestAsync(model.StartAddress, model.Locality, userId);

            if (driverRequest == null)
            {
                return(BadRequest(ErrorEnum.InvalidStartAddress));
            }

            requestsRepository.Insert(driverRequest);

            await requestsRepository.ApplyChangesAsync();

            var drive = await driveService.WaitForCustomerAsync(driverRequest);

            driverRequest.Status = drive == null ? DriveRequest.RequestStatus.Cancelled : DriveRequest.RequestStatus.Answered;

            requestsRepository.Update(driverRequest);

            await requestsRepository.ApplyChangesAsync();

            if (drive == null)
            {
                return(NotFound());
            }

            var customerRequest = await requestsRepository.GetByIdAsync(drive.CustomerRequestId);

            Debug.Assert(customerRequest != null);

            var applicationCustomer = await userManager.FindByIdAsync(customerRequest.UserId);

            Debug.Assert(applicationCustomer != null);

            var customer = await customersRepository.GetByIdAsync(customerRequest.UserId);

            Debug.Assert(customer != null);

            var result = mapper.Map <DriverDriveResult>(drive);

            mapper.Map(customer, result);

            mapper.Map(applicationCustomer, result);

            drivesRepository.Insert(drive);

            await drivesRepository.ApplyChangesAsync();

            return(Ok(result));
        }