@raketa-cloud/admin 0.0.15 → 0.0.16
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.
- package/package.json +1 -1
- package/src/cloud/EventChanges.js +15 -0
- package/src/cloud/EventRevisions.js +149 -0
- package/src/cloud/Events.js +135 -0
- package/src/cloud/documents/common.js +10 -0
- package/src/cloud/documents/eventsDocuments.js +254 -0
- package/src/handlers/event_revisions/CodeHandler.js +86 -0
- package/src/handlers/event_revisions/EventRevisionsHandler.js +47 -0
- package/src/handlers/event_revisions/GeneralHandler.js +93 -0
- package/src/handlers/event_revisions/LocksHandler.js +51 -0
- package/src/handlers/event_revisions/MetaHandler.js +86 -0
- package/src/handlers/event_revisions/PublishesHandler.js +84 -0
- package/src/handlers/event_revisions/RevertsHandler.js +26 -0
- package/src/handlers/event_revisions/TagHandler.js +85 -0
- package/src/handlers/event_revisions/UnlocksHandler.js +22 -0
- package/src/handlers/event_revisions/VisualHandler.js +80 -0
- package/src/handlers/event_revisions/WidgetHandler.js +41 -0
- package/src/handlers/events/ClonesHandler.js +17 -0
- package/src/handlers/events/DeletesHandler.js +68 -0
- package/src/handlers/events/EventsHandler.js +121 -0
- package/src/handlers/events/TranslationsHandler.js +99 -0
- package/src/handlers/events/URLsHandler.js +71 -0
- package/src/index.js +22 -0
- package/src/routeEvents.js +55 -0
- package/src/routeStandard.js +2 -0
- package/src/setupCloud.js +12 -0
- package/src/tests/handlers/article_revisions/CodesHandler.test/edit_form.test.js +56 -0
- package/src/tests/handlers/article_revisions/CodesHandler.test/update.test.js +139 -0
- package/src/tests/handlers/article_revisions/GeneralHandler.test/edit_form.test.js +65 -0
- package/src/tests/handlers/article_revisions/GeneralHandler.test/update.test.js +150 -0
- package/src/tests/handlers/article_revisions/MetaHandler.test/edit_form.test.js +57 -0
- package/src/tests/handlers/article_revisions/MetaHandler.test/update.test.js +143 -0
- package/src/tests/handlers/article_revisions/PageRevisionsHandler.test/create.test.js +75 -0
- package/src/tests/handlers/article_revisions/PageRevisionsHandler.test/destroy.test.js +53 -0
- package/src/tests/handlers/article_revisions/PublishesHandler.test/create.test.js +136 -0
- package/src/tests/handlers/article_revisions/PublishesHandler.test/create_form.test.js +47 -0
- package/src/tests/handlers/article_revisions/RevertsHandler.test/create.test.js +80 -0
- package/src/tests/handlers/article_revisions/TagHandler.test/edit_form.test.js +69 -0
- package/src/tests/handlers/article_revisions/TagHandler.test/update.test.js +143 -0
- package/src/tests/handlers/article_revisions/VisualHandler.test.test/edit_form.test.js +55 -0
- package/src/tests/handlers/article_revisions/VisualHandler.test.test/update.test.js +131 -0
- package/src/tests/handlers/article_revisions/WidgetHandler.test/show.test.js +46 -0
- package/src/tests/handlers/article_revisions/WidgetHandler.test/update.test.js +103 -0
- package/src/tests/handlers/event_revisions/CodesHandler.test/edit_form.test.js +56 -0
- package/src/tests/handlers/event_revisions/CodesHandler.test/update.test.js +143 -0
- package/src/tests/handlers/event_revisions/GeneralHandler.test/edit_form.test.js +69 -0
- package/src/tests/handlers/event_revisions/GeneralHandler.test/update.test.js +158 -0
- package/src/tests/handlers/event_revisions/MetaHandler.test/edit_form.test.js +57 -0
- package/src/tests/handlers/event_revisions/MetaHandler.test/update.test.js +147 -0
- package/src/tests/handlers/event_revisions/PageRevisionsHandler.test/create.test.js +75 -0
- package/src/tests/handlers/event_revisions/PageRevisionsHandler.test/destroy.test.js +53 -0
- package/src/tests/handlers/event_revisions/PublishesHandler.test/create.test.js +136 -0
- package/src/tests/handlers/event_revisions/PublishesHandler.test/create_form.test.js +47 -0
- package/src/tests/handlers/event_revisions/RevertsHandler.test/create.test.js +80 -0
- package/src/tests/handlers/event_revisions/TagHandler.test/edit_form.test.js +69 -0
- package/src/tests/handlers/event_revisions/TagHandler.test/update.test.js +147 -0
- package/src/tests/handlers/event_revisions/VisualHandler.test.test/edit_form.test.js +55 -0
- package/src/tests/handlers/event_revisions/VisualHandler.test.test/update.test.js +135 -0
- package/src/tests/handlers/event_revisions/WidgetHandler.test/show.test.js +46 -0
- package/src/tests/handlers/event_revisions/WidgetHandler.test/update.test.js +103 -0
- package/src/tests/handlers/events/ConesHandler.test/create.test.js +54 -0
- package/src/tests/handlers/events/DeletesHandler.test/create.test.js +110 -0
- package/src/tests/handlers/events/DeletesHandler.test/create_form.test.js +54 -0
- package/src/tests/handlers/events/EventsHandler.test/create.test.js +152 -0
- package/src/tests/handlers/events/EventsHandler.test/create_form.test.js +41 -0
- package/src/tests/handlers/events/EventsHandler.test/index.test.js +49 -0
- package/src/tests/handlers/events/EventsHandler.test/show.test.js +105 -0
- package/src/tests/handlers/events/URLsHandler.test/create.test.js +155 -0
- package/src/tests/handlers/events/URLsHandler.test/create_form.test.js +51 -0
- package/src/views/articles/translations/create_form.ejs +2 -2
- package/src/views/event_revisions/_nav.ejs +40 -0
- package/src/views/event_revisions/codes/edit_form.ejs +39 -0
- package/src/views/event_revisions/general/edit_form.ejs +72 -0
- package/src/views/event_revisions/locks/create_form.ejs +35 -0
- package/src/views/event_revisions/meta/edit_form.ejs +41 -0
- package/src/views/event_revisions/publishes/_form.ejs +57 -0
- package/src/views/event_revisions/publishes/create_form.ejs +10 -0
- package/src/views/event_revisions/tags/edit_form.ejs +64 -0
- package/src/views/event_revisions/visuals/edit_form.ejs +42 -0
- package/src/views/events/_form.ejs +88 -0
- package/src/views/events/create_form.ejs +9 -0
- package/src/views/events/deletes/create_form.ejs +55 -0
- package/src/views/events/edit_form.ejs +3 -0
- package/src/views/events/index.ejs +161 -0
- package/src/views/events/show.ejs +281 -0
- package/src/views/events/translations/_form.ejs +79 -0
- package/src/views/events/translations/create_form.ejs +11 -0
- package/src/views/events/urls/create_form.ejs +31 -0
- package/test/factory.js +42 -3
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { toUTCISO8601String } from "../../utils";
|
|
2
|
+
|
|
3
|
+
const index = async (ctx) => {
|
|
4
|
+
const items = await ctx.client.events.list(ctx.query, ctx.locale);
|
|
5
|
+
const tags = await ctx.client.tags.all(ctx.locale);
|
|
6
|
+
|
|
7
|
+
return {
|
|
8
|
+
assigns: {
|
|
9
|
+
tags: tags.list,
|
|
10
|
+
items,
|
|
11
|
+
visibilityOptions: ctx.client.events.visibilityOptions(),
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const show = async (ctx) => {
|
|
17
|
+
const { id } = ctx.params;
|
|
18
|
+
const event = await ctx.client.events.find(id, ctx.locale);
|
|
19
|
+
|
|
20
|
+
if (!event) {
|
|
21
|
+
throw new Error(`Missing event #${id}`);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const revisions = await ctx.client.eventRevisions.all(id, ctx.locale);
|
|
25
|
+
const changes = await ctx.client.eventChanges.all(id, ctx.locale);
|
|
26
|
+
|
|
27
|
+
return {
|
|
28
|
+
assigns: {
|
|
29
|
+
event,
|
|
30
|
+
revisions: revisions.list,
|
|
31
|
+
changes: changes.list,
|
|
32
|
+
_translations: Object.keys(ctx.locales)
|
|
33
|
+
.map((locale) => {
|
|
34
|
+
const translation = event.translations[locale];
|
|
35
|
+
|
|
36
|
+
if (translation) {
|
|
37
|
+
return {
|
|
38
|
+
locale,
|
|
39
|
+
path: `/${locale}/events/${translation.id}`,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return null;
|
|
44
|
+
})
|
|
45
|
+
.filter(Boolean),
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const create_form = async (ctx) => {
|
|
51
|
+
const tags = await ctx.client.tags.all(ctx.locale);
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
assigns: {
|
|
55
|
+
event: { ...ctx.client.events.defaults(), meta_image: {} },
|
|
56
|
+
tags: tags.list,
|
|
57
|
+
errors: {},
|
|
58
|
+
visibilityOptions: ctx.client.events.visibilityOptions(),
|
|
59
|
+
_translations: [],
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const create = async (ctx) => {
|
|
65
|
+
const params = { ...ctx.resourceParams.event };
|
|
66
|
+
|
|
67
|
+
params.meta_image = JSON.parse(params.meta_image || "{}");
|
|
68
|
+
|
|
69
|
+
const { errors } = await ctx.client.events.create(
|
|
70
|
+
{
|
|
71
|
+
title: params.title,
|
|
72
|
+
slug: params.slug,
|
|
73
|
+
visibility: params.visibility,
|
|
74
|
+
publishAt: toUTCISO8601String(params.publish_at),
|
|
75
|
+
startsAt: toUTCISO8601String(params.starts_at),
|
|
76
|
+
endsAt: toUTCISO8601String(params.ends_at),
|
|
77
|
+
settings: {
|
|
78
|
+
layout: params.layout,
|
|
79
|
+
meta: {
|
|
80
|
+
title: params.meta_title,
|
|
81
|
+
description: params.meta_description,
|
|
82
|
+
image: params.meta_image,
|
|
83
|
+
},
|
|
84
|
+
credentials: {
|
|
85
|
+
user: params.username || "",
|
|
86
|
+
password: params.password || "",
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
widgets: [],
|
|
90
|
+
tags: params.tags || [],
|
|
91
|
+
categories: params.categories || [],
|
|
92
|
+
},
|
|
93
|
+
ctx.locale,
|
|
94
|
+
"event"
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
if (errors) {
|
|
98
|
+
const tags = await ctx.client.tags.all(ctx.locale);
|
|
99
|
+
|
|
100
|
+
return {
|
|
101
|
+
assigns: {
|
|
102
|
+
event: params,
|
|
103
|
+
tags: tags.list,
|
|
104
|
+
errors: { event: ctx.client.events.formatErrors(errors) },
|
|
105
|
+
visibilityOptions: ctx.client.events.visibilityOptions(),
|
|
106
|
+
_translations: [],
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
redirect: `/${ctx.locale}/events`,
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
export default {
|
|
117
|
+
index,
|
|
118
|
+
show,
|
|
119
|
+
create_form,
|
|
120
|
+
create,
|
|
121
|
+
};
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { toDateTimeInput, toUTCISO8601String } from "../../utils";
|
|
2
|
+
|
|
3
|
+
const create_form = async (ctx) => {
|
|
4
|
+
// const tags = await ctx.client.tags.all(ctx.locale);
|
|
5
|
+
const { target_locale } = ctx.query;
|
|
6
|
+
const target_locate_tags = await ctx.client.tags.all(target_locale);
|
|
7
|
+
|
|
8
|
+
const { parent_id } = ctx.params;
|
|
9
|
+
const blueprint_event = await ctx.client.events.find(parent_id, ctx.locale);
|
|
10
|
+
|
|
11
|
+
const translation = {
|
|
12
|
+
title: blueprint_event.title,
|
|
13
|
+
slug: blueprint_event.slug,
|
|
14
|
+
visibility: blueprint_event.visibility,
|
|
15
|
+
publish_at: toDateTimeInput(blueprint_event.publishAt),
|
|
16
|
+
layout: blueprint_event.settings.layout,
|
|
17
|
+
meta_title: blueprint_event.settings.meta.title,
|
|
18
|
+
meta_description: blueprint_event.settings.meta.description,
|
|
19
|
+
meta_image: blueprint_event.settings.meta?.image || {},
|
|
20
|
+
username: blueprint_event.settings.credentials?.user,
|
|
21
|
+
password: blueprint_event.settings.credentials?.password,
|
|
22
|
+
tags: [],
|
|
23
|
+
// categories: blueprint_event.categories, # TODO: this will be added later?
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
return {
|
|
27
|
+
assigns: {
|
|
28
|
+
event: blueprint_event,
|
|
29
|
+
translation: translation,
|
|
30
|
+
targetLocale: target_locale,
|
|
31
|
+
tags: target_locate_tags.list,
|
|
32
|
+
blueprint_tags: blueprint_event.tags,
|
|
33
|
+
errors: {},
|
|
34
|
+
visibilityOptions: ctx.client.events.visibilityOptions(),
|
|
35
|
+
_translations: [],
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const create = async (ctx) => {
|
|
41
|
+
const { parent_id } = ctx.params;
|
|
42
|
+
const blueprint_event = await ctx.client.events.find(parent_id, ctx.locale);
|
|
43
|
+
|
|
44
|
+
const { target_locale } = ctx.resourceParams;
|
|
45
|
+
const translation = { ...ctx.translation };
|
|
46
|
+
|
|
47
|
+
translation.meta_image = JSON.parse(translation.meta_image || "{}");
|
|
48
|
+
|
|
49
|
+
const { errors } = await ctx.client.events.translate(
|
|
50
|
+
parent_id,
|
|
51
|
+
target_locale,
|
|
52
|
+
{
|
|
53
|
+
title: translation.title,
|
|
54
|
+
slug: translation.slug,
|
|
55
|
+
visibility: translation.visibility,
|
|
56
|
+
publishAt: toUTCISO8601String(translation.publish_at),
|
|
57
|
+
startsAt: toUTCISO8601String(translation.starts_at),
|
|
58
|
+
endshAt: toUTCISO8601String(translation.ends_at),
|
|
59
|
+
settings: {
|
|
60
|
+
...blueprint_event.settings,
|
|
61
|
+
layout: translation.layout,
|
|
62
|
+
meta: {
|
|
63
|
+
title: translation.meta_title,
|
|
64
|
+
description: translation.meta_description,
|
|
65
|
+
image: translation.meta_image || "{}",
|
|
66
|
+
},
|
|
67
|
+
credentials: {
|
|
68
|
+
user: translation.username || "",
|
|
69
|
+
password: translation.password || "",
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
widgets: blueprint_event.widgets,
|
|
73
|
+
tags: translation.tags || [],
|
|
74
|
+
categories: blueprint_event.categories.map((category) => category.id),
|
|
75
|
+
}
|
|
76
|
+
);
|
|
77
|
+
if (errors) {
|
|
78
|
+
const tags = await ctx.client.tags.all(target_locale);
|
|
79
|
+
return {
|
|
80
|
+
assigns: {
|
|
81
|
+
event: blueprint_event,
|
|
82
|
+
translation: translation,
|
|
83
|
+
targetLocale: translation.target_locate,
|
|
84
|
+
tags: tags.list,
|
|
85
|
+
errors: {},
|
|
86
|
+
visibilityOptions: ctx.client.events.visibilityOptions(),
|
|
87
|
+
_translations: [],
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
redirect: `/${ctx.locale}/events/${parent_id}`,
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export default {
|
|
97
|
+
create_form,
|
|
98
|
+
create,
|
|
99
|
+
};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
const create_form = async (ctx) => {
|
|
2
|
+
const { parent_id } = ctx.params;
|
|
3
|
+
const event = await ctx.client.events.find(parent_id, ctx.locale);
|
|
4
|
+
|
|
5
|
+
if (!event) {
|
|
6
|
+
throw new Error(`Cannot find event with id ${parent_id}`);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
return {
|
|
10
|
+
assigns: {
|
|
11
|
+
change: {
|
|
12
|
+
id: event.id,
|
|
13
|
+
slug: event.slug,
|
|
14
|
+
redirect: null,
|
|
15
|
+
},
|
|
16
|
+
errors: {},
|
|
17
|
+
_translations: [],
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const create = async (ctx) => {
|
|
23
|
+
const { parent_id } = ctx.params;
|
|
24
|
+
const change = ctx.resourceParams.change;
|
|
25
|
+
|
|
26
|
+
const event = await ctx.client.events.find(parent_id, ctx.locale);
|
|
27
|
+
|
|
28
|
+
if (!event) {
|
|
29
|
+
throw new Error(`Cannot find event with id ${parent_id}`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
let redirectParams = null;
|
|
33
|
+
|
|
34
|
+
if (change.redirect) {
|
|
35
|
+
redirectParams = {
|
|
36
|
+
// TODO: We need some config from the FE project on how to build paths here!
|
|
37
|
+
url: `/${event.slug}`,
|
|
38
|
+
destination: change.slug,
|
|
39
|
+
httpResponseCode: 301,
|
|
40
|
+
note: "Created with changed URL for a event",
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const { errors } = await ctx.client.events.updateSlug(
|
|
45
|
+
parent_id,
|
|
46
|
+
change.slug,
|
|
47
|
+
ctx.locale,
|
|
48
|
+
redirectParams
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
if (errors) {
|
|
52
|
+
return {
|
|
53
|
+
assigns: {
|
|
54
|
+
change: { ...change, id: event.id },
|
|
55
|
+
errors: {
|
|
56
|
+
change: ctx.client.events.formatErrors(errors, "redirect"),
|
|
57
|
+
},
|
|
58
|
+
_translations: [],
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return {
|
|
64
|
+
redirect: `/${ctx.locale}/events/${parent_id}`,
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
export default {
|
|
69
|
+
create_form,
|
|
70
|
+
create,
|
|
71
|
+
};
|
package/src/index.js
CHANGED
|
@@ -6,6 +6,7 @@ export { default as routeNestedMember } from "./routeNestedMember";
|
|
|
6
6
|
export { default as setGlobalContext } from "./setGlobalContext";
|
|
7
7
|
export { default as routePages } from "./routePages";
|
|
8
8
|
export { default as routeArticles } from "./routeArticles";
|
|
9
|
+
export { default as routeEvents } from "./routeEvents";
|
|
9
10
|
export { default as routeSettings } from "./routeSettings";
|
|
10
11
|
export { default as setupCloud } from "./setupCloud";
|
|
11
12
|
export { default as routeStandard } from "./routeStandard";
|
|
@@ -19,6 +20,9 @@ export { default as Pages } from "./cloud/Pages";
|
|
|
19
20
|
export { default as ArticleChanges } from "./cloud/ArticleChanges";
|
|
20
21
|
export { default as ArticleRevisions } from "./cloud/ArticleRevisions";
|
|
21
22
|
export { default as Articles } from "./cloud/Articles";
|
|
23
|
+
export { default as EventChanges } from "./cloud/EventChanges";
|
|
24
|
+
export { default as EventRevisions } from "./cloud/EventRevisions";
|
|
25
|
+
export { default as Events } from "./cloud/Events";
|
|
22
26
|
|
|
23
27
|
export { default as PageRevisionsHandler } from "./handlers/page_revisions/PageRevisionsHandler";
|
|
24
28
|
export { default as PageRevisionsCodeHandler } from "./handlers/page_revisions/CodeHandler";
|
|
@@ -63,3 +67,21 @@ export { default as ArticleDeletesHandler } from "./handlers/articles/DeletesHan
|
|
|
63
67
|
export { default as ArticleTranslationsHandler } from "./handlers/articles/TranslationsHandler";
|
|
64
68
|
export { default as ArticleURLsHandler } from "./handlers/articles/URLsHandler";
|
|
65
69
|
export { default as ArticlesHandler } from "./handlers/articles/ArticlesHandler";
|
|
70
|
+
|
|
71
|
+
export { default as EventRevisionsHandler } from "./handlers/event_revisions/EventRevisionsHandler";
|
|
72
|
+
export { default as EventRevisionsCodeHandler } from "./handlers/event_revisions/CodeHandler";
|
|
73
|
+
export { default as EventRevisionsGeneralHandler } from "./handlers/event_revisions/GeneralHandler";
|
|
74
|
+
export { default as EventRevisionsMetaHandler } from "./handlers/event_revisions/MetaHandler";
|
|
75
|
+
export { default as EventRevisionsLocksHandler } from "./handlers/event_revisions/LocksHandler";
|
|
76
|
+
export { default as EventRevisionsUnlocksHandler } from "./handlers/event_revisions/UnlocksHandler";
|
|
77
|
+
export { default as EventRevisionsVisualHandler } from "./handlers/event_revisions/VisualHandler";
|
|
78
|
+
export { default as EventRevisionsTagHandler } from "./handlers/event_revisions/TagHandler";
|
|
79
|
+
export { default as EventRevisionsWidgetHandler } from "./handlers/event_revisions/WidgetHandler";
|
|
80
|
+
export { default as EventRevisionsPublishesHandler } from "./handlers/event_revisions/PublishesHandler";
|
|
81
|
+
export { default as EventRevisionsRevertsHandler } from "./handlers/event_revisions/RevertsHandler";
|
|
82
|
+
|
|
83
|
+
export { default as EventClonesHandler } from "./handlers/events/ClonesHandler";
|
|
84
|
+
export { default as EventDeletesHandler } from "./handlers/events/DeletesHandler";
|
|
85
|
+
export { default as EventTranslationsHandler } from "./handlers/events/TranslationsHandler";
|
|
86
|
+
export { default as EventURLsHandler } from "./handlers/events/URLsHandler";
|
|
87
|
+
export { default as EventsHandler } from "./handlers/events/EventsHandler";
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import routeCollection from "./routeCollection";
|
|
2
|
+
import routeNestedCollection from "./routeNestedCollection";
|
|
3
|
+
import routeNestedMember from "./routeNestedMember";
|
|
4
|
+
import TranslationsHandler from "./handlers/events/TranslationsHandler";
|
|
5
|
+
import EventRevisionsHandler from "./handlers/event_revisions/EventRevisionsHandler";
|
|
6
|
+
import GeneralHandler from "./handlers/event_revisions/GeneralHandler";
|
|
7
|
+
import VisualHandler from "./handlers/event_revisions/VisualHandler";
|
|
8
|
+
import CodeHandler from "./handlers/event_revisions/CodeHandler";
|
|
9
|
+
import MetaHandler from "./handlers/event_revisions/MetaHandler";
|
|
10
|
+
import TagHandler from "./handlers/event_revisions/TagHandler";
|
|
11
|
+
import LocksHandler from "./handlers/event_revisions/LocksHandler";
|
|
12
|
+
import UnlocksHandler from "./handlers/event_revisions/UnlocksHandler";
|
|
13
|
+
import ClonesHandler from "./handlers/events/ClonesHandler";
|
|
14
|
+
import URLsHandler from "./handlers/events/URLsHandler";
|
|
15
|
+
import DeletesHandler from "./handlers/events/DeletesHandler";
|
|
16
|
+
import RevertsHandler from "./handlers/event_revisions/RevertsHandler";
|
|
17
|
+
import PublishesHandler from "./handlers/event_revisions/PublishesHandler";
|
|
18
|
+
import WidgetHandler from "./handlers/event_revisions/WidgetHandler";
|
|
19
|
+
import EventsHandler from "./handlers/events/EventsHandler";
|
|
20
|
+
|
|
21
|
+
function routeEvents(adapter) {
|
|
22
|
+
routeCollection(adapter, "events", EventsHandler);
|
|
23
|
+
routeNestedCollection(adapter, "events", "translations", TranslationsHandler);
|
|
24
|
+
routeNestedCollection(
|
|
25
|
+
adapter,
|
|
26
|
+
"events",
|
|
27
|
+
"event_revisions",
|
|
28
|
+
EventRevisionsHandler
|
|
29
|
+
);
|
|
30
|
+
routeNestedMember(adapter, "event_revisions", "general", GeneralHandler);
|
|
31
|
+
routeNestedMember(adapter, "event_revisions", "visuals", VisualHandler);
|
|
32
|
+
routeNestedMember(adapter, "event_revisions", "codes", CodeHandler);
|
|
33
|
+
routeNestedMember(adapter, "event_revisions", "meta", MetaHandler);
|
|
34
|
+
routeNestedMember(adapter, "event_revisions", "tags", TagHandler);
|
|
35
|
+
routeNestedCollection(adapter, "event_revisions", "locks", LocksHandler);
|
|
36
|
+
routeNestedCollection(adapter, "event_revisions", "unlocks", UnlocksHandler);
|
|
37
|
+
routeNestedCollection(adapter, "events", "clones", ClonesHandler);
|
|
38
|
+
routeNestedCollection(adapter, "events", "urls", URLsHandler);
|
|
39
|
+
routeNestedCollection(adapter, "events", "deletes", DeletesHandler);
|
|
40
|
+
routeNestedCollection(
|
|
41
|
+
adapter,
|
|
42
|
+
"events",
|
|
43
|
+
"event_changes/reverts",
|
|
44
|
+
RevertsHandler
|
|
45
|
+
);
|
|
46
|
+
routeNestedCollection(
|
|
47
|
+
adapter,
|
|
48
|
+
"event_revisions",
|
|
49
|
+
"publishes",
|
|
50
|
+
PublishesHandler
|
|
51
|
+
);
|
|
52
|
+
routeNestedMember(adapter, "api/event_revisions", "widgets", WidgetHandler);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export default routeEvents;
|
package/src/routeStandard.js
CHANGED
|
@@ -2,6 +2,7 @@ import routeCollection from "./routeCollection";
|
|
|
2
2
|
import routeSettings from "./routeSettings";
|
|
3
3
|
import routePages from "./routePages";
|
|
4
4
|
import routeArticles from "./routeArticles";
|
|
5
|
+
import routeEvents from "./routeEvents";
|
|
5
6
|
import RedirectsHandler from "./handlers/RedirectsHandler";
|
|
6
7
|
import TagsHandler from "./handlers/TagsHandler";
|
|
7
8
|
|
|
@@ -11,6 +12,7 @@ function routeStandard(adapter) {
|
|
|
11
12
|
routeSettings(adapter);
|
|
12
13
|
routePages(adapter);
|
|
13
14
|
routeArticles(adapter);
|
|
15
|
+
routeEvents(adapter);
|
|
14
16
|
}
|
|
15
17
|
|
|
16
18
|
export default routeStandard;
|
package/src/setupCloud.js
CHANGED
|
@@ -7,6 +7,9 @@ import PageChanges from "./cloud/PageChanges";
|
|
|
7
7
|
import Articles from "./cloud/Articles";
|
|
8
8
|
import ArticleRevisions from "./cloud/ArticleRevisions";
|
|
9
9
|
import ArticleChanges from "./cloud/ArticleChanges";
|
|
10
|
+
import Events from "./cloud/Events";
|
|
11
|
+
import EventRevisions from "./cloud/EventRevisions";
|
|
12
|
+
import EventChanges from "./cloud/EventChanges";
|
|
10
13
|
|
|
11
14
|
function setupCloud(ctx, getConfig) {
|
|
12
15
|
if (!ctx?.authentication?.token) return;
|
|
@@ -31,6 +34,15 @@ function setupCloud(ctx, getConfig) {
|
|
|
31
34
|
getConfig,
|
|
32
35
|
ctx.authentication.token
|
|
33
36
|
);
|
|
37
|
+
ctx.client.events = new Events(getConfig, ctx.authentication.token);
|
|
38
|
+
ctx.client.eventRevisions = new EventRevisions(
|
|
39
|
+
getConfig,
|
|
40
|
+
ctx.authentication.token
|
|
41
|
+
);
|
|
42
|
+
ctx.client.eventChanges = new EventChanges(
|
|
43
|
+
getConfig,
|
|
44
|
+
ctx.authentication.token
|
|
45
|
+
);
|
|
34
46
|
}
|
|
35
47
|
|
|
36
48
|
export default setupCloud;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import CodeHandler from "../../../../handlers/article_revisions/CodeHandler";
|
|
2
|
+
import ArticleRevisions from "../../../../cloud/ArticleRevisions";
|
|
3
|
+
import { testConfig } from "../../../../../test/handlersHelper";
|
|
4
|
+
import Factory from "../../../../../test/factory";
|
|
5
|
+
|
|
6
|
+
function buildCtx(revision) {
|
|
7
|
+
return {
|
|
8
|
+
client: {
|
|
9
|
+
articleRevisions: new ArticleRevisions(testConfig, "token"),
|
|
10
|
+
},
|
|
11
|
+
params: { parent_id: revision.id },
|
|
12
|
+
locale: "en",
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
describe("Article revision code settings", () => {
|
|
17
|
+
test("edit_form when a revision exists", async () => {
|
|
18
|
+
const revision = Factory.build("article_revision");
|
|
19
|
+
const ctx = buildCtx(revision);
|
|
20
|
+
|
|
21
|
+
const mockFind = jest
|
|
22
|
+
.spyOn(ctx.client.articleRevisions, "find")
|
|
23
|
+
.mockImplementation(() => revision);
|
|
24
|
+
|
|
25
|
+
const result = await CodeHandler.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.articleRevisions, "find")
|
|
48
|
+
.mockImplementation(() => null);
|
|
49
|
+
|
|
50
|
+
expect(async () => {
|
|
51
|
+
await CodeHandler.edit_form(ctx);
|
|
52
|
+
}).rejects.toThrow("Missing revision #42");
|
|
53
|
+
|
|
54
|
+
expect(mockFind).toHaveBeenCalledWith("42", "en");
|
|
55
|
+
});
|
|
56
|
+
});
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import CodeHandler from "../../../../handlers/article_revisions/CodeHandler";
|
|
2
|
+
import ArticleRevisions from "../../../../cloud/ArticleRevisions";
|
|
3
|
+
import { testConfig } from "../../../../../test/handlersHelper";
|
|
4
|
+
import Factory from "../../../../../test/factory";
|
|
5
|
+
|
|
6
|
+
function buildCtx(revision, updateSettings) {
|
|
7
|
+
return {
|
|
8
|
+
client: {
|
|
9
|
+
articleRevisions: new ArticleRevisions(testConfig, "token"),
|
|
10
|
+
},
|
|
11
|
+
params: { parent_id: revision.id },
|
|
12
|
+
resourceParams: {
|
|
13
|
+
code_settings: updateSettings,
|
|
14
|
+
},
|
|
15
|
+
locale: "en",
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
describe("Article revision code settings", () => {
|
|
20
|
+
test("update successful", async () => {
|
|
21
|
+
const revision = Factory.build("article_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.articleRevisions, "find")
|
|
32
|
+
.mockImplementation(() => revision);
|
|
33
|
+
|
|
34
|
+
const mockUpdate = jest
|
|
35
|
+
.spyOn(ctx.client.articleRevisions, "update")
|
|
36
|
+
.mockImplementation(() => ({
|
|
37
|
+
revision: {},
|
|
38
|
+
errors: null,
|
|
39
|
+
}));
|
|
40
|
+
|
|
41
|
+
const result = await CodeHandler.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
|
+
publishAt: revision.publishAt,
|
|
49
|
+
widgets: JSON.stringify(revision.widgets),
|
|
50
|
+
tags: revision.tags.map((t) => t.id),
|
|
51
|
+
categories: revision.categories.map((c) => c.id),
|
|
52
|
+
settings: JSON.stringify({
|
|
53
|
+
...revision.settings,
|
|
54
|
+
codes: {
|
|
55
|
+
scripts: [{ type: "bla" }],
|
|
56
|
+
structured_data: { type: "article" },
|
|
57
|
+
},
|
|
58
|
+
}),
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
expect(result).toEqual({
|
|
62
|
+
redirect: `/en/article_revisions/${revision.id}/codes/edit`,
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test("update failed", async () => {
|
|
67
|
+
const revision = Factory.build("article_revision");
|
|
68
|
+
|
|
69
|
+
const updateSettings = {
|
|
70
|
+
scripts: JSON.stringify([{ type: "bla" }]),
|
|
71
|
+
structured_data: JSON.stringify({ type: "article" }),
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const ctx = buildCtx(revision, updateSettings);
|
|
75
|
+
|
|
76
|
+
const mockFind = jest
|
|
77
|
+
.spyOn(ctx.client.articleRevisions, "find")
|
|
78
|
+
.mockImplementation(() => revision);
|
|
79
|
+
|
|
80
|
+
const mockUpdate = jest
|
|
81
|
+
.spyOn(ctx.client.articleRevisions, "update")
|
|
82
|
+
.mockImplementation(() => ({
|
|
83
|
+
revision: {},
|
|
84
|
+
errors: [{ key: "generalError", message: "some error" }],
|
|
85
|
+
}));
|
|
86
|
+
|
|
87
|
+
const result = await CodeHandler.update(ctx);
|
|
88
|
+
|
|
89
|
+
expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
|
|
90
|
+
expect(mockUpdate).toHaveBeenCalledWith(revision.id, "en", {
|
|
91
|
+
slug: revision.slug,
|
|
92
|
+
title: revision.title,
|
|
93
|
+
visibility: revision.visibility,
|
|
94
|
+
publishAt: revision.publishAt,
|
|
95
|
+
widgets: JSON.stringify(revision.widgets),
|
|
96
|
+
tags: revision.tags.map((t) => t.id),
|
|
97
|
+
categories: revision.categories.map((c) => c.id),
|
|
98
|
+
settings: JSON.stringify({
|
|
99
|
+
...revision.settings,
|
|
100
|
+
codes: {
|
|
101
|
+
scripts: [{ type: "bla" }],
|
|
102
|
+
structured_data: { type: "article" },
|
|
103
|
+
},
|
|
104
|
+
}),
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
expect(result).toEqual({
|
|
108
|
+
assigns: {
|
|
109
|
+
code_settings: {
|
|
110
|
+
...updateSettings,
|
|
111
|
+
id: revision.id,
|
|
112
|
+
originalId: revision.originalId,
|
|
113
|
+
},
|
|
114
|
+
errors: {
|
|
115
|
+
code_settings: { generalError: "some error" },
|
|
116
|
+
},
|
|
117
|
+
_translations: [],
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
test("update when a revision does not exist", async () => {
|
|
123
|
+
const revision = Factory.build("article_revision");
|
|
124
|
+
|
|
125
|
+
const updateSettings = {};
|
|
126
|
+
|
|
127
|
+
const ctx = buildCtx(revision, updateSettings);
|
|
128
|
+
|
|
129
|
+
const mockFind = jest
|
|
130
|
+
.spyOn(ctx.client.articleRevisions, "find")
|
|
131
|
+
.mockImplementation(() => null);
|
|
132
|
+
|
|
133
|
+
expect(async () => {
|
|
134
|
+
await CodeHandler.update(ctx);
|
|
135
|
+
}).rejects.toThrow(`Missing revision #${revision.id}`);
|
|
136
|
+
|
|
137
|
+
expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
|
|
138
|
+
});
|
|
139
|
+
});
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import GeneralHandler from "../../../../handlers/article_revisions/GeneralHandler";
|
|
2
|
+
import ArticleRevisions from "../../../../cloud/ArticleRevisions";
|
|
3
|
+
import Articles from "../../../../cloud/Articles";
|
|
4
|
+
import { testConfig } from "../../../../../test/handlersHelper";
|
|
5
|
+
import Factory from "../../../../../test/factory";
|
|
6
|
+
|
|
7
|
+
function buildCtx(revision) {
|
|
8
|
+
return {
|
|
9
|
+
client: {
|
|
10
|
+
articleRevisions: new ArticleRevisions(testConfig, "token"),
|
|
11
|
+
articles: new Articles(testConfig, "token"),
|
|
12
|
+
},
|
|
13
|
+
params: { parent_id: revision.id },
|
|
14
|
+
locale: "en",
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
describe("Article revision genereal settings", () => {
|
|
19
|
+
test("edit_form when a revision exists", async () => {
|
|
20
|
+
const revision = Factory.build("article_revision", {
|
|
21
|
+
publishAt: "2024-08-30T16:05:00Z",
|
|
22
|
+
});
|
|
23
|
+
const ctx = buildCtx(revision);
|
|
24
|
+
|
|
25
|
+
const mockFind = jest
|
|
26
|
+
.spyOn(ctx.client.articleRevisions, "find")
|
|
27
|
+
.mockImplementation(() => revision);
|
|
28
|
+
|
|
29
|
+
const result = await GeneralHandler.edit_form(ctx);
|
|
30
|
+
|
|
31
|
+
expect(mockFind).toHaveBeenCalledWith(revision.id, "en");
|
|
32
|
+
|
|
33
|
+
expect(result).toEqual({
|
|
34
|
+
assigns: {
|
|
35
|
+
general_settings: {
|
|
36
|
+
id: revision.id,
|
|
37
|
+
originalId: revision.originalId,
|
|
38
|
+
title: revision.title,
|
|
39
|
+
slug: revision.slug,
|
|
40
|
+
visibility: revision.visibility,
|
|
41
|
+
publish_at: "2024-08-30T19:05",
|
|
42
|
+
username: revision.settings?.credentials?.user || "",
|
|
43
|
+
password: revision.settings?.credentials?.password || "",
|
|
44
|
+
},
|
|
45
|
+
errors: {},
|
|
46
|
+
visibilityOptions: ctx.client.articles.visibilityOptions(),
|
|
47
|
+
_translations: [],
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("edit_form when a revision does not exist", async () => {
|
|
53
|
+
const ctx = buildCtx({ id: "42" });
|
|
54
|
+
|
|
55
|
+
const mockFind = jest
|
|
56
|
+
.spyOn(ctx.client.articleRevisions, "find")
|
|
57
|
+
.mockImplementation(() => null);
|
|
58
|
+
|
|
59
|
+
expect(async () => {
|
|
60
|
+
await GeneralHandler.edit_form(ctx);
|
|
61
|
+
}).rejects.toThrow("Missing revision #42");
|
|
62
|
+
|
|
63
|
+
expect(mockFind).toHaveBeenCalledWith("42", "en");
|
|
64
|
+
});
|
|
65
|
+
});
|