/// <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()); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }