public async Task HandleAsync_GivenUsers_UserIsMapped()
        {
            var request = new GetActiveOrganisationUsers(Guid.NewGuid());

            var user = new OrganisationUser(Guid.NewGuid(), Guid.NewGuid(), UserStatus.Active);

            var users = new List <OrganisationUser>()
            {
                user
            };

            var userMapped = new OrganisationUserData()
            {
                UserId         = user.Id.ToString(),
                OrganisationId = user.OrganisationId,
                UserStatus     = (Core.Shared.UserStatus)Enum.Parse(typeof(Core.Shared.UserStatus), user.UserStatus.Value.ToString())
            };

            A.CallTo(() => dataAccess.FetchActiveOrganisationUsers(request.OrganisationId)).Returns(users);
            A.CallTo(() => mapper.Map(user)).Returns(userMapped);

            var result = await handler.HandleAsync(request);

            result.Should().Contain(userMapped);
        }
        public void UpdateUserStatus_UserStatusRejected_UpdateToActive_UserStatusUpdateToActive()
        {
            var orgUser = new OrganisationUser(Guid.NewGuid(), Guid.NewGuid(), UserStatus.Rejected);
            orgUser.UpdateUserStatus(UserStatus.Active);

            Assert.Equal(orgUser.UserStatus, UserStatus.Active);
        }
        GetOrganisationBySimpleSearchTerm_SearchIsValid_AndNoConflictingOrganisationUserExists_ReturnsOrganisation(
            string existingUserId, string userId, Core.Shared.UserStatus userStatus, Core.Shared.OrganisationStatus organisationStatus)
        {
            var organisation = A.Fake <Organisation>();

            A.CallTo(() => organisation.TradingName).Returns("A Company");
            A.CallTo(() => organisation.OrganisationStatus).Returns(organisationStatus.ToDomainEnumeration <OrganisationStatus>());

            A.CallTo(() => context.Organisations)
            .Returns(dbContextHelper.GetAsyncEnabledDbSet(new List <Organisation> {
                organisation
            }));

            var organisationUser = new OrganisationUser(new Guid(userId), new Guid(existingUserId), userStatus.ToDomainEnumeration <UserStatus>());

            A.CallTo(() => context.OrganisationUsers)
            .Returns(dbContextHelper.GetAsyncEnabledDbSet(new List <OrganisationUser>
            {
                organisationUser
            }));

            var result = await FindMatchingOrganisationsDataAccess().GetOrganisationsBySimpleSearchTerm("A", new Guid(userId));

            Assert.Single(result);
            Assert.Equal(organisation, result.Single());
        }
        public async Task HandleAsync_NotOrganisationUser_ThrowsSecurityException()
        {
            // Arrange
            IWeeeAuthorization authorization = new AuthorizationBuilder().DenyOrganisationAccess().Build();

            Guid             organisationUserId = new Guid("10C57182-BF30-4729-BBF8-F8BCBC00EB77");
            OrganisationUser organisationUser   = A.Fake <OrganisationUser>();

            WeeeContext context = A.Fake <WeeeContext>();

            A.CallTo(() => context.OrganisationUsers.FindAsync(organisationUserId)).Returns(organisationUser);

            IMap <OrganisationUser, OrganisationUserData> mapper = A.Fake <IMap <OrganisationUser, OrganisationUserData> >();
            OrganisationUserData organisationUserData            = new OrganisationUserData();

            A.CallTo(() => mapper.Map(organisationUser)).Returns(organisationUserData);

            var handler = new GetOrganisationUserHandler(context, authorization, mapper);
            var request = new GetOrganisationUser(organisationUserId);

            // Act
            Func <Task> action = async() => await handler.HandleAsync(request);

            // Assert
            await Assert.ThrowsAsync <SecurityException>(action);
        }
        public async Task HandleAsync_HappyPath_ReturnsOrganisationUserData()
        {
            // Arrange
            IWeeeAuthorization authorization = AuthorizationBuilder.CreateUserWithAllRights();

            Guid             organisationUserId = new Guid("10C57182-BF30-4729-BBF8-F8BCBC00EB77");
            OrganisationUser organisationUser   = A.Fake <OrganisationUser>();

            WeeeContext context = A.Fake <WeeeContext>();

            A.CallTo(() => context.OrganisationUsers.FindAsync(organisationUserId)).Returns(organisationUser);

            IMap <OrganisationUser, OrganisationUserData> mapper = A.Fake <IMap <OrganisationUser, OrganisationUserData> >();
            OrganisationUserData organisationUserData            = new OrganisationUserData();

            A.CallTo(() => mapper.Map(organisationUser)).Returns(organisationUserData);

            var handler = new GetOrganisationUserHandler(context, authorization, mapper);
            var request = new GetOrganisationUser(organisationUserId);

            // Act
            OrganisationUserData result = await handler.HandleAsync(request);

            // Assert
            Assert.Equal(organisationUserData, result);
        }
        public async Task <Guid> HandleAsync(JoinOrganisation message)
        {
            authorization.EnsureCanAccessExternalArea();

            var userId = userContext.UserId;

            if (!await dataAccess.DoesUserExist(userId))
            {
                throw new ArgumentException(string.Format("Could not find a user with id {0}", userId));
            }

            if (!await dataAccess.DoesOrganisationExist(message.OrganisationId))
            {
                throw new ArgumentException(string.Format("Could not find an organisation with id {0}",
                                                          message.OrganisationId));
            }

            var organisationUser = new OrganisationUser(userId, message.OrganisationId,
                                                        Domain.User.UserStatus.Pending);

            var result = await dataAccess.JoinOrganisation(organisationUser);

            if (!result.Successful)
            {
                throw new InvalidOperationException(result.ErrorMessage);
            }

            return(message.OrganisationId);
        }
Example #7
0
        public void UpdateUserStatus_UserStatusRejected_UpdateToActive_UserStatusUpdateToActive()
        {
            var orgUser = new OrganisationUser(Guid.NewGuid(), Guid.NewGuid(), UserStatus.Rejected);

            orgUser.UpdateUserStatus(UserStatus.Active);

            Assert.Equal(orgUser.UserStatus, UserStatus.Active);
        }
Example #8
0
        public async Task <IActionResult> OnPostAsync()
        {
            OrganisationUser = organisationUserService.GetOrganisationUser(HttpContext.Session.GetString("Token"));
            if (ModelState.IsValid)
            {
                await organisationUserService.ConfirmationInvitationAsync(OrganisationUser.OrganisationId, OrganisationUser.User.Email, Input.Password, userManager);

                return(RedirectToPage("Login"));
            }
            // If we got this far, something failed, redisplay form
            return(Page());
        }
Example #9
0
        public async Task <IActionResult> UpdateUserRole([FromBody] OrganisationUser organisationUser)
        {
            try
            {
                var url = string.Format("{0}://{1}", Request.Scheme, Request.Host.Value);
                await organisationUserService.UpdateUserRoleAsync(organisationUserService.OrganisationId, organisationUserService.UserId, organisationUser);

                return(Ok());
            }
            catch (Exception ex)
            {
                return(BadRequest(new Error(ex.Message)));
            }
        }
        public async Task <OrganisationUserData> HandleAsync(GetManageableOrganisationUser query)
        {
            OrganisationUser organisationUser = await context.OrganisationUsers.FindAsync(query.OrganisationUserId);

            if (organisationUser == null)
            {
                string message = string.Format(
                    "No organisation user was found with ID \"{0}\".",
                    query.OrganisationUserId);
                throw new Exception(message);
            }

            authorization.EnsureOrganisationAccess(organisationUser.OrganisationId);

            return(organisationUserMap.Map(organisationUser));
        }
Example #11
0
        public async void JoinOrganisation_OrganisationUserDoesNotExist_SavesChanges_AndReturnsSuccess()
        {
            var organisationId = Guid.NewGuid();
            var userId         = Guid.NewGuid();

            var organisationUser = new OrganisationUser(userId, organisationId, UserStatus.Pending);

            var result =
                await JoinOrganisationDataAccess()
                .JoinOrganisation(organisationUser);

            A.CallTo(() => context.SaveChangesAsync())
            .MustHaveHappened(Repeated.Exactly.Once);

            Assert.True(result.Successful);
        }
Example #12
0
        public async Task <Guid> HandleAsync(CreatePartnershipRequest message)
        {
            authorization.EnsureCanAccessExternalArea();

            var organisation = Organisation.CreatePartnership(message.TradingName);

            db.Organisations.Add(organisation);

            await db.SaveChangesAsync();

            var organisationUser = new OrganisationUser(userContext.UserId, organisation.Id, UserStatus.Active);

            db.OrganisationUsers.Add(organisationUser);

            await db.SaveChangesAsync();

            return(organisation.Id);
        }
        public async void SingleOrganisationUserForUser_ShouldGetRequest(Core.Shared.UserStatus userStatus)
        {
            var organisationId = Guid.NewGuid();
            var userId         = Guid.NewGuid();

            var organisationUser = new OrganisationUser(userId, organisationId,
                                                        userStatus.ToDomainEnumeration <UserStatus>());

            A.CallTo(() => context.OrganisationUsers)
            .Returns(Data(new List <OrganisationUser>
            {
                organisationUser
            }));

            var result = await GetManageableOrganisationUsersDataAccess().GetManageableUsers(organisationId);

            Assert.Equal(organisationUser, result.Single());
        }
Example #14
0
        public async Task <Guid> HandleAsync(CreateRegisteredCompanyRequest message)
        {
            authorization.EnsureCanAccessExternalArea();

            var organisation = Organisation.CreateRegisteredCompany(message.BusinessName,
                                                                    message.CompanyRegistrationNumber, message.TradingName);

            db.Organisations.Add(organisation);

            await db.SaveChangesAsync();

            var organisationUser = new OrganisationUser(userContext.UserId, organisation.Id, UserStatus.Active);

            db.OrganisationUsers.Add(organisationUser);

            await db.SaveChangesAsync();

            return(organisation.Id);
        }
        public async void MultipleOrganisationUsersForOneUser_ShouldNotRetrieveAnyRejectedOrganisationUsers_WhenNonRejectedOrganisationUserAlsoExists(Core.Shared.UserStatus previousUserStatus, Core.Shared.UserStatus currentUserStatus)
        {
            var organisationId = Guid.NewGuid();
            var userId         = Guid.NewGuid();

            var previousOrganisationUser = new OrganisationUser(userId, organisationId, previousUserStatus.ToDomainEnumeration <UserStatus>());
            var currentOrganisationUser  = new OrganisationUser(userId, organisationId, previousUserStatus.ToDomainEnumeration <UserStatus>());

            A.CallTo(() => context.OrganisationUsers)
            .Returns(Data(new List <OrganisationUser>
            {
                previousOrganisationUser,
                currentOrganisationUser
            }));

            var result = await GetManageableOrganisationUsersDataAccess().GetManageableUsers(organisationId);

            Assert.Equal(currentOrganisationUser, result.Single());
        }
        protected WeeeContext GetPreparedContext()
        {
            WeeeContext context = A.Fake<WeeeContext>();

            var organisations = A.Fake<DbSet<Organisation>>();
            A.CallTo(() => organisations.Add(A<Organisation>._)).Invokes((Organisation o) =>
            {
                addedOrganisation = o;
                addedOrganisationId = Guid.NewGuid();
                dbHelper.SetId(o, addedOrganisationId);
            });

            var organisationUsers = A.Fake<DbSet<OrganisationUser>>();
            A.CallTo(() => organisationUsers.Add(A<OrganisationUser>._)).Invokes((OrganisationUser ou) => addedOrganisationUser = ou);

            A.CallTo(() => context.Organisations).Returns(organisations);
            A.CallTo(() => context.OrganisationUsers).Returns(organisationUsers);

            return context;
        }
        public async Task <JoinOrganisationResult> JoinOrganisation(OrganisationUser organisationUser)
        {
            var existingRequest = await context.OrganisationUsers
                                  .FirstOrDefaultAsync(ou => ou.OrganisationId == organisationUser.OrganisationId &&
                                                       ou.UserId == organisationUser.UserId &&
                                                       ou.UserStatus.Value != UserStatus.Rejected.Value);

            if (existingRequest == null)
            {
                context.OrganisationUsers.Add(organisationUser);
                await context.SaveChangesAsync();

                return(JoinOrganisationResult.Success());
            }

            return(JoinOrganisationResult.Fail(string.Format(
                                                   "Cannot submit a request for user with Id '{0}' to access organisation with Id '{1}': A request to access this organisation already exists with state '{2}'",
                                                   organisationUser.UserId,
                                                   organisationUser.OrganisationId,
                                                   existingRequest.UserStatus.DisplayName)));
        }
Example #18
0
        public async Task <IActionResult> OnGetAsync(string token)
        {
            OrganisationUser = organisationUserService.GetOrganisationUser(token);
            if (OrganisationUser == null)
            {
                return(Redirect(Utils.ReturnToError(Url, HttpContext, "The Url is not valid or already expire.")));
            }
            if (OrganisationUser.IsInvitingExpired)
            {
                return(Redirect(Utils.ReturnToError(Url, HttpContext, "The Url is not valid or already expire.")));
            }
            var userdb = await userManager.FindByEmailAsync(OrganisationUser.User.Email);

            if (userdb != null)
            {
                organisationUserService.ConfirmationInvitation(OrganisationUser.OrganisationId, OrganisationUser.User.Email);
                return(RedirectToPage("Login"));
            }
            HttpContext.Session.SetString("Token", token);
            return(Page());
        }
Example #19
0
        public async void JoinOrganisation_OrganisationUserExistsWithRejectedStatus_SavesChanges_AndReturnsSuccess()
        {
            var organisationId = Guid.NewGuid();
            var userId         = Guid.NewGuid();

            var organisationUser = new OrganisationUser(userId, organisationId, UserStatus.Pending);

            A.CallTo(() => context.OrganisationUsers)
            .Returns(contextHelper.GetAsyncEnabledDbSet(new List <OrganisationUser>
            {
                ValidOrganisationUser(userId, organisationId, Core.Shared.UserStatus.Rejected)
            }));

            var result =
                await JoinOrganisationDataAccess()
                .JoinOrganisation(organisationUser);

            A.CallTo(() => context.SaveChangesAsync())
            .MustHaveHappened(Repeated.Exactly.Once);

            Assert.True(result.Successful);
        }
            GetOrganisationBySimpleSearchTerm_SearchIsValid_AndNoConflictingOrganisationUserExists_ReturnsOrganisation(
            string existingUserId, string userId, Core.Shared.UserStatus userStatus, Core.Shared.OrganisationStatus organisationStatus)
        {
            var organisation = A.Fake<Organisation>();
            A.CallTo(() => organisation.TradingName).Returns("A Company");
            A.CallTo(() => organisation.OrganisationStatus).Returns(organisationStatus.ToDomainEnumeration<OrganisationStatus>());

            A.CallTo(() => context.Organisations)
                .Returns(dbContextHelper.GetAsyncEnabledDbSet(new List<Organisation> { organisation }));

            var organisationUser = new OrganisationUser(new Guid(userId), new Guid(existingUserId), userStatus.ToDomainEnumeration<UserStatus>());
            A.CallTo(() => context.OrganisationUsers)
                .Returns(dbContextHelper.GetAsyncEnabledDbSet(new List<OrganisationUser>
                {
                    organisationUser
                }));

            var result = await FindMatchingOrganisationsDataAccess().GetOrganisationsBySimpleSearchTerm("A", new Guid(userId));

            Assert.Single(result);
            Assert.Equal(organisation, result.Single());
        }
        public async Task InviteUserAsync(OrganisationUser organisationUser, string organisationId, string userId, string webUrl)
        {
            using var context = Context();
            if (string.IsNullOrEmpty(organisationUser.User.Email))
            {
                throw new Exception("Email is require");
            }
            if (string.IsNullOrEmpty(organisationUser.User.FirstName))
            {
                throw new Exception("First name is require");
            }
            if (string.IsNullOrEmpty(organisationUser.User.LastName))
            {
                throw new Exception("Last name is require");
            }
            if (string.IsNullOrEmpty(organisationUser.User.Name))
            {
                throw new Exception("Display name is require");
            }
            if (!context.OrganisationUserMenuFeature.Any(u => u.OrganisationId == organisationId && u.UserId == userId && u.MenuFeatureId == (int)MenuFeatureEnum.ManageOrganisactionSetting))
            {
                throw new Exception("You don't have permission to invite user");
            }
            if (context.OrganisationUser.Any(u => u.OrganisationId == organisationId && u.User.Email.ToLower() == organisationUser.User.Email.ToLower()))
            {
                throw new Exception("User already invited");
            }
            if (context.OrganisationInvitingUser.Any(u => u.OrganisationId == organisationId && u.Email == organisationUser.User.Email.ToLower()))
            {
                throw new Exception("User already invited");
            }
            var newInviteUser = new Dal.Models.OrganisationInvitingUser {
                DisplayName    = organisationUser.User.Name,
                Email          = organisationUser.User.Email.ToLower(),
                FirstName      = organisationUser.User.FirstName,
                LastName       = organisationUser.User.LastName,
                OrganisationId = organisationId,
                RoleName       = organisationUser.RoleName,
                ExpireToken    = CurrentCambodiaTime.AddDays(2),
                Token          = Guid.NewGuid().ToString(),
            };

            if (!organisationUser.IsAdministrator)
            {
                foreach (var m in organisationUser.MenuFeatures)
                {
                    if (m.IsCheck)
                    {
                        context.OrganisationInvitingUserMenuFeature.Add(new Dal.Models.OrganisationInvitingUserMenuFeature
                        {
                            Email          = organisationUser.User.Email.ToLower(),
                            MenuFeatureId  = m.Id,
                            OrganisationId = organisationId
                        });
                    }
                }
            }
            else
            {
                foreach (var m in organisationUser.MenuFeatures)
                {
                    context.OrganisationInvitingUserMenuFeature.Add(new Dal.Models.OrganisationInvitingUserMenuFeature
                    {
                        Email          = organisationUser.User.Email.ToLower(),
                        MenuFeatureId  = m.Id,
                        OrganisationId = organisationId
                    });
                }
            }
            var organisation = context.Organisation.FirstOrDefault(u => u.Id == organisationId);

            context.OrganisationInvitingUser.Add(newInviteUser);
            context.SaveChanges();
            webUrl += "/Identity/Account/Invite?token=" + newInviteUser.Token;
            await emailService.SendEmailAsync(organisationUser.User.Email, "Invitation to Invoice Account", $"You've been invited to join: {organisation.DisplayName} <a href='{webUrl}'>clicking here</a>.", true);
        }
Example #22
0
        protected WeeeContext GetPreparedContext()
        {
            WeeeContext context = A.Fake <WeeeContext>();

            var organisations = A.Fake <DbSet <Organisation> >();

            A.CallTo(() => organisations.Add(A <Organisation> ._)).Invokes((Organisation o) =>
            {
                addedOrganisation   = o;
                addedOrganisationId = Guid.NewGuid();
                dbHelper.SetId(o, addedOrganisationId);
            });

            var organisationUsers = A.Fake <DbSet <OrganisationUser> >();

            A.CallTo(() => organisationUsers.Add(A <OrganisationUser> ._)).Invokes((OrganisationUser ou) => addedOrganisationUser = ou);

            A.CallTo(() => context.Organisations).Returns(organisations);
            A.CallTo(() => context.OrganisationUsers).Returns(organisationUsers);

            return(context);
        }
 public OrganisationUserRequestCompletedEvent(OrganisationUser organisationUser)
 {
     OrganisationUser = organisationUser;
 }
        public OrganisationUser GetOrganisationUser(string organisationId, string requestUserId, string email)
        {
            using var context = Context();
            if (!context.OrganisationUserMenuFeature.Any(u => u.OrganisationId == organisationId && u.UserId == requestUserId && u.MenuFeatureId == (int)MenuFeatureEnum.ManageOrganisactionSetting))
            {
                throw new Exception("You don't have permission to invite user");
            }
            var organisationUser = context.OrganisationUser.FirstOrDefault(u => u.OrganisationId == organisationId && u.User.Email.ToLower() == email);
            var menuFeauture     = context.MenuFeature.Select(u => new MenuFeature
            {
                Id   = u.Id,
                Name = u.Name
            }).ToList();

            if (organisationUser != null)
            {
                var claims = organisationUser.User.AspNetUserClaims.Select(u => new { u.ClaimValue, u.ClaimType }).ToList();
                var result = new OrganisationUser
                {
                    IsAdministrator   = organisationUser.IsOwner || organisationUser.RoleName == "Administrator",
                    IsOwner           = organisationUser.IsOwner,
                    IsInviting        = false,
                    IsInvitingExpired = false,
                    OrganisationId    = organisationUser.OrganisationId,
                    RoleName          = organisationUser.RoleName,
                    User = new User
                    {
                        Email     = organisationUser.User.Email,
                        FirstName = claims.FirstOrDefault(u => u.ClaimType == ClaimTypes.Surname).ClaimValue,
                        LastName  = claims.FirstOrDefault(u => u.ClaimType == ClaimTypes.GivenName).ClaimValue,
                        //Name = claims.FirstOrDefault(u => u.ClaimType == ClaimTypes.Name).ClaimValue,
                        Id = organisationUser.UserId,
                    },
                    MenuFeatures = menuFeauture
                };
                var mfs = context.OrganisationUserMenuFeature.Where(u => u.OrganisationId == organisationId && u.UserId == organisationUser.UserId)
                          .Select(u => u.MenuFeatureId).ToList();
                foreach (var m in result.MenuFeatures)
                {
                    m.IsCheck = mfs.Any(u => u == m.Id);
                }
                return(result);
            }
            var invitingUser = context.OrganisationInvitingUser.FirstOrDefault(u => u.OrganisationId == organisationId && u.Email == email);

            if (invitingUser != null)
            {
                var result = new OrganisationUser
                {
                    IsAdministrator   = invitingUser.RoleName == "Administrator",
                    IsInviting        = true,
                    IsInvitingExpired = invitingUser.ExpireToken < CurrentCambodiaTime,
                    IsOwner           = false,
                    RoleName          = invitingUser.RoleName,
                    OrganisationId    = invitingUser.OrganisationId,
                    User = new User
                    {
                        Email     = invitingUser.Email,
                        FirstName = invitingUser.FirstName,
                        LastName  = invitingUser.LastName,
                        Name      = invitingUser.DisplayName
                    },
                    MenuFeatures = menuFeauture
                };
                var mfs = context.OrganisationInvitingUserMenuFeature.Where(u => u.OrganisationId == organisationId && u.Email == result.User.Email)
                          .Select(u => u.MenuFeatureId).ToList();
                foreach (var m in result.MenuFeatures)
                {
                    m.IsCheck = mfs.Any(u => u == m.Id);
                }
                return(result);
            }
            throw new Exception("User doesn't exist");
        }
Example #25
0
        public void UpdateUserStatus_UserStatusRejected_UpdateToPending_ThrowsException()
        {
            var orgUser = new OrganisationUser(Guid.NewGuid(), Guid.NewGuid(), UserStatus.Rejected);

            Assert.Throws <InvalidOperationException>(() => orgUser.UpdateUserStatus(UserStatus.Pending));
        }
Example #26
0
        public void UpdateUserStatus_UserStatusIsPending_UpdateToInactive_ThrowsException()
        {
            var orgUser = new OrganisationUser(Guid.NewGuid(), Guid.NewGuid(), UserStatus.Pending);

            Assert.Throws <InvalidOperationException>(() => orgUser.UpdateUserStatus(UserStatus.Inactive));
        }
        protected override void Setup()
        {
            base.Setup();

            CanGoBack = false;

            ROSecurityGroupList = ROSecurityGroupList.GetROSecurityGroupList(true);

            //need to find UserID from query string params
            int UserID              = 0;
            int OrganisationUserID  = 0;
            int ProtectedAreaUserID = 0;

            #region " Edit User\Add New Protected Area user\Add New OrganisationUser"

            if ((Page != null) && (Page.Request.Params["UserID"] != null))
            {
                UserID      = Convert.ToInt32(Singular.Encryption.DecryptString(System.Web.HttpUtility.UrlDecode(Page.Request.Params["UserID"]).Replace(" ", "+")));
                Editinguser = UserID != 0 ? METTLib.Security.UserList.GetUserList(UserID).First() : null;

                if (Editinguser != null)
                {
                    //let's check if the page redirection was from protected areas
                    if ((Page.Request.Params["OrganisationProtectedAreaID"] != null))
                    {
                        IsProtectedAreaUserInd = true;
                        //check if the user already exists before creating a new one to avoid duplicates
                        ProtectedAreaID = Convert.ToInt32(Singular.Encryption.DecryptString(System.Web.HttpUtility.UrlDecode(Page.Request.Params["ProtectedAreaID"]).Replace(" ", "+")));
                        var OrganisationProtectedAreaID = Convert.ToInt32(Singular.Encryption.DecryptString(System.Web.HttpUtility.UrlDecode(Page.Request.Params["OrganisationProtectedAreaID"]).Replace(" ", "+")));
                        var ProtectedAreaUser           = OrganisationProtectedAreaUserList.GetOrganisationProtectedAreaUserList().FirstOrDefault(c => c.OrganisationIDProtectedAreaID == OrganisationProtectedAreaID && c.UserID == UserID);
                        ProtectedAreaUserID = ProtectedAreaUser != null?OrganisationProtectedAreaUserList.GetOrganisationProtectedAreaUserList().FirstOrDefault(c => c.OrganisationIDProtectedAreaID == OrganisationProtectedAreaID && c.UserID == UserID).OrganisationProtectedAreaUserID : 0;

                        if (ProtectedAreaUserID != 0)
                        {
                            OrganisationProtectedAreaUser = OrganisationProtectedAreaUserList.GetOrganisationProtectedAreaUserList(ProtectedAreaUserID).FirstOrDefault();
                        }

                        if (OrganisationProtectedAreaUser != null)
                        {
                            SecurityGroupProtectedAreaUserList = SecurityGroupProtectedAreaUserList.GetSecurityGroupProtectedAreaUserList(UserID, ProtectedAreaID);
                            //mark as Active those roles that exists
                            if ((SecurityGroupProtectedAreaUserList != null) && (SecurityGroupProtectedAreaUserList.Count > 0))
                            {
                                foreach (var item in ROSecurityGroupList)
                                {
                                    if (SecurityGroupProtectedAreaUserList.Any(c => c.SecurityGroupID == item.SecurityGroupID && c.IsActiveInd == true))
                                    {
                                        item.IsActiveInd = true;
                                    }
                                }
                            }
                        }
                        else
                        {
                            OrganisationProtectedAreaUser = METTLib.ProtectedArea.OrganisationProtectedAreaUser.NewOrganisationProtectedAreaUser();
                            OrganisationProtectedAreaUser.OrganisationIDProtectedAreaID = Convert.ToInt32(Singular.Encryption.DecryptString(System.Web.HttpUtility.UrlDecode(Page.Request.Params["OrganisationProtectedAreaID"]).Replace(" ", "+")));
                            OrganisationProtectedAreaUser.UserID = UserID;

                            SecurityGroupProtectedAreaUserList = SecurityGroupProtectedAreaUserList.NewSecurityGroupProtectedAreaUserList();
                        }
                    }

                    //let's check if the page redirection was from organisations
                    else if ((Page.Request.Params["OrganisationID"] != null))
                    {
                        IsOrganisationUsersInd = true;
                        //check if the user already exists before creating a new one to avoid duplicates
                        OrganisationID   = Convert.ToInt32(Singular.Encryption.DecryptString(System.Web.HttpUtility.UrlDecode(Page.Request.Params["OrganisationID"]).Replace(" ", "+")));
                        OrganisationUser = OrganisationUserList.GetOrganisationUserList().FirstOrDefault(c => c.OrganisationID == OrganisationID && c.UserID == UserID);

                        if (OrganisationUser == null)
                        {
                            OrganisationUser = OrganisationUser.NewOrganisationUser();
                            OrganisationUser.OrganisationID = OrganisationID;
                            OrganisationUser.UserID         = UserID;

                            SecurityGroupOrganisationUserList = SecurityGroupOrganisationUserList.NewSecurityGroupOrganisationUserList();
                        }
                        else
                        {
                            SecurityGroupOrganisationUserList = SecurityGroupOrganisationUserList.GetSecurityGroupOrganisationUserList(UserID, OrganisationID);
                            //mark as Active the roles that exists
                            if ((SecurityGroupProtectedAreaUserList != null) && (SecurityGroupProtectedAreaUserList.Count > 0))
                            {
                                foreach (var item in ROSecurityGroupList)
                                {
                                    if (SecurityGroupProtectedAreaUserList.Any(c => c.SecurityGroupID == item.SecurityGroupID && c.IsActiveInd == true))
                                    {
                                        item.IsActiveInd = true;
                                    }
                                }
                            }
                        }
                    }

                    else
                    {
                        //editing User
                        SecurityGroupUserList = SecurityGroupUserList.GetSecurityGroupUserList(UserID);

                        if ((SecurityGroupUserList != null) && (SecurityGroupUserList.Count > 0))
                        {
                            foreach (var item in ROSecurityGroupList)
                            {
                                if (SecurityGroupUserList.Any(c => c.SecurityGroupID == item.SecurityGroupID))
                                {
                                    item.IsActiveInd = true;
                                }
                            }
                        }
                    }
                }
            }

            #endregion


            #region " Edit Organisation User - From Organisation Profile "
            if ((Page != null) && (Page.Request.Params["OrganisationUserID"] != null))
            {
                OrganisationUserID = Convert.ToInt32(Singular.Encryption.DecryptString(System.Web.HttpUtility.UrlDecode(Page.Request.Params["OrganisationUserID"]).Replace(" ", "+")));
                OrganisationID     = Convert.ToInt32(Singular.Encryption.DecryptString(System.Web.HttpUtility.UrlDecode(Page.Request.Params["OrganisationID"]).Replace(" ", "+")));

                OrganisationUser = OrganisationUserList.GetOrganisationUserList().FirstOrDefault(c => c.OrganisationUserID == OrganisationUserID);

                if (OrganisationUser != null)
                {
                    UserID                 = OrganisationUser.UserID;
                    Editinguser            = UserID != 0 ? METTLib.Security.UserList.GetUserList(UserID).FirstOrDefault() : null;
                    IsOrganisationUsersInd = true;

                    SecurityGroupOrganisationUserList = SecurityGroupOrganisationUserList.GetSecurityGroupOrganisationUserList(UserID, OrganisationID);

                    //mark as Active those roles that exists
                    if ((SecurityGroupOrganisationUserList != null) && (SecurityGroupOrganisationUserList.Count > 0))
                    {
                        foreach (var item in ROSecurityGroupList)
                        {
                            if (SecurityGroupOrganisationUserList.Any(c => c.SecurityGroupID == item.SecurityGroupID && c.IsActiveInd == true))
                            {
                                item.IsActiveInd = true;
                            }
                        }
                    }
                }
            }

            #endregion


            #region " Edit Organisation Protected Area User - From Protected Area Profile"

            if ((Page != null) && (Page.Request.Params["OrganisationProtectedAreaUserID"] != null))
            {
                ProtectedAreaUserID = Convert.ToInt32(Singular.Encryption.DecryptString(System.Web.HttpUtility.UrlDecode(Page.Request.Params["OrganisationProtectedAreaUserID"]).Replace(" ", "+")));
                ProtectedAreaID     = Convert.ToInt32(Singular.Encryption.DecryptString(System.Web.HttpUtility.UrlDecode(Page.Request.Params["ProtectedAreaID"]).Replace(" ", "+")));

                OrganisationProtectedAreaUser = OrganisationProtectedAreaUserList.GetOrganisationProtectedAreaUserList(ProtectedAreaUserID).FirstOrDefault();

                if (OrganisationProtectedAreaUser != null)
                {
                    UserID = OrganisationProtectedAreaUser.UserID;

                    Editinguser            = UserID != 0 ? METTLib.Security.UserList.GetUserList(UserID).FirstOrDefault() : null;
                    IsProtectedAreaUserInd = true;

                    //ROSecurityGroupProtectedAreaUserList = ROSecurityGroupProtectedAreaUserList.GetROSecurityGroupProtectedAreaUserList(UserID,ProtectedAreaID);

                    SecurityGroupProtectedAreaUserList = SecurityGroupProtectedAreaUserList.GetSecurityGroupProtectedAreaUserList(UserID, ProtectedAreaID);

                    //mark as Active those roles that exists
                    if ((SecurityGroupProtectedAreaUserList != null) && (SecurityGroupProtectedAreaUserList.Count > 0))
                    {
                        foreach (var item in ROSecurityGroupList)
                        {
                            if (SecurityGroupProtectedAreaUserList.Any(c => c.SecurityGroupID == item.SecurityGroupID && c.IsActiveInd == true))
                            {
                                item.IsActiveInd = true;
                            }
                        }
                    }
                }
            }

            #endregion

            if (Editinguser == null)
            {
                //new user
                //Editinguser = METTLib.Security.UserList.GetUserList.new
            }
        }
        public void UpdateUserStatus_UserStatusIsPending_UpdateToInactive_ThrowsException()
        {
            var orgUser = new OrganisationUser(Guid.NewGuid(), Guid.NewGuid(), UserStatus.Pending);

            Assert.Throws<InvalidOperationException>(() => orgUser.UpdateUserStatus(UserStatus.Inactive));
        }
        public void UpdateUserStatus_UserStatusRejected_UpdateToPending_ThrowsException()
        {
            var orgUser = new OrganisationUser(Guid.NewGuid(), Guid.NewGuid(), UserStatus.Rejected);

            Assert.Throws<InvalidOperationException>(() => orgUser.UpdateUserStatus(UserStatus.Pending));
        }
        public async Task UpdateUserRoleAsync(string organisationId, string updateByUserId, OrganisationUser organisationUser)
        {
            using var context = Context();
            if (!context.OrganisationUserMenuFeature.Any(u => u.OrganisationId == organisationId && u.UserId == updateByUserId && u.MenuFeatureId == (int)MenuFeatureEnum.ManageOrganisactionSetting))
            {
                throw new Exception("You don't have permission to update user role");
            }
            var user = context.OrganisationUser.FirstOrDefault(u => u.OrganisationId == organisationId && u.User.Email.ToLower() == organisationUser.User.Email.ToLower());

            if (user != null)
            {
                if (user.IsOwner)
                {
                    throw new Exception("You cannot update role for owner user");
                }
                user.RoleName = organisationUser.RoleName;
                context.OrganisationUserMenuFeature.RemoveRange(context.OrganisationUserMenuFeature.Where(u => u.OrganisationId == organisationId && u.UserId == user.UserId));
                foreach (var t in organisationUser.MenuFeatures)
                {
                    if (t.IsCheck)
                    {
                        context.OrganisationUserMenuFeature.Add(new Dal.Models.OrganisationUserMenuFeature
                        {
                            MenuFeatureId  = t.Id,
                            OrganisationId = organisationId,
                            UserId         = user.UserId
                        });
                    }
                }
                context.SaveChanges();
                await emailService.SendEmailAsync(user.User.Email, "Organisation role change", "Organisation role change", true);

                return;
            }
            var invitingUser = context.OrganisationInvitingUser.FirstOrDefault(u => u.OrganisationId == organisationId && u.Email.ToLower() == organisationUser.User.Email.ToLower());

            if (invitingUser != null)
            {
                invitingUser.RoleName = organisationUser.RoleName;
                context.OrganisationInvitingUserMenuFeature.RemoveRange(context.OrganisationInvitingUserMenuFeature.Where(u => u.OrganisationId == organisationId && u.Email.ToLower() == organisationUser.User.Email.ToLower()));
                foreach (var t in organisationUser.MenuFeatures)
                {
                    if (t.IsCheck)
                    {
                        context.OrganisationInvitingUserMenuFeature.Add(new Dal.Models.OrganisationInvitingUserMenuFeature
                        {
                            MenuFeatureId  = t.Id,
                            OrganisationId = organisationId,
                            Email          = organisationUser.User.Email.ToLower()
                        });
                    }
                }
                context.SaveChanges();
                return;
            }
            throw new Exception("User doesn't exist");
        }
 public async Task <int> ChangeOrganisationUserStatus(OrganisationUser organisationUser, Core.Shared.UserStatus status)
 {
     organisationUser.UpdateUserStatus(status.ToDomainEnumeration <UserStatus>());
     return(await context.SaveChangesAsync());
 }
        public async void JoinOrganisation_OrganisationUserExistsWithRejectedStatus_SavesChanges_AndReturnsSuccess()
        {
            var organisationId = Guid.NewGuid();
            var userId = Guid.NewGuid();

            var organisationUser = new OrganisationUser(userId, organisationId, UserStatus.Pending);

            A.CallTo(() => context.OrganisationUsers)
                .Returns(contextHelper.GetAsyncEnabledDbSet(new List<OrganisationUser>
                {
                    ValidOrganisationUser(userId, organisationId, Core.Shared.UserStatus.Rejected)
                }));

            var result =
                await JoinOrganisationDataAccess()
                    .JoinOrganisation(organisationUser);
            
            A.CallTo(() => context.SaveChangesAsync())
                .MustHaveHappened(Repeated.Exactly.Once);

            Assert.True(result.Successful);
        }
 public async Task<int> ChangeOrganisationUserStatus(OrganisationUser organisationUser, Core.Shared.UserStatus status)
 {
     organisationUser.UpdateUserStatus(status.ToDomainEnumeration<UserStatus>());
     return await context.SaveChangesAsync();
 }
        public async void JoinOrganisation_OrganisationUserDoesNotExist_SavesChanges_AndReturnsSuccess()
        {
            var organisationId = Guid.NewGuid();
            var userId = Guid.NewGuid();

            var organisationUser = new OrganisationUser(userId, organisationId, UserStatus.Pending);

            var result =
                await JoinOrganisationDataAccess()
                    .JoinOrganisation(organisationUser);

            A.CallTo(() => context.SaveChangesAsync())
                .MustHaveHappened(Repeated.Exactly.Once);

            Assert.True(result.Successful);
        }