113 lines
3.9 KiB
C#
113 lines
3.9 KiB
C#
|
using Microsoft.Graph;
|
|||
|
using Teamified.Api.Teams.Interfaces;
|
|||
|
|
|||
|
namespace Teamified.Api.Teams.Infrastructure;
|
|||
|
public class TeamsService : ITeamsService
|
|||
|
{
|
|||
|
private readonly GraphServiceClient _graphServiceClient;
|
|||
|
private readonly IHttpContextAccessor _context;
|
|||
|
|
|||
|
public TeamsService(
|
|||
|
GraphServiceClient graphServiceClient,
|
|||
|
IHttpContextAccessor httpContextAccessor)
|
|||
|
{
|
|||
|
_graphServiceClient = graphServiceClient;
|
|||
|
_context = httpContextAccessor;
|
|||
|
}
|
|||
|
public async Task<Models.Team> GetTeamByGroupId(Guid groupId)
|
|||
|
{
|
|||
|
var group = await _graphServiceClient.Groups[groupId.ToString()]
|
|||
|
.Request()
|
|||
|
.Expand("members($select=id,displayName,userPrincipalName,jobTitle,mail)") // can´t expand more than 1 item (owners, members does not work)
|
|||
|
.Select(g => new { g.Id, g.DisplayName, g.Description, g.Members })
|
|||
|
.GetAsync();
|
|||
|
|
|||
|
var team = Models.Team.MapFromGraphGroup(group);
|
|||
|
|
|||
|
var groupOwners = await _graphServiceClient.Groups[groupId.ToString()]
|
|||
|
.Owners
|
|||
|
.Request()
|
|||
|
.Select("id,displayName,userPrincipalName,jobTitle,mail")
|
|||
|
.GetAsync();
|
|||
|
|
|||
|
var owners = groupOwners.CurrentPage;
|
|||
|
|
|||
|
team.AddOwners(owners);
|
|||
|
|
|||
|
var teamChannels = await _graphServiceClient.Teams[groupId.ToString()]
|
|||
|
.Channels
|
|||
|
.Request()
|
|||
|
.GetAsync();
|
|||
|
|
|||
|
var channels = teamChannels.CurrentPage;
|
|||
|
|
|||
|
team.AddChannels(channels);
|
|||
|
|
|||
|
return team;
|
|||
|
}
|
|||
|
|
|||
|
public async Task<IEnumerable<Models.Team>> ListTeams()
|
|||
|
{
|
|||
|
var teamsCollection = await _graphServiceClient.Groups
|
|||
|
.Request()
|
|||
|
.Filter("resourceProvisioningOptions/Any(x:x eq 'Team')")
|
|||
|
.Expand("members($select=id,displayName,userPrincipalName,jobTitle,mail)") // can´t expand more than 1 item (owners, members does not work), but for this Listing endpoint is fine.
|
|||
|
.Select(g => new { g.Id, g.DisplayName, g.Description, g.Members })
|
|||
|
.GetAsync();
|
|||
|
|
|||
|
var teams = teamsCollection.CurrentPage;
|
|||
|
|
|||
|
var result = teams.Select(t => Models.Team.MapFromGraphGroup(t));
|
|||
|
|
|||
|
return result;
|
|||
|
}
|
|||
|
|
|||
|
public async Task<string> ProvisionTeam(Models.Team team)
|
|||
|
{
|
|||
|
var currentUserId = _context.HttpContext.User.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
|
|||
|
|
|||
|
var newTeam = new Team()
|
|||
|
{
|
|||
|
DisplayName = team.DisplayName,
|
|||
|
Description = team.Description,
|
|||
|
AdditionalData = new Dictionary<string, object>()
|
|||
|
{
|
|||
|
{"template@odata.bind", "https://graph.microsoft.com/v1.0/teamsTemplates('standard')"}
|
|||
|
},
|
|||
|
Members = new TeamMembersCollectionPage()
|
|||
|
{
|
|||
|
new AadUserConversationMember
|
|||
|
{
|
|||
|
Roles = new List<string>()
|
|||
|
{
|
|||
|
"owner"
|
|||
|
},
|
|||
|
AdditionalData = new Dictionary<string, object>()
|
|||
|
{
|
|||
|
{"user@odata.bind", $"https://graph.microsoft.com/v1.0/users/{currentUserId}"}
|
|||
|
}
|
|||
|
}
|
|||
|
}, Channels = new TeamChannelsCollectionPage
|
|||
|
{
|
|||
|
new Channel
|
|||
|
{
|
|||
|
DisplayName = "KickOff Channel",
|
|||
|
IsFavoriteByDefault = true,
|
|||
|
Description = "As per company policy, place here data related with the Kickoff of the Team"
|
|||
|
}
|
|||
|
}
|
|||
|
};
|
|||
|
|
|||
|
var result = await _graphServiceClient.Teams
|
|||
|
.Request()
|
|||
|
.AddResponseAsync(newTeam);
|
|||
|
|
|||
|
if (result.HttpHeaders.TryGetValues("Location", out var locationValues))
|
|||
|
{
|
|||
|
return locationValues?.First();
|
|||
|
}
|
|||
|
|
|||
|
return "Something went wrong. Location not found";
|
|||
|
}
|
|||
|
}
|