60 lines
2.5 KiB
C#
60 lines
2.5 KiB
C#
using Serilog;
|
|
using Microsoft.Extensions.Options;
|
|
using System.Text.Json;
|
|
using TriliumMind.Models;
|
|
|
|
namespace TriliumMind.Services;
|
|
|
|
public class JiraService
|
|
{
|
|
private readonly AppConfigs _configs;
|
|
private readonly Serilog.ILogger _log;
|
|
|
|
public JiraService(AppConfigs configs)
|
|
{
|
|
_configs = configs;
|
|
_log = Log.ForContext<JiraService>();
|
|
}
|
|
|
|
public async Task<JiraResponse> FetchJiraIssuesAsync(
|
|
DateTimeOffset lastFetchTime, string targetProject,int startAt, CancellationToken ct)
|
|
{
|
|
var uri = $"{_configs.AppSettings.Jira.ApiBaseUrl}/"
|
|
+ $"search?jql=project={targetProject} "
|
|
+ $"AND updated >= \"{lastFetchTime.ToString("yyyy-MM-dd HH:mm")}\" "
|
|
+ $"&fields={_configs.AppSettings.Jira.SearchFields}"
|
|
+ $"&startAt={startAt}&maxResults=50";
|
|
var request = new HttpRequestMessage(HttpMethod.Get, uri);
|
|
request.Headers.Add("Accept", "application/json");
|
|
request.Headers.Add("Authorization", $"Bearer {_configs.AppSettings.Jira.AccessToken}");
|
|
Log.Debug("Fetch Jira issues ready. Fetch the issues updated after {last_fetch_time} in Project {target_project}.",
|
|
lastFetchTime.ToString("yyyy-MM-dd HH:mm"), targetProject);
|
|
|
|
using var client = new HttpClient();
|
|
var response = await client.SendAsync(request, ct).ConfigureAwait(false);
|
|
response.EnsureSuccessStatusCode();
|
|
|
|
var jsonResponse = await response.Content.ReadAsStringAsync(ct).ConfigureAwait(false);
|
|
var jiraResponse = JsonSerializer.Deserialize<JiraResponse>(jsonResponse);
|
|
|
|
return jiraResponse;
|
|
}
|
|
|
|
public async Task<Issue> FetchJiraIssueAsync(string targetIssueKey, CancellationToken ct)
|
|
{
|
|
var uri = $"{_configs.AppSettings.Jira.ApiBaseUrl}/issue/{targetIssueKey}";
|
|
var request = new HttpRequestMessage(HttpMethod.Get, uri);
|
|
request.Headers.Add("Accept", "application/json");
|
|
request.Headers.Add("Authorization", $"Bearer {_configs.AppSettings.Jira.AccessToken}");
|
|
Log.Debug("Fetch a Jira issue({issue_key}) ready.", targetIssueKey);
|
|
|
|
using var client = new HttpClient();
|
|
var response = await client.SendAsync(request, ct).ConfigureAwait(false);
|
|
response.EnsureSuccessStatusCode();
|
|
|
|
var jsonResponse = await response.Content.ReadAsStringAsync(ct).ConfigureAwait(false);
|
|
var issue = JsonSerializer.Deserialize<Issue>(jsonResponse);
|
|
return issue;
|
|
}
|
|
}
|