@webbio/strapi-plugin-page-builder 0.9.6-platform → 0.9.8-authentication

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 (80) hide show
  1. package/README.md +65 -0
  2. package/admin/src/api/search-filtered-entity.ts +20 -21
  3. package/admin/src/components/Combobox/react-select-custom-styles.tsx +1 -1
  4. package/admin/src/components/EditView/CollectionTypeSearch/index.tsx +1 -1
  5. package/admin/src/components/PlatformFilteredSelectField/Multi/index.tsx +8 -4
  6. package/admin/src/components/PlatformFilteredSelectField/Single/index.tsx +8 -3
  7. package/admin/src/components/PlatformFilteredSelectField/index.tsx +39 -5
  8. package/admin/src/components/PlatformFilteredSelectField/utils/relation-helper.ts +8 -1
  9. package/admin/src/components/StrapiCore/admin/admin/src/content-manager/components/Relations/utils/getRelationLink.ts +1 -1
  10. package/dist/package.json +9 -3
  11. package/dist/server/bootstrap.js +31 -1
  12. package/dist/server/controllers/index.js +3 -1
  13. package/dist/server/controllers/private-content.js +10 -0
  14. package/dist/server/graphql/page-by-path.js +19 -2
  15. package/dist/server/register.js +13 -0
  16. package/dist/server/routes/index.js +17 -0
  17. package/dist/server/schema/page-end.json +8 -0
  18. package/dist/server/services/builder.js +86 -0
  19. package/dist/server/services/constants/customUserConstants.js +16 -0
  20. package/dist/server/services/custom-user.js +161 -0
  21. package/dist/server/services/email.js +127 -0
  22. package/dist/server/services/index.js +5 -1
  23. package/dist/server/services/private-content/auth.js +0 -0
  24. package/dist/server/services/private-content/components/admin-email.json +22 -0
  25. package/dist/server/services/private-content/components/email.json +22 -0
  26. package/dist/server/services/private-content/components/platform-email.json +30 -0
  27. package/dist/server/services/private-content/constants/index.js +16 -0
  28. package/dist/server/services/private-content/email.js +3 -0
  29. package/dist/server/services/private-content/graphql/index.js +77 -0
  30. package/dist/server/services/private-content/graphql/resolvers/findOnePage.js +40 -0
  31. package/dist/server/services/private-content/graphql/resolvers/findPage.js +43 -0
  32. package/dist/server/services/private-content/graphql/resolvers/forgot-password.js +26 -0
  33. package/dist/server/services/private-content/graphql/resolvers/login.js +44 -0
  34. package/dist/server/services/private-content/graphql/resolvers/register.js +60 -0
  35. package/dist/server/services/private-content/graphql/resolvers/reset-password.js +41 -0
  36. package/dist/server/services/private-content/graphql/types/index.js +91 -0
  37. package/dist/server/services/private-content/graphql.js +128 -0
  38. package/dist/server/services/private-content/hash.js +0 -0
  39. package/dist/server/services/private-content/index.js +81 -0
  40. package/dist/server/services/private-content/mail-template/txtMail.email.template.text.js +12 -0
  41. package/dist/server/services/private-content/mail-template/txtMail.interface.js +2 -0
  42. package/dist/server/services/private-content/page.js +17 -0
  43. package/dist/server/services/private-content/platform.js +17 -0
  44. package/dist/server/services/private-content/schemas/index.js +30 -0
  45. package/dist/server/services/private-content/user.js +159 -0
  46. package/dist/server/utils/strapi.js +9 -1
  47. package/dist/shared/utils/constants.js +3 -1
  48. package/dist/tsconfig.server.tsbuildinfo +1 -1
  49. package/package.json +9 -3
  50. package/server/bootstrap.ts +39 -1
  51. package/server/controllers/index.ts +3 -1
  52. package/server/controllers/private-content.ts +10 -0
  53. package/server/graphql/page-by-path.ts +24 -2
  54. package/server/register.ts +14 -0
  55. package/server/routes/index.ts +17 -0
  56. package/server/schema/page-end.json +9 -1
  57. package/server/services/builder.ts +83 -1
  58. package/server/services/email.ts +122 -0
  59. package/server/services/index.ts +5 -1
  60. package/server/services/private-content/components/admin-email.json +23 -0
  61. package/server/services/private-content/components/email.json +23 -0
  62. package/server/services/private-content/components/platform-email.json +30 -0
  63. package/server/services/private-content/constants/index.ts +13 -0
  64. package/server/services/private-content/graphql/index.ts +88 -0
  65. package/server/services/private-content/graphql/resolvers/findOnePage.ts +40 -0
  66. package/server/services/private-content/graphql/resolvers/findPage.ts +45 -0
  67. package/server/services/private-content/graphql/resolvers/forgot-password.ts +26 -0
  68. package/server/services/private-content/graphql/resolvers/login.ts +51 -0
  69. package/server/services/private-content/graphql/resolvers/register.ts +68 -0
  70. package/server/services/private-content/graphql/resolvers/reset-password.ts +44 -0
  71. package/server/services/private-content/graphql/types/index.ts +98 -0
  72. package/server/services/private-content/index.ts +84 -0
  73. package/server/services/private-content/mail-template/txtMail.email.template.text.ts +7 -0
  74. package/server/services/private-content/mail-template/txtMail.interface.ts +7 -0
  75. package/server/services/private-content/page.ts +14 -0
  76. package/server/services/private-content/platform.ts +14 -0
  77. package/server/services/private-content/schemas/index.ts +28 -0
  78. package/server/services/private-content/user.ts +187 -0
  79. package/server/utils/strapi.ts +5 -0
  80. package/shared/utils/constants.ts +2 -0
package/README.md CHANGED
@@ -77,6 +77,71 @@ 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
+
93
+ ## Custom field: Filtered Select
94
+
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.
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
+ ### Voorbeeld
114
+ Ik wil een lijst van vacature relaties selecteren. Deze vacatures moeten van hetzelfde platform zijn als het platform dat globaal is geselecteerd:
115
+
116
+ ```JSON
117
+ "vacatures": {
118
+ "type": "relation",
119
+ "relation": "oneToMany",
120
+ "target": "api::vacancy.vacancy"
121
+ },
122
+ "vacaturesFiltered": {
123
+ "pluginOptions": {
124
+ "filteredSelect": {
125
+ // Targets neighbouring field with selected name.
126
+ "targetField": "vacatures",
127
+ // (Default: undefined) Adds filters to the $and query for result filtering
128
+ "customFilters": [{ "title": { "$contains": "Hoi" } }],
129
+ // (Default: true). Disables result filtering by globally selected platform
130
+ "disablePlatformFilter": boolean,
131
+ // (Default: false) Hides id of the entity that is edited if it's the same as the targetField uid. So if this is enabled on a vacancy entity and also targets other vacancies, the current vacancy that is edited will not be shown.
132
+ "hideSameEntity": boolean
133
+ }
134
+ },
135
+ "type": "customField",
136
+ "customField": "plugin::page-builder.filtered-select"
137
+ },
138
+ ```
139
+
140
+ Je ziet dat het `vacatures` veld nodig is voor het custom field om te "targeten". Het custom veld weet dankzij de optie `targetField` welke waarde hij waar moet zetten. In de admin is het belangrijk dat je het `vacatures` veld verbergt, zodat enkel de gefilterde variant zichtbaar is.
141
+
142
+ 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)
143
+
144
+
80
145
  # Known bugs
81
146
 
82
147
  - Na het ontkoppelen en opslaan van een collectie item op een pagina, staat deze nog als "Geselecteerd" in de dropdown.
@@ -2,6 +2,7 @@ import { useQuery, UseQueryOptions } from 'react-query';
2
2
  import orderBy from 'lodash/orderBy';
3
3
 
4
4
  import { useFetchClient } from '@strapi/helper-plugin';
5
+ import qs from 'qs';
5
6
 
6
7
  export type SearchFilteredEntitiesResult = {
7
8
  pagination: {
@@ -27,6 +28,7 @@ type SearchFilteredEntitiesQueryParams = {
27
28
  searchQuery?: string;
28
29
  platformTitle?: string;
29
30
  notIds?: number[];
31
+ customFilters?: Record<string, any>[];
30
32
  };
31
33
 
32
34
  const QUERY_KEY = 'filteredEntities';
@@ -38,33 +40,30 @@ export const getSearchFilteredEntities = async ({
38
40
  locale,
39
41
  searchQuery,
40
42
  platformTitle,
41
- notIds
43
+ notIds,
44
+ customFilters
42
45
  }: SearchFilteredEntitiesQueryParams): Promise<SearchFilteredEntitiesResult> => {
43
46
  try {
44
47
  const { get } = fetchClient;
45
- const searchParams = new URLSearchParams();
46
- searchParams.append('page', String(page));
47
- searchParams.append('pageSize', '20');
48
- searchParams.append('locale', locale);
48
+ const notIdFilters = notIds && notIds.length > 0 ? notIds.map((id) => ({ id: { $ne: id } })) : [];
49
+ const customFilterObject = Array.isArray(customFilters) ? customFilters : [];
49
50
 
50
- if (searchQuery) {
51
- searchParams.delete('sort');
52
- searchParams.append('sort', 'title:ASC');
53
- searchParams.append('_q', searchQuery);
54
- }
55
-
56
- if (platformTitle) {
57
- searchParams.append('filters[$and][0][platform][title][$contains]', String(platformTitle));
58
- }
59
-
60
- if (notIds && notIds.length > 0) {
61
- for (let index = 0; index < notIds.length; index++) {
62
- const id = notIds[index];
63
- searchParams.append(`filters[$and][${index + 1}][id][$ne]`, String(id));
51
+ const filters = qs.stringify({
52
+ page,
53
+ pageSize: 20,
54
+ locale,
55
+ sort: searchQuery ? 'title:ASC' : undefined,
56
+ _q: searchQuery || undefined,
57
+ filters: {
58
+ $and: [
59
+ { platform: { title: { $contains: platformTitle || undefined } } },
60
+ ...notIdFilters,
61
+ ...customFilterObject
62
+ ]
64
63
  }
65
- }
64
+ });
66
65
 
67
- const { data } = await get(`/content-manager/collection-types/${uid}?${searchParams.toString()}`);
66
+ const { data } = await get(`/content-manager/collection-types/${uid}?${filters}`);
68
67
 
69
68
  const mapResults = data.results.map(
70
69
  (result: Record<string, any>): SearchFilteredEntitiesResult['results'][number] => ({
@@ -10,7 +10,7 @@ export const useReactSelectCustomStyles = (): StylesConfig<IReactSelectValue, fa
10
10
  control: (provided, { isFocused, isDisabled }) => ({
11
11
  ...provided,
12
12
  color: theme.colors.neutral800,
13
- backgroundColor: theme.colors.neutral0,
13
+ backgroundColor: isDisabled ? theme.colors.neutral100 : theme.colors.neutral0,
14
14
  minHeight: '40px',
15
15
  lineHeight: 1.4,
16
16
  borderRadius: theme.borderRadius,
@@ -123,5 +123,5 @@ const getInitialSelectItem = (id?: string, title?: string): SingleValue<IReactSe
123
123
  value: String(id),
124
124
  label: title ?? '',
125
125
  initialSelected: true
126
- }
126
+ }
127
127
  : null;
@@ -25,7 +25,8 @@ export interface IMultiPlatformFilteredSelectFieldProps extends IPlatformFiltere
25
25
  isCloningEntry?: boolean;
26
26
  totalRelations: number;
27
27
  relationsFromModifiedData?: Record<string, any>[];
28
- selectedPlatform: Platform;
28
+ selectedPlatform?: Platform;
29
+ hiddenId?: number[];
29
30
  }
30
31
 
31
32
  const MultiPlatformFilteredSelectField = ({
@@ -41,7 +42,8 @@ const MultiPlatformFilteredSelectField = ({
41
42
  isCloningEntry,
42
43
  totalRelations,
43
44
  relationsFromModifiedData,
44
- selectedPlatform
45
+ selectedPlatform,
46
+ hiddenId
45
47
  }: IMultiPlatformFilteredSelectFieldProps) => {
46
48
  const fetchClient = useFetchClient();
47
49
  const {
@@ -98,8 +100,9 @@ const MultiPlatformFilteredSelectField = ({
98
100
  uid: targetAttributes?.target || '',
99
101
  locale: selectedLocale,
100
102
  searchQuery: inputValue,
101
- platformTitle: selectedPlatform?.title,
102
- notIds: selectedResults?.data?.map((x: Record<string, any>) => x.id)
103
+ platformTitle: attribute?.pluginOptions?.filteredSelect?.disablePlatformFilter ? '' : selectedPlatform?.title,
104
+ notIds: [...(selectedResults?.data || []).map((x: Record<string, any>) => x.id), ...(hiddenId || [])],
105
+ customFilters: attribute?.pluginOptions?.filteredSelect?.customFilters
103
106
  });
104
107
 
105
108
  const mapped = entities?.results.map((x) => ({
@@ -199,6 +202,7 @@ const MultiPlatformFilteredSelectField = ({
199
202
  hint={hint || ''}
200
203
  labelAction={labelAction}
201
204
  required={required}
205
+ disabled={!selectedPlatform}
202
206
  />
203
207
  );
204
208
  };
@@ -17,7 +17,8 @@ import RelationHelper, { IPlatformFilteredSelectFieldProps } from '../utils/rela
17
17
  import { Platform } from '../../../api/platform';
18
18
 
19
19
  export interface ISinglePlatformFilteredSelectFieldProps extends IPlatformFilteredSelectFieldProps {
20
- selectedPlatform: Platform;
20
+ selectedPlatform?: Platform;
21
+ hiddenId?: number[];
21
22
  }
22
23
 
23
24
  interface CustomReactSelectValue extends Omit<IReactSelectValue, 'initialSelected'> {
@@ -36,7 +37,8 @@ const SinglePlatformFilteredSelectField = ({
36
37
  error,
37
38
  intlLabel,
38
39
  name,
39
- selectedPlatform
40
+ selectedPlatform,
41
+ hiddenId
40
42
  }: ISinglePlatformFilteredSelectFieldProps) => {
41
43
  const fetchClient = useFetchClient();
42
44
  const { onChange, initialData, modifiedData, isCreatingEntry, layout, allLayoutData } =
@@ -112,7 +114,9 @@ const SinglePlatformFilteredSelectField = ({
112
114
  uid: targetAttributes?.target || '',
113
115
  locale: selectedLocale,
114
116
  searchQuery: inputValue,
115
- platformTitle
117
+ platformTitle: attribute?.pluginOptions?.filteredSelect?.disablePlatformFilter ? '' : platformTitle,
118
+ customFilters: attribute?.pluginOptions?.filteredSelect?.customFilters,
119
+ notIds: hiddenId
116
120
  });
117
121
 
118
122
  return pages?.results.map((x) => ({
@@ -151,6 +155,7 @@ const SinglePlatformFilteredSelectField = ({
151
155
  defaultOptions
152
156
  hideSelectedOptions
153
157
  labelAction={labelAction}
158
+ isDisabled={!selectedPlatform}
154
159
  />
155
160
 
156
161
  <S.LinkToPage
@@ -8,7 +8,7 @@ import { useRelationLoad } from './hooks/useRelationLoad';
8
8
  import { usePlatformFormData } from '../../utils/hooks/usePlatformFormData';
9
9
 
10
10
  const PlatformFilteredSelectField = (props: IPlatformFilteredSelectFieldProps) => {
11
- const { name, attribute } = props;
11
+ const { name, attribute, labelAction } = props;
12
12
  const form = useCMEditViewDataManager() as any;
13
13
  const { modifiedData, layout, allLayoutData } = form;
14
14
  const { selectedPlatform } = usePlatformFormData(form);
@@ -17,13 +17,22 @@ const PlatformFilteredSelectField = (props: IPlatformFilteredSelectFieldProps) =
17
17
  const toOneRelation = ['oneWay', 'oneToOne', 'manyToOne', 'oneToManyMorph', 'oneToOneMorph'].includes(
18
18
  targetAttributes?.relation || ''
19
19
  );
20
+ const hiddenId =
21
+ attribute?.pluginOptions?.filteredSelect?.hideSameEntity && layout.uid === targetAttributes?.targetModel
22
+ ? [modifiedData.id]
23
+ : [];
20
24
 
21
- if (!selectedPlatform) {
22
- return null;
23
- }
25
+ const correctedLabelAction = getLocalizedActionLabel(labelAction, layout);
24
26
 
25
27
  if (toOneRelation) {
26
- return <SinglePlatformFilteredSelectField selectedPlatform={selectedPlatform} {...props} />;
28
+ return (
29
+ <SinglePlatformFilteredSelectField
30
+ selectedPlatform={selectedPlatform}
31
+ hiddenId={hiddenId}
32
+ {...props}
33
+ labelAction={correctedLabelAction}
34
+ />
35
+ );
27
36
  }
28
37
 
29
38
  return (
@@ -33,7 +42,9 @@ const PlatformFilteredSelectField = (props: IPlatformFilteredSelectFieldProps) =
33
42
  isCloningEntry={isCloningEntry}
34
43
  totalRelations={totalRelations}
35
44
  relationsFromModifiedData={relationsFromModifiedData}
45
+ hiddenId={hiddenId}
36
46
  {...props}
47
+ labelAction={correctedLabelAction}
37
48
  />
38
49
  );
39
50
  };
@@ -49,3 +60,26 @@ PlatformFilteredSelectField.defaultProps = {
49
60
  };
50
61
 
51
62
  export default PlatformFilteredSelectField;
63
+
64
+ const getLocalizedActionLabel = (actionLabel?: JSX.Element, layout?: Record<string, any>): JSX.Element | undefined => {
65
+ if (!actionLabel) {
66
+ return undefined;
67
+ }
68
+
69
+ if (!layout?.layouts?.edit || layout?.layouts?.edit?.length === 0) {
70
+ return actionLabel;
71
+ }
72
+
73
+ if (layout?.pluginOptions?.i18n?.localized === true) {
74
+ for (let index = 0; index < layout?.layouts?.edit.length; index++) {
75
+ const element = layout?.layouts?.edit[index];
76
+ const foundElement = element.find(
77
+ (x: Record<string, any>) => x.fieldSchema?.pluginOptions?.i18n?.localized === true
78
+ );
79
+
80
+ if (foundElement?.labelAction) {
81
+ return foundElement.labelAction;
82
+ }
83
+ }
84
+ }
85
+ };
@@ -21,7 +21,14 @@ export interface IPlatformFilteredSelectFieldProps {
21
21
  intlLabel?: MessageDescriptor & Parameters<IntlFormatters['formatMessage']>;
22
22
  onChange?: any;
23
23
  attribute?: {
24
- pluginOptions?: { filteredSelect?: { targetField?: string } };
24
+ pluginOptions?: {
25
+ filteredSelect?: {
26
+ targetField?: string;
27
+ customFilters?: Record<string, any>[];
28
+ disablePlatformFilter?: boolean;
29
+ hideSameEntity?: boolean;
30
+ };
31
+ };
25
32
  required?: boolean;
26
33
  };
27
34
  name?: string;
@@ -1,5 +1,5 @@
1
1
  import { Entity } from '@strapi/types';
2
2
 
3
3
  export function getRelationLink(targetModel: string, id?: Entity.ID) {
4
- return `/content-manager/collection-types/${targetModel}/${id ?? ''}`;
4
+ return `/content-manager/collectionType/${targetModel}/${id ?? ''}`;
5
5
  }
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webbio/strapi-plugin-page-builder",
3
- "version": "0.9.6-platform",
3
+ "version": "0.9.8-authentication",
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",
@@ -42,7 +48,7 @@
42
48
  },
43
49
  "peerDependencies": {
44
50
  "@strapi/strapi": "^4.15.0",
45
- "@webbio/strapi-plugin-slug": "^3.0.0",
51
+ "@webbio/strapi-plugin-slug": "^3.0.1",
46
52
  "react": "^17.0.0 || ^18.0.0",
47
53
  "react-dom": "^17.0.0 || ^18.0.0",
48
54
  "react-router-dom": "^5.3.4",
@@ -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: { platformMails: { 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.platformMails.accountAcceptedMail.fromEmail,
41
+ to: event.params.data.email,
42
+ // @ts-ignore
43
+ subject: userToUpdate.platform.platformMails.accountAcceptedMail.subject,
44
+ // @ts-ignore
45
+ text: userToUpdate.platform.platformMails.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) {
@@ -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,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = {
4
+ activateUser(ctx) {
5
+ return strapi.service('plugin::page-builder.private-content').activateUser(ctx.params.token);
6
+ },
7
+ removeInactiveUsers(ctx) {
8
+ return strapi.service('plugin::page-builder.private-content').removeInactiveUsers();
9
+ }
10
+ };
@@ -1,6 +1,7 @@
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");
4
5
  const getPageByPath = (strapi) => {
5
6
  const typeDefs = () => {
6
7
  return `
@@ -20,7 +21,7 @@ const getPageByPath = (strapi) => {
20
21
  Query: {
21
22
  getPageByPath: {
22
23
  resolve: async (_parent, args, ctx) => {
23
- var _a;
24
+ var _a, _b, _c, _d, _e;
24
25
  try {
25
26
  const filteredArgs = {
26
27
  filters: {
@@ -61,7 +62,23 @@ const getPageByPath = (strapi) => {
61
62
  };
62
63
  const results = await getPage();
63
64
  if (((_a = Object.values(results)) === null || _a === void 0 ? void 0 : _a.filter(Boolean).length) > 0) {
64
- return results;
65
+ if (!((_b = results === null || results === void 0 ? void 0 : results.platform) === null || _b === void 0 ? void 0 : _b.isPrivate) && !results.isPrivate) {
66
+ return results;
67
+ }
68
+ 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) ||
69
+ ((results === null || results === void 0 ? void 0 : results.isPrivate) === true && ctx.koaContext.req.headers.authorization)) {
70
+ const auth = ctx.koaContext.req.headers.authorization;
71
+ const token = auth.split(' ');
72
+ const jwtService = strapi.plugin('users-permissions').service('jwt');
73
+ const decodedToken = await jwtService.verify(token[1]);
74
+ if (decodedToken) {
75
+ const user = ctx.state.user;
76
+ 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)) {
77
+ return results;
78
+ }
79
+ }
80
+ }
81
+ return new apollo_server_koa_1.ForbiddenError('Forbidden access');
65
82
  }
66
83
  else {
67
84
  throw new Error(ctx.koaContext.response.message);
@@ -17,5 +17,18 @@ 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']);
21
+ // const contentTypeName = await strapi.contentType('plugin::users-permissions.user');
22
+ // contentTypeName.attributes = {
23
+ // // Spread previous defined attributes
24
+ // ...contentTypeName.attributes,
25
+ // // Add new, or override attributes
26
+ // platform: {
27
+ // type: 'relation',
28
+ // relation: 'oneToOne',
29
+ // target: 'api::platform.platform'
30
+ // }
31
+ // };
20
32
  await ((_b = (_a = strapi.services) === null || _a === void 0 ? void 0 : _a['plugin::page-builder.builder']) === null || _b === void 0 ? void 0 : _b.buildContentTypes());
33
+ await strapi.service('plugin::page-builder.private-content').enablePrivateContent();
21
34
  };
@@ -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: 'POST',
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,
@@ -91,6 +91,14 @@
91
91
  "type": "relation",
92
92
  "relation": "oneToOne",
93
93
  "target": "api::platform.platform"
94
+ },
95
+ "isPrivate": {
96
+ "pluginOptions": {
97
+ "i18n": {
98
+ "localized": true
99
+ }
100
+ },
101
+ "type": "boolean"
94
102
  }
95
103
  }
96
104
  }
@@ -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; })