public async Task StartAccessSync(List <string> plantList, bool removeUserAccess) { _logger.LogInformation($"[GroupSync] : Started at {Timestamp}"); _logger.LogInformation("[GroupSync] : Getting plants."); var plants = new List <Plant>(); if (plantList.Any()) { plants.AddRange(plantList.Select(plant => _plantService.GetPlant(plant))); } else { plants = _plantService.GetAllPlants(); } // Set person CreatedBy cache await _personService.SetPersonCreatedByCache(); foreach (var plant in plants) { if (plant.IsVoided || string.IsNullOrEmpty(plant.AffiliateGroupId) || string.IsNullOrEmpty(plant.InternalGroupId)) { // go to next plant if above values are empty or plant is voided continue; } _logger.LogInformation($"[GroupSync] : Started handling {plant.PlantId} at {Timestamp}"); // Get PCS user OIDs var pcsPersonOidList = await GetPcsUserOidList(plant.PlantId); // Get AD member OIDs var adMemberOidList = await GetAdMemberOidList(new[] { plant.AffiliateGroupId, plant.InternalGroupId }); // Get AD members that are not existing or mapped by OID in PCS var membersInAdNotInPcs = adMemberOidList.Except(pcsPersonOidList).ToList(); if (membersInAdNotInPcs.Any()) { _logger.LogInformation($"[GroupSync] : Found {membersInAdNotInPcs.Count} members to update from AD."); _logger.LogInformation("[GroupSync] : Starting AD members update."); var members = membersInAdNotInPcs.Select(oid => new Member(oid, shouldRemove: false)).ToList(); await ProcessMembers(members, plant.PlantId); _logger.LogInformation("[GroupSync] : Finished AD members update."); } else { _logger.LogInformation("[GroupSync] : No AD members to update."); } if (removeUserAccess) { // Get PCS users that are no longer a member of the AD group(s) var usersInPcsNotInAd = pcsPersonOidList.Except(adMemberOidList).ToList(); if (usersInPcsNotInAd.Any()) { _logger.LogInformation($"[GroupSync] : Found {usersInPcsNotInAd.Count} users in PCS (remove access from AD group)."); _logger.LogInformation("[GroupSync] : Starting PCS users update."); var members = usersInPcsNotInAd.Select(oid => new Member(oid, shouldRemove: true)).ToList(); await ProcessMembers(members, plant.PlantId); _logger.LogInformation("[GroupSync] : Finished PCS users update."); } else { _logger.LogInformation("[GroupSync] : No PCS users to update."); } } else { _logger.LogInformation("[GroupSync] : PCS users update (remove access) is disabled. This step will be skipped."); } _logger.LogInformation($"[GroupSync] : Finished handling {plant.PlantId} at {Timestamp}"); // Take a break to allow AI to finish logging. await Task.Delay(10000); } _logger.LogInformation($"[GroupSync] : Finished at {Timestamp}"); }