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)); }