public static PlayerApiClient GetPlayerApiClient(IHttpClientFactory httpClientFactory, string apiUrl, TokenResponse tokenResponse)
        {
            var client    = ApiClientsExtensions.GetHttpClient(httpClientFactory, apiUrl, tokenResponse);
            var apiClient = new PlayerApiClient(client);

            return(apiClient);
        }
        public static void AddPlayerApiClient(this IServiceCollection services)
        {
            services.AddScoped <IPlayerApiClient, PlayerApiClient>(p =>
            {
                var httpContextAccessor = p.GetRequiredService <IHttpContextAccessor>();
                var httpClientFactory   = p.GetRequiredService <IHttpClientFactory>();
                var clientOptions       = p.GetRequiredService <ClientOptions>();

                var playerUri = new Uri(clientOptions.urls.playerApi);

                string authHeader = httpContextAccessor.HttpContext.Request.Headers["Authorization"];

                if (authHeader == null)
                {
                    var token  = httpContextAccessor.HttpContext.Request.Query["access_token"];
                    authHeader = new AuthenticationHeaderValue("Bearer", token).ToString();
                }

                var httpClient         = httpClientFactory.CreateClient();
                httpClient.BaseAddress = playerUri;
                httpClient.DefaultRequestHeaders.Add("Authorization", authHeader);

                var apiClient = new PlayerApiClient(httpClient);
                return(apiClient);
            });
        }
Beispiel #3
0
        public ViewService(
            IHttpClientFactory httpClientFactory,
            IMemoryCache cache,
            ClientOptions clientOptions,
            ILogger <ViewService> logger)
        {
            _cache  = cache;
            _logger = logger;

            var playerUri  = new Uri(clientOptions.urls.playerApi);
            var httpClient = httpClientFactory.CreateClient("player-admin");

            httpClient.BaseAddress = playerUri;
            var playerApiClient = new PlayerApiClient(httpClient);

            _playerApiClient = playerApiClient;
        }
Beispiel #4
0
        public static void AddPlayerApiClient(this IServiceCollection services)
        {
            services.AddScoped <IPlayerApiClient, PlayerApiClient>(p =>
            {
                var httpContextAccessor = p.GetRequiredService <IHttpContextAccessor>();
                var httpClientFactory   = p.GetRequiredService <IHttpClientFactory>();
                var clientOptions       = p.GetRequiredService <ClientOptions>();

                var playerUri = new Uri(clientOptions.urls.playerApi);

                string authHeader = httpContextAccessor.HttpContext.Request.Headers["Authorization"];

                var httpClient         = httpClientFactory.CreateClient();
                httpClient.BaseAddress = playerUri;
                httpClient.DefaultRequestHeaders.Add("Authorization", authHeader);

                var apiClient = new PlayerApiClient(httpClient);
                return(apiClient);
            });
        }
        public static async Task <Guid?> CreatePlayerViewAsync(PlayerApiClient playerApiClient, EventEntity eventEntity, Guid parentViewId, CancellationToken ct)
        {
            try
            {
                var view = await playerApiClient.CloneViewAsync(parentViewId, ct);

                view.Name = $"{view.Name.Replace("Clone of ", "")} - {eventEntity.Username}";
                await playerApiClient.UpdateViewAsync((Guid)view.Id, view, ct);

                // add user to first non-admin team
                var roles = await playerApiClient.GetRolesAsync(ct);

                var teams = (await playerApiClient.GetViewTeamsAsync((Guid)view.Id, ct));
                foreach (var team in teams)
                {
                    if (team.Permissions.Where(p => p.Key == "ViewAdmin").Any())
                    {
                        continue;
                    }

                    if (team.RoleId.HasValue)
                    {
                        var role = roles.Where(r => r.Id == team.RoleId).FirstOrDefault();

                        if (role != null && role.Permissions.Where(p => p.Key == "ViewAdmin").Any())
                        {
                            continue;
                        }
                    }

                    await playerApiClient.AddUserToTeamAsync(team.Id, eventEntity.UserId, ct);
                }
                return(view.Id);
            }
            catch (Exception ex)
            {
                return(null);
            }
        }
        public static async Task <bool> AddUserToViewTeamAsync(PlayerApiClient playerApiClient, Guid viewId, Guid userId, CancellationToken ct)
        {
            try
            {
                var view = await playerApiClient.GetViewAsync(viewId, ct);

                var roles = await playerApiClient.GetRolesAsync(ct);

                var teams = await playerApiClient.GetViewTeamsAsync(viewId, ct);

                //Get first non-admin team
                foreach (var team in teams)
                {
                    if (team.Permissions.Where(p => p.Key == "ViewAdmin").Any())
                    {
                        continue;
                    }

                    if (team.RoleId.HasValue)
                    {
                        var role = roles.Where(r => r.Id == team.RoleId).FirstOrDefault();

                        if (role != null && role.Permissions.Where(p => p.Key == "ViewAdmin").Any())
                        {
                            continue;
                        }
                    }

                    await playerApiClient.AddUserToTeamAsync(team.Id, userId, ct);
                }

                return(true);
            }
            catch (Exception ex)
            {
                return(false);
            }
        }
        public static async Task <string> GetCasterVarsFileContentAsync(EventEntity eventEntity, PlayerApiClient playerApiClient, CancellationToken ct)
        {
            try
            {
                var varsFileContent = "";
                var view            = await playerApiClient.GetViewAsync((Guid)eventEntity.ViewId, ct);

                // TODO: exercise_id is deprecated. Remove when no longer in use
                varsFileContent = $"exercise_id = \"{view.Id}\"\r\nview_id = \"{view.Id}\"\r\nuser_id = \"{eventEntity.UserId}\"\r\nusername = \"{eventEntity.Username}\"\r\n";
                var teams = await playerApiClient.GetViewTeamsAsync((Guid)view.Id, ct);

                foreach (var team in teams)
                {
                    var cleanTeamName = Regex.Replace(team.Name.ToLower().Replace(" ", "_"), "[@&'(\\s)<>#]", "", RegexOptions.None);
                    varsFileContent += $"{cleanTeamName} = \"{team.Id}\"\r\n";
                }

                return(varsFileContent);
            }
            catch (Exception ex)
            {
                return("");
            }
        }
        public static async Task <bool> DeletePlayerViewAsync(string playerApiUrl, Guid?viewId, PlayerApiClient playerApiClient, CancellationToken ct)
        {
            // no view to delete
            if (viewId == null)
            {
                return(true);
            }
            // try to delete the view
            try
            {
                await playerApiClient.DeleteViewAsync((Guid)viewId, ct);

                return(true);
            }
            catch (Exception ex)
            {
                return(false);
            }
        }
    private async Task CloneMaps(ViewCreated form, VmContext dbContext)
    {
        if (!form.ParentId.HasValue)
        {
            return;
        }

        var client = _clientFactory.CreateClient("player-admin");

        client.BaseAddress = new Uri(_clientOptions.CurrentValue.urls.playerApi);
        var playerClient = new PlayerApiClient(client);

        // Get maps assigned to parent view
        var maps = await dbContext.Maps
                   .Where(m => m.ViewId == form.ParentId)
                   .Include(m => m.Coordinates)
                   .ToListAsync();

        if (maps.Count == 0)
        {
            return;
        }

        HashSet <Team> parentTeams = new HashSet <Team>();
        HashSet <Team> childTeams  = new HashSet <Team>();

        // Views can't have duplicate teams, so use HashSet for constant time lookups
        try
        {
            parentTeams = (await playerClient.GetViewTeamsAsync(form.ParentId.Value)).ToHashSet();
            childTeams  = (await playerClient.GetViewTeamsAsync(form.ViewId)).ToHashSet();
        }
        catch (ApiException ex)
        {
            // View no longer exists, so there is nothing to clone
            if (ex.StatusCode == (int)HttpStatusCode.NotFound)
            {
                return;
            }
        }

        var clonedMaps = new List <VmMap>();

        // Create clones of maps assigned to the child view
        foreach (var map in maps)
        {
            var clone = map.Clone();
            clone.ViewId = form.ViewId;

            var teamNames = parentTeams
                            .Where(t => map.TeamIds.Contains((Guid)t.Id))
                            .Select(t => t.Name);

            var cloneTeamIds = childTeams
                               .Where(t => teamNames.Contains(t.Name))
                               .Select(t => (Guid)t.Id);

            clone.TeamIds = cloneTeamIds.ToList();

            dbContext.Maps.Add(clone);
        }

        await dbContext.SaveChangesAsync();
    }