public static async Task InitializeSubscribedPlan(this HttpClient github, LabelEventPayload payload, ILogger log) { if (Exempt.Owners.Contains(payload.OwnerLogin)) { return; } string method = $"/marketplace_listing/accounts/{payload.OwnerId}"; using var response = (await github.GetAsync(method)); if (System.Net.HttpStatusCode.OK == response.StatusCode) { var json = await response.Content.ReadAsStringAsync(); var data = JObject.Parse(json); payload.IgnorePrivate = true; foreach (var bullet in data["marketplace_purchase"]["plan"]["bullets"].Select(t => t.Value <string>())) { if (RgxLimit.IsMatch(bullet)) { var match = Regex.Match(bullet, @"\d+").Value; payload.Limit = int.Parse(match); continue; } if (RgxPrivate.IsMatch(bullet)) { payload.IgnorePrivate = false; } } if (log.IsEnabled(LogLevel.Trace)) { log.LogTrace($"Marketplace Listing:\n {json}"); } if (log.IsEnabled(LogLevel.Debug)) { var plan = data["marketplace_purchase"]["plan"][NAME].Value <string>(); var allow = payload.IgnorePrivate ? "Public repositories only" : "Private Allowed"; var limit = int.MaxValue == payload.Limit ? "Unlimited repositories" : $"Limited to {payload.Limit.ToString()} repositories"; log.LogDebug($"Subscribed plan: '{plan}', {allow}, {limit}"); } } else { response.EnsureSuccessStatusCode(); } }
public static async Task <HttpClient> AuthenticateAsInstallation(this HttpClient github, LabelEventPayload payload) { using (var content = new StringContent(string.Empty)) { string method = $"/installations/{payload.InstallationId}/access_tokens"; using var response = (await github.PostAsync(method, content)) .EnsureSuccessStatusCode(); var json = await response.Content.ReadAsStringAsync(); var obj = JObject.Parse(json); var token = obj[TOKEN]?.Value <string>(); github.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(BEARER, token); return(github); } }
public static async IAsyncEnumerable <JToken> GetNodes(this HttpClient github, LabelEventPayload payload) { var count = 0; var id = payload.RepositoryId; var limit = payload.Limit; var privacy = payload.IgnorePrivate ? ", privacy: PUBLIC" : string.Empty; var suffix = $", ownerAffiliations: OWNER{privacy}) {{ pageInfo {{ endCursor hasNextPage }} nodes {{ databaseId name label(name: \\\"{payload.LabelName}\\\") {{ name node_id:id color description }} }} }} }} }}\"}}"; var query = $"{{\"query\":\"{{ viewer {{ repositories(first: {Math.Min(GitHubApi.MAX_ITEMS_PER_TRANSACTION, limit)}" + suffix; bool hasNextPage; var promise = github.GraphQL(query); do { // Wait for results JObject data = await promise; var repos = data[DATA][VIEWER][REPOSITORIES]; var page = repos[PAGEINFO]; hasNextPage = page[HASNEXTPAGE].Value <bool>(); // If more data is available request it now if (hasNextPage) { query = $"{{\"query\":\"{{ viewer {{ repositories(first: {GitHubApi.MAX_ITEMS_PER_TRANSACTION}, after: \\\"{page[ENDCURSOR].Value<string>()}\\\"" + suffix; promise = github.GraphQL(query); } // Yield label info for each matching repository foreach (var node in repos[NODES]) { // Skip source repository if (node[DATABASEID].Value <long>() == id) { continue; } yield return(node); if (limit < ++count) { yield break; } } }while (hasNextPage); }