Example #1
0
        private BlobCreateDto CreateNewPostBlob(WikipediaArticle article)
        {
            BlobCreateDto blob = new BlobCreateDto();

            blob.content = article.ToMarkdownPost();
            return(blob);
        }
        public async Task <WikipediaArticle> FetchArticle(SubmissionRequestDto submissionRequest)
        {
            WikipediaArticle wiki = new WikipediaArticle();

            // Extract the title to use from the link
            var uri      = new Uri(submissionRequest.Link);
            var segments = uri.Segments;
            var title    = segments[2];

            var detailsResponse = await _client.GetStringAsync($"/w/api.php?action=query&format=json&formatversion=2&prop=pageimages|extracts|pageterms&piprop=original&titles={title}&pilicense=any&exlimit=1&exintro=1");

            JObject data = (JObject)JsonConvert.DeserializeObject(detailsResponse);

            // Fetch the contents from wikimedia API
            Task <string> wikiDescription = ParseArticleDescription(data);
            Task <string> wikiImageUrl    = ParseArticleImage(data);
            Task <string> wikiLinkText    = ParseArticleLinkText(data);

            _logger.LogInformation("Building Article");

            // Build the article object
            wiki.Title       = title.Replace('_', ' ');
            wiki.Description = await wikiDescription;
            wiki.ImageUrl    = await wikiImageUrl;
            var linkText = await wikiLinkText;

            wiki.LinkText = string.IsNullOrEmpty(linkText) ? $"A wild wiki submitted by {submissionRequest.Username}" : linkText;
            wiki.Author   = submissionRequest.Username;
            wiki.Link     = submissionRequest.Link;
            wiki.Comments = "### Why it's wild:\n\n" + (string.IsNullOrEmpty(submissionRequest.Comments) ? $"No comments provided." : submissionRequest.Comments);
            return(wiki);
        }
Example #3
0
        public async Task <string> UploadNewWikiPost(WikipediaArticle article)
        {
            string branchTitle  = article.Title.ToLower() + "-" + DateTime.Now.Ticks.ToString();
            string newBranchSha = await CreateNewBranch(branchTitle);

            string blobSha = await CreateFileInGit(article, branchTitle);

            string details = await OpenNewPullRequest(article, branchTitle);

            _logger.LogInformation("\n > Completed Github Upload Process");

            return(details);
        }
Example #4
0
        private async Task <string> CreateFileInGit(WikipediaArticle article, string newBranchName)
        {
            // First get the SHA of the branches current head
            var currentHead = await _client.GetStringAsync($"git/refs/heads/{newBranchName}");

            dynamic json      = JsonConvert.DeserializeObject(currentHead);
            var     commitSha = json["object"]["sha"].ToString();

            // Use the current head to fetch the previous commit SHA
            var previousCommit = await _client.GetStringAsync($"git/commits/{commitSha}");

            json = JsonConvert.DeserializeObject(previousCommit);
            var treeSha = json["tree"]["sha"].ToString();

            // Upload content of the file to github server in prep for creating tree
            var blob         = CreateNewPostBlob(article);
            var blobResponse = await _client.PostAsync("git/blobs", new StringContent(JsonConvert.SerializeObject(blob), Encoding.UTF8, "application/json"));

            var blobJsonString = await blobResponse.Content.ReadAsStringAsync();

            json = JsonConvert.DeserializeObject(blobJsonString);
            var blobSha = json["sha"].ToString();

            // Create a new git tree object containing the created blob and placement of new file
            var tree         = CreatePostTree(treeSha, blobSha, article.Title.Replace(' ', '-'));
            var treeResponse = await _client.PostAsync("git/trees", new StringContent(JsonConvert.SerializeObject(tree), Encoding.UTF8, "application/json"));

            var treeJsonString = await treeResponse.Content.ReadAsStringAsync();

            json = JsonConvert.DeserializeObject(treeJsonString);
            var newTreeSha = json["sha"].ToString();

            // Create a commit object referencing the created tree and the previous commit
            var commit         = CreatePostCommit(commitSha, newTreeSha);
            var commitResponse = await _client.PostAsync("git/commits", new StringContent(JsonConvert.SerializeObject(commit), Encoding.UTF8, "application/json"));

            var commitJsonString = await commitResponse.Content.ReadAsStringAsync();

            json = JsonConvert.DeserializeObject(commitJsonString);
            var newCommitSha = json["sha"].ToString();

            // Update the head to point to the newly created commit
            var updateRef = CreateUpdateRef(newCommitSha);
            await _client.PatchAsync($"git/refs/heads/{newBranchName}", new StringContent(JsonConvert.SerializeObject(updateRef), Encoding.UTF8, "application/json"));

            _logger.LogInformation($"\n > Completed git file creation and commit - Blob SHA ({blobSha})\n");

            return(blobSha);
        }
Example #5
0
        private async Task <string> OpenNewPullRequest(WikipediaArticle article, string branchName)
        {
            PullRequestDto prDto = new PullRequestDto();

            prDto.title   = $"Add {article.Title}";
            prDto.body    = $"Automated Pull Request created on {DateTime.Now.ToShortDateString()}";
            prDto.head    = $"{branchName}";
            prDto.baseRef = "master";

            var json = JsonConvert.SerializeObject(prDto);
            var data = new StringContent(json, Encoding.UTF8, "application/json");

            var detailsResponse = await _client.PostAsync("pulls", data);

            _logger.LogInformation($"\n > Opened new pull request for {branchName}\n");

            return(detailsResponse.ToString());
        }
        public async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            _wikipediaClient = new WikipediaClient(log);
            _githubClient    = new GithubClient(log, Environment.GetEnvironmentVariable("GithubToken", EnvironmentVariableTarget.Process));

            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            SubmissionRequestDto submissionRequest = JsonConvert.DeserializeObject <SubmissionRequestDto>(requestBody);

            WikipediaArticle wikipediaArticle = await _wikipediaClient.FetchArticle(submissionRequest);

            log.LogInformation("Finished Parsing Wikipedia Data");

            string details = await _githubClient.UploadNewWikiPost(wikipediaArticle);

            return(new JsonResult("Success"));
        }