public async Task CreateUserWithOutCompanyRole()
        {
            using var helper = await new SimpleTestHelperBuilderCompanyUser().Build();
            var uri = $"api/companies/{helper.Company.Id}/users";

            PropertyUserLoginDTO user = GetUser("Phillip", "Schmidt", "Test123456", new List <RoleDTO>()
            {
                new RoleDTO()
                {
                    Name = "Mitarbeiter"
                }
            });

            var response = await helper.client.PostAsync(uri, user.ToStringContent());

            var newUser = await response.Content.Parse <PropertyUserDTO>();

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);

            var uriUser = $"api/companies/{helper.Company.Id}/users/{newUser.User.Id}";

            response = await helper.client.GetAsync(uriUser);

            var exists = await response.Content.Parse <PropertyUserDTO>() != null;

            Assert.IsTrue(exists);

            var signInNewUser = await SignIn(helper.client, newUser.User.Username, "Test123456");

            helper.client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", signInNewUser.Token);

            response = await helper.client.PostAsync(uri, user.ToStringContent());

            Assert.IsFalse(response.IsSuccessStatusCode);
        }
        public async Task CreateUserTrue()
        {
            using var helper = await new SimpleTestHelperBuilderCompanyUser().Build();
            var uri = $"api/companies/{helper.Company.Id}/users";

            PropertyUserLoginDTO user = GetUser("Phillip", "Schmidt", "Test123456", new List <RoleDTO>()
            {
                new RoleDTO()
                {
                    Name = "Mitarbeiter"
                }
            });

            var response = await helper.client.PostAsync(uri, user.ToStringContent());

            var newUser = await response.Content.Parse <PropertyUserDTO>();

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);

            var uriUser = $"api/companies/{helper.Company.Id}/users/{newUser.User.Id}";

            response = await helper.client.GetAsync(uriUser);

            var exists = await response.Content.Parse <PropertyUserDTO>() != null;

            Assert.IsTrue(exists);
        }
        public async Task CreateUserFirstNameFalse()
        {
            using var helper = await new SimpleTestHelperBuilderCompanyUser().Build();

            var uri = $"api/companies/{helper.Company.Id}/users";

            PropertyUserLoginDTO user = GetUser(" ", "Schmidt", "Test123456", new List <RoleDTO>()
            {
                new RoleDTO()
                {
                    Name = "Mitarbeiter"
                }
            });
            var response = await helper.client.PostAsync(uri, user.ToStringContent());

            Assert.IsFalse(response.IsSuccessStatusCode);
        }
        public async Task <PropertyUserDTO> CreateComapanyUserAsync(string companyId, PropertyUserLoginDTO user)
        {
            var company = await _companyRepository.GetCompanyByIdAsync(companyId);

            var requestUserId = _httpContextAccessor.HttpContext.User.GetUserId();

            var requestUser = await GetCompanyUserAsync(companyId, requestUserId.ToString());

            if (requestUser is null)
            {
                throw new HttpStatusException(400, "Der angefragte Benutzer Existiert nicht in der Firma");
            }

            if (requestUser.Roles.FirstOrDefault(x => x.Name.Equals(Role.CompanyRole.Name)) is null)
            {
                throw new HttpStatusException(400, "Nur der Firmen Account darf einen Benutzer erstellen");
            }

            // create new user
            User newUser = new User()
            {
                Firstname = user.Firstname,
                Lastname  = user.Lastname
            };

            // generate username
            newUser.Username = await _authService.GenerateUserNameAsync(newUser.Firstname, newUser.Lastname);

            // password hashed by BCrypt with workFactor of 11 => round about 150-300 ms depends on hardware.
            newUser.HashedPassword = _authService.GetHashedPassword(user.Password);

            // save user
            await _userService.CreateNewUserAsync(newUser);

            var roles = await GetRoleIds(user.Roles);

            company.Users.Add(new PropertyUser()
            {
                UserId = newUser.Id, RoleIds = roles
            });

            await _companyRepository.UpdateAsync(company);

            var roleList = await _roleService.GetRolesAsync();

            var roleDTOs = new List <RoleDTO>();

            foreach (var roleId in roles)
            {
                roleDTOs.Add(new RoleDTO(roleList.FirstOrDefault(x => x.Id.Equals(roleId))));
            }

            return(new PropertyUserDTO()
            {
                User = new UserDTO(newUser), Roles = roleDTOs
            });
        }
        public async Task <PropertyUserDTO> UpdateComapanyUserAsync(string companyId, string userId, PropertyUserLoginDTO user)
        {
            if (!userId.Equals(user.UserId))
            {
                throw new HttpStatusException(400, "Die angegebene UserID stimmt nicht mit dem User Überein");
            }

            var userToUpdate = new User()
            {
                Firstname      = user.Firstname,
                Lastname       = user.Lastname,
                HashedPassword = _authService.GetHashedPassword(user.Password)
            };

            await _userService.UpdateUserAsync(new ObjectId(userId), userToUpdate);

            var roles = await GetRoleIds(user.Roles);

            var company = await _companyRepository.GetCompanyByIdAsync(companyId);

            var companyUser = company.Users.FirstOrDefault(x => x.UserId.Equals(userId));

            if (companyUser is null)
            {
                throw new HttpStatusException(400, "Es wurde kein User mit dieser ID gefunden");
            }

            companyUser.RoleIds = roles;

            await _companyRepository.UpdateAsync(company);

            var roleDTOs = new List <RoleDTO>();
            var roleList = await _roleService.GetRolesAsync();

            foreach (var roleId in roles)
            {
                roleDTOs.Add(new RoleDTO(roleList.FirstOrDefault(x => x.Id.Equals(roleId))));
            }

            return(new PropertyUserDTO()
            {
                User = new UserDTO(userToUpdate), Roles = user.Roles
            });
        }
        public async Task <ActionResult <PropertyUserDTO> > UpdateCompanyUser([FromRoute] string companyId, string userId, PropertyUserLoginDTO user)
        {
            var updatedUser = await _companyUserService.UpdateComapanyUserAsync(companyId, userId, user);

            return(Ok(updatedUser));
        }
        public async Task <ActionResult <PropertyUserDTO> > CreateCompanyUser([FromRoute] string companyId, PropertyUserLoginDTO user)
        {
            var newUser = await _companyUserService.CreateComapanyUserAsync(companyId, user);

            return(Ok(newUser));
        }