refactor: save and publishing logic for post and single page (#696)

#### What type of PR is this?

/kind improvement
/milestone 2.0

#### What this PR does / why we need it:

优化文章和自定义页面的保存内容和发布逻辑。详情可查阅:https://github.com/halo-dev/halo/pull/2709

#### Special notes for your reviewer:

/cc @halo-dev/sig-halo-console 

测试流程:

1. Halo 需要切换到 https://github.com/halo-dev/halo/pull/2709 分支。
2. 测试文章和自定义页面的新建、更新内容,以及发布。

#### Does this PR introduce a user-facing change?

```release-note
优化文章和自定义页面的保存内容和发布逻辑。
```
pull/697/head
Ryan Wang 2022-11-18 21:16:23 +08:00 committed by GitHub
parent eef8dc3d43
commit 8deb8ee3bb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 35 additions and 85 deletions

View File

@ -32,7 +32,7 @@
"@formkit/themes": "^1.0.0-beta.11",
"@formkit/vue": "^1.0.0-beta.11",
"@formkit/utils": "^1.0.0-beta.11",
"@halo-dev/api-client": "^0.0.47",
"@halo-dev/api-client": "^0.0.50",
"@halo-dev/components": "workspace:*",
"@halo-dev/console-shared": "workspace:*",
"@halo-dev/richtext-editor": "^0.0.0-alpha.11",

View File

@ -12,7 +12,7 @@ importers:
'@formkit/themes': ^1.0.0-beta.11
'@formkit/utils': ^1.0.0-beta.11
'@formkit/vue': ^1.0.0-beta.11
'@halo-dev/api-client': ^0.0.47
'@halo-dev/api-client': ^0.0.50
'@halo-dev/components': workspace:*
'@halo-dev/console-shared': workspace:*
'@halo-dev/richtext-editor': ^0.0.0-alpha.11
@ -104,7 +104,7 @@ importers:
'@formkit/themes': 1.0.0-beta.12-e579559_tailwindcss@3.2.4
'@formkit/utils': 1.0.0-beta.12-e579559
'@formkit/vue': 1.0.0-beta.12-e579559_ior6jr3fpijijuwpr34w2i25va
'@halo-dev/api-client': 0.0.47
'@halo-dev/api-client': 0.0.50
'@halo-dev/components': link:packages/components
'@halo-dev/console-shared': link:packages/shared
'@halo-dev/richtext-editor': 0.0.0-alpha.11_vue@3.2.45
@ -1970,8 +1970,8 @@ packages:
- windicss
dev: false
/@halo-dev/api-client/0.0.47:
resolution: {integrity: sha512-O5Yw7TDpTElCOTKPz98yeaixh5SdfPZ63qOSZlFqO//F3tAvegpjq1ZYHMblJfP1Q/P9GioZB9YYebzzv8PC4g==}
/@halo-dev/api-client/0.0.50:
resolution: {integrity: sha512-/bf/zv/27Pk2dpyozKeEjFkNy5P5ecGX2064WA2oQVHV8sK0UeCRrzDKQ/bIHrHJWaP9aBAN29fE9ocBXoJMeg==}
dev: false
/@halo-dev/richtext-editor/0.0.0-alpha.11_vue@3.2.45:

View File

@ -7,6 +7,7 @@ import {
VSpace,
VButton,
IconSave,
Toast,
} from "@halo-dev/components";
import DefaultEditor from "@/components/editor/DefaultEditor.vue";
import SinglePageSettingModal from "./components/SinglePageSettingModal.vue";
@ -34,7 +35,6 @@ const initialFormState: SinglePageRequest = {
pinned: false,
allowComment: true,
visible: "PUBLIC",
version: 1,
priority: 0,
excerpt: {
autoGenerate: true,
@ -83,19 +83,9 @@ const handleSave = async () => {
}
if (isUpdateMode.value) {
// Get latest single page
const { data: latestSinglePage } =
await apiClient.extension.singlePage.getcontentHaloRunV1alpha1SinglePage(
{
name: formState.value.page.metadata.name,
}
);
formState.value.page = latestSinglePage;
const { data } = await apiClient.singlePage.updateDraftSinglePage({
const { data } = await apiClient.singlePage.updateSinglePageContent({
name: formState.value.page.metadata.name,
singlePageRequest: formState.value,
content: formState.value.content,
});
formState.value.page = data;
@ -107,9 +97,12 @@ const handleSave = async () => {
routeQueryName.value = data.metadata.name;
}
Toast.success("保存成功");
await handleFetchContent();
} catch (error) {
console.error("Failed to save single page", error);
Toast.error("保存失败,请重试");
} finally {
saving.value = false;
}
@ -123,45 +116,16 @@ const handlePublish = async () => {
formState.value.content.content = formState.value.content.raw;
if (isUpdateMode.value) {
const { headSnapshot } = formState.value.page.spec;
const { name: singlePageName } = formState.value.page.metadata;
const { data: latestContent } =
await apiClient.content.updateSnapshotContent({
snapshotName: headSnapshot as string,
contentRequest: {
raw: formState.value.content.raw as string,
content: formState.value.content.content as string,
rawType: formState.value.content.rawType as string,
headSnapshotName: headSnapshot,
subjectRef: {
kind: "SinglePage",
version: "v1alpha1",
group: "content.halo.run",
name: singlePageName,
},
},
});
// Get latest single page
const { data: latestSinglePage } =
await apiClient.extension.singlePage.getcontentHaloRunV1alpha1SinglePage(
{
name: formState.value.page.metadata.name,
}
);
await apiClient.singlePage.updateSinglePageContent({
name: singlePageName,
content: formState.value.content,
});
formState.value.page = latestSinglePage;
formState.value.page.spec.publish = true;
formState.value.page.spec.headSnapshot = latestContent.snapshotName;
formState.value.page.spec.releaseSnapshot =
formState.value.page.spec.headSnapshot;
await apiClient.extension.singlePage.updatecontentHaloRunV1alpha1SinglePage(
{
name: singlePageName,
singlePage: formState.value.page,
}
);
await apiClient.singlePage.publishSinglePage({
name: singlePageName,
});
} else {
formState.value.page.spec.publish = true;
await apiClient.singlePage.draftSinglePage({
@ -169,9 +133,12 @@ const handlePublish = async () => {
});
}
Toast.success("发布成功");
router.push({ name: "SinglePages" });
} catch (error) {
console.error("Failed to publish single page", error);
Toast.error("发布失败,请重试");
} finally {
publishing.value = false;
}

View File

@ -20,7 +20,6 @@ const initialFormState: SinglePage = {
pinned: false,
allowComment: true,
visible: "PUBLIC",
version: 1,
priority: 0,
excerpt: {
autoGenerate: true,

View File

@ -7,6 +7,7 @@ import {
VButton,
VPageHeader,
VSpace,
Toast,
} from "@halo-dev/components";
import DefaultEditor from "@/components/editor/DefaultEditor.vue";
import PostSettingModal from "./components/PostSettingModal.vue";
@ -34,7 +35,6 @@ const initialFormState: PostRequest = {
pinned: false,
allowComment: true,
visible: "PUBLIC",
version: 1,
priority: 0,
excerpt: {
autoGenerate: true,
@ -84,17 +84,9 @@ const handleSave = async () => {
}
if (isUpdateMode.value) {
// Get latest post
const { data: latestPost } =
await apiClient.extension.post.getcontentHaloRunV1alpha1Post({
name: formState.value.post.metadata.name,
});
formState.value.post = latestPost;
const { data } = await apiClient.post.updateDraftPost({
const { data } = await apiClient.post.updatePostContent({
name: formState.value.post.metadata.name,
postRequest: formState.value,
content: formState.value.content,
});
formState.value.post = data;
@ -106,9 +98,12 @@ const handleSave = async () => {
name.value = data.metadata.name;
}
Toast.success("保存成功");
await handleFetchContent();
} catch (e) {
console.error("Failed to save post", e);
Toast.error("保存失败,请重试");
} finally {
saving.value = false;
}
@ -122,28 +117,15 @@ const handlePublish = async () => {
formState.value.content.content = formState.value.content.raw;
if (isUpdateMode.value) {
const { headSnapshot } = formState.value.post.spec;
const { name: postName } = formState.value.post.metadata;
const { data: latestContent } =
await apiClient.content.updateSnapshotContent({
snapshotName: headSnapshot as string,
contentRequest: {
raw: formState.value.content.raw as string,
content: formState.value.content.content as string,
rawType: formState.value.content.rawType as string,
headSnapshotName: headSnapshot,
subjectRef: {
kind: "Post",
version: "v1alpha1",
group: "content.halo.run",
name: postName,
},
},
});
await apiClient.post.updatePostContent({
name: postName,
content: formState.value.content,
});
await apiClient.post.publishPost({
name: postName,
headSnapshot: latestContent.snapshotName,
});
} else {
const { data } = await apiClient.post.draftPost({
@ -155,9 +137,12 @@ const handlePublish = async () => {
});
}
Toast.success("发布成功", { duration: 2000 });
router.push({ name: "Posts" });
} catch (error) {
console.error("Failed to publish post", error);
Toast.error("发布失败,请重试");
} finally {
publishing.value = false;
}

View File

@ -20,7 +20,6 @@ const initialFormState: Post = {
pinned: false,
allowComment: true,
visible: "PUBLIC",
version: 1,
priority: 0,
excerpt: {
autoGenerate: true,