JiraIssue에 대해 Trilium 노트 발급 기능 추가.

This commit is contained in:
2025-12-12 17:21:26 +09:00
parent 2e2edc8dac
commit f6bccc5434
7 changed files with 189 additions and 10 deletions

View File

@@ -1,4 +1,5 @@
using System;
using System.Reflection.Metadata;
using TriliumMind.Data.Entities;
using TriliumMind.Models;
@@ -26,7 +27,6 @@ public static class JiraIssueMapper
NeedNotify = 0
};
}
private static string CleanDisplayName(string? displayName)
{
if (string.IsNullOrWhiteSpace(displayName))

View File

@@ -5,6 +5,7 @@ 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;
@@ -18,7 +19,73 @@ public class TriliumService
_log = Log.ForContext<TriliumService>();
_configs = configs;
}
public async Task<string> FettchPageContentsAsync(Issue issue)
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)
{
var baseUrl = _configs.AppSettings.Trilium.EtapiBaseUrl;
var pageId = "QxxFqCNAtIOy";
@@ -34,4 +101,26 @@ public class TriliumService
// 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;
}
}