优化帖子更新逻辑,支持同时更新帖子内容和主题信息

- 分离帖子内容和主题更新流程
- 添加对主题标题和标签的单独更新支持
- 改进错误处理和响应处理机制
- 在标签选择模态框中添加更新时的标签初始化
This commit is contained in:
wood chen 2025-03-06 21:52:07 +08:00
parent 049162579c
commit ce8b608b8c

View File

@ -142,6 +142,7 @@ export default class DiscourseSyncPlugin extends Plugin {
// Check if frontmatter contains post ID // Check if frontmatter contains post ID
const frontMatter = this.getFrontMatter(content); const frontMatter = this.getFrontMatter(content);
const postId = frontMatter?.discourse_post_id; const postId = frontMatter?.discourse_post_id;
const topicId = frontMatter?.discourse_topic_id;
// Filter out note properties section // Filter out note properties section
content = content.replace(/^---[\s\S]*?---\n/, ''); content = content.replace(/^---[\s\S]*?---\n/, '');
@ -156,32 +157,94 @@ export default class DiscourseSyncPlugin extends Plugin {
}); });
const isUpdate = postId !== undefined; const isUpdate = postId !== undefined;
const endpoint = isUpdate ? `${this.settings.baseUrl}/posts/${postId}` : url;
const method = isUpdate ? "PUT" : "POST";
const body = JSON.stringify(isUpdate ? { if (isUpdate) {
raw: content, // For updating a post
edit_reason: "Updated from Obsidian", const postEndpoint = `${this.settings.baseUrl}/posts/${postId}`;
tags: this.settings.selectedTags || [] const topicEndpoint = `${this.settings.baseUrl}/t/${topicId}`;
} : {
title: (frontMatter?.title ? frontMatter?.title : this.activeFile.name),
raw: content,
category: this.settings.category,
tags: this.settings.selectedTags || []
});
try { // First update the post content
const response = await requestUrl({ try {
url: endpoint, const postResponse = await requestUrl({
method: method, url: postEndpoint,
contentType: "application/json", method: "PUT",
body, contentType: "application/json",
headers, body: JSON.stringify({
throw: false raw: content,
}); edit_reason: "Updated from Obsidian"
}),
headers,
throw: false
});
if (response.status === 200) { if (postResponse.status !== 200) {
if (!isUpdate) { return {
message: "Error",
error: `${t('UPDATE_FAILED')} (${postResponse.status})`
};
}
// Then update the topic (for title and tags)
const topicResponse = await requestUrl({
url: topicEndpoint,
method: "PUT",
contentType: "application/json",
body: JSON.stringify({
title: (frontMatter?.title ? frontMatter?.title : this.activeFile.name),
tags: this.settings.selectedTags || []
}),
headers,
throw: false
});
if (topicResponse.status === 200) {
return { message: "Success" };
} else {
try {
const errorResponse = topicResponse.json;
if (errorResponse.errors && errorResponse.errors.length > 0) {
return {
message: "Error",
error: errorResponse.errors.join('\n')
};
}
if (errorResponse.error) {
return {
message: "Error",
error: errorResponse.error
};
}
} catch (parseError) {
return {
message: "Error",
error: `${t('UPDATE_FAILED')} (${topicResponse.status})`
};
}
}
} catch (error) {
return {
message: "Error",
error: `${t('UPDATE_FAILED')}: ${error.message || t('UNKNOWN_ERROR')}`
};
}
} else {
// For creating a new post
try {
const response = await requestUrl({
url,
method: "POST",
contentType: "application/json",
body: JSON.stringify({
title: (frontMatter?.title ? frontMatter?.title : this.activeFile.name),
raw: content,
category: this.settings.category,
tags: this.settings.selectedTags || []
}),
headers,
throw: false
});
if (response.status === 200) {
try { try {
// Get new post ID and topic ID // Get new post ID and topic ID
const responseData = response.json; const responseData = response.json;
@ -199,35 +262,35 @@ export default class DiscourseSyncPlugin extends Plugin {
error: t('SAVE_POST_ID_ERROR') error: t('SAVE_POST_ID_ERROR')
}; };
} }
} return { message: "Success" };
return { message: "Success" }; } else {
} else { try {
try { const errorResponse = response.json;
const errorResponse = response.json; if (errorResponse.errors && errorResponse.errors.length > 0) {
if (errorResponse.errors && errorResponse.errors.length > 0) { return {
message: "Error",
error: errorResponse.errors.join('\n')
};
}
if (errorResponse.error) {
return {
message: "Error",
error: errorResponse.error
};
}
} catch (parseError) {
return { return {
message: "Error", message: "Error",
error: errorResponse.errors.join('\n') error: `${t('PUBLISH_FAILED')} (${response.status})`
}; };
} }
if (errorResponse.error) {
return {
message: "Error",
error: errorResponse.error
};
}
} catch (parseError) {
return {
message: "Error",
error: `${isUpdate ? t('UPDATE_FAILED') : t('PUBLISH_FAILED')} (${response.status})`
};
} }
} catch (error) {
return {
message: "Error",
error: `${t('PUBLISH_FAILED')}: ${error.message || t('UNKNOWN_ERROR')}`
};
} }
} catch (error) {
return {
message: "Error",
error: `${isUpdate ? t('UPDATE_FAILED') : t('PUBLISH_FAILED')}: ${error.message || t('UNKNOWN_ERROR')}`
};
} }
return { message: "Error", error: `${isUpdate ? t('UPDATE_FAILED') : t('PUBLISH_FAILED')}, ${t('TRY_AGAIN')}` }; return { message: "Error", error: `${isUpdate ? t('UPDATE_FAILED') : t('PUBLISH_FAILED')}, ${t('TRY_AGAIN')}` };
} }
@ -528,6 +591,11 @@ export class SelectCategoryModal extends Modal {
const selectedTagsContainer = tagSelectArea.createEl('div', { cls: 'selected-tags' }); const selectedTagsContainer = tagSelectArea.createEl('div', { cls: 'selected-tags' });
const selectedTags = new Set<string>(); const selectedTags = new Set<string>();
// Initialize with existing tags if updating
if (isUpdate && this.plugin.settings.selectedTags && this.plugin.settings.selectedTags.length > 0) {
this.plugin.settings.selectedTags.forEach(tag => selectedTags.add(tag));
}
// Update selected tags display // Update selected tags display
const updateSelectedTags = () => { const updateSelectedTags = () => {
selectedTagsContainer.empty(); selectedTagsContainer.empty();
@ -547,6 +615,9 @@ export class SelectCategoryModal extends Modal {
}); });
}; };
// Initialize tag display
updateSelectedTags();
// Create tag input container // Create tag input container
const tagInputContainer = tagSelectArea.createEl('div', { cls: 'tag-input-container' }); const tagInputContainer = tagSelectArea.createEl('div', { cls: 'tag-input-container' });