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;
|
2025-12-12 17:21:26 +09:00
|
|
|
|
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;
|
|
|
|
|
|
}
|
2025-12-12 17:21:26 +09:00
|
|
|
|
|
|
|
|
|
|
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 "";
|
|
|
|
|
|
}
|
2025-12-12 17:21:26 +09:00
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|