alamion_obsidian-jira-sync/src/file_operations/createUpdateIssue.ts
Alamion a3211bcdb2
Fix:
- multiple fixes and code refactors for last feats to work correctly
- added Jira api_version variable to field mapping context
2026-05-04 21:05:29 +03:00

79 lines
2.3 KiB
TypeScript

import JiraPlugin from '../main';
import { TFile } from 'obsidian';
import { createJiraIssue, fetchIssue, updateJiraIssue, updateJiraStatus } from '../api';
import { prepareJiraFieldsFromFile } from './commonPrepareData';
import { localToJiraFields, updateJiraToLocal } from '../tools/mapObsidianJiraFields';
import { JiraIssue, JiraTransitionType } from '../interfaces';
import { obsidianJiraFieldMappings } from '../default/obsidianJiraFieldsMapping';
export async function updateIssueFromFile(plugin: JiraPlugin, file: TFile): Promise<string> {
let fields = await prepareJiraFieldsFromFile(plugin, file);
const issueKey = fields.key;
const apiVersion = plugin.getCurrentConnection()?.apiVersion;
if (!issueKey) {
throw new Error('No issue key found in frontmatter');
}
fields = localToJiraFields(
fields,
{
...obsidianJiraFieldMappings,
...plugin.settings.fieldMapping.fieldMappings,
},
apiVersion,
);
await updateJiraIssue(plugin, issueKey, fields);
return issueKey;
}
export async function createIssueFromFile(
plugin: JiraPlugin,
file: TFile,
fields?: Record<string, any>,
): Promise<string> {
const apiVersion = plugin.getCurrentConnection()?.apiVersion;
if (!fields) {
fields = await prepareJiraFieldsFromFile(plugin, file);
}
fields = localToJiraFields(
fields,
{
...obsidianJiraFieldMappings,
...plugin.settings.fieldMapping.fieldMappings,
},
apiVersion,
);
// Create the issue
const issueData = await createJiraIssue(plugin, fields);
const issueKey = issueData.key;
// Update frontmatter with the new issue key
await plugin.app.fileManager.processFrontMatter(file, (frontmatter) => {
frontmatter['key'] = issueKey;
});
// Pull the created issue back from Jira to populate all remaining synced fields
const createdIssue = await fetchIssue(plugin, issueKey);
await updateJiraToLocal(plugin, file, createdIssue);
return issueKey;
}
export async function updateStatusFromFile(
plugin: JiraPlugin,
file: TFile,
transition: JiraTransitionType,
): Promise<string> {
const fields = await prepareJiraFieldsFromFile(plugin, file);
if (!fields.key) {
throw new Error('No issue key found in frontmatter');
}
await updateJiraStatus(plugin, fields.key, transition.id);
await updateJiraToLocal(plugin, file, {
fields: { status: { name: transition.status } },
} as JiraIssue);
return fields.key;
}