JD2022-TU1/main/tools/services/JD.Jira.Service/JiraService.cs

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()
{
}
}
}