Files
TriliumMind/Services/JiraService.cs
2025-12-11 10:20:10 +09:00

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;
}
}