Files
TriliumMind/Services/TriliumService.cs

127 lines
4.4 KiB
C#
Raw Permalink Normal View History

2025-12-11 10:20:10 +09:00
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;
2025-12-11 10:20:10 +09:00
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<TriliumService>();
_configs = configs;
}
public async Task<IEnumerable<JiraIssue>> PublishNotesAsync(IEnumerable<JiraIssue> jiraIssues)
{
var issuesToPatch = new List<JiraIssue>();
var issuesToPost = new List<JiraIssue>();
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<IEnumerable<TriliumNote>> PostNotesAsync(IEnumerable<JiraIssue> jiraIssues)
{
var baseUrl = _configs.AppSettings.Trilium.EtapiBaseUrl;
var token = _configs.AppSettings.Trilium.EtapiToken;
var apiUrl = $"{baseUrl}/create-note";
var triliumNotes = new List<TriliumNote>();
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<TriliumResponse>();
lastRequestTime = DateTimeOffset.UtcNow;
note.ObjectId = triliumResponse?.note.noteId;
note.Published = lastRequestTime;
note.TriliumNoteData = triliumResponse;
triliumNotes.Add(note);
}
return triliumNotes;
}
public Task<IEnumerable<JiraIssue>> PatchNotesAsync(IEnumerable<JiraIssue> jiraIssues)
{
throw new NotImplementedException();
// Update attributes
}
public async Task<string> FetchPageContentsAsync(Issue issue)
2025-12-11 10:20:10 +09:00
{
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;
}
2025-12-11 10:20:10 +09:00
}