@raketa-cloud/admin 0.0.79 → 0.0.81

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 (38) hide show
  1. package/package.json +1 -1
  2. package/src/cloud/ArticleRevisions.js +30 -0
  3. package/src/cloud/EventRevisions.js +30 -0
  4. package/src/cloud/PageRevisions.js +30 -0
  5. package/src/cloud/documents/articlesDocuments.js +24 -0
  6. package/src/cloud/documents/common.js +13 -0
  7. package/src/cloud/documents/eventsDocuments.js +24 -0
  8. package/src/cloud/documents/pagesDocuments.js +24 -0
  9. package/src/handlers/article_revisions/CancelSchedulesHandler.js +26 -0
  10. package/src/handlers/article_revisions/PublishesHandler.js +39 -10
  11. package/src/handlers/article_revisions/UnlocksHandler.js +1 -1
  12. package/src/handlers/event_revisions/CancelSchedulesHandler.js +26 -0
  13. package/src/handlers/event_revisions/PublishesHandler.js +34 -7
  14. package/src/handlers/event_revisions/UnlocksHandler.js +3 -1
  15. package/src/handlers/page_revisions/CancelSchedulesHandler.js +26 -0
  16. package/src/handlers/page_revisions/PublishesHandler.js +34 -7
  17. package/src/handlers/page_revisions/UnlocksHandler.js +1 -1
  18. package/src/routeArticlesModule.js +12 -0
  19. package/src/routeEventsModule.js +12 -0
  20. package/src/routePagesModule.js +12 -0
  21. package/src/styles/application.css +1 -2
  22. package/src/tests/handlers/article_revisions/CancelScheduledHandler.test/create.test.js +90 -0
  23. package/src/tests/handlers/article_revisions/PublishesHandler.test/create.test.js +187 -2
  24. package/src/tests/handlers/article_revisions/UnlocksHandler.test/create.test.js +2 -2
  25. package/src/tests/handlers/event_revisions/CancelScheduledHandler.test/create.test.js +90 -0
  26. package/src/tests/handlers/event_revisions/PublishesHandler.test/create.test.js +187 -2
  27. package/src/tests/handlers/event_revisions/UnlocksHandler.test/create.test.js +2 -2
  28. package/src/tests/handlers/page_revisions/CancelScheduledHandler.test/create.test.js +86 -0
  29. package/src/tests/handlers/page_revisions/PublishesHandler.test/create.test.js +187 -2
  30. package/src/tests/handlers/page_revisions/UnlocksHandler.test/create.test.js +2 -2
  31. package/src/tests/support/factory.js +16 -0
  32. package/src/views/article_revisions/publishes/_form.ejs +4 -1
  33. package/src/views/articles/show.ejs +113 -4
  34. package/src/views/event_revisions/publishes/_form.ejs +4 -1
  35. package/src/views/events/show.ejs +113 -4
  36. package/src/views/layouts/application.ejs +15 -0
  37. package/src/views/page_revisions/publishes/_form.ejs +4 -1
  38. package/src/views/pages/show.ejs +113 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@raketa-cloud/admin",
3
- "version": "0.0.79",
3
+ "version": "0.0.81",
4
4
  "main": "src/index.js",
5
5
  "scripts": {
6
6
  "dev": "npx tailwindcss -i ./src/styles/application.css -o ../../apps/admin/static/application.css --watch",
@@ -3,6 +3,8 @@ import {
3
3
  DeleteArticleDocument,
4
4
  LockArticleRevisionDocument,
5
5
  MergeArticleRevisionDocument,
6
+ ScheduleArticleRevisionDocument,
7
+ CancelArticleRevisionScheduleDocument,
6
8
  ArticleRevisionDocument,
7
9
  ArticleRevisionsDocument,
8
10
  StartArticleRevisionDocument,
@@ -77,6 +79,34 @@ export default class ArticleRevisions extends RaketaClient {
77
79
  return { article, errors };
78
80
  }
79
81
 
82
+ async schedule(id, locale, params, articleParams) {
83
+ const {
84
+ scheduleArticleRevision: { revision, errors, articleErrors },
85
+ } = await this.query(ScheduleArticleRevisionDocument, {
86
+ input: {
87
+ id,
88
+ locale,
89
+ ...params,
90
+ article: { ...articleParams },
91
+ },
92
+ });
93
+
94
+ return { revision, errors, articleErrors };
95
+ }
96
+
97
+ async cancelSchedule(id, locale) {
98
+ const {
99
+ cancelArticleRevisionSchedule: { revision, errors, articleErrors },
100
+ } = await this.query(CancelArticleRevisionScheduleDocument, {
101
+ input: {
102
+ revisionId: id,
103
+ locale: locale,
104
+ },
105
+ });
106
+
107
+ return { revision, errors, articleErrors };
108
+ }
109
+
80
110
  async create(articleId, locale) {
81
111
  const {
82
112
  startArticleRevision: { revision, errors, articleErrors },
@@ -3,6 +3,8 @@ import {
3
3
  DeleteEventDocument,
4
4
  LockEventRevisionDocument,
5
5
  MergeEventRevisionDocument,
6
+ ScheduleEventRevisionDocument,
7
+ CancelEventRevisionScheduleDocument,
6
8
  EventRevisionDocument,
7
9
  EventRevisionsDocument,
8
10
  StartEventRevisionDocument,
@@ -84,6 +86,34 @@ export default class EventRevisions extends RaketaClient {
84
86
  return { event, errors };
85
87
  }
86
88
 
89
+ async schedule(id, locale, params, eventParams) {
90
+ const {
91
+ scheduleEventRevision: { revision, errors, eventErrors },
92
+ } = await this.query(ScheduleEventRevisionDocument, {
93
+ input: {
94
+ id,
95
+ locale,
96
+ ...params,
97
+ event: { ...eventParams },
98
+ },
99
+ });
100
+
101
+ return { revision, errors, eventErrors };
102
+ }
103
+
104
+ async cancelSchedule(id, locale) {
105
+ const {
106
+ cancelEventRevisionSchedule: { revision, errors, eventErrors },
107
+ } = await this.query(CancelEventRevisionScheduleDocument, {
108
+ input: {
109
+ revisionId: id,
110
+ locale: locale,
111
+ },
112
+ });
113
+
114
+ return { revision, errors, eventErrors };
115
+ }
116
+
87
117
  async create(eventId, locale) {
88
118
  const {
89
119
  startEventRevision: { revision, errors, eventErrors },
@@ -3,6 +3,8 @@ import {
3
3
  DeletePageDocument,
4
4
  LockPageRevisionDocument,
5
5
  MergePageRevisionDocument,
6
+ SchedulePageRevisionDocument,
7
+ CancelPageRevisionScheduleDocument,
6
8
  PageRevisionDocument,
7
9
  PageRevisionsDocument,
8
10
  StartPageRevisionDocument,
@@ -64,6 +66,34 @@ export default class PageRevisions extends RaketaClient {
64
66
  return { page, errors };
65
67
  }
66
68
 
69
+ async schedule(id, locale, params, pageParams) {
70
+ const {
71
+ schedulePageRevision: { revision, errors, pageErrors },
72
+ } = await this.query(SchedulePageRevisionDocument, {
73
+ input: {
74
+ id,
75
+ locale,
76
+ ...params,
77
+ page: { ...pageParams },
78
+ },
79
+ });
80
+
81
+ return { revision, errors, pageErrors };
82
+ }
83
+
84
+ async cancelSchedule(id, locale) {
85
+ const {
86
+ cancelPageRevisionSchedule: { revision, errors, pageErrors },
87
+ } = await this.query(CancelPageRevisionScheduleDocument, {
88
+ input: {
89
+ revisionId: id,
90
+ locale: locale,
91
+ },
92
+ });
93
+
94
+ return { revision, errors, pageErrors };
95
+ }
96
+
67
97
  async create(pageId, locale) {
68
98
  const {
69
99
  startPageRevision: { revision, errors, pageErrors },
@@ -7,6 +7,7 @@ import {
7
7
  revisionMetaFragment,
8
8
  tagFragment,
9
9
  summaryChangeFragment,
10
+ revisionScheduleFragment,
10
11
  } from "./common";
11
12
 
12
13
  function minimalArticleFragment() {
@@ -59,6 +60,7 @@ function articleRevisionFragment() {
59
60
  tags ${tagFragment()}
60
61
  articleType ${articleTypeFragment()}
61
62
  meta ${revisionMetaFragment()}
63
+ schedule ${revisionScheduleFragment()}
62
64
  categories ${categoryFragment()}
63
65
  }
64
66
  `;
@@ -202,6 +204,26 @@ const MergeArticleRevisionDocument = gql`
202
204
  }
203
205
  `;
204
206
 
207
+ const ScheduleArticleRevisionDocument = gql`
208
+ mutation($input: ScheduleArticleRevisionInput!) {
209
+ scheduleArticleRevision(input: $input) {
210
+ revision ${articleRevisionFragment()}
211
+ errors ${errorsFragment()}
212
+ articleErrors ${errorsFragment()}
213
+ }
214
+ }
215
+ `;
216
+
217
+ const CancelArticleRevisionScheduleDocument = gql`
218
+ mutation($input: CancelArticleRevisionScheduleInput!) {
219
+ cancelArticleRevisionSchedule(input: $input) {
220
+ revision ${articleRevisionFragment()}
221
+ errors ${errorsFragment()}
222
+ articleErrors ${errorsFragment()}
223
+ }
224
+ }
225
+ `;
226
+
205
227
  const ChangeArticleSlugDocument = gql`
206
228
  mutation ($input: ChangeArticleSlugInput!) {
207
229
  changeArticleSlug(input: $input) {
@@ -257,6 +279,8 @@ export {
257
279
  ArticleRevisionsDocument,
258
280
  StartArticleRevisionDocument,
259
281
  MergeArticleRevisionDocument,
282
+ ScheduleArticleRevisionDocument,
283
+ CancelArticleRevisionScheduleDocument,
260
284
  ArticleChangesDocument,
261
285
  ChangeArticleSlugDocument,
262
286
  ReopenArticleChangeDocument,
@@ -78,6 +78,19 @@ export function revisionMetaFragment() {
78
78
  `;
79
79
  }
80
80
 
81
+ export function revisionScheduleFragment() {
82
+ return gql`
83
+ {
84
+ id
85
+ mergeAt
86
+ title
87
+ description
88
+ operator
89
+ operatorMeta
90
+ }
91
+ `;
92
+ }
93
+
81
94
  export function revisionFragment() {
82
95
  return gql`
83
96
  {
@@ -7,6 +7,7 @@ import {
7
7
  revisionMetaFragment,
8
8
  tagFragment,
9
9
  summaryChangeFragment,
10
+ revisionScheduleFragment,
10
11
  } from "./common";
11
12
 
12
13
  function minimalEventFragment() {
@@ -65,6 +66,7 @@ function eventRevisionFragment() {
65
66
  tags ${tagFragment()}
66
67
  eventType ${eventTypeFragment()}
67
68
  meta ${revisionMetaFragment()}
69
+ schedule ${revisionScheduleFragment()}
68
70
  categories ${categoryFragment()}
69
71
  }
70
72
  `;
@@ -210,6 +212,26 @@ const MergeEventRevisionDocument = gql`
210
212
  }
211
213
  `;
212
214
 
215
+ const ScheduleEventRevisionDocument = gql`
216
+ mutation($input: ScheduleEventRevisionInput!) {
217
+ scheduleEventRevision(input: $input) {
218
+ revision ${eventRevisionFragment()}
219
+ errors ${errorsFragment()}
220
+ eventErrors ${errorsFragment()}
221
+ }
222
+ }
223
+ `;
224
+
225
+ const CancelEventRevisionScheduleDocument = gql`
226
+ mutation($input: CancelEventRevisionScheduleInput!) {
227
+ cancelEventRevisionSchedule(input: $input) {
228
+ revision ${eventRevisionFragment()}
229
+ errors ${errorsFragment()}
230
+ eventErrors ${errorsFragment()}
231
+ }
232
+ }
233
+ `;
234
+
213
235
  const ChangeEventSlugDocument = gql`
214
236
  mutation ($input: ChangeEventSlugInput!) {
215
237
  changeEventSlug(input: $input) {
@@ -265,6 +287,8 @@ export {
265
287
  EventRevisionsDocument,
266
288
  StartEventRevisionDocument,
267
289
  MergeEventRevisionDocument,
290
+ ScheduleEventRevisionDocument,
291
+ CancelEventRevisionScheduleDocument,
268
292
  EventChangesDocument,
269
293
  ChangeEventSlugDocument,
270
294
  ReopenEventChangeDocument,
@@ -7,6 +7,7 @@ import {
7
7
  revisionMetaFragment,
8
8
  tagFragment,
9
9
  summaryChangeFragment,
10
+ revisionScheduleFragment,
10
11
  } from "./common";
11
12
 
12
13
  function minimalPageFragment() {
@@ -56,6 +57,7 @@ function pageRevisionFragment() {
56
57
  tags ${tagFragment()}
57
58
  pageType ${pageTypeFragment()}
58
59
  meta ${revisionMetaFragment()}
60
+ schedule ${revisionScheduleFragment()}
59
61
  categories ${categoryFragment()}
60
62
  }
61
63
  `;
@@ -198,6 +200,26 @@ const MergePageRevisionDocument = gql`
198
200
  }
199
201
  `;
200
202
 
203
+ const SchedulePageRevisionDocument = gql`
204
+ mutation($input: SchedulePageRevisionInput!) {
205
+ schedulePageRevision(input: $input) {
206
+ revision ${pageRevisionFragment()}
207
+ errors ${errorsFragment()}
208
+ pageErrors ${errorsFragment()}
209
+ }
210
+ }
211
+ `;
212
+
213
+ const CancelPageRevisionScheduleDocument = gql`
214
+ mutation($input: CancelPageRevisionScheduleInput!) {
215
+ cancelPageRevisionSchedule(input: $input) {
216
+ revision ${pageRevisionFragment()}
217
+ errors ${errorsFragment()}
218
+ pageErrors ${errorsFragment()}
219
+ }
220
+ }
221
+ `;
222
+
201
223
  const ChangePageSlugDocument = gql`
202
224
  mutation ($input: ChangePageSlugInput!) {
203
225
  changePageSlug(input: $input) {
@@ -253,6 +275,8 @@ export {
253
275
  PageRevisionsDocument,
254
276
  StartPageRevisionDocument,
255
277
  MergePageRevisionDocument,
278
+ SchedulePageRevisionDocument,
279
+ CancelPageRevisionScheduleDocument,
256
280
  PageChangesDocument,
257
281
  ChangePageSlugDocument,
258
282
  ReopenPageChangeDocument,
@@ -0,0 +1,26 @@
1
+ const create = async (ctx) => {
2
+ const { parent_id } = ctx.params;
3
+
4
+ const { revision, errors, articleErrors } =
5
+ await ctx.client.articleRevisions.cancelSchedule(parent_id, ctx.locale);
6
+
7
+ if (errors) {
8
+ throw new Error(
9
+ `Failed to cancel schedule for revision: ${JSON.stringify(errors)}`
10
+ );
11
+ }
12
+
13
+ if (articleErrors) {
14
+ throw new Error(
15
+ `Failed to cancel schedule for revision: ${JSON.stringify(articleErrors)}`
16
+ );
17
+ }
18
+
19
+ return {
20
+ redirect: `/${ctx.locale}/${ctx.resourceConfig.articleTypePlural}/${revision.originalId}`,
21
+ };
22
+ };
23
+
24
+ export default {
25
+ create,
26
+ };
@@ -1,3 +1,5 @@
1
+ import { toUTCISO8601String } from "../../utils";
2
+
1
3
  const create_form = async (ctx) => {
2
4
  const { parent_id } = ctx.params;
3
5
 
@@ -46,15 +48,21 @@ function publishArticleParams(
46
48
  return { visibility };
47
49
  }
48
50
 
49
- const create = async (ctx) => {
50
- const { parent_id } = ctx.params;
51
- const publishing = ctx.resourceParams.publishing;
51
+ async function publishRevision(ctx, revision, publishing) {
52
+ if (publishing.mergeAt) {
53
+ return await ctx.client.articleRevisions.schedule(
54
+ revision.id,
55
+ ctx.locale,
56
+ {
57
+ title: publishing.title || "",
58
+ description: publishing.description || "",
59
+ mergeAt: toUTCISO8601String(publishing.mergeAt),
60
+ },
61
+ publishArticleParams(publishing, revision.settings)
62
+ );
63
+ }
52
64
 
53
- const revision = await ctx.client.articleRevisions.find(
54
- parent_id,
55
- ctx.locale
56
- );
57
- const { errors } = await ctx.client.articleRevisions.publish(
65
+ return await ctx.client.articleRevisions.publish(
58
66
  revision.id,
59
67
  ctx.locale,
60
68
  {
@@ -63,8 +71,24 @@ const create = async (ctx) => {
63
71
  },
64
72
  publishArticleParams(publishing, revision.settings)
65
73
  );
74
+ }
75
+
76
+ const create = async (ctx) => {
77
+ const { parent_id } = ctx.params;
78
+ const publishing = ctx.resourceParams.publishing;
79
+
80
+ const revision = await ctx.client.articleRevisions.find(
81
+ parent_id,
82
+ ctx.locale
83
+ );
84
+
85
+ const { errors, articleErrors } = await publishRevision(
86
+ ctx,
87
+ revision,
88
+ publishing
89
+ );
66
90
 
67
- if (errors) {
91
+ if (errors || articleErrors) {
68
92
  return {
69
93
  assigns: {
70
94
  publishing: {
@@ -73,7 +97,12 @@ const create = async (ctx) => {
73
97
  originalId: revision.originalId,
74
98
  },
75
99
  visibilityOptions: ctx.client.articles.visibilityOptions(),
76
- errors: ctx.client.articleRevisions.formatErrors(errors),
100
+ errors: errors
101
+ ? ctx.client.articleRevisions.formatErrors(errors)
102
+ : null,
103
+ articleErrors: articleErrors
104
+ ? ctx.client.articleRevisions.formatErrors(articleErrors)
105
+ : null,
77
106
  _translations: [],
78
107
  },
79
108
  };
@@ -10,7 +10,7 @@ const create = async (ctx) => {
10
10
 
11
11
  if (articleErrors) {
12
12
  throw new Error(
13
- `Failed to start revision: ${JSON.stringify(articleErrors)}`
13
+ `Failed to unlock revision: ${JSON.stringify(articleErrors)}`
14
14
  );
15
15
  }
16
16
 
@@ -0,0 +1,26 @@
1
+ const create = async (ctx) => {
2
+ const { parent_id } = ctx.params;
3
+
4
+ const { revision, errors, eventErrors } =
5
+ await ctx.client.eventRevisions.cancelSchedule(parent_id, ctx.locale);
6
+
7
+ if (errors) {
8
+ throw new Error(
9
+ `Failed to cancel schedule for revision: ${JSON.stringify(errors)}`
10
+ );
11
+ }
12
+
13
+ if (eventErrors) {
14
+ throw new Error(
15
+ `Failed to cancel schedule for revision: ${JSON.stringify(eventErrors)}`
16
+ );
17
+ }
18
+
19
+ return {
20
+ redirect: `/${ctx.locale}/${ctx.resourceConfig.eventTypePlural}/${revision.originalId}`,
21
+ };
22
+ };
23
+
24
+ export default {
25
+ create,
26
+ };
@@ -1,3 +1,5 @@
1
+ import { toUTCISO8601String } from "../../utils";
2
+
1
3
  const create_form = async (ctx) => {
2
4
  const { parent_id } = ctx.params;
3
5
 
@@ -43,12 +45,21 @@ function publishEventParams(
43
45
  return { visibility };
44
46
  }
45
47
 
46
- const create = async (ctx) => {
47
- const { parent_id } = ctx.params;
48
- const publishing = ctx.resourceParams.publishing;
48
+ async function publishRevision(ctx, revision, publishing) {
49
+ if (publishing.mergeAt) {
50
+ return await ctx.client.eventRevisions.schedule(
51
+ revision.id,
52
+ ctx.locale,
53
+ {
54
+ title: publishing.title || "",
55
+ description: publishing.description || "",
56
+ mergeAt: toUTCISO8601String(publishing.mergeAt),
57
+ },
58
+ publishEventParams(publishing, revision.settings)
59
+ );
60
+ }
49
61
 
50
- const revision = await ctx.client.eventRevisions.find(parent_id, ctx.locale);
51
- const { errors } = await ctx.client.eventRevisions.publish(
62
+ return await ctx.client.eventRevisions.publish(
52
63
  revision.id,
53
64
  ctx.locale,
54
65
  {
@@ -57,8 +68,21 @@ const create = async (ctx) => {
57
68
  },
58
69
  publishEventParams(publishing, revision.settings)
59
70
  );
71
+ }
72
+
73
+ const create = async (ctx) => {
74
+ const { parent_id } = ctx.params;
75
+ const publishing = ctx.resourceParams.publishing;
76
+
77
+ const revision = await ctx.client.eventRevisions.find(parent_id, ctx.locale);
78
+
79
+ const { errors, eventErrors } = await publishRevision(
80
+ ctx,
81
+ revision,
82
+ publishing
83
+ );
60
84
 
61
- if (errors) {
85
+ if (errors || eventErrors) {
62
86
  return {
63
87
  assigns: {
64
88
  publishing: {
@@ -67,7 +91,10 @@ const create = async (ctx) => {
67
91
  originalId: revision.originalId,
68
92
  },
69
93
  visibilityOptions: ctx.client.events.visibilityOptions(),
70
- errors: ctx.client.eventRevisions.formatErrors(errors),
94
+ errors: errors ? ctx.client.eventRevisions.formatErrors(errors) : null,
95
+ eventErrors: eventErrors
96
+ ? ctx.client.eventRevisions.formatErrors(eventErrors)
97
+ : null,
71
98
  _translations: [],
72
99
  },
73
100
  };
@@ -9,7 +9,9 @@ const create = async (ctx) => {
9
9
  }
10
10
 
11
11
  if (eventErrors) {
12
- throw new Error(`Failed to start revision: ${JSON.stringify(eventErrors)}`);
12
+ throw new Error(
13
+ `Failed to unlock revision: ${JSON.stringify(eventErrors)}`
14
+ );
13
15
  }
14
16
 
15
17
  return {
@@ -0,0 +1,26 @@
1
+ const create = async (ctx) => {
2
+ const { parent_id } = ctx.params;
3
+
4
+ const { revision, errors, pageErrors } =
5
+ await ctx.client.pageRevisions.cancelSchedule(parent_id, ctx.locale);
6
+
7
+ if (errors) {
8
+ throw new Error(
9
+ `Failed to cancel schedule for revision: ${JSON.stringify(errors)}`
10
+ );
11
+ }
12
+
13
+ if (pageErrors) {
14
+ throw new Error(
15
+ `Failed to cancel schedule for revision: ${JSON.stringify(pageErrors)}`
16
+ );
17
+ }
18
+
19
+ return {
20
+ redirect: `/${ctx.locale}/${ctx.resourceConfig.pageTypePlural}/${revision.originalId}`,
21
+ };
22
+ };
23
+
24
+ export default {
25
+ create,
26
+ };
@@ -1,3 +1,5 @@
1
+ import { toUTCISO8601String } from "../../utils";
2
+
1
3
  const create_form = async (ctx) => {
2
4
  const { parent_id } = ctx.params;
3
5
 
@@ -43,12 +45,21 @@ function publishPageParams(
43
45
  return { visibility };
44
46
  }
45
47
 
46
- const create = async (ctx) => {
47
- const { parent_id } = ctx.params;
48
- const publishing = ctx.resourceParams.publishing;
48
+ async function publishRevision(ctx, revision, publishing) {
49
+ if (publishing.mergeAt) {
50
+ return await ctx.client.pageRevisions.schedule(
51
+ revision.id,
52
+ ctx.locale,
53
+ {
54
+ title: publishing.title || "",
55
+ description: publishing.description || "",
56
+ mergeAt: toUTCISO8601String(publishing.mergeAt),
57
+ },
58
+ publishPageParams(publishing, revision.settings)
59
+ );
60
+ }
49
61
 
50
- const revision = await ctx.client.pageRevisions.find(parent_id, ctx.locale);
51
- const { errors } = await ctx.client.pageRevisions.publish(
62
+ return await ctx.client.pageRevisions.publish(
52
63
  revision.id,
53
64
  ctx.locale,
54
65
  {
@@ -57,8 +68,21 @@ const create = async (ctx) => {
57
68
  },
58
69
  publishPageParams(publishing, revision.settings)
59
70
  );
71
+ }
72
+
73
+ const create = async (ctx) => {
74
+ const { parent_id } = ctx.params;
75
+ const publishing = ctx.resourceParams.publishing;
76
+
77
+ const revision = await ctx.client.pageRevisions.find(parent_id, ctx.locale);
78
+
79
+ const { errors, pageErrors } = await publishRevision(
80
+ ctx,
81
+ revision,
82
+ publishing
83
+ );
60
84
 
61
- if (errors) {
85
+ if (errors || pageErrors) {
62
86
  return {
63
87
  assigns: {
64
88
  publishing: {
@@ -67,7 +91,10 @@ const create = async (ctx) => {
67
91
  originalId: revision.originalId,
68
92
  },
69
93
  visibilityOptions: ctx.client.pages.visibilityOptions(),
70
- errors: ctx.client.pageRevisions.formatErrors(errors),
94
+ errors: errors ? ctx.client.pageRevisions.formatErrors(errors) : null,
95
+ pageErrors: pageErrors
96
+ ? ctx.client.pageRevisions.formatErrors(pageErrors)
97
+ : null,
71
98
  _translations: [],
72
99
  },
73
100
  };
@@ -9,7 +9,7 @@ const create = async (ctx) => {
9
9
  }
10
10
 
11
11
  if (pageErrors) {
12
- throw new Error(`Failed to start revision: ${JSON.stringify(pageErrors)}`);
12
+ throw new Error(`Failed to unlock revision: ${JSON.stringify(pageErrors)}`);
13
13
  }
14
14
 
15
15
  return {
@@ -17,6 +17,7 @@ import RevertsHandler from "./handlers/article_revisions/RevertsHandler";
17
17
  import PublishesHandler from "./handlers/article_revisions/PublishesHandler";
18
18
  import WidgetHandler from "./handlers/article_revisions/WidgetHandler";
19
19
  import ArticlesHandler from "./handlers/articles/ArticlesHandler";
20
+ import CancelSchedulesHandler from "./handlers/article_revisions/CancelSchedulesHandler";
20
21
 
21
22
  function routeArticlesModule(
22
23
  adapter,
@@ -121,6 +122,17 @@ function routeArticlesModule(
121
122
  { ...resourceConfig, viewsFallback: "article_revisions/publishes" }
122
123
  );
123
124
 
125
+ routeNestedCollection(
126
+ adapter,
127
+ revisionsBaseResource,
128
+ "cancel_schedules",
129
+ CancelSchedulesHandler,
130
+ {
131
+ ...resourceConfig,
132
+ viewsFallback: "article_revisions/cancel_schedules",
133
+ }
134
+ );
135
+
124
136
  routeNestedMember(
125
137
  adapter,
126
138
  `api/${revisionsBaseResource}`,
@@ -17,6 +17,7 @@ import RevertsHandler from "./handlers/event_revisions/RevertsHandler";
17
17
  import PublishesHandler from "./handlers/event_revisions/PublishesHandler";
18
18
  import WidgetHandler from "./handlers/event_revisions/WidgetHandler";
19
19
  import EventsHandler from "./handlers/events/EventsHandler";
20
+ import CancelSchedulesHandler from "./handlers/event_revisions/CancelSchedulesHandler";
20
21
 
21
22
  function routeEventsModule(
22
23
  adapter,
@@ -136,6 +137,17 @@ function routeEventsModule(
136
137
  }
137
138
  );
138
139
 
140
+ routeNestedCollection(
141
+ adapter,
142
+ revisionsBaseResource,
143
+ "cancel_schedules",
144
+ CancelSchedulesHandler,
145
+ {
146
+ ...resourceConfig,
147
+ viewsFallback: "event_revisions/cancel_schedules",
148
+ }
149
+ );
150
+
139
151
  routeNestedMember(
140
152
  adapter,
141
153
  `api/${revisionsBaseResource}`,