Esempio n. 1
0
        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();
            }
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
        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);
        }