public SettingsChangedNotification(string status, Repository repository) { Status = status; RepoName = repository.Name; RepoOwner = repository.Owner; RequireCla = repository.RequireCla; }
public async Task<bool> SetCommitStatus(Repository repository, string commitSha, bool isSuccess, string description, string detailsUrl) { var commitStatusUri = string.Format("https://api.github.com/repos/{0}/{1}/statuses/{2}?access_token={3}", repository.Owner, repository.Name, commitSha, repository.AccessToken); var payload = new { state = isSuccess ? "success" : "error", target_url = detailsUrl, description }; var request = await HttpClient.PostAsync(commitStatusUri, new StringContent(JsonConvert.SerializeObject(payload))); return request.IsSuccessStatusCode; }
public static SettingsViewModel From(Repository repository) { if (repository == null) return null; return new SettingsViewModel() { AccessToken = repository.AccessToken, LicenseText = repository.LicenseText, RepoName = repository.Name, RequireCla = repository.RequireCla, RepoOwner = repository.Owner }; }
public async Task<ActionResult> Settings(SettingsViewModel model) { if (!ModelState.IsValid) return View(model); // TODO: Setup/move validation to EF model? // TODO: Support ajax submit? // TODO: Wrap in a try/catch var repository = DataContext.Repositories.Where(model.RepoOwner, model.RepoName); if (repository != null) { repository.AccessToken = model.AccessToken; repository.RequireCla = model.RequireCla; repository.LicenseText = model.LicenseText; } else { repository = new Repository( owner: model.RepoOwner, name: model.RepoName, requireCla: model.RequireCla, accessToken: model.AccessToken, licenseText: model.LicenseText); DataContext.Repositories.Add(repository); } DataContext.SaveChanges(); await GitHubService.EnableWebHook(repository); TempData["settingsChanged"] = new SettingsChangedNotification(repository.RequireCla ? "success" : "warning", repository); return Redirect(string.Format("/{0}/{1}/", model.RepoOwner, model.RepoName)); }
private async Task<IEnumerable<Task<bool>>> UpdateCommitsFor(Repository repository, string committer) { var pullRequests = await GitHubService.GetPullRequests(repository.Owner, repository.Name); var tasks = new List<Task<bool>>(); foreach (var pullRequest in pullRequests.Where(pr => pr.RequesterUsername.Equals(committer, StringComparison.InvariantCultureIgnoreCase))) { tasks.Add(GitHubService.SetCommitStatus(repository, pullRequest.HeadCommitSha, true, committer + " has signed this repository's CLA.", string.Format("{2}/{0}/{1}/", repository.Owner, repository.Name, Signatory.Settings.Authority))); } return tasks; }
public async Task<bool> EnableWebHook(Repository repository) { var createHook = string.Format("https://api.github.com/repos/{0}/{1}/hooks?access_token={2}", repository.Owner, repository.Name, repository.AccessToken); var payload = new { name = "web", active = true, events = new[] { "pull_request" }, config = new { url = Settings.Authority + "hook", content_type = "json", secret = Guid.NewGuid().ToString()} }; var serializeObject = JsonConvert.SerializeObject(payload); var request = await HttpClient.PostAsync(createHook, new StringContent(serializeObject)); return request.IsSuccessStatusCode; }