@raketa-cloud/admin 0.0.7 → 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 -4
  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 +1 -1
  79. package/src/styles/application.css +55 -19
  80. package/src/views/layouts/application.ejs +30 -31
  81. package/src/views/layouts/header.ejs +5 -6
  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,80 @@
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 tags = await ctx.client.tags.all(ctx.locale);
11
+
12
+ const tag_settings = {
13
+ id: revision.id,
14
+ originalId: revision.originalId,
15
+ tags: revision.tags.map((t) => t.id),
16
+ };
17
+
18
+ return {
19
+ assigns: {
20
+ tag_settings,
21
+ errors: {},
22
+ tags: tags.list,
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.tag_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: params.tags,
48
+ categories: revision.categories.map((c) => c.id),
49
+ settings: JSON.stringify({
50
+ ...revision.settings,
51
+ }),
52
+ }
53
+ );
54
+
55
+ if (errors) {
56
+ const tags = await ctx.client.tags.all(ctx.locale);
57
+
58
+ return {
59
+ assigns: {
60
+ tag_settings: {
61
+ ...params,
62
+ id: revision.id,
63
+ originalId: revision.originalId,
64
+ },
65
+ errors: { tag_settings: ctx.client.pageRevisions.formatErrors(errors) },
66
+ tags: tags.list,
67
+ _translations: [],
68
+ },
69
+ };
70
+ }
71
+
72
+ return {
73
+ redirect: `/${ctx.locale}/page_revisions/${revision.id}/tags/edit`,
74
+ };
75
+ };
76
+
77
+ export default {
78
+ edit_form,
79
+ update,
80
+ };
@@ -0,0 +1,69 @@
1
+ import PageRevisionsTagsHandler from "../PageRevisionsTagsHandler";
2
+ import PageRevisions from "../../cloud/PageRevisions";
3
+ import Tags from "../../cloud/Tags";
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
+ tags: new Tags(testConfig, "token"),
12
+ },
13
+ params: { parent_id: revision.id },
14
+ locale: "en",
15
+ };
16
+ }
17
+
18
+ describe("Page revision tags settings", () => {
19
+ test("edit_form when a revision exists", async () => {
20
+ const tags = [
21
+ Factory.build("tag", { id: 42 }),
22
+ Factory.build("tag", { id: 69 }),
23
+ ];
24
+ const revision = Factory.build("page_revision", { tags: [tags[0]] });
25
+ const ctx = buildCtx(revision);
26
+
27
+ const mockFind = jest
28
+ .spyOn(ctx.client.pageRevisions, "find")
29
+ .mockImplementation(() => revision);
30
+
31
+ const mockTags = jest
32
+ .spyOn(ctx.client.tags, "all")
33
+ .mockImplementation(() => ({
34
+ list: tags,
35
+ }));
36
+
37
+ const result = await PageRevisionsTagsHandler.edit_form(ctx);
38
+
39
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
40
+ expect(mockTags).toHaveBeenCalledWith("en");
41
+
42
+ expect(result).toEqual({
43
+ assigns: {
44
+ tag_settings: {
45
+ id: revision.id,
46
+ originalId: revision.originalId,
47
+ tags: revision.tags.map((t) => t.id),
48
+ },
49
+ tags: tags,
50
+ errors: {},
51
+ _translations: [],
52
+ },
53
+ });
54
+ });
55
+
56
+ test("edit_form when a revision does not exist", async () => {
57
+ const ctx = buildCtx({ id: "42" });
58
+
59
+ const mockFind = jest
60
+ .spyOn(ctx.client.pageRevisions, "find")
61
+ .mockImplementation(() => null);
62
+
63
+ expect(async () => {
64
+ await PageRevisionsTagsHandler.edit_form(ctx);
65
+ }).rejects.toThrow("Missing revision #42");
66
+
67
+ expect(mockFind).toHaveBeenCalledWith("42", "en");
68
+ });
69
+ });
@@ -0,0 +1,141 @@
1
+ import PageRevisionsTagsHandler from "../PageRevisionsTagsHandler";
2
+ import PageRevisions from "../../cloud/PageRevisions";
3
+ import Tags from "../../cloud/Tags";
4
+ import { testConfig } from "../../../../../apps/admin/test/handlersHelper";
5
+ import Factory from "../../../../../apps/admin/test/factory";
6
+
7
+ function buildCtx(revision, updateSettings) {
8
+ return {
9
+ client: {
10
+ pageRevisions: new PageRevisions(testConfig, "token"),
11
+ tags: new Tags(testConfig, "token"),
12
+ },
13
+ params: { parent_id: revision.id },
14
+ resourceParams: {
15
+ tag_settings: updateSettings,
16
+ },
17
+ locale: "en",
18
+ };
19
+ }
20
+
21
+ describe("Page revision tags settings", () => {
22
+ test("update successful", async () => {
23
+ const tags = [
24
+ Factory.build("tag", { id: 42 }),
25
+ Factory.build("tag", { id: 69 }),
26
+ ];
27
+ const revision = Factory.build("page_revision", { tags: [tags[0]] });
28
+
29
+ const updateSettings = {
30
+ tags: [tags.map((t) => t.id)],
31
+ };
32
+
33
+ const ctx = buildCtx(revision, updateSettings);
34
+
35
+ const mockFind = jest
36
+ .spyOn(ctx.client.pageRevisions, "find")
37
+ .mockImplementation(() => revision);
38
+
39
+ const mockUpdate = jest
40
+ .spyOn(ctx.client.pageRevisions, "update")
41
+ .mockImplementation(() => ({
42
+ revision: {},
43
+ errors: null,
44
+ }));
45
+
46
+ const result = await PageRevisionsTagsHandler.update(ctx);
47
+
48
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
49
+ expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
50
+ slug: revision.slug,
51
+ title: revision.title,
52
+ visibility: revision.visibility,
53
+ widgets: JSON.stringify(revision.widgets),
54
+ tags: updateSettings.tags,
55
+ categories: revision.categories.map((c) => c.id),
56
+ settings: JSON.stringify(revision.settings),
57
+ });
58
+
59
+ expect(result).toEqual({
60
+ redirect: `/en/page_revisions/${revision.id}/tags/edit`,
61
+ });
62
+ });
63
+
64
+ test("update failed", async () => {
65
+ const tags = [
66
+ Factory.build("tag", { id: 42 }),
67
+ Factory.build("tag", { id: 69 }),
68
+ ];
69
+ const revision = Factory.build("page_revision", { tags: [tags[0]] });
70
+
71
+ const updateSettings = {
72
+ tags: [tags.map((t) => t.id)],
73
+ };
74
+
75
+ const ctx = buildCtx(revision, updateSettings);
76
+
77
+ const mockFind = jest
78
+ .spyOn(ctx.client.pageRevisions, "find")
79
+ .mockImplementation(() => revision);
80
+
81
+ const mockUpdate = jest
82
+ .spyOn(ctx.client.pageRevisions, "update")
83
+ .mockImplementation(() => ({
84
+ revision: {},
85
+ errors: [{ key: "generalError", message: "some error" }],
86
+ }));
87
+
88
+ const mockTags = jest
89
+ .spyOn(ctx.client.tags, "all")
90
+ .mockImplementation(() => ({
91
+ list: tags,
92
+ }));
93
+
94
+ const result = await PageRevisionsTagsHandler.update(ctx);
95
+
96
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
97
+ expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
98
+ slug: revision.slug,
99
+ title: revision.title,
100
+ visibility: revision.visibility,
101
+ widgets: JSON.stringify(revision.widgets),
102
+ tags: updateSettings.tags,
103
+ categories: revision.categories.map((c) => c.id),
104
+ settings: JSON.stringify(revision.settings),
105
+ });
106
+ expect(mockTags).toHaveBeenCalledWith("en");
107
+
108
+ expect(result).toEqual({
109
+ assigns: {
110
+ tag_settings: {
111
+ ...updateSettings,
112
+ id: revision.id,
113
+ originalId: revision.originalId,
114
+ },
115
+ errors: {
116
+ tag_settings: { generalError: "some error" },
117
+ },
118
+ tags: tags,
119
+ _translations: [],
120
+ },
121
+ });
122
+ });
123
+
124
+ test("update when a revision does not exist", async () => {
125
+ const revision = Factory.build("page_revision");
126
+
127
+ const updateSettings = {};
128
+
129
+ const ctx = buildCtx(revision, updateSettings);
130
+
131
+ const mockFind = jest
132
+ .spyOn(ctx.client.pageRevisions, "find")
133
+ .mockImplementation(() => null);
134
+
135
+ expect(async () => {
136
+ await PageRevisionsTagsHandler.update(ctx);
137
+ }).rejects.toThrow(`Missing revision #${revision.id}`);
138
+
139
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
140
+ });
141
+ });
@@ -0,0 +1,22 @@
1
+ const create = async (ctx) => {
2
+ const { parent_id } = ctx.params;
3
+
4
+ const { revision, errors, pageErrors } =
5
+ await ctx.client.pageRevisions.unlock(parent_id, ctx.locale);
6
+
7
+ if (errors) {
8
+ throw new Error(`Failed to unlock revision: ${JSON.stringify(errors)}`);
9
+ }
10
+
11
+ if (pageErrors) {
12
+ throw `Failed to start revision: ${JSON.stringify(pageErrors)}`;
13
+ }
14
+
15
+ return {
16
+ redirect: `/${ctx.locale}/pages/${revision.originalId}`,
17
+ };
18
+ };
19
+
20
+ export default {
21
+ create,
22
+ };
@@ -0,0 +1,77 @@
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 visual_settings = {
11
+ id: revision.id,
12
+ originalId: revision.originalId,
13
+ layout: revision.settings.layout,
14
+ };
15
+
16
+ return {
17
+ assigns: {
18
+ visual_settings,
19
+ errors: {},
20
+ _translations: [],
21
+ },
22
+ };
23
+ };
24
+
25
+ const update = async (ctx) => {
26
+ const { parent_id } = ctx.params;
27
+
28
+ const revision = await ctx.client.pageRevisions.find(parent_id, ctx.locale);
29
+
30
+ if (!revision) {
31
+ throw new Error(`Missing revision #${parent_id}`);
32
+ }
33
+
34
+ const params = ctx.resourceParams.visual_settings;
35
+
36
+ const { errors } = await ctx.client.pageRevisions.update(
37
+ revision.id,
38
+ ctx.locale,
39
+ {
40
+ slug: revision.slug,
41
+ title: revision.title,
42
+ visibility: revision.visibility,
43
+ widgets: JSON.stringify(revision.widgets),
44
+ tags: revision.tags.map((t) => t.id),
45
+ categories: revision.categories.map((c) => c.id),
46
+ settings: JSON.stringify({
47
+ ...revision.settings,
48
+ layout: params.layout,
49
+ }),
50
+ }
51
+ );
52
+
53
+ if (errors) {
54
+ return {
55
+ assigns: {
56
+ visual_settings: {
57
+ ...params,
58
+ id: revision.id,
59
+ originalId: revision.originalId,
60
+ },
61
+ errors: {
62
+ visual_settings: ctx.client.pageRevisions.formatErrors(errors),
63
+ },
64
+ _translations: [],
65
+ },
66
+ };
67
+ }
68
+
69
+ return {
70
+ redirect: `/${ctx.locale}/page_revisions/${revision.id}/visuals/edit`,
71
+ };
72
+ };
73
+
74
+ export default {
75
+ edit_form,
76
+ update,
77
+ };
@@ -0,0 +1,55 @@
1
+ import PageRevisionsVisualsHandler from "../PageRevisionsVisualsHandler";
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 visuals 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 PageRevisionsVisualsHandler.edit_form(ctx);
26
+
27
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
28
+
29
+ expect(result).toEqual({
30
+ assigns: {
31
+ visual_settings: {
32
+ id: revision.id,
33
+ originalId: revision.originalId,
34
+ layout: revision.settings.layout,
35
+ },
36
+ errors: {},
37
+ _translations: [],
38
+ },
39
+ });
40
+ });
41
+
42
+ test("edit_form when a revision does not exist", async () => {
43
+ const ctx = buildCtx({ id: "42" });
44
+
45
+ const mockFind = jest
46
+ .spyOn(ctx.client.pageRevisions, "find")
47
+ .mockImplementation(() => null);
48
+
49
+ expect(async () => {
50
+ await PageRevisionsVisualsHandler.edit_form(ctx);
51
+ }).rejects.toThrow("Missing revision #42");
52
+
53
+ expect(mockFind).toHaveBeenCalledWith("42", "en");
54
+ });
55
+ });
@@ -0,0 +1,129 @@
1
+ import PageRevisionsVisualsHandler from "../PageRevisionsVisualsHandler";
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
+ visual_settings: updateSettings,
14
+ },
15
+ locale: "en",
16
+ };
17
+ }
18
+
19
+ describe("Page revision visuals settings", () => {
20
+ test("update successful", async () => {
21
+ const revision = Factory.build("page_revision");
22
+
23
+ const updateSettings = {
24
+ layout: "bla",
25
+ };
26
+
27
+ const ctx = buildCtx(revision, updateSettings);
28
+
29
+ const mockFind = jest
30
+ .spyOn(ctx.client.pageRevisions, "find")
31
+ .mockImplementation(() => revision);
32
+
33
+ const mockUpdate = jest
34
+ .spyOn(ctx.client.pageRevisions, "update")
35
+ .mockImplementation(() => ({
36
+ revision: {},
37
+ errors: null,
38
+ }));
39
+
40
+ const result = await PageRevisionsVisualsHandler.update(ctx);
41
+
42
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
43
+ expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
44
+ slug: revision.slug,
45
+ title: revision.title,
46
+ visibility: revision.visibility,
47
+ widgets: JSON.stringify(revision.widgets),
48
+ tags: revision.tags.map((t) => t.id),
49
+ categories: revision.categories.map((c) => c.id),
50
+ settings: JSON.stringify({
51
+ ...revision.settings,
52
+ layout: updateSettings.layout,
53
+ }),
54
+ });
55
+
56
+ expect(result).toEqual({
57
+ redirect: `/en/page_revisions/${revision.id}/visuals/edit`,
58
+ });
59
+ });
60
+
61
+ test("update failed", async () => {
62
+ const revision = Factory.build("page_revision");
63
+
64
+ const updateSettings = {
65
+ layout: "bla",
66
+ };
67
+
68
+ const ctx = buildCtx(revision, updateSettings);
69
+
70
+ const mockFind = jest
71
+ .spyOn(ctx.client.pageRevisions, "find")
72
+ .mockImplementation(() => revision);
73
+
74
+ const mockUpdate = jest
75
+ .spyOn(ctx.client.pageRevisions, "update")
76
+ .mockImplementation(() => ({
77
+ revision: {},
78
+ errors: [{ key: "generalError", message: "some error" }],
79
+ }));
80
+
81
+ const result = await PageRevisionsVisualsHandler.update(ctx);
82
+
83
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
84
+ expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
85
+ slug: revision.slug,
86
+ title: revision.title,
87
+ visibility: revision.visibility,
88
+ widgets: JSON.stringify(revision.widgets),
89
+ tags: revision.tags.map((t) => t.id),
90
+ categories: revision.categories.map((c) => c.id),
91
+ settings: JSON.stringify({
92
+ ...revision.settings,
93
+ layout: updateSettings.layout,
94
+ }),
95
+ });
96
+
97
+ expect(result).toEqual({
98
+ assigns: {
99
+ visual_settings: {
100
+ ...updateSettings,
101
+ id: revision.id,
102
+ originalId: revision.originalId,
103
+ },
104
+ errors: {
105
+ visual_settings: { generalError: "some error" },
106
+ },
107
+ _translations: [],
108
+ },
109
+ });
110
+ });
111
+
112
+ test("update when a revision does not exist", async () => {
113
+ const revision = Factory.build("page_revision");
114
+
115
+ const updateSettings = {};
116
+
117
+ const ctx = buildCtx(revision, updateSettings);
118
+
119
+ const mockFind = jest
120
+ .spyOn(ctx.client.pageRevisions, "find")
121
+ .mockImplementation(() => null);
122
+
123
+ expect(async () => {
124
+ await PageRevisionsVisualsHandler.update(ctx);
125
+ }).rejects.toThrow(`Missing revision #${revision.id}`);
126
+
127
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
128
+ });
129
+ });
@@ -0,0 +1,41 @@
1
+ const show = async (ctx) => {
2
+ const { parent_id } = ctx.params;
3
+
4
+ const revision = await ctx.client.pageRevisions.find(parent_id, ctx.locale);
5
+ const settings = await ctx.client.settings.find(ctx.locale);
6
+
7
+ return {
8
+ json: {
9
+ revision: { ...revision, websiteSettings: settings },
10
+ },
11
+ };
12
+ };
13
+
14
+ const update = async (ctx) => {
15
+ const { parent_id } = ctx.params;
16
+
17
+ const revision = await ctx.client.pageRevisions.find(parent_id, ctx.locale);
18
+
19
+ const params = ctx.resourceParams;
20
+
21
+ const data = await ctx.client.pageRevisions.updateWidgets(
22
+ revision.id,
23
+ ctx.locale,
24
+ params.widgets || []
25
+ );
26
+
27
+ if (data.revision) {
28
+ const settings = await ctx.client.settings.find(ctx.locale);
29
+
30
+ data.revision = { ...data.revision, websiteSettings: settings };
31
+ }
32
+
33
+ return {
34
+ json: data,
35
+ };
36
+ };
37
+
38
+ export default {
39
+ update,
40
+ show,
41
+ };
@@ -0,0 +1,47 @@
1
+ import PageRevisionsWidgetsHandler from "../PageRevisionsWidgetsHandler";
2
+ import PageRevisions from "../../cloud/PageRevisions";
3
+ import Settings from "../../cloud/Settings";
4
+
5
+ import { testConfig } from "../../../test/handlersHelper";
6
+ import Factory from "../../../test/factory";
7
+
8
+ function buildCtx(revision) {
9
+ return {
10
+ client: {
11
+ pageRevisions: new PageRevisions(testConfig, "token"),
12
+ settings: new Settings(testConfig, "token"),
13
+ },
14
+ params: { parent_id: revision.id },
15
+ locale: "en",
16
+ };
17
+ }
18
+
19
+ describe("PageRevisionsWidgetsHandler", () => {
20
+ test("show", async () => {
21
+ const revision = Factory.build("page_revision");
22
+ const settings = Factory.build("settings");
23
+ const ctx = buildCtx(revision);
24
+
25
+ const mockFind = jest
26
+ .spyOn(ctx.client.pageRevisions, "find")
27
+ .mockImplementation(() => revision);
28
+
29
+ const mockSettings = jest
30
+ .spyOn(ctx.client.settings, "find")
31
+ .mockImplementation(() => settings);
32
+
33
+ const result = await PageRevisionsWidgetsHandler.show(ctx);
34
+
35
+ expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
36
+ expect(mockSettings).toHaveBeenCalledWith("en");
37
+
38
+ expect(result).toEqual({
39
+ json: {
40
+ revision: {
41
+ ...revision,
42
+ websiteSettings: { ...settings },
43
+ },
44
+ },
45
+ });
46
+ });
47
+ });