示例#1
0
        public async Task <IActionResult> CreateTagAsync([FromBody] Client.TagCreationInfo creationInfo,
                                                         CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (creationInfo == null)
            {
                var error = ErrorResponsesService.BodyIsMissing(nameof(creationInfo));
                return(BadRequest(error));
            }

            var modelCreationInfo = Converter.TagCreationInfoConverter.Convert(creationInfo);

            Model.Tag modelTag;

            try
            {
                modelTag =
                    await repository.CreateAsync(modelCreationInfo, cancellationToken).ConfigureAwait(false);
            }
            catch (TagDuplicationException ex)
            {
                var error = ErrorResponsesService.DuplicationError(Target, ex.Message);
                return(BadRequest(error));
            }

            var clientTag = Converter.TagConverter.Convert(modelTag);

            return(CreatedAtRoute("GetTagRoute", new { id = clientTag.Id }, clientTag));
        }
示例#2
0
        public async Task <IActionResult> GetDriverAsync([FromRoute] string id, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (!Guid.TryParse(id, out var guid))
            {
                var error = ErrorResponsesService.NotFoundError(Target, $"Driver with id '{id}' not found.");
                return(NotFound(error));
            }

            Model.Driver modelDriver;

            try
            {
                modelDriver = await repository.GetAsync(guid, cancellationToken).ConfigureAwait(false);
            }
            catch (DriverNotFoundException ex)
            {
                var error = ErrorResponsesService.NotFoundError(Target, ex.Message);
                return(NotFound(error));
            }

            var clientDriver = Converter.DriverConverter.Convert(modelDriver);

            return(Ok(clientDriver));
        }
示例#3
0
        public async Task <IActionResult> PatchTagAsync([FromRoute] string id,
                                                        [FromBody] Client.TagPatchInfo patchInfo, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (patchInfo == null)
            {
                var error = ErrorResponsesService.BodyIsMissing(nameof(patchInfo));
                return(BadRequest(error));
            }

            var modelPatchInfo = Converter.TagPatchInfoConverter.Convert(id, patchInfo);

            Model.Tag modelTag;

            try
            {
                modelTag = await repository.PatchAsync(modelPatchInfo, cancellationToken).ConfigureAwait(false);
            }
            catch (TagNotFoundException ex)
            {
                var error = ErrorResponsesService.NotFoundError(Target, ex.Message);
                return(NotFound(error));
            }

            var clientTag = Converter.TagConverter.Convert(modelTag);

            return(Ok(clientTag));
        }
示例#4
0
        public async Task <IActionResult> CreateSecretAsync([FromBody] Client.SecretCreationInfo creationInfo,
                                                            CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (creationInfo == null)
            {
                var error = ErrorResponsesService.BodyIsMissing(nameof(creationInfo));
                return(BadRequest(error));
            }

            const string blackTemplateWithColoredPoints = "1001582";
            var          pointsUrl = await PhotolabService.PostMultipartFormData(creationInfo.ImageUrl, blackTemplateWithColoredPoints);

            var webClient  = new WebClient();
            var imageBytes = await webClient.DownloadDataTaskAsync(pointsUrl);

            Stream stream = new MemoryStream(imageBytes);

            var          description = PhysiognomyService.GetDescription(new Bitmap(stream));
            const string photoTemplateWithColoredPoints = "1001581";
            var          url = await PhotolabService.PostMultipartFormData(creationInfo.ImageUrl, photoTemplateWithColoredPoints);

            var modelCreationInfo = new Model.SecretCreationInfo(url, description);
            var modelSecret       =
                await repository.CreateAsync(modelCreationInfo, cancellationToken).ConfigureAwait(false);

            var clientSecret = Converter.SecretConverter.Convert(modelSecret);

            return(CreatedAtRoute("GetSecretRoute", new { id = clientSecret.Id }, clientSecret));
        }
示例#5
0
        public async Task <IActionResult> GetSecretAsync([FromRoute] string id, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (!Guid.TryParse(id, out var guid) || guid.Equals(Guid.Empty))
            {
                var error = ErrorResponsesService.NotFoundError(Target, $"Secret with id '{id}' not found.");
                return(NotFound(error));
            }

            Model.Secret modelSecret;

            try
            {
                modelSecret = await repository.GetAsync(guid, cancellationToken).ConfigureAwait(false);
            }
            catch (SecretNotFoundException ex)
            {
                var error = ErrorResponsesService.NotFoundError(Target, ex.Message);
                return(NotFound(error));
            }

            var clientSecret = Converter.SecretConverter.Convert(modelSecret);

            return(Ok(clientSecret));
        }
        public async Task <IActionResult> GetRouteAsync([FromRoute] string id, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (!Guid.TryParse(id, out var guid))
            {
                var error = ErrorResponsesService.NotFoundError(Target, $"Route with id '{id}' not found.");
                return(BadRequest(error));
            }

            Model.Route modelRoute;

            try
            {
                modelRoute = await routeRepository.GetAsync(guid, cancellationToken).ConfigureAwait(false);
            }
            catch (RouteNotFoundException ex)
            {
                var error = ErrorResponsesService.NotFoundError(Target, ex.Message);
                return(NotFound(error));
            }

            var modelCheckpoints = await checkpointRepository.GetAllAsync(cancellationToken).ConfigureAwait(false);

            var clientRoute = Converter.RouteConverter.Convert(modelRoute, modelCheckpoints);

            return(Ok(clientRoute));
        }
        public async Task <IActionResult> GetWayBillAsync([FromRoute] string id, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (!Guid.TryParse(id, out var guid))
            {
                var error = ErrorResponsesService.NotFoundError(Target, $"WayBill with id '{id}' not found.");
                return(NotFound(error));
            }

            Model.WayBill modelWayBill;

            try
            {
                modelWayBill = await wayBillRepository.GetAsync(guid, cancellationToken).ConfigureAwait(false);
            }
            catch (WayBillNotFoundException)
            {
                var error = ErrorResponsesService.NotFoundError(Target, $"WayBill with id '{id}' not found.");
                return(NotFound(error));
            }

            var driver = await driverRepository.GetAsync(modelWayBill.Driver, cancellationToken).ConfigureAwait(false);

            var clientDriver = ModelConverters.Drivers.DriverConverter.Convert(driver);
            var vehicle      = await vehicleRepository.GetAsync(modelWayBill.Vehicle, cancellationToken).ConfigureAwait(false);

            var clientVehicle = ModelConverters.Vehicles.VehicleConverter.Convert(vehicle);
            var route         = await routeRepository.GetAsync(modelWayBill.Route, cancellationToken).ConfigureAwait(false);

            var checkpoints = await checkpointRepository.GetAllAsync(cancellationToken).ConfigureAwait(false);

            var clientRoute  = ModelConverters.Routes.RouteConverter.Convert(route, checkpoints);
            var mechanicNote = await mechanicNoteRepository.GetAsync(modelWayBill.MechanicNote, cancellationToken)
                               .ConfigureAwait(false);

            var medicNotesCount = route.Checkpoints.Count + 1;
            var medicNotes      = new Models.MedicNotes.MedicNote[medicNotesCount];

            for (var i = 0; i < medicNotesCount; i++)
            {
                medicNotes[i] = await medicNoteRepository.CreateAsync(cancellationToken).ConfigureAwait(false);
            }

            var clientMechanicNote = ModelConverters.MechanicNotes.MechanicNoteConverter.Convert(mechanicNote);
            var clientMedicNotes   = medicNotes.Select(ModelConverters.MedicNotes.MedicNoteConverter.Convert);

            var clientWayBill =
                WayBillConverter.Convert(modelWayBill, clientDriver, clientVehicle, clientRoute, clientMechanicNote, clientMedicNotes);

            return(Ok(clientWayBill));
        }
示例#8
0
        public async Task <IActionResult> DeleteTagAsync([FromRoute] string id, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            try
            {
                await repository.RemoveAsync(id, cancellationToken).ConfigureAwait(false);
            }
            catch (TagNotFoundException ex)
            {
                var error = ErrorResponsesService.NotFoundError(Target, ex.Message);
                return(NotFound(error));
            }

            return(NoContent());
        }
示例#9
0
        public async Task <IActionResult> GetAllRoles(CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var roles = await Task.Run(() => roleManager.Roles, cancellationToken);

            if (roles == null)
            {
                var error = ErrorResponsesService.NotFoundError(TargetRole, "Roles not found.");
                return(NotFound(error));
            }

            var clientRoles = roles.Select(item => Converter.RoleConverter.Convert(item)).ToImmutableList();

            return(Ok(clientRoles));
        }
示例#10
0
        public async Task <IActionResult> UploadImageAsync(string imageName, IFormFile imageFile, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (imageName == null)
            {
                var error = ErrorResponsesService.BodyIsMissing(nameof(imageName));
                return(BadRequest(error));
            }

            if (imageFile == null)
            {
                var error = ErrorResponsesService.BodyIsMissing(nameof(imageFile));
                return(BadRequest(error));
            }

            var extension = Path.GetExtension(imageFile.FileName);
            var path      = $"{ImageDirectory}{imageName}{extension}";
            var stream    = imageFile.OpenReadStream();

            if (ImageValidationService.IsValidLength(imageFile.Length) && ImageValidationService.IsImage(stream))
            {
                var webDirectoryPath = $"{hostingEnvironment.WebRootPath}{ImageDirectory}";

                if (!Directory.Exists(webDirectoryPath))
                {
                    Directory.CreateDirectory(webDirectoryPath);
                }

                using (var fileStream = new FileStream($"{hostingEnvironment.WebRootPath}{path}", FileMode.Create))
                {
                    await imageFile.CopyToAsync(fileStream, cancellationToken).ConfigureAwait(false);
                }
            }
            else
            {
                var error = ErrorResponsesService.InvalidImageData(nameof(imageFile));
                return(BadRequest(error));
            }

            var clientImageInfo = new ClientModels.Image
            {
                Url = path
            };

            return(Ok(clientImageInfo));
        }
        public async Task <IActionResult> GetUserInfoAsync(CancellationToken cancellationToken)
        {
            if (HttpContext.User?.Identity != null && HttpContext.User.Identity.IsAuthenticated)
            {
                var user = await userManager.FindByNameAsync(HttpContext.User.Identity.Name);

                if (user != null)
                {
                    var clientUser = ModelConverters.Users.UserConverter.Convert(user);
                    return(Ok(clientUser));
                }
            }

            var error = ErrorResponsesService.UnauthorizedError(Target);

            return(NotFound(error));
        }
示例#12
0
        public async Task <IActionResult> UploadImageAsync(IFormFile imageFile, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (imageFile == null)
            {
                var error = ErrorResponsesService.BodyIsMissing(nameof(imageFile));
                return(BadRequest(error));
            }

            var imageId   = Guid.NewGuid();
            var imageName = imageId.ToString();
            var extension = Path.GetExtension(imageFile.FileName);
            var path      = $"{ImageDirectory}{imageName}{extension}";
            var stream    = imageFile.OpenReadStream();

            ClientModels.Secrets.Secret clientSecret;

            if (ImageValidationService.IsValidLength(imageFile.Length) && ImageValidationService.IsImage(stream))
            {
                var webDirectoryPath = $"{hostingEnvironment.WebRootPath}{ImageDirectory}";

                if (!Directory.Exists(webDirectoryPath))
                {
                    Directory.CreateDirectory(webDirectoryPath);
                }

                using (var fileStream = new FileStream($"{hostingEnvironment.WebRootPath}{path}", FileMode.Create))
                {
                    await imageFile.CopyToAsync(fileStream, cancellationToken).ConfigureAwait(false);

                    var creationInfo = new SecretCreationInfo(path, string.Empty);
                    var modelSecret  = await repository.CreateAsync(creationInfo, cancellationToken).ConfigureAwait(false);

                    clientSecret = Converter.SecretConverter.Convert(modelSecret);
                }
            }
            else
            {
                var error = ErrorResponsesService.InvalidImageData(nameof(imageFile));
                return(BadRequest(error));
            }

            return(Ok(clientSecret));
        }
示例#13
0
        public async Task <IActionResult> CreateDriverAsync([FromBody] Client.DriverCreationInfo creationInfo,
                                                            CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (creationInfo == null)
            {
                var error = ErrorResponsesService.BodyIsMissing(nameof(creationInfo));
                return(BadRequest(error));
            }

            var modelCreationInfo = Converter.DriverCreationInfoConverter.Convert(creationInfo);
            var modelDriver       = await repository.CreateAsync(modelCreationInfo, cancellationToken).ConfigureAwait(false);

            var clientDriver = Converter.DriverConverter.Convert(modelDriver);

            return(CreatedAtRoute("GetDriverRoute", new { id = clientDriver.Id }, clientDriver));
        }
示例#14
0
        public async Task <IActionResult> GetTagAsync([FromRoute] string id, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();
            Model.Tag modelTag;

            try
            {
                modelTag = await repository.GetAsync(id, cancellationToken).ConfigureAwait(false);
            }
            catch (TagNotFoundException ex)
            {
                var error = ErrorResponsesService.NotFoundError(Target, ex.Message);
                return(NotFound(error));
            }

            var clientTag = Converter.TagConverter.Convert(modelTag);

            return(Ok(clientTag));
        }
        public async Task <IActionResult> CreateRouteAsync([FromBody] Client.RouteCreationInfo creationInfo,
                                                           CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (creationInfo == null)
            {
                var error = ErrorResponsesService.BodyIsMissing(nameof(creationInfo));
                return(BadRequest(error));
            }

            var modelCreationInfo = Converter.RouteCreationInfoConverter.Convert(creationInfo);
            var modelRoute        = await routeRepository.CreateAsync(modelCreationInfo, cancellationToken).ConfigureAwait(false);

            var modelCheckpoints = await checkpointRepository.GetAllAsync(cancellationToken).ConfigureAwait(false);

            var clientRoute = Converter.RouteConverter.Convert(modelRoute, modelCheckpoints);

            return(CreatedAtRoute("GetRouteRoute", new { id = clientRoute.Id }, clientRoute));
        }
        public async Task <ActionResult> DeleteUserAsync([FromRoute] string userName, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (!HasAccessToUser(userName))
            {
                return(Forbid());
            }

            var user = await userManager.FindByNameAsync(userName);

            if (user == null)
            {
                var error = ErrorResponsesService.NotFoundError(Target, $"User with name '{userName}' not found.");
                return(NotFound(error));
            }

            await userManager.DeleteAsync(user);

            return(NoContent());
        }
示例#17
0
        public IActionResult DeleteImageAsync([FromRoute] string imageName, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (imageName == null)
            {
                var error = ErrorResponsesService.BodyIsMissing(nameof(imageName));
                return(BadRequest(error));
            }

            var fileInfo = new FileInfo($"{hostingEnvironment.WebRootPath}{ImageDirectory}{imageName}");

            if (!fileInfo.Exists)
            {
                var error = ErrorResponsesService.NotFoundError(Target, "Image not found");
                return(NotFound(error));
            }

            fileInfo.Delete();
            return(NoContent());
        }
        public async Task <IActionResult> GetUserAsync([FromRoute] string userName, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (!HasAccessToUser(userName))
            {
                return(Forbid());
            }

            var user = await userManager.FindByNameAsync(userName);

            if (user == null)
            {
                var error = ErrorResponsesService.NotFoundError(Target, $"User with name '{userName}' not found.");
                return(BadRequest(error));
            }

            var clientUser = ModelConverters.Users.UserConverter.Convert(user);

            return(Ok(clientUser));
        }
示例#19
0
        public async Task <IActionResult> PatchRoleAsync([FromRoute] string userName,
                                                         [FromBody] Client.RolePatchInfo clientRolePatchInfo, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (clientRolePatchInfo == null)
            {
                var error = ErrorResponsesService.BodyIsMissing(nameof(clientRolePatchInfo));
                return(BadRequest(error));
            }

            var user = await userManager.FindByNameAsync(userName);

            if (user == null)
            {
                var error = ErrorResponsesService.NotFoundError(TargetUser, $"User with name '{userName}' not found.");
                return(NotFound(error));
            }

            var modelRolePatchInfo = Converter.RolePatchInfoConverter.Convert(userName, clientRolePatchInfo);
            var modelRole          = await roleManager.FindByNameAsync(modelRolePatchInfo.UserRole.ToLower());

            if (modelRole == null)
            {
                var error = ErrorResponsesService.NotFoundError(TargetRole, $"Role with name '{modelRolePatchInfo.UserRole}' not found.");
                return(NotFound(error));
            }

            if (user.Roles.Contains(modelRolePatchInfo.UserRole.ToUpper()))
            {
                await userManager.RemoveFromRoleAsync(user, modelRolePatchInfo.UserRole);
            }
            else
            {
                await userManager.AddToRoleAsync(user, modelRolePatchInfo.UserRole);
            }

            return(Ok(user));
        }
示例#20
0
        public async Task <IActionResult> DeleteDriverAsync([FromRoute] string id, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (!Guid.TryParse(id, out var guid))
            {
                var error = ErrorResponsesService.NotFoundError(Target, $"Driver with id '{id}' not found.");
                return(NotFound(error));
            }

            try
            {
                await repository.RemoveAsync(guid, cancellationToken).ConfigureAwait(false);
            }
            catch (DriverNotFoundException ex)
            {
                var error = ErrorResponsesService.NotFoundError(Target, ex.Message);
                return(NotFound(error));
            }

            return(NoContent());
        }
        public async Task <IActionResult> Login([FromBody] Client.UserLogin loginInfo,
                                                CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (loginInfo == null)
            {
                var error = ErrorResponsesService.BodyIsMissing(nameof(loginInfo));
                return(BadRequest(error));
            }

            var result = await signInManager.PasswordSignInAsync(loginInfo.Username, loginInfo.Password,
                                                                 loginInfo.RememberMe, false);

            if (!result.Succeeded)
            {
                var error = ErrorResponsesService.InvalidCredentialsError(nameof(loginInfo));
                return(BadRequest(error));
            }

            return(Ok(result));
        }
示例#22
0
        public async Task <IActionResult> PatchMedicNoteAsync([FromRoute] string id,
                                                              [FromBody] Client.MedicNotePatchInfo patchInfo, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (patchInfo == null)
            {
                var error = ErrorResponsesService.BodyIsMissing(nameof(patchInfo));
                return(BadRequest(error));
            }

            if (!Guid.TryParse(id, out var guid))
            {
                var error = ErrorResponsesService.NotFoundError(Target, $"MedicNote with id '{id}' not found.");
                return(NotFound(error));
            }

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

            var modelPatchInfo = Converter.MedicNotePatchInfoConverter.Convert(guid, user.Name, patchInfo);

            Model.MedicNote modelMedicNote;

            try
            {
                modelMedicNote = await repository.PatchAsync(modelPatchInfo, cancellationToken).ConfigureAwait(false);
            }
            catch (MedicNoteNotFoundException ex)
            {
                var error = ErrorResponsesService.NotFoundError(Target, ex.Message);
                return(NotFound(error));
            }

            var clientMedicNote = Converter.MedicNoteConverter.Convert(modelMedicNote);

            return(Ok(clientMedicNote));
        }
        public async Task <IActionResult> PatchUserAsync([FromRoute] string userName, [FromBody] Client.UserPatchInfo clientPatchInfo,
                                                         CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (clientPatchInfo == null)
            {
                var error = ErrorResponsesService.BodyIsMissing(nameof(clientPatchInfo));
                return(BadRequest(error));
            }

            if (!HasAccessToUser(userName))
            {
                return(Forbid());
            }

            var modelPatchInfo = ModelConverters.Users.UserPatchInfoConverter.Convert(userName, clientPatchInfo);
            var user           = await userManager.FindByNameAsync(userName);

            if (user == null)
            {
                var error = ErrorResponsesService.NotFoundError(Target, $"User with name '{userName}' not found.");
                return(NotFound(error));
            }

            var updated = false;

            if (modelPatchInfo.OldPassword != null && modelPatchInfo.Password != null)
            {
                var passwordHasher = HttpContext.RequestServices.
                                     GetService(typeof(IPasswordHasher <User>)) as IPasswordHasher <User>;
                //todo неработает проверка на правильность старого пароля
//                var oldPasswordHash = passwordHasher.HashPassword(user, modelPatchInfo.OldPassword);
//
//                if (!oldPasswordHash.Equals(user.PasswordHash))
//                {
//                    var error = ErrorResponsesService.ValidationError(nameof(clientPatchInfo.OldPassword),
//                        "Old password doesn't match with actual.");
//                    return BadRequest(error);
//                }

                if (!modelPatchInfo.Password.Equals(modelPatchInfo.ConfirmPassword))
                {
                    var error = ErrorResponsesService.ValidationError(nameof(clientPatchInfo.ConfirmPassword),
                                                                      PasswordValidationMessage);
                    return(BadRequest(error));
                }

                var passwordValidator = HttpContext.RequestServices.
                                        GetService(typeof(IPasswordValidator <User>)) as IPasswordValidator <User>;
                var result = await passwordValidator.ValidateAsync(userManager, user, modelPatchInfo.Password);

                if (result.Succeeded)
                {
                    user.PasswordHash = passwordHasher.HashPassword(user, modelPatchInfo.Password);
                    updated           = true;
                }
            }

            if (updated)
            {
                user.LastUpdateAt = DateTime.UtcNow;
                await userManager.UpdateAsync(user);
            }

            var clientUser = ModelConverters.Users.UserConverter.Convert(user);

            return(Ok(clientUser));
        }
        public async Task <IActionResult> CreateWayBillAsync([FromBody] Client.WayBillCreationInfo creationInfo,
                                                             CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (creationInfo == null)
            {
                var error = ErrorResponsesService.BodyIsMissing(nameof(creationInfo));
                return(BadRequest(error));
            }

            Model.WayBillCreationInfo modelCreationInfo;

            try
            {
                modelCreationInfo = WayBillCreationInfoConverter.Convert(creationInfo);
            }
            catch (InvalidDataException ex)
            {
                var error = ErrorResponsesService.InvalidBodyData(nameof(creationInfo), ex.Message);
                return(BadRequest(error));
            }

            if (!Guid.TryParse(creationInfo.RouteId, out var routeGuid))
            {
                var error = ErrorResponsesService.NotFoundError("Route", $"Route with id '{creationInfo.RouteId}' not found.");
                return(BadRequest(error));
            }

            Model.WayBill modelWayBill;
            var           route = await routeRepository.GetAsync(routeGuid, cancellationToken).ConfigureAwait(false);

            var mechanicNote = await mechanicNoteRepository.CreateAsync(cancellationToken).ConfigureAwait(false);

            var medicNotesCount = route.Checkpoints.Count + 1;
            var medicNotes      = new Models.MedicNotes.MedicNote[medicNotesCount];

            for (var i = 0; i < medicNotesCount; i++)
            {
                medicNotes[i] = await medicNoteRepository.CreateAsync(cancellationToken).ConfigureAwait(false);
            }

            try
            {
                modelWayBill = await wayBillRepository.CreateAsync(modelCreationInfo, mechanicNote.Id,
                                                                   medicNotes.Select(item => item.Id), cancellationToken)
                               .ConfigureAwait(false);
            }
            catch (WayBillDuplicationException ex)
            {
                var error = ErrorResponsesService.DuplicationError(Target, ex.Message);
                return(BadRequest(error));
            }

            if (!Guid.TryParse(creationInfo.DriverId, out var driverGuid))
            {
                var error = ErrorResponsesService.NotFoundError("Driver", $"Driver with id '{creationInfo.RouteId}' not found.");
                return(BadRequest(error));
            }

            var driver = await driverRepository.GetAsync(driverGuid, cancellationToken).ConfigureAwait(false);

            var clientDriver = ModelConverters.Drivers.DriverConverter.Convert(driver);

            if (!Guid.TryParse(creationInfo.VehicleId, out var vehicleGuid))
            {
                var error = ErrorResponsesService.NotFoundError("Vehicle", $"Vehicle with id '{creationInfo.RouteId}' not found.");
                return(BadRequest(error));
            }

            var vehicle = await vehicleRepository.GetAsync(vehicleGuid, cancellationToken).ConfigureAwait(false);

            var clientVehicle = ModelConverters.Vehicles.VehicleConverter.Convert(vehicle);

            var checkpoints = await checkpointRepository.GetAllAsync(cancellationToken).ConfigureAwait(false);

            var clientRoute = ModelConverters.Routes.RouteConverter.Convert(route, checkpoints);

            var clientMechanicNote = ModelConverters.MechanicNotes.MechanicNoteConverter.Convert(mechanicNote);
            var clientMedicNotes   = medicNotes.Select(ModelConverters.MedicNotes.MedicNoteConverter.Convert);

            var clientWayBill =
                WayBillConverter.Convert(modelWayBill, clientDriver, clientVehicle, clientRoute, clientMechanicNote, clientMedicNotes);

            return(CreatedAtRoute("GetWayBillRoute", new { id = clientWayBill.Id }, clientWayBill));
        }
        public async Task <IActionResult> CreateUserAsync([FromBody] Client.UserCreationInfo clientUserCreationInfo,
                                                          CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            if (clientUserCreationInfo == null)
            {
                var error = ErrorResponsesService.BodyIsMissing(nameof(clientUserCreationInfo));
                return(BadRequest(error));
            }

            if (!clientUserCreationInfo.Password.Equals(clientUserCreationInfo.ConfirmPassword))
            {
                var error = ErrorResponsesService.ValidationError(nameof(clientUserCreationInfo.ConfirmPassword),
                                                                  PasswordValidationMessage);
                return(BadRequest(error));
            }

            UserCreationInfo modelCreationInfo;

            try
            {
                modelCreationInfo = Converter.UserCreationInfoConverter.Convert(clientUserCreationInfo);
            }
            catch (ArgumentNullException ex)
            {
                var error = ErrorResponsesService.InvalidCredentialsError(ex.Message);
                return(BadRequest(error));
            }

            var user = await userManager.FindByNameAsync(modelCreationInfo.UserName);

            if (user != null)
            {
                var error = ErrorResponsesService.DuplicationError(Target, $"User with name '{clientUserCreationInfo.UserName}' already exists.");
                return(BadRequest(error));
            }

            var dateTime  = DateTime.UtcNow;
            var modelUser = new User
            {
                UserName     = modelCreationInfo.UserName,
                Name         = modelCreationInfo.Name,
                Email        = modelCreationInfo.Email,
                PhoneNumber  = modelCreationInfo.PhoneNumber,
                RegisteredAt = dateTime,
                LastUpdateAt = dateTime
            };

            var result = await userManager.CreateAsync(modelUser, modelCreationInfo.Password);

            if (!result.Succeeded)
            {
                var error = ErrorResponsesService.ValidationError(nameof(clientUserCreationInfo),
                                                                  result.Errors.First().Description);
                return(BadRequest(error));
            }

            await userManager.AddToRoleAsync(modelUser, "user");

            var clientUser = ModelConverters.Users.UserConverter.Convert(modelUser);

            return(CreatedAtRoute("GetUserRoute", new { username = clientUser.UserName }, clientUser));
        }