118 lines
3.9 KiB
C#
118 lines
3.9 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using Atlassian.Jira;
|
|
using Plume.Core.Logging;
|
|
using Plume.Interfaces.Services;
|
|
|
|
namespace JD.Jira.Service
|
|
{
|
|
public class JiraService : IService
|
|
{
|
|
public static int MaxIssuesPerRequest = 300;
|
|
|
|
private string _serverUrl;
|
|
|
|
private ILogger Logger { get; set; }
|
|
|
|
/// <inheritdoc />
|
|
public void Initialize(IServiceContext serviceContext)
|
|
{
|
|
Logger = serviceContext.Logger;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Connect to a Jira server
|
|
/// </summary>
|
|
/// <param name="serverUrl"></param>
|
|
/// <param name="userName"></param>
|
|
/// <param name="password"></param>
|
|
public void Connect(string serverUrl, string userName, string password)
|
|
{
|
|
_serverUrl = serverUrl;
|
|
Jira = Atlassian.Jira.Jira.CreateRestClient(serverUrl, userName, password);
|
|
Jira.Issues.MaxIssuesPerRequest = MaxIssuesPerRequest;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Jira client
|
|
/// </summary>
|
|
public Atlassian.Jira.Jira Jira { get; private set; }
|
|
|
|
/// <summary>
|
|
/// Get the issues for a particular user
|
|
/// </summary>
|
|
/// <param name="emailIdOfJiraUser"></param>
|
|
/// <param name="withinWeeks"></param>
|
|
/// <param name="projectId"></param>
|
|
/// <returns></returns>
|
|
public async Task<IEnumerable<Issue>> GetIssuesForUserAsync(string emailIdOfJiraUser, int withinWeeks = 3, string projectId = "")
|
|
{
|
|
var query = $"((Resolution = 'Unresolved' AND assignee='{emailIdOfJiraUser}')";
|
|
query += $"OR (Resolution != 'Unresolved' AND updated >= -{withinWeeks}w AND assignee='{emailIdOfJiraUser}'))";
|
|
if (!string.IsNullOrEmpty(projectId))
|
|
{
|
|
query += $" AND project = '{projectId}'";
|
|
}
|
|
query += " order by created desc";
|
|
return await GetIssuesFromJqlAsync(query);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get issues by specifying a JQL query
|
|
/// </summary>
|
|
/// <param name="query">a JQL query</param>
|
|
/// <param name="maxResults">Maximum number of results, if set to null it will use global setting</param>
|
|
/// <returns>A list of issues</returns>
|
|
public IEnumerable<Issue> GetIssuesFromJql(string query, int? maxResults = null)
|
|
{
|
|
try
|
|
{
|
|
var result = Jira.Issues.GetIssuesFromJqlAsync(query, maxResults).Result;
|
|
return result;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.Warn($"Jira query failed. Details: {ex.Message}");
|
|
return Enumerable.Empty<Issue>();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Get issues by specifying a JQL query
|
|
/// </summary>
|
|
/// <param name="query">a JQL query</param>
|
|
/// <param name="maxResults">Maximum number of results, if set to null it will use global setting</param>
|
|
/// <returns>A list of issues</returns>
|
|
public async Task<IEnumerable<Issue>> GetIssuesFromJqlAsync(string query, int? maxResults = null)
|
|
{
|
|
try
|
|
{
|
|
return await Jira.Issues.GetIssuesFromJqlAsync(query, maxResults);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.Warn($"Jira query failed. Details: {ex.Message}");
|
|
return Enumerable.Empty<Issue>();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Open an issue
|
|
/// </summary>
|
|
/// <param name="issue"></param>
|
|
public void OpenIssue(Issue issue)
|
|
{
|
|
var url = _serverUrl + "browse/" + issue.Key;
|
|
Process.Start(url);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public void Dispose()
|
|
{
|
|
|
|
}
|
|
}
|
|
}
|