public async Task TestUpdateAssignmentFailsWith400OnMissingClient()
        {
            // arrange
            var assignmentController = GetAssignmentController();

            var nonExistantClientId = "ffff0000ffff0000ffff0000ffff0000";
            var client = new Client {
                Id = Guid.NewGuid().ToString("n"), Name = "John", LastName = "Carmack"
            };
            var provider = new Provider {
                Id = Guid.NewGuid().ToString("n"), Name = "bTow"
            };
            var worker = new ProviderWorker {
                Id = Guid.NewGuid().ToString("n"), Name = "Andrew", LastName = "Garfield"
            };
            var assignment =
                new Assignment
            {
                Id               = Guid.NewGuid().ToString("n"),
                Status           = AssignmentStatus.Created,
                StatusReason     = AssignmentStatusReason.New,
                CreationDateTime = DateTimeOffset.Now,
                InitialLocation  = new GeoJson2DGeographicCoordinates(-58.375979, -34.605062),
                ClientId         = client.Id,
                WorkerId         = worker.Id,
                ProviderId       = provider.Id
            };

            var updateAssignmentVM =
                new UpdateAssignmentBindingModel
            {
                Status          = AssignmentStatus.InProgress,
                StatusReason    = AssignmentStatusReason.WorkerEnRoute,
                UpdateDateTime  = DateTimeOffset.Now,
                InitialLocation = new GeoLocation {
                    Latitude = -34.605062, Longitude = -58.375979
                },
                ClientId   = nonExistantClientId,
                WorkerId   = worker.Id,
                ProviderId = provider.Id
            };

            _testDataStore.EnsureClientDoesNotExist(nonExistantClientId);
            _testDataStore.EnsureClient(client);
            _testDataStore.EnsureProvider(provider);
            _testDataStore.EnsureWorker(worker);
            _testDataStore.EnsureAssignment(assignment);

            // act
            var actualResult = await assignmentController.UpdateAssignment(assignment.Id, updateAssignmentVM);

            // assert
            var actualUpdateAssignmentResult = actualResult as BadRequestObjectResult;

            Assert.True(actualUpdateAssignmentResult != null, "actualUpdateAssignmentResult should be of type BadRequestObjectResult");
            Assert.Equal(400, actualUpdateAssignmentResult.StatusCode);
            Assert.NotNull(actualUpdateAssignmentResult.Value);
        }
        public async Task <IActionResult> NewWorker(string providerId, [FromBody] ProviderWorkerBindingModel bindingModel)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState.GetErrors()));
            }

            var(imageBucket, outcomeAction, error) =
                await _imageBucketRepository.NewImageBucket(
                    new ImageBucket
            {
                StoreBucket = new ImageBucketKey {
                    Store = Constants.WORKER_IMAGES_STORE
                },
                ImageList = new List <string>()
            });

            if (outcomeAction != RepositoryOutcomeAction.OkCreated)
            {
                return(this.StatusCode(500, error));
            }

            var providerWorker = new ProviderWorker
            {
                Name        = bindingModel.Name,
                LastName    = bindingModel.LastName,
                Email       = bindingModel.Email,
                PhoneNumber = bindingModel.PhoneNumber,
                ProviderWorkerImageBucketKey = imageBucket.StoreBucket
            };

            (providerWorker, outcomeAction, error) = await _providerWorkerRepository.NewAsync(providerId, providerWorker);

            try
            {
                var userRegistration = await _userService.RegisterUserAsync(
                    new UserRegistration
                {
                    ProviderId = providerId,
                    WorkerId   = providerWorker.Id,
                    FirstName  = bindingModel.Name,
                    LastName   = bindingModel.LastName,
                    Email      = bindingModel.Email,
                    Password   = bindingModel.Password,
                });
            }
            catch (ApiException ex)
            {
                return(BadRequest(ex.ApiError));
            }

            var location = this.Url.BuildGetProviderWorkerUrl(providerId, providerWorker?.Id);

            return(this.FromRepositoryOutcome(outcomeAction, error, MapToProviderWorkerViewModel(providerWorker), location));
        }
        public async Task NewAsyncShouldThrowArgumentNullExceptionOnNullProviderId()
        {
            // arrange
            var providerWorkerRepository = new ProviderWorkerRepository(_mongoDatabase);
            var providerWorker           = new ProviderWorker();

            // act (deferred)
            var testCode = (Func <Task>)(async() => await providerWorkerRepository.NewAsync(null, providerWorker));

            // assert
            await Assert.ThrowsAsync <ArgumentNullException>(testCode);
        }
Exemple #4
0
        public async Task TesNewAsyncCreatesProviderWorkerResult()
        {
            // arrange
            var providerId = Guid.NewGuid().ToString("n");
            var provider   = new Provider
            {
                Id      = providerId,
                City    = "Springfield",
                State   = "Illinois",
                Name    = "TowNow!",
                Email   = "*****@*****.**",
                ZipCode = "2342",
                ProviderImageBucketKey = new ImageBucketKey {
                    Store = "some-store", Bucket = Guid.NewGuid().ToString("n")
                },
                Address = "742 Evergreen Terrace",
            };

            var providerWorker = new ProviderWorker
            {
                ProviderId = providerId,
                Name       = "Homer",
                LastName   = "Simpson",
            };

            _dataStore.EnsureProvider(provider);

            // act
            var(providerWorkerResult, outcomeAction, error) = await _providerWorkerRepository.NewAsync(providerId, providerWorker);

            // assert
            Assert.NotNull(providerWorkerResult);
            Assert.Equal(RepositoryOutcomeAction.OkCreated, outcomeAction);
            Assert.Null(error);
            // here we check that what was returned is the same as we sent.
            Assert.NotNull(providerWorkerResult.Id);
            Assert.Equal(providerWorker.ProviderId, providerWorkerResult.ProviderId);
            Assert.Equal(providerWorker.LastKnownLocation, providerWorkerResult.LastKnownLocation);
            Assert.Equal(providerWorker.LastName, providerWorkerResult.LastName);
            Assert.Equal(providerWorker.Name, providerWorkerResult.Name);
            Assert.Equal(providerWorker.PhoneNumber, providerWorkerResult.PhoneNumber);
            Assert.Equal(providerWorker.Status, providerWorkerResult.Status);
            Assert.True(
                _dataStore
                .TestProviderWorker(_ =>
                                    _.Id == providerWorker.Id &&
                                    _.ProviderId == providerWorker.ProviderId &&
                                    _.LastKnownLocation == providerWorker.LastKnownLocation &&
                                    _.LastName == providerWorker.LastName &&
                                    _.Name == providerWorker.Name &&
                                    _.PhoneNumber == providerWorker.PhoneNumber &&
                                    _.Status == providerWorker.Status));
        }
        private ProviderWorkerViewModel MapToProviderWorkerViewModel(ProviderWorker providerWorker) =>
        providerWorker != null
                ? new ProviderWorkerViewModel
        {
            Id                = providerWorker.Id,
            ProviderId        = providerWorker.ProviderId,
            Name              = providerWorker.Name,
            LastName          = providerWorker.LastName,
            Email             = providerWorker.Email,
            LastKnownLocation = providerWorker.LastKnownLocation,
            PhoneNumber       = providerWorker.PhoneNumber,
            Status            = providerWorker.Status,
            ProfilePictureUrl = Url.BuildGetImageUrl(providerWorker?.ProviderWorkerImageBucketKey?.Store, providerWorker?.ProviderWorkerImageBucketKey?.Bucket, "profilepicture"),
            DeviceId          = providerWorker.DeviceId
        }

                : null;
Exemple #6
0
        public async Task TestGetByIdAsyncCanRetrieveProviderWorker()
        {
            // arrange
            var providerId = Guid.NewGuid().ToString("n");
            var id         = Guid.NewGuid().ToString("n");
            var provider   = new Provider
            {
                Id      = providerId,
                City    = "Springfield",
                State   = "Illinois",
                Name    = "TowNow!",
                Email   = "*****@*****.**",
                ZipCode = "2342",
                ProviderImageBucketKey = new ImageBucketKey {
                    Store = "some-store", Bucket = Guid.NewGuid().ToString("n")
                },
                Address = "742 Evergreen Terrace",
            };

            var providerWorker = new ProviderWorker
            {
                Id         = id,
                ProviderId = providerId,
                Name       = "Homer",
                LastName   = "Simpson"
            };

            _dataStore.EnsureProvider(provider);
            _dataStore.EnsureProviderWorker(providerWorker);

            // act
            var(providerWorkerResult, outcomeAction, error) = await _providerWorkerRepository.GetByIdAsync(providerId, id);

            // assert
            Assert.NotNull(providerWorkerResult);
            Assert.Equal(RepositoryOutcomeAction.OkNone, outcomeAction);
            Assert.Null(error);
            Assert.Equal(providerWorker.Id, providerWorkerResult.Id);
            Assert.Equal(providerWorker.ProviderId, providerWorkerResult.ProviderId);
            Assert.Equal(providerWorker.LastKnownLocation, providerWorkerResult.LastKnownLocation);
            Assert.Equal(providerWorker.LastName, providerWorkerResult.LastName);
            Assert.Equal(providerWorker.Name, providerWorkerResult.Name);
            Assert.Equal(providerWorker.PhoneNumber, providerWorkerResult.PhoneNumber);
            Assert.Equal(providerWorker.Status, providerWorkerResult.Status);
        }
        public async Task TestGetAssignmentSucceedsWith200OnExistentDocument()
        {
            // arrange
            var assignmentController = GetAssignmentController();

            var client = new Client {
                Id = Guid.NewGuid().ToString("n"), Name = "John", LastName = "Carmack"
            };
            var provider = new Provider {
                Id = Guid.NewGuid().ToString("n"), Name = "bTow"
            };
            var worker = new ProviderWorker {
                Id = Guid.NewGuid().ToString("n"), Name = "Andrew", LastName = "Garfield"
            };
            var assignment =
                new Assignment
            {
                Id               = Guid.NewGuid().ToString("n"),
                ClientId         = client.Id,
                WorkerId         = worker.Id,
                ProviderId       = provider.Id,
                Status           = AssignmentStatus.Created,
                StatusReason     = AssignmentStatusReason.New,
                CreationDateTime = DateTimeOffset.Now
            };

            _testDataStore.EnsureClient(client);
            _testDataStore.EnsureProvider(provider);
            _testDataStore.EnsureWorker(worker);
            _testDataStore.EnsureAssignment(assignment);

            // act
            var actualResult = await assignmentController.GetAssignment(assignment.Id);

            // assert
            var actualAssignmentResult = actualResult as OkObjectResult;
            var actualAssignment       = actualAssignmentResult.Value as AssignmentViewModel;

            Assert.True(actualAssignmentResult != null, "actualAssignmentResult should be of type OkObjectResult");
            Assert.True(actualAssignment != null, "actualAssignment should be of Type Assignment");
            Assert.Equal(200, actualAssignmentResult.StatusCode);
            Assert.Equal(assignment.Id, actualAssignment.Id);
        }
        public async Task TestNewAssignmentSucceedsWith201()
        {
            // arrange
            var assignmentController = GetAssignmentController();

            var client = new Client {
                Id = Guid.NewGuid().ToString("n"), Name = "John", LastName = "Carmack"
            };
            var provider = new Provider {
                Id = Guid.NewGuid().ToString("n"), Name = "bTow"
            };
            var worker = new ProviderWorker {
                Id = Guid.NewGuid().ToString("n"), Name = "Andrew", LastName = "Garfield"
            };
            var assignmentVM =
                new NewAssignmentBindingModel
            {
                InitialLocation = new GeoLocation {
                    Latitude = -34.605062, Longitude = -58.375979
                },
                ClientId         = client.Id,
                WorkerId         = worker.Id,
                ProviderId       = provider.Id,
                Status           = AssignmentStatus.Created,
                StatusReason     = AssignmentStatusReason.New,
                CreationDateTime = DateTimeOffset.Now
            };

            _testDataStore.EnsureClient(client);
            _testDataStore.EnsureProvider(provider);
            _testDataStore.EnsureWorker(worker);

            // act
            var actualResult = await assignmentController.NewAssignment(assignmentVM);

            // assert
            var actualNewAssignmentResult = actualResult as CreatedResult;

            Assert.True(actualNewAssignmentResult != null, "actualNewAssignmentResult should be of type CreatedResult");
            Assert.Equal(201, actualNewAssignmentResult.StatusCode);
            Assert.Matches("^.*/assignment/.*$", actualNewAssignmentResult.Location);
        }
Exemple #9
0
        public async Task <ProviderWorkerDisplayModel> UpdateBySlug(string slug, ProviderWorkerUpdateModel model)
        {
            if (!await _providerRepository.IsWorkerInRoleBySlug(slug, _userId, ProviderWorkerRole.USER_MANAGER))
            {
                throw new AccessDeniedException("", typeof(AppUser));
            }

            var shortUser = await _appUserRepository.GetShortById(model.UserId);

            if (shortUser == null)
            {
                throw new EntityNotFoundException(model.UserId, typeof(AppUser));
            }

            if (shortUser.Status == UserStatus.Blocked)
            {
                throw new MRException(-1, "User is blocked");
            }

            ProviderWorker entity = _mapper.Map <ProviderWorker>(model);

            entity.UserEmail = shortUser.Email;

            if (!await _providerRepository.IsWorkerExistsBySlug(slug, model.UserId))
            {
                await _providerRepository.InsertWorkersBySlug(slug, entity);
            }
            else
            {
                await _providerRepository.UpdateWorkerBySlug(slug, model.UserId, model.Roles);
            }

            if (!await _appUserManager.IsInRoleAsync(shortUser, AppUserRoleList.MANAGER))
            {
                await _appUserManager.AddToRoleAsync(shortUser, AppUserRoleList.MANAGER);
            }

            return(_mapper.Map <ProviderWorkerDisplayModel>(entity).ApplyUser(shortUser));
        }
Exemple #10
0
        public async Task TesNewAsyncFailsToCreateProviderWorkerWhenProviderDoesNotExist()
        {
            // arrange
            var providerId = "0000ffff0000ffff0000ffff0000ffff";

            var providerWorker = new ProviderWorker
            {
                ProviderId = providerId,
                Name       = "Homer",
                LastName   = "Simpson"
            };

            _dataStore.EnsureProviderDoesNotExist(providerId);

            // act
            var(providerWorkerResult, outcomeAction, error) = await _providerWorkerRepository.NewAsync(providerId, providerWorker);

            // assert
            Assert.Null(providerWorkerResult);
            Assert.Equal(RepositoryOutcomeAction.ValidationErrorNone, outcomeAction);
            Assert.NotNull(error);
        }
Exemple #11
0
        public async Task TestPatchLastKnownLocationAsyncReturnsNullOnNonExistantProvider()
        {
            // arrange
            var providerId = Guid.NewGuid().ToString("n");
            var id         = "0000ffff0000ffff0000ffff0000ffff";
            var provider   = new Provider
            {
                Id      = providerId,
                City    = "Springfield",
                State   = "Illinois",
                Name    = "TowNow!",
                Email   = "*****@*****.**",
                ZipCode = "2342",
                ProviderImageBucketKey = new ImageBucketKey {
                    Store = "some-store", Bucket = Guid.NewGuid().ToString("n")
                },
                Address = "742 Evergreen Terrace",
            };

            var providerWorker = new ProviderWorker
            {
                Id         = id,
                ProviderId = providerId,
                Name       = "Homer",
                LastName   = "Simpson"
            };

            _dataStore.EnsureProvider(provider);
            _dataStore.EnsureProviderWorkerDoesNotExist(providerId, id);

            // act
            var(updateProviderWorkerResult, outcomeAction, error) = await _providerWorkerRepository.PatchLastKnownLocationAsync(providerId, providerWorker);

            // assert
            Assert.Null(updateProviderWorkerResult);
            Assert.Equal(RepositoryOutcomeAction.NotFoundNone, outcomeAction);
            Assert.Null(error);
        }
Exemple #12
0
        public async Task TestPatchLastKnownLocationAsyncFailsToUpdateProviderWorkerWhenProviderDoesNotExist()
        {
            // arrange
            var providerId = "0000ffff0000ffff0000ffff0000ffff";
            var id         = Guid.NewGuid().ToString("n");

            var providerWorker = new ProviderWorker
            {
                Id         = id,
                ProviderId = providerId,
                Name       = "Homer",
                LastName   = "Simpson"
            };

            _dataStore.EnsureProviderDoesNotExist(providerId);

            // act
            var(updateProviderWorkerResult, outcomeAction, error) = await _providerWorkerRepository.PatchLastKnownLocationAsync(providerId, providerWorker);

            // assert
            Assert.Null(updateProviderWorkerResult);
            Assert.Equal(RepositoryOutcomeAction.ValidationErrorNone, outcomeAction);
            Assert.NotNull(error);
        }
Exemple #13
0
        public async Task TestPatchAsyncPatchesProviderWorker(JsonPatchDocument <ProviderWorker> providerWorkerPatch)
        {
            // arrange
            var providerId = Guid.NewGuid().ToString("n");
            var id         = Guid.NewGuid().ToString("n");
            var provider   = new Provider
            {
                Id      = providerId,
                City    = "Springfield",
                State   = "Illinois",
                Name    = "TowNow!",
                Email   = "*****@*****.**",
                ZipCode = "2342",
                ProviderImageBucketKey = new ImageBucketKey {
                    Store = "some-store", Bucket = Guid.NewGuid().ToString("n")
                },
                Address = "742 Evergreen Terrace",
            };

            var providerWorker = new ProviderWorker
            {
                Id                = id,
                ProviderId        = providerId,
                Name              = "Homer",
                LastName          = "Simpson",
                LastKnownLocation = new GeoLocation {
                    Longitude = -67, Latitude = 32
                },
                Status = ProviderWorkerStatus.Idle,
            };

            var expectedProviderWorker = new ProviderWorker
            {
                Id                = providerWorker.Id,
                ProviderId        = providerWorker.ProviderId,
                Name              = providerWorker.Name,
                LastName          = providerWorker.LastName,
                LastKnownLocation = providerWorker.LastKnownLocation,
                Status            = providerWorker.Status
            };

            providerWorkerPatch.ApplyTo(expectedProviderWorker);
            _dataStore.EnsureProvider(provider);
            _dataStore.EnsureProviderWorker(providerWorker);

            // act
            var(patchedProviderWorkerResult, outcomeAction, error) = await _providerWorkerRepository.PatchAsync(providerId, id, providerWorkerPatch);

            // assert
            Assert.NotNull(patchedProviderWorkerResult);
            Assert.Equal(RepositoryOutcomeAction.OkUpdated, outcomeAction);
            Assert.Null(error);

            Assert.Equal(expectedProviderWorker.Id, patchedProviderWorkerResult.Id);
            Assert.Equal(expectedProviderWorker.ProviderId, patchedProviderWorkerResult.ProviderId);
            Assert.Equal(expectedProviderWorker.LastKnownLocation, patchedProviderWorkerResult.LastKnownLocation);
            Assert.Equal(expectedProviderWorker.LastName, patchedProviderWorkerResult.LastName);
            Assert.Equal(expectedProviderWorker.Name, patchedProviderWorkerResult.Name);
            Assert.Equal(expectedProviderWorker.PhoneNumber, patchedProviderWorkerResult.PhoneNumber);
            Assert.Equal(expectedProviderWorker.Status, patchedProviderWorkerResult.Status);
            Assert.Equal(expectedProviderWorker.ProviderWorkerImageBucketKey?.Store, patchedProviderWorkerResult.ProviderWorkerImageBucketKey?.Store);
            Assert.Equal(expectedProviderWorker.ProviderWorkerImageBucketKey?.Bucket, patchedProviderWorkerResult.ProviderWorkerImageBucketKey?.Bucket);

            Assert.True(
                _dataStore
                .TestProviderWorker(_ =>
                                    _.Id == expectedProviderWorker.Id &&
                                    _.ProviderId == expectedProviderWorker.ProviderId &&
                                    (
                                        (
                                            _.LastKnownLocation != null &&
                                            expectedProviderWorker.LastKnownLocation != null &&
                                            _.LastKnownLocation.Latitude == expectedProviderWorker.LastKnownLocation.Latitude &&
                                            _.LastKnownLocation.Longitude == expectedProviderWorker.LastKnownLocation.Longitude) ||
                                        (_.LastKnownLocation == null && expectedProviderWorker.LastKnownLocation == null)
                                    ) &&
                                    _.LastName == expectedProviderWorker.LastName &&
                                    _.Name == expectedProviderWorker.Name &&
                                    _.PhoneNumber == expectedProviderWorker.PhoneNumber &&
                                    _.Status == expectedProviderWorker.Status));
        }
Exemple #14
0
        public async Task TestPatchLastKnownLocationAsyncPatchesProviderWorker()
        {
            // arrange
            var providerId = Guid.NewGuid().ToString("n");
            var id         = Guid.NewGuid().ToString("n");
            var provider   = new Provider
            {
                Id      = providerId,
                City    = "Springfield",
                State   = "Illinois",
                Name    = "TowNow!",
                Email   = "*****@*****.**",
                ZipCode = "2342",
                ProviderImageBucketKey = new ImageBucketKey {
                    Store = "some-store", Bucket = Guid.NewGuid().ToString("n")
                },
                Address = "742 Evergreen Terrace",
            };

            var providerWorker = new ProviderWorker
            {
                Id                = id,
                ProviderId        = providerId,
                Name              = "Homer",
                LastName          = "Simpson",
                LastKnownLocation = new GeoLocation {
                    Longitude = -67, Latitude = 32
                }
            };

            var updatedProviderWorker = new ProviderWorker
            {
                Id                = id,
                ProviderId        = providerId,
                Name              = "Bart",
                LastName          = "Simpson",
                LastKnownLocation = new GeoLocation {
                    Longitude = -68, Latitude = 31
                }
            };

            _dataStore.EnsureProvider(provider);
            _dataStore.EnsureProviderWorker(providerWorker);

            // act
            var(providerWorkerResult, outcomeAction, error) = await _providerWorkerRepository.PatchLastKnownLocationAsync(providerId, updatedProviderWorker);

            // assert
            Assert.NotNull(providerWorkerResult);
            Assert.Equal(RepositoryOutcomeAction.OkUpdated, outcomeAction);
            Assert.Null(error);

            Assert.Equal(providerWorker.Id, providerWorkerResult.Id);
            Assert.Equal(providerWorker.ProviderId, providerWorkerResult.ProviderId);
            // we must test that only LastKnownLocation has changed
            Assert.Equal(updatedProviderWorker.LastKnownLocation, providerWorkerResult.LastKnownLocation);
            Assert.Equal(providerWorker.LastName, providerWorkerResult.LastName);
            Assert.Equal(providerWorker.Name, providerWorkerResult.Name);
            Assert.Equal(providerWorker.PhoneNumber, providerWorkerResult.PhoneNumber);
            Assert.Equal(providerWorker.Status, providerWorkerResult.Status);
            Assert.Equal(providerWorker.ProviderWorkerImageBucketKey?.Store, providerWorkerResult.ProviderWorkerImageBucketKey?.Store);
            Assert.Equal(providerWorker.ProviderWorkerImageBucketKey?.Bucket, providerWorkerResult.ProviderWorkerImageBucketKey?.Bucket);

            Assert.True(
                _dataStore
                .TestProviderWorker(_ =>
                                    _.Id == providerWorker.Id &&
                                    _.ProviderId == providerWorker.ProviderId &&
                                    _.LastKnownLocation == updatedProviderWorker.LastKnownLocation &&
                                    _.LastName == providerWorker.LastName &&
                                    _.Name == providerWorker.Name &&
                                    _.PhoneNumber == providerWorker.PhoneNumber &&
                                    _.Status == providerWorker.Status));
        }
Exemple #15
0
        public async Task <(ProviderWorker providerWorker, RepositoryOutcomeAction outcomeAction, object error)> NewAsync(string providerId, ProviderWorker providerWorker, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (providerId == null)
            {
                throw new ArgumentNullException(nameof(providerId));
            }
            if (providerWorker == null)
            {
                throw new ArgumentNullException(nameof(providerWorker));
            }

            var providerExists = await(await _mongoDatabase.Providers().FindAsync(_ => _.Id == providerId, cancellationToken: cancellationToken)).AnyAsync(cancellationToken);

            if (!providerExists)
            {
                return(null, RepositoryOutcomeAction.ValidationErrorNone, new { cause = "Missing Provider", data = providerId });
            }

            providerWorker.Id         = Guid.NewGuid().ToString("n");
            providerWorker.ProviderId = providerId;

            await _mongoDatabase
            .Workers()
            .InsertOneAsync(providerWorker, cancellationToken: cancellationToken);

            return(providerWorker, RepositoryOutcomeAction.OkCreated, null);
        }
Exemple #16
0
        public async Task <ProviderWorkerDisplayModel> CreateBySlug(string slug, ProviderWorkerCreateModel model)
        {
            if (!await _providerRepository.IsWorkerInRoleBySlug(slug, _userId, ProviderWorkerRole.USER_MANAGER))
            {
                throw new AccessDeniedException(slug, typeof(ProviderWorker));
            }

            model.Email = model.Email.ToLower();

            ProviderWorker worker = null;

            var existsUser = await _appUserRepository.FindByEmailAsync(model.Email, new System.Threading.CancellationToken());

            if (existsUser == null)
            {
                existsUser = new AppUser
                {
                    CreateTime = DateTime.UtcNow,
                    State      = MREntityState.Active,
                    Status     = UserStatus.Invited,
                    Tels       = new List <MRUserTel>(),
                    UserName   = model.Email,
                    Email      = model.Email,
                    FirstName  = model.FirstName,
                    LastName   = model.LastName,
                    UpdateTime = DateTime.UtcNow,
                };

                existsUser = await _appUserRepository.Insert(existsUser);

                await _appUserManager.AddToRolesAsync(existsUser, new List <string>()
                {
                    AppUserRoleList.MANAGER,
                    AppUserRoleList.USER
                });

                var providerShort = await _providerRepository.GetShortBySlug(slug);

                var invite = await _userInviteRepository.Insert(new UserInvite
                {
                    Code         = UserInviteCodeGenerator.Generate(),
                    IsByIdentity = false,
                    ProviderId   = providerShort.Id,
                    ProviderName = providerShort.Name,
                    State        = MREntityState.Active,
                    UserId       = existsUser.Id
                });

                _logger.LogInformation("Created new user {0} from provider {1}", existsUser.Email, providerShort.Slug);

                // TODO add invite user email
            }
            else
            {
                if (await _providerRepository.IsWorkerExistsBySlug(slug, existsUser.Id))
                {
                    throw new EntityExistsException("Id", existsUser.Id, typeof(AppUser));
                }

                if (!await _appUserManager.IsInRoleAsync(existsUser, AppUserRoleList.MANAGER))
                {
                    await _appUserManager.AddToRoleAsync(existsUser, AppUserRoleList.MANAGER);
                }


                // TODO add welcome to provider user email
            }

            worker = new ProviderWorker
            {
                Roles     = model.Roles,
                UserEmail = model.Email,
                UserId    = existsUser.Id
            };

            await _providerRepository.InsertWorkersBySlug(slug, worker);

            _logger.LogInformation("Added new worker {0} to provider {1} by user {2}", worker.UserEmail, slug, _userEmail);

            return(_mapper.Map <ProviderWorkerDisplayModel>(worker).ApplyUser(existsUser));
        }
Exemple #17
0
 public async Task <bool> InsertWorkersBySlug(string slug, ProviderWorker worker) => await InsertWorkersBySlug(slug, new List <ProviderWorker>() { worker });
Exemple #18
0
        public async Task <(ProviderWorker providerWorker, RepositoryOutcomeAction outcomeAction, object error)> PatchAllButProviderWorkerImageStoreAsync(string providerId, ProviderWorker providerWorker, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (providerId == null)
            {
                throw new ArgumentNullException(nameof(providerId));
            }
            if (providerWorker == null)
            {
                throw new ArgumentNullException(nameof(providerWorker));
            }

            var providerExists = await(await _mongoDatabase.Providers().FindAsync(_ => _.Id == providerId, cancellationToken: cancellationToken)).AnyAsync(cancellationToken);

            if (!providerExists)
            {
                return(null, RepositoryOutcomeAction.ValidationErrorNone, new { cause = "Missing Provider", data = providerId });
            }

            providerWorker.ProviderId = providerId;
            var result =
                await _mongoDatabase.Workers()
                .FindOneAndUpdateAsync(
                    new FilterDefinitionBuilder <ProviderWorker>()
                    .And(
                        new FilterDefinitionBuilder <ProviderWorker>().Eq(_ => _.ProviderId, providerWorker.ProviderId),
                        new FilterDefinitionBuilder <ProviderWorker>().Eq(_ => _.Id, providerWorker.Id)),
                    new UpdateDefinitionBuilder <ProviderWorker>()
                    .Set(_ => _.DeviceId, providerWorker.DeviceId)
                    .Set(_ => _.Email, providerWorker.Email)
                    .Set(_ => _.Name, providerWorker.Name)
                    .Set(_ => _.LastName, providerWorker.LastName)
                    .Set(_ => _.LastKnownLocation, providerWorker.LastKnownLocation)
                    .Set(_ => _.PhoneNumber, providerWorker.PhoneNumber)
                    .Set(_ => _.Status, providerWorker.Status),
                    new FindOneAndUpdateOptions <ProviderWorker>()
            {
                ReturnDocument = ReturnDocument.After
            },
                    cancellationToken);

            var outcomeAction = result != null ? RepositoryOutcomeAction.OkUpdated : RepositoryOutcomeAction.NotFoundNone;

            return(result, outcomeAction, null);
        }
Exemple #19
0
 public void EnsureWorker(ProviderWorker worker)
 {
     _mongoDatabase.Workers().InsertOne(worker);
 }
Exemple #20
0
        public async Task <(ProviderWorker providerWorker, RepositoryOutcomeAction outcomeAction, object error)> UpdateAsync(string providerId, ProviderWorker providerWorker, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (providerId == null)
            {
                throw new ArgumentNullException(nameof(providerId));
            }
            if (providerWorker == null)
            {
                throw new ArgumentNullException(nameof(providerWorker));
            }

            var providerExists = await(await _mongoDatabase.Providers().FindAsync(_ => _.Id == providerId, cancellationToken: cancellationToken)).AnyAsync(cancellationToken);

            if (!providerExists)
            {
                return(null, RepositoryOutcomeAction.ValidationErrorNone, new { cause = "Missing Provider", data = providerId });
            }

            providerWorker.ProviderId = providerId;

            var result = await _mongoDatabase
                         .Workers()
                         .ReplaceOneAsync(_ => _.Id == providerWorker.Id, providerWorker, cancellationToken: cancellationToken);

            return
                (result.MatchedCount == 1 && result.MatchedCount == result.ModifiedCount
                    ? (providerWorker, RepositoryOutcomeAction.OkUpdated, null)
                    : ((ProviderWorker)null, RepositoryOutcomeAction.NotFoundNone, (object)null));
        }