@webbio/strapi-plugin-page-builder 0.10.9-platform → 0.11.10-platform
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/README.md +38 -1
- package/admin/src/components/EditView/CollectionTypeSearch/index.tsx +1 -1
- package/admin/src/components/EditView/CollectionTypeSettings/CreatePageButton/index.tsx +5 -1
- package/admin/src/components/PageTypeEditView/index.tsx +17 -6
- package/admin/src/index.tsx +2 -2
- package/admin/src/utils/hooks/usePlatformFormData.ts +8 -2
- package/dist/package.json +8 -2
- package/dist/server/bootstrap.js +31 -1
- package/dist/server/content-types/category/schema.json +18 -0
- package/dist/server/content-types/index.js +9 -1
- package/dist/server/controllers/index.js +3 -1
- package/dist/server/controllers/private-content.js +18 -0
- package/dist/server/controllers/sitemap.js +20 -0
- package/dist/server/graphql/page-by-path.js +22 -2
- package/dist/server/policies/index.js +7 -1
- package/dist/server/policies/isAuthorizedPage.js +11 -0
- package/dist/server/register.js +2 -0
- package/dist/server/routes/index.js +17 -0
- package/dist/server/schema/page-end.json +8 -0
- package/dist/server/schema/platform-start.json +5 -0
- package/dist/server/services/builder.js +86 -0
- package/dist/server/services/email.js +132 -0
- package/dist/server/services/index.js +5 -1
- package/dist/server/services/private-content/components/admin-email.json +22 -0
- package/dist/server/services/private-content/components/email.json +22 -0
- package/dist/server/services/private-content/components/platform-email.json +30 -0
- package/dist/server/services/private-content/constants/index.js +16 -0
- package/dist/server/services/private-content/graphql/index.js +77 -0
- package/dist/server/services/private-content/graphql/resolvers/findOnePage.js +40 -0
- package/dist/server/services/private-content/graphql/resolvers/findPage.js +44 -0
- package/dist/server/services/private-content/graphql/resolvers/forgot-password.js +31 -0
- package/dist/server/services/private-content/graphql/resolvers/login.js +49 -0
- package/dist/server/services/private-content/graphql/resolvers/register.js +68 -0
- package/dist/server/services/private-content/graphql/resolvers/reset-password.js +41 -0
- package/dist/server/services/private-content/graphql/types/index.js +89 -0
- package/dist/server/services/private-content/index.js +92 -0
- package/dist/server/services/private-content/mail-template/txtMail.email.template.text.js +12 -0
- package/dist/server/services/private-content/mail-template/txtMail.interface.js +2 -0
- package/dist/server/services/private-content/page.js +17 -0
- package/dist/server/services/private-content/platform.js +17 -0
- package/dist/server/services/private-content/schemas/index.js +30 -0
- package/dist/server/services/private-content/user.js +159 -0
- package/dist/server/services/sitemap.js +17 -0
- package/dist/server/utils/strapi.js +9 -1
- package/dist/shared/utils/constants.js +3 -1
- package/dist/tsconfig.server.tsbuildinfo +1 -1
- package/package.json +8 -2
- package/server/bootstrap.ts +39 -1
- package/server/content-types/category/schema.json +18 -0
- package/server/content-types/index.ts +7 -1
- package/server/controllers/index.ts +3 -1
- package/server/controllers/private-content.ts +17 -0
- package/server/graphql/page-by-path.ts +28 -2
- package/server/policies/index.ts +5 -1
- package/server/policies/isAuthorizedPage.ts +11 -0
- package/server/register.ts +2 -0
- package/server/routes/index.ts +17 -0
- package/server/schema/page-end.json +8 -0
- package/server/schema/platform-start.json +5 -0
- package/server/services/builder.ts +83 -1
- package/server/services/email.ts +127 -0
- package/server/services/index.ts +5 -1
- package/server/services/private-content/components/admin-email.json +22 -0
- package/server/services/private-content/components/email.json +22 -0
- package/server/services/private-content/components/platform-email.json +30 -0
- package/server/services/private-content/constants/index.ts +13 -0
- package/server/services/private-content/graphql/index.ts +88 -0
- package/server/services/private-content/graphql/resolvers/findOnePage.ts +40 -0
- package/server/services/private-content/graphql/resolvers/findPage.ts +45 -0
- package/server/services/private-content/graphql/resolvers/forgot-password.ts +34 -0
- package/server/services/private-content/graphql/resolvers/login.ts +56 -0
- package/server/services/private-content/graphql/resolvers/register.ts +78 -0
- package/server/services/private-content/graphql/resolvers/reset-password.ts +44 -0
- package/server/services/private-content/graphql/types/index.ts +96 -0
- package/server/services/private-content/index.ts +93 -0
- package/server/services/private-content/mail-template/txtMail.email.template.text.ts +6 -0
- package/server/services/private-content/page.ts +14 -0
- package/server/services/private-content/platform.ts +14 -0
- package/server/services/private-content/schemas/index.ts +28 -0
- package/server/services/private-content/user.ts +187 -0
- package/server/utils/strapi.ts +5 -0
- package/shared/utils/constants.ts +2 -0
package/README.md
CHANGED
|
@@ -77,10 +77,47 @@ Voor elk collectiontype die je wil toevoegen aan het platform, moet deze relatie
|
|
|
77
77
|
|
|
78
78
|
Een platform zit altijd aan een pagina gekoppeld. Deze moet handmatig in de pagina toegevoegd worden.
|
|
79
79
|
|
|
80
|
+
|
|
81
|
+
## NPO Gebruiker
|
|
82
|
+
|
|
83
|
+
Omdat er voor verschillende pagina's ingelogd moet worden binnen NPO, moet de gebruiker aangepast worden. Omdat dit niet op alle sites mag komen, wordt er gekeken naar de config die mee gegeven wordt. Wanneer er in de config de
|
|
84
|
+
customNPOUser mee gegeven wordt, worden de wijzigingen doorgevoerd voor de gebruiker.
|
|
85
|
+
```
|
|
86
|
+
config: {
|
|
87
|
+
customNPOUser: true
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Dit zorgt ervoor dat de gebruiker aangepast wordt en de controllers om te updaten en aan te maken zijn aangepast. Strapi verplicht je namelijk om een username aan te maken bij het registreren. Die zit hier nu niet meer bij.
|
|
92
|
+
|
|
80
93
|
## Custom field: Filtered Select
|
|
81
94
|
|
|
82
95
|
Om het mogelijk te maken om andere relaties te leggen en daarbij te limiteren op het gekoppelde platform, is er een custom field gemaakt. Dit custom field vereist dat er een ander relatieveld bestaat (custom fields kunnen immers geen relaties zijn). Het veld is puur een FE filter voor de eindgebruiker.
|
|
83
96
|
|
|
97
|
+
## Private content
|
|
98
|
+
|
|
99
|
+
Om private content toe te voegen aan het systeem, moet er bij de config van de plugin een property toegevoegd worden, privateContent.
|
|
100
|
+
```
|
|
101
|
+
'page-builder': {
|
|
102
|
+
enabled: true,
|
|
103
|
+
resolve: './src/plugins/strapi-plugin-page-builder',
|
|
104
|
+
config: {
|
|
105
|
+
modules: ['modules.text', 'modules.featured-vacancies'],
|
|
106
|
+
privateContent: true
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Zodra deze aan staat, wordt er extra componenten ingeladen en worden er bepaalde functies aangemaakt om gebruikers te kunnen registreren en te laten inloggen.
|
|
112
|
+
|
|
113
|
+
## Private modules
|
|
114
|
+
|
|
115
|
+
Wanneer private content aan staat, wordt ook de getPageByPath module private. Dit wordt gedaan om modules private te kunnen maken. Om de data op te kunnen halen van de page moet een header meegestuurd worden: "x-strapi-page-secret". Deze token wordt in de environment variabele gezet `STRAPI_PAGE_SECRET`
|
|
116
|
+
|
|
117
|
+
Vervolgens kun je private modules maken. Deze hebben wel een structuur nodig. Zo moet het component `auth` bevatten. Voorbeeld: `authBodyText` Op die manier weten we of de module authenticatie bevat. Vervolgens moeten de velden in de module een `public` en een `private` veld bevatten. Voorbeeld: `publicBodyText` en `privateBodyText`.
|
|
118
|
+
|
|
119
|
+
Binnen strapi kunnen we niet controleren of de public versie of private versie terug gestuurd moet worden. Dit komt doordat de resolvers van dynamic zones niet aangepast kunnen worden. Vandaar dat we de authenticatie op de server doen van de frontend.
|
|
120
|
+
|
|
84
121
|
### Voorbeeld
|
|
85
122
|
Ik wil een lijst van vacature relaties selecteren. Deze vacatures moeten van hetzelfde platform zijn als het platform dat globaal is geselecteerd:
|
|
86
123
|
|
|
@@ -112,6 +149,7 @@ Je ziet dat het `vacatures` veld nodig is voor het custom field om te "targeten"
|
|
|
112
149
|
|
|
113
150
|
Daarnaast heb je de optie om customFilters toe te voegen. In het bovenstaande geval worden enkel resultaten getoond met "Hoi" als titel. De waarde moet een array van objecten zijn. De filtermogelijkheden kunnen in de [Strapi](https://docs.strapi.io/dev-docs/api/rest/interactive-query-builder) documentatie gevonden worden. (Let wel, de filters zijn altijd AND)
|
|
114
151
|
|
|
152
|
+
|
|
115
153
|
# Known bugs
|
|
116
154
|
|
|
117
155
|
- Na het ontkoppelen en opslaan van een collectie item op een pagina, staat deze nog als "Geselecteerd" in de dropdown.
|
|
@@ -121,7 +159,6 @@ Daarnaast heb je de optie om customFilters toe te voegen. In het bovenstaande ge
|
|
|
121
159
|
|
|
122
160
|
- Deze readme updaten en naar engels vertalen.
|
|
123
161
|
- Intl gebruiken voor de teksten.
|
|
124
|
-
- Pagetype mag ook een default parent page relation hebben. Bij het aanmaken van een pagina obv een page type, deze relatie als default aan de aangemaakte pagina koppelen. Als ik bijvoorbeeld een post pagina maak, dan wordt de pagina automatisch aan de "actueel" pagina gekoppeld zodat al mijn posts die parent hebben.
|
|
125
162
|
- Filteren op Page in GraphQL binnen een collectiontype met een morph op een page kan niet. Strapi staat dit niet toe. Wellicht in de toekomst wel.
|
|
126
163
|
- Slug en path genereren op basis van de titel van het collection type waarvan je een pagina aanmaakt. Nu wordt deze leeggelaten. Dit moet zorgvuldig gebeuren, bij een bestaande slug wil je bijvoorbeeld een -2 toevoegen oid.
|
|
127
164
|
- Dit vorige punt geldt ook andersom, dus als je een entity koppelt vanuit een pagina. Als de titel en slug nog leeg zijn, vul die dan automatisch in.
|
|
@@ -24,7 +24,7 @@ export const CreatePageButton = ({ selectedPlatform, onCreatedPage }: ICreatePag
|
|
|
24
24
|
const history = useHistory();
|
|
25
25
|
const form = (useCMEditViewDataManager() || {}) as Record<string, any>;
|
|
26
26
|
|
|
27
|
-
const { layout, initialData
|
|
27
|
+
const { layout, initialData } = form;
|
|
28
28
|
|
|
29
29
|
const { locales } = useSelector((state: any) => state.i18n_locales);
|
|
30
30
|
|
|
@@ -45,6 +45,10 @@ export const CreatePageButton = ({ selectedPlatform, onCreatedPage }: ICreatePag
|
|
|
45
45
|
const defaultLocale = locales.find((locale: any) => locale.isDefault);
|
|
46
46
|
const locale = initialData?.locale || defaultLocale?.code;
|
|
47
47
|
|
|
48
|
+
if (!locale) {
|
|
49
|
+
throw new Error('No locale found');
|
|
50
|
+
}
|
|
51
|
+
|
|
48
52
|
// Get data inside template
|
|
49
53
|
let templateData: Record<string, any> | undefined;
|
|
50
54
|
|
|
@@ -12,20 +12,16 @@ import { useRelationLoad } from '../PlatformFilteredSelectField/hooks/useRelatio
|
|
|
12
12
|
|
|
13
13
|
const targetField = 'defaultParent';
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
const PageTypeEditView = () => {
|
|
16
16
|
const form = useCMEditViewDataManager() as any;
|
|
17
17
|
const { layout } = form;
|
|
18
18
|
const { selectedPlatform } = usePlatformFormData(form);
|
|
19
19
|
const targetFieldAttribute = layout?.metadatas?.[targetField]?.edit?.mainField?.schema || {};
|
|
20
|
+
|
|
20
21
|
useRelationLoad({
|
|
21
22
|
name: targetField,
|
|
22
23
|
attribute: targetFieldAttribute
|
|
23
24
|
});
|
|
24
|
-
const isPageTypeCollectionType = layout.uid === PAGE_TYPE_UID;
|
|
25
|
-
|
|
26
|
-
if (!isPageTypeCollectionType || !selectedPlatform) {
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
25
|
|
|
30
26
|
return (
|
|
31
27
|
<Wrapper title="Instellingen">
|
|
@@ -40,3 +36,18 @@ export const PageTypeEditView = () => {
|
|
|
40
36
|
</Wrapper>
|
|
41
37
|
);
|
|
42
38
|
};
|
|
39
|
+
|
|
40
|
+
const PageTypeEditViewWrapper = () => {
|
|
41
|
+
const form = useCMEditViewDataManager() as any;
|
|
42
|
+
const { layout } = form;
|
|
43
|
+
const { selectedPlatform } = usePlatformFormData(form);
|
|
44
|
+
const isPageTypeCollectionType = layout.uid === PAGE_TYPE_UID;
|
|
45
|
+
|
|
46
|
+
if (!isPageTypeCollectionType || !selectedPlatform) {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return <PageTypeEditView />;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
export default PageTypeEditViewWrapper;
|
package/admin/src/index.tsx
CHANGED
|
@@ -5,7 +5,7 @@ import pluginId from './pluginId';
|
|
|
5
5
|
import Initializer from './components/Initializer';
|
|
6
6
|
import PageFiltersContainer from './components/PageFilters';
|
|
7
7
|
import { EditView } from './components/EditView';
|
|
8
|
-
import
|
|
8
|
+
import PageTypeEditViewWrapper from './components/PageTypeEditView';
|
|
9
9
|
import middlewares from './middlewares';
|
|
10
10
|
import PluginIcon from './components/PluginIcon';
|
|
11
11
|
import getTrad from './utils/getTrad';
|
|
@@ -67,7 +67,7 @@ export default {
|
|
|
67
67
|
});
|
|
68
68
|
app.injectContentManagerComponent('editView', 'right-links', {
|
|
69
69
|
name: 'page-type-edit-view',
|
|
70
|
-
Component:
|
|
70
|
+
Component: PageTypeEditViewWrapper
|
|
71
71
|
});
|
|
72
72
|
app.injectContentManagerComponent('listView', 'actions', {
|
|
73
73
|
name: 'page-filters',
|
|
@@ -3,6 +3,7 @@ import { useEffect } from 'react';
|
|
|
3
3
|
import { Platform } from '../../api/platform';
|
|
4
4
|
import { useDefaultPlatformFromLocalStorage } from './useDefaultPlatformFromLocalStorage';
|
|
5
5
|
import { useGetPlatformRelation } from '../../api/platform-relation';
|
|
6
|
+
import { PLATFORM_UID } from '../../../../shared/utils/constants';
|
|
6
7
|
|
|
7
8
|
const usePlatformFormData = (form?: Record<string, any>, onPlatformChange?: (platform: Platform) => void) => {
|
|
8
9
|
const { onChange, initialData, modifiedData, layout } = form || {};
|
|
@@ -13,12 +14,15 @@ const usePlatformFormData = (form?: Record<string, any>, onPlatformChange?: (pla
|
|
|
13
14
|
|
|
14
15
|
const { selectedPlatform: defaultPlatform, setSelectedPlatform: setDefaultPlatform } =
|
|
15
16
|
useDefaultPlatformFromLocalStorage();
|
|
17
|
+
const isPlatformPage = layout.uid === PLATFORM_UID;
|
|
16
18
|
|
|
17
19
|
useEffect(() => {
|
|
18
|
-
if (!isLoadingPlatform && !platformRelation?.id && defaultPlatform) {
|
|
20
|
+
if (!isLoadingPlatform && !platformRelation?.id && defaultPlatform && !isPlatformPage) {
|
|
19
21
|
handleSelectPlatform(defaultPlatform);
|
|
20
22
|
}
|
|
21
23
|
|
|
24
|
+
// If a user lands on a page which has a different platform linked than the one that is globally selected,
|
|
25
|
+
// we want to update the global selection to match the page's platform (if the user has access to it).
|
|
22
26
|
if (platformRelation?.id && defaultPlatform?.id && platformRelation.id !== defaultPlatform.id) {
|
|
23
27
|
setDefaultPlatform(platformRelation);
|
|
24
28
|
}
|
|
@@ -50,7 +54,9 @@ const usePlatformFormData = (form?: Record<string, any>, onPlatformChange?: (pla
|
|
|
50
54
|
|
|
51
55
|
return {
|
|
52
56
|
defaultPlatform,
|
|
53
|
-
selectedPlatform:
|
|
57
|
+
selectedPlatform:
|
|
58
|
+
(isPlatformPage && initialData) ||
|
|
59
|
+
(modifiedData?.platform?.[0]?.id ? modifiedData?.platform?.[0] : platformRelation),
|
|
54
60
|
isLoadingPlatform
|
|
55
61
|
};
|
|
56
62
|
};
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webbio/strapi-plugin-page-builder",
|
|
3
|
-
"version": "0.10
|
|
3
|
+
"version": "0.11.10-platform",
|
|
4
4
|
"description": "This is the description of the plugin.",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"develop": "tsc -p tsconfig.server.json -w",
|
|
@@ -20,14 +20,20 @@
|
|
|
20
20
|
"url": "https://github.com/webbio/strapi-plugin-page-builder.git"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
+
"@aws-sdk/client-ses": "^3.485.0",
|
|
23
24
|
"@mantine/hooks": "^7.2.2",
|
|
24
25
|
"@strapi/design-system": "^1.11.0",
|
|
25
26
|
"@strapi/helper-plugin": "^4.15.0",
|
|
26
27
|
"@strapi/icons": "^1.11.0",
|
|
28
|
+
"@strapi/provider-email-amazon-ses": "^4.16.2",
|
|
27
29
|
"@strapi/typescript-utils": "^4.15.0",
|
|
28
30
|
"@strapi/utils": "^4.15.0",
|
|
31
|
+
"add": "^2.0.6",
|
|
32
|
+
"aws-sdk": "^2.1528.0",
|
|
33
|
+
"handlebars": "^4.7.8",
|
|
29
34
|
"react-select": "^5.7.4",
|
|
30
|
-
"slugify": "^1.6.6"
|
|
35
|
+
"slugify": "^1.6.6",
|
|
36
|
+
"yarn": "^1.22.21"
|
|
31
37
|
},
|
|
32
38
|
"devDependencies": {
|
|
33
39
|
"@types/react": "^18.2.21",
|
package/dist/server/bootstrap.js
CHANGED
|
@@ -8,7 +8,7 @@ const constants_1 = require("../shared/utils/constants");
|
|
|
8
8
|
const permissions_1 = __importDefault(require("./bootstrap/permissions"));
|
|
9
9
|
const collection_type_lifecycles_1 = __importDefault(require("./bootstrap/collection-type-lifecycles"));
|
|
10
10
|
exports.default = async ({ strapi }) => {
|
|
11
|
-
var _a;
|
|
11
|
+
var _a, _b;
|
|
12
12
|
await (0, permissions_1.default)({ strapi });
|
|
13
13
|
await (0, collection_type_lifecycles_1.default)({ strapi });
|
|
14
14
|
const updateCollectionTypeData = (data, collectionTypeId, uid) => {
|
|
@@ -21,7 +21,37 @@ exports.default = async ({ strapi }) => {
|
|
|
21
21
|
};
|
|
22
22
|
return data;
|
|
23
23
|
};
|
|
24
|
+
const plugin = strapi.plugin('users-permissions');
|
|
25
|
+
plugin.services.user.fetchAuthenticatedUser = async (id) => {
|
|
26
|
+
return strapi.query('plugin::users-permissions.user').findOne({ where: { id }, populate: ['role', 'platform'] });
|
|
27
|
+
};
|
|
24
28
|
(_a = strapi.db) === null || _a === void 0 ? void 0 : _a.lifecycles.subscribe({
|
|
29
|
+
models: [constants_1.USER_PERMISSION_USER_PLUGIN],
|
|
30
|
+
async beforeUpdate(event) {
|
|
31
|
+
var _a;
|
|
32
|
+
if (event.params.data.id) {
|
|
33
|
+
const userToUpdate = await ((_a = strapi.entityService) === null || _a === void 0 ? void 0 : _a.findOne(constants_1.USER_PERMISSION_USER_PLUGIN, event.params.data.id, {
|
|
34
|
+
populate: { platform: { populate: { platformEmails: { populate: '*' } } } }
|
|
35
|
+
}));
|
|
36
|
+
if (userToUpdate) {
|
|
37
|
+
if (event.params.data.activateUser && event.params.data.confirmed && !userToUpdate.confirmMailSend) {
|
|
38
|
+
await strapi.service(constants_1.PAGE_BUILDER_EMAIL_PLUGIN).sendMail({
|
|
39
|
+
// @ts-ignore strapi typings
|
|
40
|
+
from: userToUpdate.platform.platformEmails.accountAcceptedMail.fromEmail,
|
|
41
|
+
to: event.params.data.email,
|
|
42
|
+
// @ts-ignore
|
|
43
|
+
subject: userToUpdate.platform.platformEmails.accountAcceptedMail.subject,
|
|
44
|
+
// @ts-ignore
|
|
45
|
+
text: userToUpdate.platform.platformEmails.accountAcceptedMail.message,
|
|
46
|
+
firstName: event.params.data.firstName,
|
|
47
|
+
lastName: event.params.data.lastName
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
(_b = strapi.db) === null || _b === void 0 ? void 0 : _b.lifecycles.subscribe({
|
|
25
55
|
// @ts-ignore
|
|
26
56
|
models: [constants_1.PAGE_UID],
|
|
27
57
|
async beforeCreate(event) {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"kind": "collectionType",
|
|
3
|
+
"collectionName": "categories",
|
|
4
|
+
"info": {
|
|
5
|
+
"singularName": "category",
|
|
6
|
+
"pluralName": "categories",
|
|
7
|
+
"displayName": "category"
|
|
8
|
+
},
|
|
9
|
+
"options": {
|
|
10
|
+
"draftAndPublish": false,
|
|
11
|
+
"comment": ""
|
|
12
|
+
},
|
|
13
|
+
"attributes": {
|
|
14
|
+
"title": {
|
|
15
|
+
"type": "string"
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
6
|
+
const schema_json_1 = __importDefault(require("./category/schema.json"));
|
|
7
|
+
exports.default = {
|
|
8
|
+
category: {
|
|
9
|
+
schema: schema_json_1.default
|
|
10
|
+
}
|
|
11
|
+
};
|
|
@@ -8,10 +8,12 @@ const page_type_1 = __importDefault(require("./page-type"));
|
|
|
8
8
|
const collection_types_1 = __importDefault(require("./collection-types"));
|
|
9
9
|
const template_1 = __importDefault(require("./template"));
|
|
10
10
|
const platform_1 = __importDefault(require("./platform"));
|
|
11
|
+
const private_content_1 = __importDefault(require("./private-content"));
|
|
11
12
|
exports.default = {
|
|
12
13
|
page: page_1.default,
|
|
13
14
|
'page-type': page_type_1.default,
|
|
14
15
|
'collection-types': collection_types_1.default,
|
|
15
16
|
template: template_1.default,
|
|
16
|
-
platform: platform_1.default
|
|
17
|
+
platform: platform_1.default,
|
|
18
|
+
'private-content': private_content_1.default
|
|
17
19
|
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = {
|
|
4
|
+
async activateUser(ctx) {
|
|
5
|
+
try {
|
|
6
|
+
const user = await strapi.service('plugin::page-builder.private-content').activateUser(ctx.params.token);
|
|
7
|
+
const callbackUrl = `${user.platform.domain}/inloggen`;
|
|
8
|
+
return ctx.redirect(callbackUrl);
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
console.log(ctx);
|
|
12
|
+
return ctx.unauthorized('User is already confirmed or token is invalid');
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
removeInactiveUsers(ctx) {
|
|
16
|
+
return strapi.service('plugin::page-builder.private-content').removeInactiveUsers();
|
|
17
|
+
}
|
|
18
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const sitemap_1 = require("sitemap");
|
|
4
|
+
const stream_1 = require("stream");
|
|
5
|
+
exports.default = {
|
|
6
|
+
async generate(ctx) {
|
|
7
|
+
const domain = 'http://localhost:3000/ketenafspraken';
|
|
8
|
+
ctx.set('Content-Type', 'text/xml');
|
|
9
|
+
const entities = await strapi.service('plugin::page-builder.sitemap').generateSitemap(domain);
|
|
10
|
+
const links = entities.map(({ path }) => ({
|
|
11
|
+
url: `/${path}`,
|
|
12
|
+
changefreq: 'daily',
|
|
13
|
+
priority: 0.7
|
|
14
|
+
}));
|
|
15
|
+
const stream = new sitemap_1.SitemapStream({ hostname: 'http://localhost:3000/ketenafspraken' });
|
|
16
|
+
const sitemap = await (0, sitemap_1.streamToPromise)(stream_1.Readable.from(links).pipe(stream)).then((data) => data.toString());
|
|
17
|
+
console.log(sitemap);
|
|
18
|
+
return sitemap;
|
|
19
|
+
}
|
|
20
|
+
};
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const constants_1 = require("../../shared/utils/constants");
|
|
4
|
+
const apollo_server_koa_1 = require("apollo-server-koa");
|
|
5
|
+
const strapi_1 = require("../utils/strapi");
|
|
4
6
|
const getPageByPath = (strapi) => {
|
|
5
7
|
const typeDefs = () => {
|
|
6
8
|
return `
|
|
@@ -20,7 +22,7 @@ const getPageByPath = (strapi) => {
|
|
|
20
22
|
Query: {
|
|
21
23
|
getPageByPath: {
|
|
22
24
|
resolve: async (_parent, args, ctx) => {
|
|
23
|
-
var _a;
|
|
25
|
+
var _a, _b, _c, _d, _e;
|
|
24
26
|
try {
|
|
25
27
|
const filteredArgs = {
|
|
26
28
|
filters: {
|
|
@@ -61,7 +63,23 @@ const getPageByPath = (strapi) => {
|
|
|
61
63
|
};
|
|
62
64
|
const results = await getPage();
|
|
63
65
|
if (((_a = Object.values(results)) === null || _a === void 0 ? void 0 : _a.filter(Boolean).length) > 0) {
|
|
64
|
-
|
|
66
|
+
if (!((_b = results === null || results === void 0 ? void 0 : results.platform) === null || _b === void 0 ? void 0 : _b.isPrivate) && !(results === null || results === void 0 ? void 0 : results.isPrivate)) {
|
|
67
|
+
return results;
|
|
68
|
+
}
|
|
69
|
+
if ((((_c = results === null || results === void 0 ? void 0 : results.platform) === null || _c === void 0 ? void 0 : _c.isPrivate) === true && ctx.koaContext.req.headers.authorization) ||
|
|
70
|
+
((results === null || results === void 0 ? void 0 : results.isPrivate) === true && ctx.koaContext.req.headers.authorization)) {
|
|
71
|
+
const auth = ctx.koaContext.req.headers.authorization;
|
|
72
|
+
const token = auth.split(' ');
|
|
73
|
+
const jwtService = strapi.plugin('users-permissions').service('jwt');
|
|
74
|
+
const decodedToken = await jwtService.verify(token[1]);
|
|
75
|
+
if (decodedToken) {
|
|
76
|
+
const user = ctx.state.user;
|
|
77
|
+
if (((_d = user === null || user === void 0 ? void 0 : user.platform) === null || _d === void 0 ? void 0 : _d.id) === ((_e = results === null || results === void 0 ? void 0 : results.platform) === null || _e === void 0 ? void 0 : _e.id)) {
|
|
78
|
+
return results;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return new apollo_server_koa_1.ForbiddenError('Forbidden access');
|
|
65
83
|
}
|
|
66
84
|
else {
|
|
67
85
|
throw new Error(ctx.koaContext.response.message);
|
|
@@ -76,8 +94,10 @@ const getPageByPath = (strapi) => {
|
|
|
76
94
|
}
|
|
77
95
|
};
|
|
78
96
|
};
|
|
97
|
+
const pageBuilderConfig = (0, strapi_1.getConfig)();
|
|
79
98
|
const resolversConfig = {
|
|
80
99
|
'Query.getPageByPath': {
|
|
100
|
+
policies: (pageBuilderConfig === null || pageBuilderConfig === void 0 ? void 0 : pageBuilderConfig.privateContent) === true ? ['plugin::page-builder.isAuthorizedForPage'] : [],
|
|
81
101
|
auth: false
|
|
82
102
|
}
|
|
83
103
|
};
|
|
@@ -1,3 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
6
|
+
const isAuthorizedPage_1 = __importDefault(require("./isAuthorizedPage"));
|
|
7
|
+
exports.default = {
|
|
8
|
+
isAuthorizedForPage: isAuthorizedPage_1.default
|
|
9
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const isAuthorizedForPage = (policyContext, _config, { strapi }) => {
|
|
4
|
+
const pageToken = policyContext.http.request.headers['x-strapi-page-secret'];
|
|
5
|
+
const pageEnvToken = process.env.STRAPI_PAGE_SECRET;
|
|
6
|
+
if (pageToken && pageEnvToken && pageToken === pageEnvToken) {
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
return false;
|
|
10
|
+
};
|
|
11
|
+
exports.default = isAuthorizedForPage;
|
package/dist/server/register.js
CHANGED
|
@@ -17,5 +17,7 @@ exports.default = async ({ strapi }) => {
|
|
|
17
17
|
extensionService.use(page_type_1.default);
|
|
18
18
|
extensionService.use((0, page_by_path_1.default)(strapi));
|
|
19
19
|
extensionService.use((0, pages_by_uid_1.default)(strapi));
|
|
20
|
+
extensionService.shadowCRUD('api::page.page').disableActions(['find', 'findOne']);
|
|
20
21
|
await ((_b = (_a = strapi.services) === null || _a === void 0 ? void 0 : _a['plugin::page-builder.builder']) === null || _b === void 0 ? void 0 : _b.buildContentTypes());
|
|
22
|
+
await strapi.service('plugin::page-builder.private-content').enablePrivateContent();
|
|
21
23
|
};
|
|
@@ -1,6 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const routes = {
|
|
4
|
+
'private-content': {
|
|
5
|
+
type: 'content-api',
|
|
6
|
+
prefix: undefined,
|
|
7
|
+
routes: [
|
|
8
|
+
{
|
|
9
|
+
method: 'GET',
|
|
10
|
+
path: '/activate/:token',
|
|
11
|
+
handler: 'private-content.activateUser',
|
|
12
|
+
config: { policies: [], auth: false }
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
method: 'POST',
|
|
16
|
+
path: '/removeInactiveUsers',
|
|
17
|
+
handler: 'private-content.removeInactiveUsers'
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
},
|
|
4
21
|
'page-type': {
|
|
5
22
|
type: 'admin',
|
|
6
23
|
prefix: undefined,
|
|
@@ -14,8 +14,14 @@ const page_type_end_json_1 = __importDefault(require("../schema/page-type-end.js
|
|
|
14
14
|
const template_start_json_1 = __importDefault(require("../schema/template-start.json"));
|
|
15
15
|
const template_end_json_1 = __importDefault(require("../schema/template-end.json"));
|
|
16
16
|
const platform_start_json_1 = __importDefault(require("../schema/platform-start.json"));
|
|
17
|
+
const email_json_1 = __importDefault(require("./private-content/components/email.json"));
|
|
18
|
+
const platform_email_json_1 = __importDefault(require("./private-content/components/platform-email.json"));
|
|
19
|
+
const admin_email_json_1 = __importDefault(require("./private-content/components/admin-email.json"));
|
|
17
20
|
const UIDS = [constants_1.TEMPLATE_UID, constants_1.PAGE_TYPE_UID, constants_1.PLATFORM_UID, constants_1.PAGE_UID];
|
|
18
21
|
exports.default = {
|
|
22
|
+
async buildComponents() {
|
|
23
|
+
await this.createEmailComponents();
|
|
24
|
+
},
|
|
19
25
|
async buildContentTypes() {
|
|
20
26
|
this.listenToCreatedContentTypes();
|
|
21
27
|
await this.createContentTypes();
|
|
@@ -28,6 +34,86 @@ exports.default = {
|
|
|
28
34
|
}
|
|
29
35
|
});
|
|
30
36
|
},
|
|
37
|
+
async createEmailComponents() {
|
|
38
|
+
const foundEmailComponent = strapi.components['internal.email'];
|
|
39
|
+
const foundAdminEmail = strapi.components['internal.admin-email'];
|
|
40
|
+
const foundPlatformEmail = strapi.components['internal.platform-email'];
|
|
41
|
+
if (!foundAdminEmail && !foundEmailComponent && !foundPlatformEmail) {
|
|
42
|
+
try {
|
|
43
|
+
const res = await strapi.plugin('content-type-builder').services.components.createComponent({
|
|
44
|
+
component: {
|
|
45
|
+
category: 'internal',
|
|
46
|
+
displayName: platform_email_json_1.default.info.displayName,
|
|
47
|
+
attributes: platform_email_json_1.default.attributes
|
|
48
|
+
},
|
|
49
|
+
components: [
|
|
50
|
+
{
|
|
51
|
+
tmpUID: 'internal.email',
|
|
52
|
+
category: 'internal',
|
|
53
|
+
displayName: email_json_1.default.info.displayName,
|
|
54
|
+
attributes: email_json_1.default.attributes
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
tmpUID: 'internal.admin-email',
|
|
58
|
+
category: 'internal',
|
|
59
|
+
displayName: admin_email_json_1.default.info.displayName,
|
|
60
|
+
attributes: admin_email_json_1.default.attributes
|
|
61
|
+
}
|
|
62
|
+
]
|
|
63
|
+
});
|
|
64
|
+
return res;
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
console.log(error);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
async createEmailComponent() {
|
|
72
|
+
try {
|
|
73
|
+
const res = await strapi.plugin('content-type-builder').services.components.createComponent({
|
|
74
|
+
component: {
|
|
75
|
+
category: 'internal',
|
|
76
|
+
displayName: email_json_1.default.info.displayName,
|
|
77
|
+
attributes: email_json_1.default.attributes
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
return res;
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
console.log(error);
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
async createPlatformEmail() {
|
|
87
|
+
try {
|
|
88
|
+
const res = await strapi.plugin('content-type-builder').services.components.createComponent({
|
|
89
|
+
component: {
|
|
90
|
+
category: 'internal',
|
|
91
|
+
displayName: platform_email_json_1.default.info.displayName,
|
|
92
|
+
attributes: platform_email_json_1.default.attributes
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
return res;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
console.log(error);
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
async createAdminEmail() {
|
|
102
|
+
try {
|
|
103
|
+
const res = await strapi.plugin('content-type-builder').services.components.createComponent({
|
|
104
|
+
component: {
|
|
105
|
+
category: 'internal',
|
|
106
|
+
displayName: admin_email_json_1.default.info.displayName,
|
|
107
|
+
attributes: admin_email_json_1.default.attributes
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
console.log(res);
|
|
111
|
+
return res;
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
console.log(error);
|
|
115
|
+
}
|
|
116
|
+
},
|
|
31
117
|
async createContentTypes() {
|
|
32
118
|
const newContentTypes = UIDS.filter((c) => !Boolean(strapi.contentType(c)))
|
|
33
119
|
.map((c) => { var _a; return (_a = this.getContentType(c)) === null || _a === void 0 ? void 0 : _a.create; })
|