@raketa-cloud/admin 0.0.6 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/package.json +3 -2
  2. package/src/Adapter.js +1 -1
  3. package/src/cloud/ChangePageURL.js +24 -0
  4. package/src/cloud/ClonesPage.js +14 -0
  5. package/src/cloud/DeletePage.js +35 -0
  6. package/src/cloud/PageChanges.js +15 -0
  7. package/src/cloud/PageRevisions.js +135 -0
  8. package/src/cloud/PageTranslations.js +22 -0
  9. package/src/cloud/Pages.js +63 -0
  10. package/src/cloud/RaketaClient.js +118 -0
  11. package/src/cloud/Redirects.js +81 -0
  12. package/src/cloud/RevertPageRevision.js +18 -0
  13. package/src/cloud/Settings.js +30 -0
  14. package/src/cloud/Tags.js +80 -0
  15. package/src/cloud/documents/articlesDocuments.js +608 -0
  16. package/src/cloud/documents/categoryDocuments.js +64 -0
  17. package/src/cloud/documents/common.js +84 -0
  18. package/src/cloud/documents/pagesDocuments.js +245 -0
  19. package/src/cloud/documents/redirectsDocuments.js +82 -0
  20. package/src/cloud/documents/settingsDocuments.js +23 -0
  21. package/src/cloud/documents/tagsDocuments.js +63 -0
  22. package/src/handlers/PageCloneHandler.js +17 -0
  23. package/src/handlers/PageCloneHandler.test/create.test.js +55 -0
  24. package/src/handlers/PageDeleteHandler.js +68 -0
  25. package/src/handlers/PageDeleteHandler.test/create.test.js +112 -0
  26. package/src/handlers/PageDeleteHandler.test/create_form.test.js +54 -0
  27. package/src/handlers/PageRevisionsCodesHandler.js +83 -0
  28. package/src/handlers/PageRevisionsCodesHandler.test/edit_form.test.js +56 -0
  29. package/src/handlers/PageRevisionsCodesHandler.test/update.test.js +137 -0
  30. package/src/handlers/PageRevisionsGeneralHandler.js +86 -0
  31. package/src/handlers/PageRevisionsGeneralHandler.test/edit_form.test.js +62 -0
  32. package/src/handlers/PageRevisionsGeneralHandler.test/update.test.js +147 -0
  33. package/src/handlers/PageRevisionsHandler.js +47 -0
  34. package/src/handlers/PageRevisionsHandler.test/create.test.js +67 -0
  35. package/src/handlers/PageRevisionsHandler.test/destroy.test.js +54 -0
  36. package/src/handlers/PageRevisionsLockHandler.js +54 -0
  37. package/src/handlers/PageRevisionsMetaHandler.js +83 -0
  38. package/src/handlers/PageRevisionsMetaHandler.test/edit_form.test.js +57 -0
  39. package/src/handlers/PageRevisionsMetaHandler.test/update.test.js +141 -0
  40. package/src/handlers/PageRevisionsTagsHandler.js +80 -0
  41. package/src/handlers/PageRevisionsTagsHandler.test/edit_form.test.js +69 -0
  42. package/src/handlers/PageRevisionsTagsHandler.test/update.test.js +141 -0
  43. package/src/handlers/PageRevisionsUnlockHandler.js +22 -0
  44. package/src/handlers/PageRevisionsVisualsHandler.js +77 -0
  45. package/src/handlers/PageRevisionsVisualsHandler.test/edit_form.test.js +55 -0
  46. package/src/handlers/PageRevisionsVisualsHandler.test/update.test.js +129 -0
  47. package/src/handlers/PageRevisionsWidgetsHandler.js +41 -0
  48. package/src/handlers/PageRevisionsWidgetsHandler.test/show.test.js +47 -0
  49. package/src/handlers/PageRevisionsWidgetsHandler.test/update.test.js +104 -0
  50. package/src/handlers/PageTranslationsHandler.js +91 -0
  51. package/src/handlers/PageURLsHandler.js +69 -0
  52. package/src/handlers/PageURLsHandler.test/create.test.js +157 -0
  53. package/src/handlers/PageURLsHandler.test/create_form.test.js +51 -0
  54. package/src/handlers/PagesHandler.js +114 -0
  55. package/src/handlers/PagesHandler.test/create.test.js +140 -0
  56. package/src/handlers/PagesHandler.test/create_form.test.js +41 -0
  57. package/src/handlers/PagesHandler.test/index.test.js +49 -0
  58. package/src/handlers/PagesHandler.test/show.test.js +103 -0
  59. package/src/handlers/PublishPageRevisionHandler.js +84 -0
  60. package/src/handlers/PublishPageRevisionHandler.test/create.test.js +136 -0
  61. package/src/handlers/PublishPageRevisionHandler.test/create_form.test.js +47 -0
  62. package/src/handlers/RedirectsHandler.js +124 -0
  63. package/src/handlers/RedirectsHandler.test/create.test.js +84 -0
  64. package/src/handlers/RedirectsHandler.test/create_form.test.js +29 -0
  65. package/src/handlers/RedirectsHandler.test/destroy.test.js +54 -0
  66. package/src/handlers/RedirectsHandler.test/edit_form.test.js +38 -0
  67. package/src/handlers/RedirectsHandler.test/index.test.js +42 -0
  68. package/src/handlers/RedirectsHandler.test/show.test.js +41 -0
  69. package/src/handlers/RedirectsHandler.test/update.test.js +89 -0
  70. package/src/handlers/RevertPageRevisionHandler.js +26 -0
  71. package/src/handlers/RevertPageRevisionHandler.test/create.test.js +80 -0
  72. package/src/handlers/SettingsGeneralHandler.js +13 -0
  73. package/src/handlers/SettingsLayoutHandler.js +51 -0
  74. package/src/handlers/SettingsMetaHandler.js +52 -0
  75. package/src/handlers/TagsHandler.js +113 -0
  76. package/src/helpers/FormBuilder.js +12 -4
  77. package/src/index.js +33 -0
  78. package/src/setupAuthentication.js +3 -0
  79. package/src/styles/application.css +55 -19
  80. package/src/views/layouts/application.ejs +30 -31
  81. package/src/views/layouts/header.ejs +6 -7
  82. package/src/views/page_deletes/create_form.ejs +55 -0
  83. package/src/views/page_lock/create_form.ejs +35 -0
  84. package/src/views/page_publish/_form.ejs +57 -0
  85. package/src/views/page_publish/create_form.ejs +11 -0
  86. package/src/views/page_revisions/_nav.ejs +40 -0
  87. package/src/views/page_revisions/codes/edit_form.ejs +39 -0
  88. package/src/views/page_revisions/general/edit_form.ejs +69 -0
  89. package/src/views/page_revisions/meta/edit_form.ejs +41 -0
  90. package/src/views/page_revisions/tags/edit_form.ejs +64 -0
  91. package/src/views/page_revisions/visuals/edit_form.ejs +42 -0
  92. package/src/views/page_translations/_form.ejs +76 -0
  93. package/src/views/page_translations/create_form.ejs +11 -0
  94. package/src/views/page_urls/create_form.ejs +31 -0
  95. package/src/views/pages/_form.ejs +84 -0
  96. package/src/views/pages/create_form.ejs +9 -0
  97. package/src/views/pages/edit_form.ejs +3 -0
  98. package/src/views/pages/index.ejs +161 -0
  99. package/src/views/pages/show.ejs +281 -0
  100. package/src/views/redirects/_form.ejs +40 -0
  101. package/src/views/redirects/create_form.ejs +9 -0
  102. package/src/views/redirects/edit_form.ejs +9 -0
  103. package/src/views/redirects/index.ejs +75 -1
  104. package/src/views/redirects/show.ejs +60 -0
  105. package/src/views/settings/_nav.ejs +28 -0
  106. package/src/views/settings/general/edit_form.ejs +26 -0
  107. package/src/views/settings/layout/edit_form.ejs +22 -0
  108. package/src/views/settings/meta/edit_form.ejs +38 -0
  109. package/src/views/tags/_form.ejs +39 -0
  110. package/src/views/tags/create_form.ejs +9 -0
  111. package/src/views/tags/edit_form.ejs +9 -0
  112. package/src/views/tags/index.ejs +43 -0
  113. package/test/factory.js +91 -0
  114. package/test/handlersHelper.js +9 -0
@@ -0,0 +1,112 @@
1
+ import PageDeleteHandler from "../PageDeleteHandler";
2
+ import Pages from "../../cloud/Pages";
3
+ import DeletePage from "../../cloud/DeletePage";
4
+ import Factory from "../../../../../apps/admin/test/factory";
5
+ import { testConfig } from "../../../../../apps/admin/test/handlersHelper";
6
+
7
+ function buildCtx(page, updateSettings) {
8
+ return {
9
+ client: {
10
+ pages: new Pages(testConfig, "token"),
11
+ deletePage: new DeletePage(testConfig, "token"),
12
+ },
13
+ params: { parent_id: page.id },
14
+ resourceParams: {
15
+ deleteAction: updateSettings,
16
+ },
17
+ locale: "en",
18
+ };
19
+ }
20
+
21
+ describe("Page delete", () => {
22
+ test("create successful", async () => {
23
+ const page = Factory.build("page");
24
+ const updateSettings = {
25
+ redirect: "301",
26
+ destination: "/test-dest",
27
+ };
28
+ const ctx = buildCtx(page, updateSettings);
29
+
30
+ const mockFind = jest
31
+ .spyOn(ctx.client.pages, "find")
32
+ .mockImplementation(() => page);
33
+
34
+ const mockDelete = jest
35
+ .spyOn(ctx.client.deletePage, "delete")
36
+ .mockImplementation(() => ({ page, errors: null }));
37
+
38
+ const result = await PageDeleteHandler.create(ctx);
39
+
40
+ expect(mockFind).toHaveBeenCalledWith(page.id, "en");
41
+ expect(mockDelete).toHaveBeenCalledWith(page.id, "en", {
42
+ url: `/${page.slug}`,
43
+ destination: updateSettings.destination,
44
+ httpResponseCode: 301,
45
+ note: "Created via page deletion process",
46
+ });
47
+
48
+ expect(result).toEqual({
49
+ redirect: "/en/pages",
50
+ });
51
+ });
52
+
53
+ test("create failed due to redirect create", async () => {
54
+ const page = Factory.build("page");
55
+ const updateSettings = {
56
+ redirect: "410",
57
+ destination: "/test-dest",
58
+ };
59
+ const ctx = buildCtx(page, updateSettings);
60
+
61
+ const mockFind = jest
62
+ .spyOn(ctx.client.pages, "find")
63
+ .mockImplementation(() => page);
64
+
65
+ const mockDelete = jest
66
+ .spyOn(ctx.client.deletePage, "delete")
67
+ .mockImplementation(() => ({
68
+ page: null,
69
+ errors: [
70
+ {
71
+ codes: [],
72
+ key: "generalError",
73
+ message: "url: has already been taken",
74
+ },
75
+ ],
76
+ }));
77
+
78
+ const result = await PageDeleteHandler.create(ctx);
79
+
80
+ expect(mockFind).toHaveBeenCalledWith(page.id, "en");
81
+ expect(mockDelete).toHaveBeenCalledWith(page.id, "en", {
82
+ url: `/${page.slug}`,
83
+ destination: "/",
84
+ httpResponseCode: 410,
85
+ note: "Created via page deletion process",
86
+ });
87
+
88
+ expect(result).toEqual({
89
+ assigns: {
90
+ deleteAction: { ...updateSettings, id: page.id },
91
+ errors: {
92
+ deleteAction: { redirect: "url: has already been taken" },
93
+ },
94
+ _translations: [],
95
+ },
96
+ });
97
+ });
98
+
99
+ test("create for non existing page", async () => {
100
+ const ctx = buildCtx({ id: "42" }, {});
101
+
102
+ const mockFind = jest
103
+ .spyOn(ctx.client.pages, "find")
104
+ .mockImplementation(() => null);
105
+
106
+ expect(async () => {
107
+ await PageDeleteHandler.create(ctx);
108
+ }).rejects.toThrow("Missing page #42");
109
+
110
+ expect(mockFind).toHaveBeenCalledWith("42", "en");
111
+ });
112
+ });
@@ -0,0 +1,54 @@
1
+ import PageDeleteHandler from "../PageDeleteHandler";
2
+ import Pages from "../../cloud/Pages";
3
+ import Factory from "../../../test/factory";
4
+ import { testConfig } from "../../../test/handlersHelper";
5
+
6
+ function buildCtx(page) {
7
+ return {
8
+ client: {
9
+ pages: new Pages(testConfig, "token"),
10
+ },
11
+ params: { parent_id: page.id },
12
+ locale: "en",
13
+ };
14
+ }
15
+
16
+ describe("Page delete", () => {
17
+ test("create_form for existing page", async () => {
18
+ const page = Factory.build("page");
19
+ const ctx = buildCtx(page);
20
+
21
+ const mockFind = jest
22
+ .spyOn(ctx.client.pages, "find")
23
+ .mockImplementation(() => page);
24
+
25
+ const result = await PageDeleteHandler.create_form(ctx);
26
+
27
+ expect(mockFind).toHaveBeenCalledWith(page.id, "en");
28
+
29
+ expect(result).toEqual({
30
+ assigns: {
31
+ deleteAction: {
32
+ id: page.id,
33
+ redirect: "",
34
+ },
35
+ errors: {},
36
+ _translations: [],
37
+ },
38
+ });
39
+ });
40
+
41
+ test("create_form for non existing page", async () => {
42
+ const ctx = buildCtx({ id: "42" });
43
+
44
+ const mockFind = jest
45
+ .spyOn(ctx.client.pages, "find")
46
+ .mockImplementation(() => null);
47
+
48
+ expect(async () => {
49
+ await PageDeleteHandler.create_form(ctx);
50
+ }).rejects.toThrow("Missing page #42");
51
+
52
+ expect(mockFind).toHaveBeenCalledWith("42", "en");
53
+ });
54
+ });
@@ -0,0 +1,83 @@
1
+ const edit_form = async (ctx) => {
2
+ const { parent_id } = ctx.params;
3
+
4
+ const revision = await ctx.client.pageRevisions.find(parent_id, ctx.locale);
5
+
6
+ if (!revision) {
7
+ throw new Error(`Missing revision #${parent_id}`);
8
+ }
9
+
10
+ const code_settings = {
11
+ id: revision.id,
12
+ originalId: revision.originalId,
13
+ scripts: JSON.stringify(revision.settings.codes?.scripts || []),
14
+ structured_data: JSON.stringify(
15
+ revision.settings.codes?.structured_data || {}
16
+ ),
17
+ };
18
+
19
+ return {
20
+ assigns: {
21
+ code_settings,
22
+ errors: {},
23
+ _translations: [],
24
+ },
25
+ };
26
+ };
27
+
28
+ const update = async (ctx) => {
29
+ const { parent_id } = ctx.params;
30
+
31
+ const revision = await ctx.client.pageRevisions.find(parent_id, ctx.locale);
32
+
33
+ if (!revision) {
34
+ throw new Error(`Missing revision #${parent_id}`);
35
+ }
36
+
37
+ const params = ctx.resourceParams.code_settings;
38
+
39
+ const { errors } = await ctx.client.pageRevisions.update(
40
+ revision.id,
41
+ ctx.locale,
42
+ {
43
+ slug: revision.slug,
44
+ title: revision.title,
45
+ visibility: revision.visibility,
46
+ widgets: JSON.stringify(revision.widgets),
47
+ tags: revision.tags.map((t) => t.id),
48
+ categories: revision.categories.map((c) => c.id),
49
+ settings: JSON.stringify({
50
+ ...revision.settings,
51
+ codes: {
52
+ scripts: JSON.parse(params.scripts),
53
+ structured_data: JSON.parse(params.structured_data),
54
+ },
55
+ }),
56
+ }
57
+ );
58
+
59
+ if (errors) {
60
+ return {
61
+ assigns: {
62
+ code_settings: {
63
+ ...params,
64
+ id: revision.id,
65
+ originalId: revision.originalId,
66
+ },
67
+ errors: {
68
+ code_settings: ctx.client.pageRevisions.formatErrors(errors),
69
+ },
70
+ _translations: [],
71
+ },
72
+ };
73
+ }
74
+
75
+ return {
76
+ redirect: `/${ctx.locale}/page_revisions/${revision.id}/codes/edit`,
77
+ };
78
+ };
79
+
80
+ export default {
81
+ edit_form,
82
+ update,
83
+ };
@@ -0,0 +1,56 @@
1
+ import PageRevisionsCodesHandler from "../PageRevisionsCodesHandler";
2
+ import PageRevisions from "../../cloud/PageRevisions";
3
+ import { testConfig } from "../../../test/handlersHelper";
4
+ import Factory from "../../../test/factory";
5
+
6
+ function buildCtx(revision) {
7
+ return {
8
+ client: {
9
+ pageRevisions: new PageRevisions(testConfig, "token"),
10
+ },
11
+ params: { parent_id: revision.id },
12
+ locale: "en",
13
+ };
14
+ }
15
+
16
+ describe("Page revision code settings", () => {
17
+ test("edit_form when a revision exists", async () => {
18
+ const revision = Factory.build("page_revision");
19
+ const ctx = buildCtx(revision);
20
+
21
+ const mockFind = jest
22
+ .spyOn(ctx.client.pageRevisions, "find")
23
+ .mockImplementation(() => revision);
24
+
25
+ const result = await PageRevisionsCodesHandler.edit_form(ctx);
26
+
27
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
28
+
29
+ expect(result).toEqual({
30
+ assigns: {
31
+ code_settings: {
32
+ id: revision.id,
33
+ originalId: revision.originalId,
34
+ scripts: JSON.stringify([]),
35
+ structured_data: JSON.stringify({}),
36
+ },
37
+ errors: {},
38
+ _translations: [],
39
+ },
40
+ });
41
+ });
42
+
43
+ test("edit_form when a revision does not exist", async () => {
44
+ const ctx = buildCtx({ id: "42" });
45
+
46
+ const mockFind = jest
47
+ .spyOn(ctx.client.pageRevisions, "find")
48
+ .mockImplementation(() => null);
49
+
50
+ expect(async () => {
51
+ await PageRevisionsCodesHandler.edit_form(ctx);
52
+ }).rejects.toThrow("Missing revision #42");
53
+
54
+ expect(mockFind).toHaveBeenCalledWith("42", "en");
55
+ });
56
+ });
@@ -0,0 +1,137 @@
1
+ import PageRevisionsCodesHandler from "../PageRevisionsCodesHandler";
2
+ import PageRevisions from "../../cloud/PageRevisions";
3
+ import { testConfig } from "../../../../../apps/admin/test/handlersHelper";
4
+ import Factory from "../../../../../apps/admin/test/factory";
5
+
6
+ function buildCtx(revision, updateSettings) {
7
+ return {
8
+ client: {
9
+ pageRevisions: new PageRevisions(testConfig, "token"),
10
+ },
11
+ params: { parent_id: revision.id },
12
+ resourceParams: {
13
+ code_settings: updateSettings,
14
+ },
15
+ locale: "en",
16
+ };
17
+ }
18
+
19
+ describe("Page revision code settings", () => {
20
+ test("update successful", async () => {
21
+ const revision = Factory.build("page_revision");
22
+
23
+ const updateSettings = {
24
+ scripts: JSON.stringify([{ type: "bla" }]),
25
+ structured_data: JSON.stringify({ type: "article" }),
26
+ };
27
+
28
+ const ctx = buildCtx(revision, updateSettings);
29
+
30
+ const mockFind = jest
31
+ .spyOn(ctx.client.pageRevisions, "find")
32
+ .mockImplementation(() => revision);
33
+
34
+ const mockUpdate = jest
35
+ .spyOn(ctx.client.pageRevisions, "update")
36
+ .mockImplementation(() => ({
37
+ revision: {},
38
+ errors: null,
39
+ }));
40
+
41
+ const result = await PageRevisionsCodesHandler.update(ctx);
42
+
43
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
44
+ expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
45
+ slug: revision.slug,
46
+ title: revision.title,
47
+ visibility: revision.visibility,
48
+ widgets: JSON.stringify(revision.widgets),
49
+ tags: revision.tags.map((t) => t.id),
50
+ categories: revision.categories.map((c) => c.id),
51
+ settings: JSON.stringify({
52
+ ...revision.settings,
53
+ codes: {
54
+ scripts: [{ type: "bla" }],
55
+ structured_data: { type: "article" },
56
+ },
57
+ }),
58
+ });
59
+
60
+ expect(result).toEqual({
61
+ redirect: `/en/page_revisions/${revision.id}/codes/edit`,
62
+ });
63
+ });
64
+
65
+ test("update failed", async () => {
66
+ const revision = Factory.build("page_revision");
67
+
68
+ const updateSettings = {
69
+ scripts: JSON.stringify([{ type: "bla" }]),
70
+ structured_data: JSON.stringify({ type: "article" }),
71
+ };
72
+
73
+ const ctx = buildCtx(revision, updateSettings);
74
+
75
+ const mockFind = jest
76
+ .spyOn(ctx.client.pageRevisions, "find")
77
+ .mockImplementation(() => revision);
78
+
79
+ const mockUpdate = jest
80
+ .spyOn(ctx.client.pageRevisions, "update")
81
+ .mockImplementation(() => ({
82
+ revision: {},
83
+ errors: [{ key: "generalError", message: "some error" }],
84
+ }));
85
+
86
+ const result = await PageRevisionsCodesHandler.update(ctx);
87
+
88
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
89
+ expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
90
+ slug: revision.slug,
91
+ title: revision.title,
92
+ visibility: revision.visibility,
93
+ widgets: JSON.stringify(revision.widgets),
94
+ tags: revision.tags.map((t) => t.id),
95
+ categories: revision.categories.map((c) => c.id),
96
+ settings: JSON.stringify({
97
+ ...revision.settings,
98
+ codes: {
99
+ scripts: [{ type: "bla" }],
100
+ structured_data: { type: "article" },
101
+ },
102
+ }),
103
+ });
104
+
105
+ expect(result).toEqual({
106
+ assigns: {
107
+ code_settings: {
108
+ ...updateSettings,
109
+ id: revision.id,
110
+ originalId: revision.originalId,
111
+ },
112
+ errors: {
113
+ code_settings: { generalError: "some error" },
114
+ },
115
+ _translations: [],
116
+ },
117
+ });
118
+ });
119
+
120
+ test("update when a revision does not exist", async () => {
121
+ const revision = Factory.build("page_revision");
122
+
123
+ const updateSettings = {};
124
+
125
+ const ctx = buildCtx(revision, updateSettings);
126
+
127
+ const mockFind = jest
128
+ .spyOn(ctx.client.pageRevisions, "find")
129
+ .mockImplementation(() => null);
130
+
131
+ expect(async () => {
132
+ await PageRevisionsCodesHandler.update(ctx);
133
+ }).rejects.toThrow(`Missing revision #${revision.id}`);
134
+
135
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
136
+ });
137
+ });
@@ -0,0 +1,86 @@
1
+ const edit_form = async (ctx) => {
2
+ const { parent_id } = ctx.params;
3
+
4
+ const revision = await ctx.client.pageRevisions.find(parent_id, ctx.locale);
5
+
6
+ if (!revision) {
7
+ throw new Error(`Missing revision #${parent_id}`);
8
+ }
9
+
10
+ const general_settings = {
11
+ id: revision.id,
12
+ originalId: revision.originalId,
13
+ title: revision.title,
14
+ slug: revision.slug,
15
+ visibility: revision.visibility,
16
+ username: revision.settings?.credentials?.user || "",
17
+ password: revision.settings?.credentials?.password || "",
18
+ };
19
+
20
+ return {
21
+ assigns: {
22
+ general_settings,
23
+ errors: {},
24
+ visibilityOptions: ctx.client.pages.visibilityOptions(),
25
+ _translations: [],
26
+ },
27
+ };
28
+ };
29
+
30
+ const update = async (ctx) => {
31
+ const { parent_id } = ctx.params;
32
+
33
+ const revision = await ctx.client.pageRevisions.find(parent_id, ctx.locale);
34
+
35
+ if (!revision) {
36
+ throw new Error(`Missing revision #${parent_id}`);
37
+ }
38
+
39
+ const params = ctx.resourceParams.general_settings;
40
+
41
+ const { errors } = await ctx.client.pageRevisions.update(
42
+ revision.id,
43
+ ctx.locale,
44
+ {
45
+ slug: params.slug,
46
+ title: params.title,
47
+ visibility: params.visibility,
48
+ widgets: JSON.stringify(revision.widgets),
49
+ tags: revision.tags.map((t) => t.id),
50
+ categories: revision.categories.map((c) => c.id),
51
+ settings: JSON.stringify({
52
+ ...revision.settings,
53
+ credentials: {
54
+ user: params.username,
55
+ password: params.password,
56
+ },
57
+ }),
58
+ }
59
+ );
60
+
61
+ if (errors) {
62
+ return {
63
+ assigns: {
64
+ general_settings: {
65
+ ...params,
66
+ id: revision.id,
67
+ originalId: revision.originalId,
68
+ },
69
+ errors: {
70
+ general_settings: ctx.client.pageRevisions.formatErrors(errors),
71
+ },
72
+ visibilityOptions: ctx.client.pages.visibilityOptions(),
73
+ _translations: [],
74
+ },
75
+ };
76
+ }
77
+
78
+ return {
79
+ redirect: `/${ctx.locale}/page_revisions/${revision.id}/general/edit`,
80
+ };
81
+ };
82
+
83
+ export default {
84
+ edit_form,
85
+ update,
86
+ };
@@ -0,0 +1,62 @@
1
+ import PageRevisionsGeneralHandler from "../PageRevisionsGeneralHandler";
2
+ import PageRevisions from "../../cloud/PageRevisions";
3
+ import Pages from "../../cloud/Pages";
4
+ import { testConfig } from "../../../test/handlersHelper";
5
+ import Factory from "../../../test/factory";
6
+
7
+ function buildCtx(revision) {
8
+ return {
9
+ client: {
10
+ pageRevisions: new PageRevisions(testConfig, "token"),
11
+ pages: new Pages(testConfig, "token"),
12
+ },
13
+ params: { parent_id: revision.id },
14
+ locale: "en",
15
+ };
16
+ }
17
+
18
+ describe("Page revision genereal settings", () => {
19
+ test("edit_form when a revision exists", async () => {
20
+ const revision = Factory.build("page_revision");
21
+ const ctx = buildCtx(revision);
22
+
23
+ const mockFind = jest
24
+ .spyOn(ctx.client.pageRevisions, "find")
25
+ .mockImplementation(() => revision);
26
+
27
+ const result = await PageRevisionsGeneralHandler.edit_form(ctx);
28
+
29
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
30
+
31
+ expect(result).toEqual({
32
+ assigns: {
33
+ general_settings: {
34
+ id: revision.id,
35
+ originalId: revision.originalId,
36
+ title: revision.title,
37
+ slug: revision.slug,
38
+ visibility: revision.visibility,
39
+ username: revision.settings?.credentials?.user || "",
40
+ password: revision.settings?.credentials?.password || "",
41
+ },
42
+ errors: {},
43
+ visibilityOptions: ctx.client.pages.visibilityOptions(),
44
+ _translations: [],
45
+ },
46
+ });
47
+ });
48
+
49
+ test("edit_form when a revision does not exist", async () => {
50
+ const ctx = buildCtx({ id: "42" });
51
+
52
+ const mockFind = jest
53
+ .spyOn(ctx.client.pageRevisions, "find")
54
+ .mockImplementation(() => null);
55
+
56
+ expect(async () => {
57
+ await PageRevisionsGeneralHandler.edit_form(ctx);
58
+ }).rejects.toThrow("Missing revision #42");
59
+
60
+ expect(mockFind).toHaveBeenCalledWith("42", "en");
61
+ });
62
+ });