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(); } public async Task 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(jsonResponse); return jiraResponse; } public async Task 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(jsonResponse); return issue; } }