Esempio n. 1
0
        /// <summary>
        /// <see cref="ITableauProjectService.FindProjectAsync"/>
        /// </summary>
        public async Task <TableauProject> FindProjectAsync(string name)
        {
            _logger?.Debug($"Finding project {name}");

            var pageSize       = 1000;
            var pageNumber     = 1;
            var totalRetrieved = 0;
            var totalAvailable = 0;
            var projects       = new List <TableauProject>();

            do
            {
                var queryFilter = "filter=" + _tableauApiService.BuildQueryFilter("name", QueryFilterOperator.eq, name);
                var url         = _tableauApiService.SiteUrl.AppendUri(
                    $"projects?pageSize={pageSize}&pageNumber={pageNumber}&{queryFilter}"
                    );
                var responseString = await _tableauApiService.SendGetAsync(url).ConfigureAwait(false);

                var responseJson = JToken.Parse(responseString);
                if (!responseJson.Value <JObject>("projects").ContainsKey("project"))
                {
                    break;
                }

                var pagination = JsonConvert.DeserializeObject <TableauPagination>(
                    responseJson.Value <JObject>("pagination").ToString()
                    );

                var pageProjects = JsonConvert.DeserializeObject <List <TableauProject> >(
                    responseJson.Value <JObject>("projects").Value <JArray>("project").ToString()
                    );
                projects.AddRange(pageProjects);

                pageNumber++;
                totalAvailable  = pagination.TotalAvailable;
                totalRetrieved += pagination.PageSize;
            }while (totalRetrieved < totalAvailable);

            projects.ForEach(
                p =>
            {
                p.SiteId     = _tableauApiService.SiteId;
                p.ApiVersion = _tableauApiService.ApiVersion;
            }
                );

            if (!projects.Any())
            {
                _logger?.Debug("No matching projects found");
            }
            else if (projects.Count > 1)
            {
                _logger?.Debug($"{projects.Count} matching projects found");
            }

            return(projects.SingleOrDefault());
        }
Esempio n. 2
0
        /// <summary>
        /// <see cref="ITableauGroupService.FindGroupAsync"/>
        /// </summary>
        public async Task <TableauGroup> FindGroupAsync(string name)
        {
            _logger?.Debug("Finding group");

            var pageSize       = 1000;
            var pageNumber     = 1;
            var totalRetrieved = 0;
            var totalAvailable = 0;

            var queryFilter = "filter=" + _tableauApiService.BuildQueryFilter("name", QueryFilterOperator.eq, name);

            var groups = new List <TableauGroup>();

            do
            {
                var url = _tableauApiService.SiteUrl.AppendUri(
                    $"groups?pageSize={pageSize}&pageNumber={pageNumber}&{queryFilter}"
                    );
                var responseString = await _tableauApiService.SendGetAsync(url).ConfigureAwait(false);

                var responseJson = JToken.Parse(responseString);
                if (!responseJson.Value <JObject>("groups").ContainsKey("group"))
                {
                    break;
                }

                var pagination = JsonConvert.DeserializeObject <TableauPagination>(
                    responseJson.Value <JObject>("pagination").ToString()
                    );

                var pageGroups = JsonConvert.DeserializeObject <List <TableauGroup> >(
                    responseJson.Value <JObject>("groups").Value <JArray>("group").ToString()
                    );

                var group = pageGroups.SingleOrDefault(g => g.Name.EqualsIgnoreCase(name));

                if (group != null)
                {
                    group.SiteId     = _tableauApiService.SiteId;
                    group.ApiVersion = _tableauApiService.ApiVersion;
                    return(group);
                }

                pageNumber++;
                totalAvailable  = pagination.TotalAvailable;
                totalRetrieved += pagination.PageSize;
            }while (totalRetrieved < totalAvailable);

            _logger?.Debug("No matching groups found");

            return(null);
        }
Esempio n. 3
0
        /// <summary>
        /// <see cref="ITableauWorkbookService.FindWorkbooksAsync"/>
        /// </summary>
        public async Task <IEnumerable <TableauWorkbook> > FindWorkbooksAsync(string name)
        {
            _logger?.Debug($"Finding workbooks: {name}");

            var pageSize       = 1000;
            var pageNumber     = 1;
            var totalRetrieved = 0;
            var totalAvailable = 0;
            var workbooks      = new List <TableauWorkbook>();

            do
            {
                var queryFilter = "filter=" + _tableauApiService.BuildQueryFilter("name", QueryFilterOperator.eq, name);
                var url         = _tableauApiService.SiteUrl.AppendUri(
                    $"workbooks?pageSize={pageSize}&pageNumber={pageNumber}&{queryFilter}"
                    );
                var responseString = await _tableauApiService.SendGetAsync(url).ConfigureAwait(false);

                var responseJson = JToken.Parse(responseString);
                if (!responseJson.Value <JObject>("workbooks").ContainsKey("workbook"))
                {
                    break;
                }

                var pagination = JsonConvert.DeserializeObject <TableauPagination>(
                    responseJson.Value <JObject>("pagination").ToString()
                    );

                var pageWorkbooks = JsonConvert.DeserializeObject <List <TableauWorkbook> >(
                    responseJson.Value <JObject>("workbooks").Value <JArray>("workbook").ToString()
                    );
                workbooks.AddRange(pageWorkbooks);

                pageNumber++;
                totalAvailable  = pagination.TotalAvailable;
                totalRetrieved += pagination.PageSize;
            }while (totalRetrieved < totalAvailable);

            workbooks.ForEach(
                w =>
            {
                w.SiteId     = _tableauApiService.SiteId;
                w.ApiVersion = _tableauApiService.ApiVersion;
            }
                );

            _logger?.Debug($"{workbooks.Count} matching workbook(s) found");

            return(workbooks);
        }
Esempio n. 4
0
        /// <summary>
        /// <see cref="ITableauDatasourceService.FindDatasourceAsync"/>
        /// </summary>
        public async Task <TableauDatasource> FindDatasourceAsync(string name, bool includeConnections = false)
        {
            _logger?.Debug($"Finding datasource {name}");

            var pageSize       = 1000;
            var pageNumber     = 1;
            var totalRetrieved = 0;
            var totalAvailable = 0;
            var datasources    = new List <TableauDatasource>();

            do
            {
                var queryFilter = "filter=" + _tableauApiService.BuildQueryFilter("name", QueryFilterOperator.eq, name);
                var url         = _tableauApiService.SiteUrl.AppendUri(
                    $"datasources?pageSize={pageSize}&pageNumber={pageNumber}&{queryFilter}"
                    );
                var responseString = await _tableauApiService.SendGetAsync(url).ConfigureAwait(false);

                var responseJson = JToken.Parse(responseString);
                if (!responseJson.Value <JObject>("datasources").ContainsKey("datasource"))
                {
                    break;
                }

                var pagination = JsonConvert.DeserializeObject <TableauPagination>(
                    responseJson.Value <JObject>("pagination").ToString()
                    );

                var pageDatasources = JsonConvert.DeserializeObject <List <TableauDatasource> >(
                    responseJson.Value <JObject>("datasources").Value <JArray>("datasource").ToString()
                    );
                datasources.AddRange(pageDatasources);

                pageNumber++;
                totalAvailable  = pagination.TotalAvailable;
                totalRetrieved += pagination.PageSize;
            }while (totalRetrieved < totalAvailable);

            datasources.ForEach(
                d =>
            {
                d.SiteId     = _tableauApiService.SiteId;
                d.ApiVersion = _tableauApiService.ApiVersion;
            }
                );

            if (!datasources.Any())
            {
                _logger?.Debug("No matching datasources found");
            }
            else if (datasources.Count > 1)
            {
                _logger?.Debug($"{datasources.Count} matching datasources found");
            }

            var datasource = datasources.SingleOrDefault();

            if (includeConnections && datasource != null)
            {
                _logger?.Debug($"Getting connections for datasource {datasource.Name}");
                var connections = await GetDatasourceConnectionsAsync(datasource.Id).ConfigureAwait(false);

                datasource.Connections = connections.ToArray();
            }

            return(datasource);
        }
Esempio n. 5
0
        /// <summary>
        /// <see cref="ITableauUserService.FindUsersAsync"/>
        /// </summary>
        public async Task <IEnumerable <TableauUser> > FindUsersAsync(string name, string domain = null)
        {
            _logger?.Debug($"Finding users: {name}");

            var pageSize       = 1000;
            var pageNumber     = 1;
            var totalRetrieved = 0;
            var totalAvailable = 0;
            var users          = new List <TableauUser>();

            do
            {
                var queryFilter = "filter=" + _tableauApiService.BuildQueryFilter("name", QueryFilterOperator.eq, name);
                var url         = _tableauApiService.SiteUrl.AppendUri(
                    $"users?pageSize={pageSize}&pageNumber={pageNumber}&{queryFilter}"
                    );
                var responseString = await _tableauApiService.SendGetAsync(url).ConfigureAwait(false);

                var responseJson = JToken.Parse(responseString);

                if (!responseJson.Value <JObject>("users").ContainsKey("user"))
                {
                    break;
                }

                var pagination = JsonConvert.DeserializeObject <TableauPagination>(
                    responseJson.Value <JObject>("pagination").ToString()
                    );

                var pageUsers = JsonConvert.DeserializeObject <List <TableauUser> >(
                    responseJson.Value <JObject>("users").Value <JArray>("user").ToString(),
                    new StringEnumConverter()
                    );
                users.AddRange(pageUsers);

                pageNumber++;
                totalAvailable  = pagination.TotalAvailable;
                totalRetrieved += pagination.PageSize;
            }while(totalRetrieved < totalAvailable);

            // domain is only returned when performing direct query for user's id
            if (!String.IsNullOrWhiteSpace(domain))
            {
                var detailedUsers = new List <TableauUser>();
                foreach (var user in users)
                {
                    var detailedUser = await GetUserAsync(user.Id).ConfigureAwait(false);

                    if ((detailedUser.Domain?.Name ?? "").Equals(domain, StringComparison.OrdinalIgnoreCase))
                    {
                        detailedUsers.Add(detailedUser);
                    }
                }
                users = detailedUsers;
            }

            users.ForEach(
                u =>
            {
                u.SiteId     = _tableauApiService.SiteId;
                u.ApiVersion = _tableauApiService.ApiVersion;
            }
                );

            _logger?.Debug($"{users.Count} matching user(s) found");

            return(users);
        }