Skip to content
This repository was archived by the owner on Jan 21, 2024. It is now read-only.

Commit db9fcb8

Browse files
authored
perf: add supports for force updating of post and single page settings (#907)
> **Warning** > > 此 PR 的改动来自:<halo-dev/halo#3498> > 因为目前 Console 仓库已经合并到 Halo 主仓库,但主仓库的 release-2.3 分支不包含 Console,所以如果需要发布 2.3.x 的 patch 版本,依旧需要在此仓库修改。 #### What type of PR is this? /kind improvement /milestone 2.3.2 #### What this PR does / why we need it: 支持强制保存文章和单页面的设置,绕开后端 version 锁的机制,因为目前发现在后端 Reconcile 处理文章较慢时会影响文章的保存。 需要注意的是,这是一个不太合理的处理方式,但目前别无选择。 #### Which issue(s) this PR fixes: Fixes halo-dev/halo#3339 #### Special notes for your reviewer: 测试方式: 1. 同时打开多个同文章的编辑页面的窗口。 2. 编辑任意一个窗口的文章设置。 3. 然后再去其他窗口保存,观察是否有异常。 #### Does this PR introduce a user-facing change? ```release-note 支持强制保存文章和页面的设置,避免因为 Version 锁的机制导致保存失败。 ```
1 parent 09417ba commit db9fcb8

File tree

3 files changed

+85
-17
lines changed

3 files changed

+85
-17
lines changed

src/modules/contents/pages/components/SinglePageSettingModal.vue

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { toDatetimeLocal, toISOString } from "@/utils/date";
1717
import { submitForm } from "@formkit/core";
1818
import AnnotationsForm from "@/components/form/AnnotationsForm.vue";
1919
import useSlugify from "@/composables/use-slugify";
20+
import { useMutation } from "@tanstack/vue-query";
2021
2122
const initialFormState: SinglePage = {
2223
spec: {
@@ -110,6 +111,40 @@ const handlePublishClick = () => {
110111
});
111112
};
112113
114+
// Fix me:
115+
// Force update post settings,
116+
// because currently there may be errors caused by changes in version due to asynchronous processing.
117+
const { mutateAsync: singlePageUpdateMutate } = useMutation({
118+
mutationKey: ["singlePage-update"],
119+
mutationFn: async (page: SinglePage) => {
120+
const { data: latestSinglePage } =
121+
await apiClient.extension.singlePage.getcontentHaloRunV1alpha1SinglePage({
122+
name: page.metadata.name,
123+
});
124+
return apiClient.extension.singlePage.updatecontentHaloRunV1alpha1SinglePage(
125+
{
126+
name: page.metadata.name,
127+
singlePage: {
128+
...latestSinglePage,
129+
spec: page.spec,
130+
metadata: {
131+
...latestSinglePage.metadata,
132+
annotations: page.metadata.annotations,
133+
},
134+
},
135+
},
136+
{
137+
mute: true,
138+
}
139+
);
140+
},
141+
retry: 3,
142+
onError: (error) => {
143+
console.error("Failed to update post", error);
144+
Toast.error(`服务器内部错误`);
145+
},
146+
});
147+
113148
const handleSave = async () => {
114149
annotationsFormRef.value?.handleSubmit();
115150
await nextTick();
@@ -133,15 +168,8 @@ const handleSave = async () => {
133168
try {
134169
saving.value = true;
135170
136-
saving.value = true;
137-
138171
const { data } = isUpdateMode.value
139-
? await apiClient.extension.singlePage.updatecontentHaloRunV1alpha1SinglePage(
140-
{
141-
name: formState.value.metadata.name,
142-
singlePage: formState.value,
143-
}
144-
)
172+
? await singlePageUpdateMutate(formState.value)
145173
: await apiClient.extension.singlePage.createcontentHaloRunV1alpha1SinglePage(
146174
{
147175
singlePage: formState.value,

src/modules/contents/posts/components/PostSettingModal.vue

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { toDatetimeLocal, toISOString } from "@/utils/date";
1717
import AnnotationsForm from "@/components/form/AnnotationsForm.vue";
1818
import { submitForm } from "@formkit/core";
1919
import useSlugify from "@/composables/use-slugify";
20+
import { useMutation } from "@tanstack/vue-query";
2021
2122
const initialFormState: Post = {
2223
spec: {
@@ -114,6 +115,40 @@ const handlePublishClick = () => {
114115
});
115116
};
116117
118+
// Fix me:
119+
// Force update post settings,
120+
// because currently there may be errors caused by changes in version due to asynchronous processing.
121+
const { mutateAsync: postUpdateMutate } = useMutation({
122+
mutationKey: ["post-update"],
123+
mutationFn: async (post: Post) => {
124+
const { data: latestPost } =
125+
await apiClient.extension.post.getcontentHaloRunV1alpha1Post({
126+
name: post.metadata.name,
127+
});
128+
return apiClient.extension.post.updatecontentHaloRunV1alpha1Post(
129+
{
130+
name: post.metadata.name,
131+
post: {
132+
...latestPost,
133+
spec: post.spec,
134+
metadata: {
135+
...latestPost.metadata,
136+
annotations: post.metadata.annotations,
137+
},
138+
},
139+
},
140+
{
141+
mute: true,
142+
}
143+
);
144+
},
145+
retry: 3,
146+
onError: (error) => {
147+
console.error("Failed to update post", error);
148+
Toast.error(`服务器内部错误`);
149+
},
150+
});
151+
117152
const handleSave = async () => {
118153
annotationsFormRef.value?.handleSubmit();
119154
await nextTick();
@@ -139,10 +174,7 @@ const handleSave = async () => {
139174
saving.value = true;
140175
141176
const { data } = isUpdateMode.value
142-
? await apiClient.extension.post.updatecontentHaloRunV1alpha1Post({
143-
name: formState.value.metadata.name,
144-
post: formState.value,
145-
})
177+
? await postUpdateMutate(formState.value)
146178
: await apiClient.extension.post.createcontentHaloRunV1alpha1Post({
147179
post: formState.value,
148180
});

src/modules/contents/posts/components/__tests__/PostSettingModal.spec.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,27 @@ import { beforeEach, describe, expect, it } from "vitest";
22
import { mount } from "@vue/test-utils";
33
import PostSettingModal from "../PostSettingModal.vue";
44
import { createPinia, setActivePinia } from "pinia";
5+
import { VueQueryPlugin } from "@tanstack/vue-query";
56

67
describe("PostSettingModal", () => {
78
beforeEach(() => {
89
setActivePinia(createPinia());
910
});
1011

1112
it("should render", () => {
12-
const wrapper = mount({
13-
components: {
14-
PostSettingModal,
13+
const wrapper = mount(
14+
{
15+
components: {
16+
PostSettingModal,
17+
},
18+
template: `<PostSettingModal></PostSettingModal>`,
1519
},
16-
template: `<PostSettingModal></PostSettingModal>`,
17-
});
20+
{
21+
global: {
22+
plugins: [VueQueryPlugin],
23+
},
24+
}
25+
);
1826
expect(wrapper).toBeDefined();
1927
});
2028
});

0 commit comments

Comments
 (0)