private static async Task <Group> CreateGroupAsync(string accessToken, HttpClient httpClient, string displayName, string description, string classification, string mailNickname, string owner, GroupVisibility visibility, TeamsTemplateType templateType = TeamsTemplateType.None, TeamResourceBehaviorOptions?[] resourceBehaviorOptions = null) { Group group = new Group(); // get the owner if no owner was specified var ownerId = string.Empty; if (string.IsNullOrEmpty(owner)) { var user = await GraphHelper.GetAsync <User>(httpClient, "v1.0/me?$select=Id", accessToken); ownerId = user.Id; } else { var user = await GraphHelper.GetAsync <User>(httpClient, $"v1.0/users/{owner}?$select=Id", accessToken); if (user != null) { ownerId = user.Id; } else { // find the user in the organization var collection = await GraphHelper.GetResultCollectionAsync <User>(httpClient, $"v1.0/users?$filter=mail eq '{owner}'&$select=Id", accessToken); if (collection != null) { if (collection.Any()) { ownerId = collection.First().Id; } } } } group.DisplayName = displayName; group.Description = description; group.Classification = classification; group.MailEnabled = true; group.MailNickname = mailNickname ?? await CreateAliasAsync(httpClient, accessToken); group.GroupTypes = new List <string>() { "Unified" }; group.SecurityEnabled = false; group.Owners = new List <string>() { $"https://{PnPConnection.Current.GraphEndPoint}/v1.0/users/{ownerId}" }; group.Members = new List <string>() { $"https://{PnPConnection.Current.GraphEndPoint}/v1.0/users/{ownerId}" }; group.Visibility = visibility == GroupVisibility.NotSpecified ? GroupVisibility.Private : visibility; if (resourceBehaviorOptions != null && resourceBehaviorOptions.Length > 0) { var teamResourceBehaviorOptionsValue = new List <string>(); for (int i = 0; i < resourceBehaviorOptions.Length; i++) { teamResourceBehaviorOptionsValue.Add(resourceBehaviorOptions[i].ToString()); } group.ResourceBehaviorOptions = teamResourceBehaviorOptionsValue; } switch (templateType) { case TeamsTemplateType.EDU_Class: { group.Visibility = GroupVisibility.HiddenMembership; group.CreationOptions = new List <string> { "ExchangeProvisioningFlags:461", "classAssignments" }; group.EducationObjectType = "Section"; break; } case TeamsTemplateType.EDU_PLC: { group.CreationOptions = new List <string> { "PLC" }; break; } default: { group.CreationOptions = new List <string> { "ExchangeProvisioningFlags:3552" }; break; } } try { return(await GraphHelper.PostAsync <Group>(httpClient, "v1.0/groups", group, accessToken)); } catch (GraphException ex) { if (ex.Error.Message.Contains("extension_fe2174665583431c953114ff7268b7b3_Education_ObjectType")) { throw new PSInvalidOperationException("Invalid EDU license type"); } else { throw; } } }
public static async Task <Team> NewTeamAsync(string accessToken, HttpClient httpClient, string groupId, string displayName, string description, string classification, string mailNickname, string owner, GroupVisibility visibility, TeamCreationInformation teamCI, TeamsTemplateType templateType = TeamsTemplateType.None, TeamResourceBehaviorOptions?[] resourceBehaviorOptions = null) { Group group = null; Team returnTeam = null; // Create group if (string.IsNullOrEmpty(groupId)) { group = await CreateGroupAsync(accessToken, httpClient, displayName, description, classification, mailNickname, owner, visibility, templateType, resourceBehaviorOptions); bool wait = true; int iterations = 0; while (wait) { iterations++; try { var createdGroup = await GraphHelper.GetAsync <Group>(httpClient, $"v1.0/groups/{group.Id}", accessToken); if (!string.IsNullOrEmpty(createdGroup.DisplayName)) { wait = false; } } catch (Exception) { // In case of exception wait for 5 secs await Task.Delay(TimeSpan.FromSeconds(5)); } // Don't wait more than 1 minute if (iterations > 12) { wait = false; } } } else { group = await GraphHelper.GetAsync <Group>(httpClient, $"v1.0/groups/{groupId}", accessToken); if (group == null) { throw new PSArgumentException($"Cannot find group with id {groupId}"); } teamCI.Visibility = group.Visibility; teamCI.Description = group.Description; } if (group != null) { Team team = teamCI.ToTeam(group.Visibility); var retry = true; var iteration = 0; while (retry) { try { var teamSettings = await GraphHelper.PutAsync(httpClient, $"v1.0/groups/{group.Id}/team", team, accessToken); if (teamSettings != null) { returnTeam = await TeamsUtility.GetTeamAsync(accessToken, httpClient, group.Id); } retry = false; } catch (Exception) { await Task.Delay(5000); iteration++; } if (iteration > 10) // don't try more than 10 times { retry = false; } } } return(returnTeam); }