protected override void Synchronize(BoardMapping project) { Log.Debug("Polling GitHub for Pull Requests"); var queryAsOfDate = QueryDate.AddMilliseconds(Configuration.PollingFrequency * -1.5); //https://api.github.com/repos/{0}/{1}/pulls?state=Open var request = new RestRequest(string.Format("repos/{0}/{1}/pulls", Configuration.Target.Host, project.Identity.Target), Method.GET); request.AddParameter("state", project.QueryStates[0]); var resp = _restClient.Execute(request); if (resp.StatusCode != HttpStatusCode.OK) { var serializer = new JsonSerializer <ErrorMessage>(); var errorMessage = serializer.DeserializeFromString(resp.Content); Log.Error(string.Format("Unable to get Pull Requests from GitHub, Error: {0}. Check your board/repo mapping configuration.", errorMessage.Message)); return; } var pulls = new JsonSerializer <List <Pull> >().DeserializeFromString(resp.Content); Log.Info("\nQueried [{0}] at {1} for changes after {2}", project.Identity.Target, QueryDate, queryAsOfDate.ToString("o")); if (pulls != null && pulls.Any() && pulls[0].Id > 0) { foreach (var pull in pulls) { if (pull.Id > 0) { Log.Info("Pull Requests [{0}]: {1}, {2}, {3}", pull.Number, pull.Title, pull.User.Login, pull.State); // does this workitem have a corresponding card? var card = LeanKit.GetCardByExternalId(project.Identity.LeanKit, pull.Id + "|" + pull.Number.ToString()); if (card == null || !card.ExternalSystemName.Equals(ServiceName, StringComparison.OrdinalIgnoreCase)) { Log.Debug("Create new card for Pull Request [{0}]", pull.Number); CreateCardFromItem(project, pull); } else { Log.Debug("Previously created a card for Pull Request [{0}]", pull.Number); if (project.UpdateCards) { PullUpdated(pull, card, project); } else { Log.Info("Skipped card update because 'UpdateCards' is disabled."); } } } } Log.Info("{0} item(s) queried.\n", pulls.Count); } }
protected override void Synchronize(BoardMapping project) { Log.Debug("Polling Jira for Issues"); var queryAsOfDate = QueryDate.AddMilliseconds(Configuration.PollingFrequency * -1.5); string jqlQuery; var formattedQueryDate = queryAsOfDate.ToString(QueryDateFormat, CultureInfo.InvariantCulture); if (!string.IsNullOrEmpty(project.Query)) { jqlQuery = string.Format(project.Query, formattedQueryDate); } else { var queryFilter = string.Format(" and ({0})", string.Join(" or ", project.QueryStates.Select(x => "status = '" + x.Trim() + "'").ToList())); if (!string.IsNullOrEmpty(project.ExcludedTypeQuery)) { queryFilter += project.ExcludedTypeQuery; } jqlQuery = string.Format("project=\"{0}\" {1} and updated > \"{2}\" order by created asc", project.Identity.Target, queryFilter, formattedQueryDate); } //https://yoursite.atlassian.net/rest/api/latest/search?jql=project=%22More+Tests%22+and+status=%22open%22+and+created+%3E+%222008/12/31+12:00%22+order+by+created+asc&fields=id,status,priority,summary,description var request = new RestRequest("/rest/api/latest/search", Method.GET); request.AddParameter("jql", jqlQuery); request.AddParameter("fields", "id,status,priority,summary,description,issuetype,type,assignee,duedate,labels"); request.AddParameter("maxResults", "9999"); var jiraResp = _restClient.Execute(request); if (jiraResp.StatusCode != HttpStatusCode.OK) { var serializer = new JsonSerializer <ErrorMessage>(); var errorMessage = serializer.DeserializeFromString(jiraResp.Content); Log.Error(string.Format("Unable to get issues from Jira, Error: {0}. Check your board/project mapping configuration.", errorMessage.Message)); return; } var resp = new JsonSerializer <IssuesResponse>().DeserializeFromString(jiraResp.Content); Log.Info("\nQueried [{0}] at {1} for changes after {2}", project.Identity.Target, QueryDate, queryAsOfDate.ToString("o")); if (resp != null && resp.Issues != null && resp.Issues.Any()) { var issues = resp.Issues; foreach (var issue in issues) { Log.Info("Issue [{0}]: {1}, {2}, {3}", issue.Key, issue.Fields.Summary, issue.Fields.Status.Name, issue.Fields.Priority.Name); // does this workitem have a corresponding card? var card = LeanKit.GetCardByExternalId(project.Identity.LeanKit, issue.Key); if (card == null || !card.ExternalSystemName.Equals(ServiceName, StringComparison.OrdinalIgnoreCase)) { Log.Debug("Create new card for Issue [{0}]", issue.Key); CreateCardFromItem(project, issue); } else { Log.Debug("Previously created a card for Issue [{0}]", issue.Key); if (project.UpdateCards) { IssueUpdated(issue, card, project); } else { Log.Info("Skipped card update because 'UpdateCards' is disabled."); } } } Log.Info("{0} item(s) queried.\n", issues.Count); } }
protected override void Synchronize(BoardMapping project) { Log.Debug("Polling Unfuddle for Tickets"); var queryAsOfDate = QueryDate.AddMilliseconds(Configuration.PollingFrequency * -1.5); var unfuddleQuery = !string.IsNullOrEmpty(project.Query) ? string.Format(project.Query, queryAsOfDate.ToString("yyyy/MM/dd hh:mm")) : string.Format("status-eq-{0},created_at-gt-{1}", project.QueryStates[0], queryAsOfDate.ToString("yyyy/MM/dd hh:mm")); //http://mysubdomain.unfuddle.com/api/v1/projects/{id}/ticket_reports/dynamic?sort_by=created_at&sort_direction=ASC&conditions_string=status-eq-new,created_at-gt-yyyy/MM/dd hh:mm var request = new RestRequest(string.Format("/api/v1/projects/{0}/ticket_reports/dynamic", project.Identity.Target), Method.GET); request.AddParameter("sort_by", "created_at"); request.AddParameter("sort_direction", "ASC"); request.AddParameter("conditions_string", unfuddleQuery); //, "id,status,priority,summary,description,type"); request.AddParameter("limit", "500"); var unfuddleResp = _restClient.Execute(request); if (unfuddleResp.StatusCode != HttpStatusCode.OK) { var serializer = new JsonSerializer <ErrorMessage>(); var errorMessage = serializer.DeserializeFromString(unfuddleResp.Content); Log.Error(string.Format("Unable to get tickets from Unfuddle, Error: {0}. Check your board/project mapping configuration.", errorMessage.Message)); return; } var resp = new JsonSerializer <TicketsResponse>().DeserializeFromString(unfuddleResp.Content); Log.Info("\nQueried [{0}] at {1} for changes after {2}", project.Identity.Target, QueryDate, queryAsOfDate.ToString("o")); if (resp != null && resp.Groups != null && resp.Groups.Any()) { foreach (var group in resp.Groups) { if (group != null && group.Tickets != null && group.Tickets.Any()) { var tickets = group.Tickets; foreach (var ticket in tickets) { Log.Info("Ticket [{0}]: {1}, {2}, {3}", ticket.Id, ticket.Summary, ticket.Status, ticket.Priority); // does this workitem have a corresponding card? var card = LeanKit.GetCardByExternalId(project.Identity.LeanKit, ticket.Id.ToString()); if (card == null || !card.ExternalSystemName.Equals(ServiceName, StringComparison.OrdinalIgnoreCase)) { Log.Debug("Create new card for Ticket [{0}]", ticket.Id); CreateCardFromItem(project, ticket); } else { Log.Debug("Previously created a card for Ticket [{0}]", ticket.Id); if (project.UpdateCards) { TicketUpdated(ticket, card, project); } else { Log.Info("Skipped card update because 'UpdateCards' is disabled."); } } } } } Log.Info("{0} item(s) queried.\n", resp.Count); } }
protected override void Synchronize(BoardMapping project) { Log.Debug("Polling TFS [{0}] for Work Items", project.Identity.TargetName); //query a project for new items var stateQuery = string.Format(" AND ({0})", String.Join(" or ", project.QueryStates.Select(x => "[System.State] = '" + x.Trim() + "'").ToList())); var iterationQuery = ""; if (!string.IsNullOrEmpty(project.IterationPath)) { iterationQuery = string.Format(" AND [System.IterationPath] UNDER '{0}' ", project.IterationPath); } var queryAsOfDate = QueryDate.AddMilliseconds(Configuration.PollingFrequency * -1.5).ToString("o"); string tfsQuery; if (!string.IsNullOrEmpty(project.Query)) { tfsQuery = string.Format(project.Query, queryAsOfDate); } else { tfsQuery = String.Format( "[System.TeamProject] = '{0}' {1} {2} {3} and [System.ChangedDate] > '{4}'", project.Identity.TargetName, iterationQuery, stateQuery, project.ExcludedTypeQuery, queryAsOfDate); } var queryStr = string.Format("SELECT [System.Id], [System.WorkItemType]," + " [System.State], [System.AssignedTo], [System.Title], [System.Description]" + " FROM WorkItems " + " WHERE {0}" + " ORDER BY [System.TeamProject]", tfsQuery); if (_projectCollectionWorkItemStore == null) { "Reconnecting to TFS...".Info(); Init(); } Query query; try { query = new Query(_projectCollectionWorkItemStore, queryStr, null, false); } catch (Exception ex) { Log.Error("Error creating TFS query. {0} ", ex.Message); if (_projectCollectionWorkItemStore == null) { Log.Error("Project Collection Work Item Store is null"); } throw; } var cancelableAsyncResult = query.BeginQuery(); var changedItems = query.EndQuery(cancelableAsyncResult); Log.Info("\nQuery [{0}] for changes after {1}", project.Identity.Target, queryAsOfDate); Log.Debug(queryStr); foreach (WorkItem item in changedItems) { Log.Info("Work Item [{0}]: {1}, {2}, {3}", item.Id, item.Title, item.Fields["System.AssignedTo"].Value, item.State); // does this workitem have a corresponding card? var card = LeanKit.GetCardByExternalId(project.Identity.LeanKit, item.Id.ToString(CultureInfo.InvariantCulture)); if (card == null || !card.ExternalSystemName.Equals(ServiceName, StringComparison.OrdinalIgnoreCase)) { Log.Debug("Creating new card for work item [{0}]", item.Id); CreateCardFromWorkItem(project, item); } // TODO: else if Lane = defined end lane then update it in TFS (i.e. we missed the event) // call UpdateStateOfExternalWorkItem() else { Log.Info("Previously created a card for work item[{0}]", item.Id); if (project.UpdateCards) { WorkItemUpdated(item, card, project); } else { Log.Info("Skipped card update because 'UpdateCards' is disabled."); } } } Log.Info("{0} item(s) queried.\n", changedItems.Count); }