public async Task <IActionResult> GetMembershipByMemberUserName(Guid groupId, string memberUserName)
        {
            User loggedOnUser = await _identityBusiness.GetUserAsync(User);

            var loggedOnUserIsGroupOwner = await _taskBookBusiness.IsUserGroupOwner(loggedOnUser.Id, groupId);

            if (!loggedOnUserIsGroupOwner)
            {
                return(NotFound());
            }

            User memberUser = await _identityBusiness.FindByNameAsync(memberUserName);

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

            UserGroup membership = await _taskBookBusiness.GetGroupMembership(memberUser.Id, groupId);

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

            var viewModel = _mapper.Map <GroupMembershipViewModel>(membership);

            return(Ok(viewModel));
        }
        public async Task <IActionResult> UpdateUserGroup(Guid groupId, [FromBody] UpdateUserGroupParameters parameters)
        {
            if (parameters == null)
            {
                return(BadRequest());
            }

            User loggedOnUser = await _identityBusiness.GetUserAsync(User);

            if (!ModelState.IsValid)
            {
                return(UnprocessableEntity(ModelState));
            }

            UserGroup groupToUpdateGroup = await _taskBookBusiness.GetUserGroupByGroupId(loggedOnUser.Id, groupId);

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

            if (groupToUpdateGroup.RelationType != UserGroupRelationType.Owner)
            {
                return(Forbid());
            }

            UserGroup updatedGroup = await _taskBookBusiness.UpdateGroup(loggedOnUser.Id, groupId, parameters.GroupName, parameters.IsActive);

            var viewModel = _mapper.Map <UserGroupViewModel>(updatedGroup);

            return(Ok(viewModel));
        }
        public async Task <IActionResult> DeleteMembership(Guid groupId, string memberUserName)
        {
            User loggedOnUser = await _identityBusiness.GetUserAsync(User);

            var loggedOnUserIsGroupOwner = await _taskBookBusiness.IsUserGroupOwner(loggedOnUser.Id, groupId);

            if (!loggedOnUserIsGroupOwner)
            {
                return(NotFound());
            }

            User memberUser = await _identityBusiness.FindByNameAsync(memberUserName);

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

            UserGroup membership = await _taskBookBusiness.GetGroupMembership(memberUser.Id, groupId);

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

            if (membership.RelationType != UserGroupRelationType.Member)
            {
                return(Forbid());
            }

            await _taskBookBusiness.DeleteGroupMembership(memberUser.Id, groupId);

            return(NoContent());
        }
        public async Task <IActionResult> GetUserGroupById(Guid groupId)
        {
            User loggedOnUser = await _identityBusiness.GetUserAsync(User);

            UserGroup userGroup = await _taskBookBusiness.GetUserGroupByGroupId(loggedOnUser.Id, groupId);

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

            var viewModel = _mapper.Map <UserGroupViewModel>(userGroup);

            return(Ok(viewModel));
        }
        public async Task <IActionResult> CreateUserGroup([FromBody] CreateUserGroupParameters parameters)
        {
            if (parameters == null)
            {
                return(BadRequest());
            }

            User loggedOnUser = await _identityBusiness.GetUserAsync(User);

            if (!ModelState.IsValid)
            {
                return(UnprocessableEntity(ModelState));
            }

            UserGroup createdGroup = await _taskBookBusiness.CreateUserGroup(loggedOnUser.Id, parameters.GroupName, parameters.IsActive);

            var viewModel = _mapper.Map <UserGroupViewModel>(createdGroup);

            return(CreatedAtRoute(nameof(GetUserGroupById), new { viewModel.GroupId }, viewModel));
        }
        public async Task <IActionResult> DeleteUserGroup(Guid groupId)
        {
            User loggedOnUser = await _identityBusiness.GetUserAsync(User);

            UserGroup groupToDelete = await _taskBookBusiness.GetUserGroupByGroupId(loggedOnUser.Id, groupId);

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

            if (groupToDelete.RelationType != UserGroupRelationType.Owner)
            {
                return(Forbid());
            }

            await _taskBookBusiness.DeleteGroup(groupId);

            return(NoContent());
        }
        public async Task <IActionResult> CreateMembership(Guid groupId, [FromBody] CreateGroupMembershipParameters parameters)
        {
            if (parameters == null)
            {
                return(BadRequest());
            }

            User loggedOnUser = await _identityBusiness.GetUserAsync(User);

            var loggedOnUserIsGroupOwner = await _taskBookBusiness.IsUserGroupOwner(loggedOnUser.Id, groupId);

            if (!loggedOnUserIsGroupOwner)
            {
                return(NotFound());
            }

            if (!ModelState.IsValid)
            {
                return(UnprocessableEntity(ModelState));
            }

            User memberUser = await _identityBusiness.FindByNameAsync(parameters.UserName);

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

            UserGroup existingMembership = await _taskBookBusiness.GetGroupMembership(memberUser.Id, groupId);

            if (existingMembership != null)
            {
                return(Conflict($"'{memberUser.UserName}' is already member of '{existingMembership.Group.Name}'."));
            }

            UserGroup membership = await _taskBookBusiness.CrateGroupMembership(memberUser.Id, groupId);

            var viewModel = _mapper.Map <GroupMembershipViewModel>(membership);

            return(CreatedAtRoute(nameof(GetMembershipByMemberUserName), new { memberUserName = memberUser.UserName }, viewModel));
        }