Пример #1
0
        public async Task <DepartmentGroupMember> MoveUserIntoGroupAsync(string userId, int groupId, bool isAdmin, int departmentId, CancellationToken cancellationToken = default(CancellationToken))
        {
            var departmentGroup = await GetGroupByIdAsync(groupId);

            if (departmentGroup == null || departmentGroup.DepartmentId != departmentId)
            {
                return(null);
            }

            var depMember = (await _departmentGroupMembersRepository.GetAllGroupMembersByUserAndDepartmentAsync(userId, departmentId)).FirstOrDefault();

            if (depMember == null)
            {
                depMember = new DepartmentGroupMember();
            }

            depMember.DepartmentGroupId = groupId;
            depMember.DepartmentId      = departmentId;
            depMember.IsAdmin           = isAdmin;
            depMember.UserId            = userId;

            var saved = await _departmentGroupMembersRepository.SaveOrUpdateAsync(depMember, cancellationToken);

            InvalidateGroupInCache(groupId);

            _eventAggregator.SendMessage <UserAssignedToGroupEvent>(new UserAssignedToGroupEvent()
            {
                DepartmentId = departmentGroup.DepartmentId, UserId = userId, Group = departmentGroup
            });

            return(saved);
        }
Пример #2
0
        public bool MoveUserIntoGroup(string userId, int groupId, bool isAdmin, int departmentId)
        {
            var departmentGroup = GetGroupById(groupId);

            if (departmentGroup == null)
            {
                return(false);
            }

            var depMember = (from member in _departmentGroupMembersRepository.GetAll()
                             where member.UserId == userId && member.DepartmentId == departmentId
                             select member).FirstOrDefault();

            if (depMember == null)
            {
                depMember = new DepartmentGroupMember();
            }

            depMember.DepartmentGroupId = groupId;
            depMember.DepartmentId      = departmentId;
            depMember.IsAdmin           = isAdmin;
            depMember.UserId            = userId;

            _departmentGroupMembersRepository.SaveOrUpdate(depMember);
            InvalidateGroupInCache(groupId);

            _eventAggregator.SendMessage <UserAssignedToGroupEvent>(new UserAssignedToGroupEvent()
            {
                DepartmentId = departmentGroup.DepartmentId, UserId = userId, Group = departmentGroup
            });

            return(true);
        }
Пример #3
0
        public DepartmentGroupMember SaveGroupMember(DepartmentGroupMember depMember, CancellationToken cancellationToken = default(CancellationToken))
        {
            _departmentGroupMembersRepository.SaveOrUpdateAsync(depMember, cancellationToken);

            InvalidateGroupInCache(depMember.DepartmentGroupId);

            return(depMember);
        }
Пример #4
0
        public DepartmentGroupMember SaveGroupMember(DepartmentGroupMember depMember)
        {
            _departmentGroupMembersRepository.SaveOrUpdate(depMember);

            InvalidateGroupInCache(depMember.DepartmentGroupId);

            return(depMember);
        }
Пример #5
0
        public IActionResult NewGroup(NewGroupView model, IFormCollection collection)
        {
            model.Users  = _departmentsService.GetAllUsersForDepartment(DepartmentId);
            model.Groups = _departmentGroupsService.GetAllGroupsForDepartment(DepartmentId);

            var groups = new List <DepartmentGroup>();

            groups.Add(new DepartmentGroup {
                DepartmentGroupId = -1, Name = "None"
            });
            groups.AddRange(model.Groups.Where(x => x.Type.HasValue && x.Type.Value == (int)DepartmentGroupTypes.Station));

            model.StationGroups = new SelectList(groups, "DepartmentGroupId", "Name");

            var groupAdmins = new List <string>();
            var groupUsers  = new List <string>();
            var allUsers    = new List <string>();

            if (collection.ContainsKey("groupAdmins"))
            {
                groupAdmins.AddRange(collection["groupAdmins"].ToString().Split(char.Parse(",")));
            }

            if (collection.ContainsKey("groupUsers"))
            {
                groupUsers.AddRange(collection["groupUsers"].ToString().Split(char.Parse(",")));
            }

            allUsers.AddRange(groupAdmins);
            allUsers.AddRange(groupUsers);

            foreach (var groupUser in allUsers)
            {
                if (_departmentGroupsService.IsUserInAGroup(groupUser, DepartmentId))
                {
                    var profile = _userProfileService.GetProfileByUserId(groupUser);

                    ModelState.AddModelError("", string.Format("{0} Is already in a group. Cannot add to another.", profile.FullName.AsFirstNameLastName));
                }
            }

            if (model.NewGroup.Type.HasValue && model.NewGroup.Type.Value == (int)DepartmentGroupTypes.Station)
            {
                if (String.IsNullOrWhiteSpace(model.What3Word))
                {
                    if (String.IsNullOrEmpty(model.Latitude) && String.IsNullOrEmpty(model.Longitude))
                    {
                        if (String.IsNullOrEmpty(model.Address1))
                        {
                            ModelState.AddModelError("Address1", string.Format("The Address field is required for station groups"));
                        }

                        if (String.IsNullOrEmpty(model.City))
                        {
                            ModelState.AddModelError("City", string.Format("The City field is required for station groups"));
                        }

                        if (String.IsNullOrEmpty(model.Country))
                        {
                            ModelState.AddModelError("Country", string.Format("The Country field is required for station groups"));
                        }

                        if (String.IsNullOrEmpty(model.PostalCode))
                        {
                            ModelState.AddModelError("PostalCode", string.Format("The Postal Code field is required for station groups"));
                        }

                        if (String.IsNullOrEmpty(model.State))
                        {
                            ModelState.AddModelError("State", string.Format("The State field is required for station groups"));
                        }
                    }
                }
                else
                {
                    var result = _geoLocationProvider.GetCoordinatesFromW3W(model.What3Word);

                    if (result == null)
                    {
                        ModelState.AddModelError("What3Word", string.Format("The What3Words address entered was incorrect."));
                    }
                    else
                    {
                        model.Latitude  = result.Latitude.ToString();
                        model.Longitude = result.Longitude.ToString();
                    }
                }
            }

            if (ModelState.IsValid)
            {
                model.NewGroup.DepartmentId = DepartmentId;
                var users = new List <DepartmentGroupMember>();

                foreach (var user in allUsers)
                {
                    if (users.All(x => x.UserId != user))
                    {
                        var dgm = new DepartmentGroupMember();
                        dgm.DepartmentId = DepartmentId;
                        dgm.UserId       = user;

                        if (groupAdmins.Contains(user))
                        {
                            dgm.IsAdmin = true;
                        }

                        users.Add(dgm);
                    }
                }

                if (model.NewGroup.Type.HasValue && model.NewGroup.Type.Value == (int)DepartmentGroupTypes.Station)
                {
                    if (String.IsNullOrEmpty(model.Latitude) && String.IsNullOrEmpty(model.Longitude))
                    {
                        model.NewGroup.Address.Address1   = model.Address1;
                        model.NewGroup.Address.City       = model.City;
                        model.NewGroup.Address.Country    = model.Country;
                        model.NewGroup.Address.PostalCode = model.PostalCode;
                        model.NewGroup.Address.State      = model.State;
                    }
                    else
                    {
                        model.NewGroup.Address   = null;
                        model.NewGroup.Latitude  = model.Latitude;
                        model.NewGroup.Longitude = model.Longitude;
                    }

                    if (!String.IsNullOrWhiteSpace(model.What3Word))
                    {
                        model.NewGroup.What3Words = model.What3Word;
                    }
                }
                else
                {
                    model.NewGroup.Address = null;
                }

                if (model.NewGroup.ParentDepartmentGroupId <= 0)
                {
                    model.NewGroup.ParentDepartmentGroupId = null;
                }

                if (!String.IsNullOrWhiteSpace(model.PrinterApiKey) && !String.IsNullOrWhiteSpace(model.PrinterId))
                {
                    var printer = new DepartmentGroupPrinter();
                    printer.PrinterId   = int.Parse(model.PrinterId);
                    printer.PrinterName = model.PrinterName;
                    printer.ApiKey      = SymmetricEncryption.Encrypt(model.PrinterApiKey, Config.SystemBehaviorConfig.ExternalLinkUrlParamPassphrase);

                    model.NewGroup.DispatchToPrinter = true;
                    model.NewGroup.PrinterData       = JsonConvert.SerializeObject(printer);
                }

                model.NewGroup.Members       = users;
                model.NewGroup.DispatchEmail = RandomGenerator.GenerateRandomString(6, 6, false, true, false, true, true, false, null);
                model.NewGroup.MessageEmail  = RandomGenerator.GenerateRandomString(6, 6, false, true, false, true, true, false, null);

                _departmentGroupsService.Save(model.NewGroup);

                var auditEvent = new AuditEvent();
                auditEvent.DepartmentId = DepartmentId;
                auditEvent.UserId       = UserId;
                auditEvent.Type         = AuditLogTypes.GroupAdded;
                auditEvent.After        = model.NewGroup.CloneJson();
                _eventAggregator.SendMessage <AuditEvent>(auditEvent);

                return(RedirectToAction("Index", "Groups", new { Area = "User" }));
            }

            return(View("NewGroup", model));
        }
Пример #6
0
        public IActionResult EditGroup(EditGroupView model, IFormCollection collection)
        {
            if (!_authorizationService.CanUserEditDepartmentGroup(UserId, model.EditGroup.DepartmentGroupId))
            {
                Unauthorized();
            }

            model.Users  = _departmentsService.GetAllUsersForDepartment(DepartmentId);
            model.Groups = _departmentGroupsService.GetAllGroupsForDepartment(DepartmentId);

            List <DepartmentGroup> groups = new List <DepartmentGroup>();

            groups.Add(new DepartmentGroup {
                DepartmentGroupId = -1, Name = "None"
            });
            groups.AddRange(model.Groups.Where(x => x.Type.HasValue && x.Type.Value == (int)DepartmentGroupTypes.Station));
            model.StationGroups = new SelectList(groups, "DepartmentGroupId", "Name");

            var group = _departmentGroupsService.GetGroupById(model.EditGroup.DepartmentGroupId);

            if (String.IsNullOrWhiteSpace(group.DispatchEmail))
            {
                group.DispatchEmail = RandomGenerator.GenerateRandomString(6, 6, false, true, false, true, true, false, null);
            }

            if (String.IsNullOrWhiteSpace(group.MessageEmail))
            {
                group.MessageEmail = RandomGenerator.GenerateRandomString(6, 6, false, true, false, true, true, false, null);
            }

            var auditEvent = new AuditEvent();

            auditEvent.DepartmentId = DepartmentId;
            auditEvent.UserId       = UserId;
            auditEvent.Type         = AuditLogTypes.GroupChanged;
            auditEvent.Before       = group.CloneJson();

            group.Name = model.EditGroup.Name;

            var groupAdmins = new List <string>();
            var groupUsers  = new List <string>();
            var allUsers    = new List <string>();

            if (collection.ContainsKey("groupAdmins"))
            {
                groupAdmins.AddRange(collection["groupAdmins"].ToString().Split(char.Parse(",")));
            }

            if (collection.ContainsKey("groupUsers"))
            {
                groupUsers.AddRange(collection["groupUsers"].ToString().Split(char.Parse(",")));
            }

            allUsers.AddRange(groupAdmins);
            allUsers.AddRange(groupUsers);

            if (model.EditGroup.Type.HasValue && model.EditGroup.Type.Value == (int)DepartmentGroupTypes.Station)
            {
                if (String.IsNullOrWhiteSpace(model.What3Word))
                {
                    if (String.IsNullOrEmpty(model.Latitude) && String.IsNullOrEmpty(model.Longitude))
                    {
                        if (String.IsNullOrEmpty(model.Address1))
                        {
                            ModelState.AddModelError("Address1", string.Format("The Address field is required for station groups"));
                        }

                        if (String.IsNullOrEmpty(model.City))
                        {
                            ModelState.AddModelError("City", string.Format("The City field is required for station groups"));
                        }

                        if (String.IsNullOrEmpty(model.Country))
                        {
                            ModelState.AddModelError("Country", string.Format("The Country field is required for station groups"));
                        }

                        if (String.IsNullOrEmpty(model.PostalCode))
                        {
                            ModelState.AddModelError("PostalCode", string.Format("The Postal Code field is required for station groups"));
                        }

                        if (String.IsNullOrEmpty(model.State))
                        {
                            ModelState.AddModelError("State", string.Format("The State field is required for station groups"));
                        }
                    }
                }
                else
                {
                    var result = _geoLocationProvider.GetCoordinatesFromW3W(model.What3Word);

                    if (result == null)
                    {
                        ModelState.AddModelError("What3Word", string.Format("The What3Words address entered was incorrect."));
                    }
                    else
                    {
                        model.Latitude  = result.Latitude.ToString();
                        model.Longitude = result.Longitude.ToString();
                    }
                }
            }

            if (ModelState.IsValid)
            {
                model.EditGroup.DepartmentId = DepartmentId;
                List <DepartmentGroupMember> users = new List <DepartmentGroupMember>();

                foreach (var user in allUsers)
                {
                    if (users.All(x => x.UserId != user))
                    {
                        var dgm = new DepartmentGroupMember();
                        dgm.DepartmentId = DepartmentId;
                        dgm.UserId       = user;

                        if (groupAdmins.Contains(user))
                        {
                            dgm.IsAdmin = true;
                        }

                        users.Add(dgm);
                    }
                }

                if (model.EditGroup.Type.HasValue && model.EditGroup.Type.Value == (int)DepartmentGroupTypes.Station)
                {
                    if (group.Address == null)
                    {
                        group.Address = new Address();
                    }

                    if (String.IsNullOrEmpty(model.Latitude) && String.IsNullOrEmpty(model.Longitude))
                    {
                        group.Address.Address1   = model.Address1;
                        group.Address.City       = model.City;
                        group.Address.Country    = model.Country;
                        group.Address.PostalCode = model.PostalCode;
                        group.Address.State      = model.State;
                    }
                    else
                    {
                        group.Address   = null;
                        group.Latitude  = model.Latitude;
                        group.Longitude = model.Longitude;
                    }

                    if (!String.IsNullOrWhiteSpace(model.What3Word))
                    {
                        group.What3Words = model.What3Word;
                    }

                    group.ParentDepartmentGroupId = null;
                    group.Parent = null;
                }
                else
                {
                    group.Address = null;
                }

                if (model.EditGroup.ParentDepartmentGroupId <= 0)
                {
                    group.ParentDepartmentGroupId = null;
                }

                group.Members = users;
                _departmentGroupsService.Update(group);

                auditEvent.After = group.CloneJson();
                _eventAggregator.SendMessage <AuditEvent>(auditEvent);

                return(RedirectToAction("Index", "Groups", new { Area = "User" }));
            }

            model.EditGroup = group;

            return(View(model));
        }
Пример #7
0
        public async Task <IActionResult> EditGroup(EditGroupView model, IFormCollection collection, CancellationToken cancellationToken)
        {
            if (!await _authorizationService.CanUserEditDepartmentGroupAsync(UserId, model.EditGroup.DepartmentGroupId))
            {
                Unauthorized();
            }

            model.Users = await _departmentsService.GetAllUsersForDepartmentAsync(DepartmentId);

            model.Groups = await _departmentGroupsService.GetAllGroupsForDepartmentAsync(DepartmentId);

            List <DepartmentGroup> groups = new List <DepartmentGroup>();

            groups.Add(new DepartmentGroup {
                DepartmentGroupId = -1, Name = "None"
            });
            groups.AddRange(model.Groups.Where(x => x.Type.HasValue && x.Type.Value == (int)DepartmentGroupTypes.Station));
            model.StationGroups = new SelectList(groups, "DepartmentGroupId", "Name");

            var group = await _departmentGroupsService.GetGroupByIdAsync(model.EditGroup.DepartmentGroupId);

            if (String.IsNullOrWhiteSpace(group.DispatchEmail))
            {
                group.DispatchEmail = RandomGenerator.GenerateRandomString(6, 6, false, true, false, true, true, false, null);
            }

            if (String.IsNullOrWhiteSpace(group.MessageEmail))
            {
                group.MessageEmail = RandomGenerator.GenerateRandomString(6, 6, false, true, false, true, true, false, null);
            }

            var auditEvent = new AuditEvent();

            auditEvent.DepartmentId = DepartmentId;
            auditEvent.UserId       = UserId;
            auditEvent.Type         = AuditLogTypes.GroupChanged;
            auditEvent.Before       = group.CloneJson();

            group.Name = model.EditGroup.Name;

            var groupAdmins = new List <string>();
            var groupUsers  = new List <string>();
            var allUsers    = new List <string>();

            if (collection.ContainsKey("groupAdmins"))
            {
                groupAdmins.AddRange(collection["groupAdmins"].ToString().Split(char.Parse(",")));
            }

            if (collection.ContainsKey("groupUsers"))
            {
                groupUsers.AddRange(collection["groupUsers"].ToString().Split(char.Parse(",")));
            }

            allUsers.AddRange(groupAdmins);
            allUsers.AddRange(groupUsers);

            if (model.EditGroup.Type.HasValue && model.EditGroup.Type.Value == (int)DepartmentGroupTypes.Station)
            {
                if (String.IsNullOrWhiteSpace(model.What3Word))
                {
                    if (String.IsNullOrEmpty(model.Latitude) && String.IsNullOrEmpty(model.Longitude))
                    {
                        if (String.IsNullOrEmpty(model.Address1))
                        {
                            ModelState.AddModelError("Address1", string.Format("The Address field is required for station groups"));
                        }

                        if (String.IsNullOrEmpty(model.City))
                        {
                            ModelState.AddModelError("City", string.Format("The City field is required for station groups"));
                        }

                        if (String.IsNullOrEmpty(model.Country))
                        {
                            ModelState.AddModelError("Country", string.Format("The Country field is required for station groups"));
                        }

                        if (String.IsNullOrEmpty(model.PostalCode))
                        {
                            ModelState.AddModelError("PostalCode", string.Format("The Postal Code field is required for station groups"));
                        }

                        if (String.IsNullOrEmpty(model.State))
                        {
                            ModelState.AddModelError("State", string.Format("The State field is required for station groups"));
                        }
                    }
                }
                else
                {
                    var result = _geoLocationProvider.GetCoordinatesFromW3W(model.What3Word);

                    if (result == null)
                    {
                        ModelState.AddModelError("What3Word", string.Format("The What3Words address entered was incorrect."));
                    }
                    else
                    {
                        model.Latitude  = result.Latitude.ToString();
                        model.Longitude = result.Longitude.ToString();
                    }
                }
            }

            if (ModelState.IsValid)
            {
                model.EditGroup.DepartmentId = DepartmentId;

                foreach (var user in allUsers)
                {
                    if (group.Members.All(x => x.UserId != user))
                    {
                        var dgm = new DepartmentGroupMember();
                        dgm.DepartmentId = DepartmentId;
                        dgm.UserId       = user;

                        if (groupAdmins.Contains(user))
                        {
                            dgm.IsAdmin = true;
                        }

                        group.Members.Add(dgm);
                    }
                }

                var usersToRemove = group.Members.Where(x => !allUsers.Contains(x.UserId)).ToList();
                foreach (var user in usersToRemove)
                {
                    group.Members.Remove(user);
                }

                if (model.EditGroup.Type.HasValue && model.EditGroup.Type.Value == (int)DepartmentGroupTypes.Station)
                {
                    if (group.Address == null)
                    {
                        group.Address = new Address();
                    }

                    if (String.IsNullOrEmpty(model.Latitude) && String.IsNullOrEmpty(model.Longitude))
                    {
                        group.Address.Address1   = model.Address1;
                        group.Address.City       = model.City;
                        group.Address.Country    = model.Country;
                        group.Address.PostalCode = model.PostalCode;
                        group.Address.State      = model.State;
                    }
                    else
                    {
                        group.Address   = null;
                        group.Latitude  = model.Latitude;
                        group.Longitude = model.Longitude;
                    }

                    if (!String.IsNullOrWhiteSpace(model.What3Word))
                    {
                        group.What3Words = model.What3Word;
                    }

                    group.ParentDepartmentGroupId = null;
                    group.Parent = null;
                }
                else
                {
                    group.Address = null;
                }

                if (model.EditGroup.ParentDepartmentGroupId <= 0)
                {
                    group.ParentDepartmentGroupId = null;
                }

                if (!String.IsNullOrWhiteSpace(model.PrinterApiKey) && !String.IsNullOrWhiteSpace(model.PrinterId))
                {
                    var printer = new DepartmentGroupPrinter();
                    printer.PrinterId   = int.Parse(model.PrinterId);
                    printer.PrinterName = model.PrinterName;
                    printer.ApiKey      = SymmetricEncryption.Encrypt(model.PrinterApiKey, Config.SystemBehaviorConfig.ExternalLinkUrlParamPassphrase);

                    group.PrinterData = JsonConvert.SerializeObject(printer);
                }
                group.DispatchToPrinter = model.EditGroup.DispatchToPrinter;

                if (!String.IsNullOrWhiteSpace(group.Latitude))
                {
                    group.Latitude = group.Latitude.Replace(" ", "");
                }

                if (!String.IsNullOrWhiteSpace(group.Longitude))
                {
                    group.Longitude = group.Longitude.Replace(" ", "");
                }

                await _departmentGroupsService.UpdateAsync(group, cancellationToken);

                auditEvent.After = group.CloneJson();
                _eventAggregator.SendMessage <AuditEvent>(auditEvent);

                return(RedirectToAction("Index", "Groups", new { Area = "User" }));
            }

            model.EditGroup = group;

            return(View(model));
        }