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); }
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); }
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); }
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")); }