using Microsoft.Extensions.Options; using Serilog; using System; using System.Collections.Generic; using System.Net.Http.Headers; using System.Net.Http.Json; using System.Text; using TriliumMind.Data.Entities; using TriliumMind.Models; namespace TriliumMind.Services; public class TriliumService { private readonly Serilog.ILogger _log; private readonly AppConfigs _configs; public TriliumService(AppConfigs configs) { _log = Log.ForContext(); _configs = configs; } public async Task> PublishNotesAsync(IEnumerable jiraIssues) { var issuesToPatch = new List(); var issuesToPost = new List(); foreach (var jiraIssue in jiraIssues) { if(jiraIssue.Published > DateTimeOffset.MinValue) issuesToPatch.Add(jiraIssue); else issuesToPost.Add(jiraIssue); break; } // Post note does not support attribute, so additional work is required. var postedNotes = await PostNotesAsync(issuesToPost); //issuesToPatch.AddRange(postedIssues); //var patchedIssues = await PatchNotesAsync(issuesToPatch); return issuesToPatch; } public async Task> PostNotesAsync(IEnumerable jiraIssues) { var baseUrl = _configs.AppSettings.Trilium.EtapiBaseUrl; var token = _configs.AppSettings.Trilium.EtapiToken; var apiUrl = $"{baseUrl}/create-note"; var triliumNotes = new List(); var lastRequestTime = DateTimeOffset.MinValue; foreach (var jiraIssue in jiraIssues) { var timeSinceLastRequest = DateTimeOffset.UtcNow - lastRequestTime; if (timeSinceLastRequest < TimeSpan.FromSeconds(1)) { var delayTime = TimeSpan.FromSeconds(1) - timeSinceLastRequest; await Task.Delay(delayTime); } var note = new TriliumNote(jiraIssue, GetParentPageId(jiraIssue.Status)); var request = new HttpRequestMessage(HttpMethod.Post, apiUrl); request.Headers.TryAddWithoutValidation("Authorization", token); request.Content = note.ToNoteContent(); using var client = new HttpClient(); var response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); // Deserialize to TriliumResponse var triliumResponse = await response.Content.ReadFromJsonAsync(); lastRequestTime = DateTimeOffset.UtcNow; note.ObjectId = triliumResponse?.note.noteId; note.Published = lastRequestTime; note.TriliumNoteData = triliumResponse; triliumNotes.Add(note); } return triliumNotes; } public Task> PatchNotesAsync(IEnumerable jiraIssues) { throw new NotImplementedException(); // Update attributes } public async Task FetchPageContentsAsync(Issue issue) { var baseUrl = _configs.AppSettings.Trilium.EtapiBaseUrl; var pageId = "QxxFqCNAtIOy"; var requstUrl = $"{baseUrl}/notes/{pageId}/content"; var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Get, requstUrl); request.Headers.Add("Authorization", ""); var response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); Console.WriteLine(await response.Content.ReadAsStringAsync()); // Return new page ID after creating a new page return ""; } private string GetParentPageId(string issueStatus) { var readyPageId = _configs.AppSettings.Trilium.JiraOpenedIssuePageId; var workingPageId = _configs.AppSettings.Trilium.JiraWorkingIssuePageId; var resolvedPageId = _configs.AppSettings.Trilium.JiraResolvedIssuePageId; string pageId = string.Empty; if (issueStatus.Equals("Open", StringComparison.OrdinalIgnoreCase) || issueStatus.Equals("Reopend", StringComparison.OrdinalIgnoreCase)) { pageId = readyPageId; } else if (issueStatus.Equals("In progress", StringComparison.OrdinalIgnoreCase)) { pageId = workingPageId; } else { pageId = resolvedPageId; } return pageId; } }