@strapi/i18n 5.41.1 → 5.42.1
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/dist/admin/components/CMHeaderActions.js +28 -25
- package/dist/admin/components/CMHeaderActions.js.map +1 -1
- package/dist/admin/components/CMHeaderActions.mjs +26 -23
- package/dist/admin/components/CMHeaderActions.mjs.map +1 -1
- package/dist/admin/services/fillFromLocale.js +21 -0
- package/dist/admin/services/fillFromLocale.js.map +1 -0
- package/dist/admin/services/fillFromLocale.mjs +18 -0
- package/dist/admin/services/fillFromLocale.mjs.map +1 -0
- package/dist/admin/src/services/fillFromLocale.d.ts +2 -0
- package/dist/admin/translations/pl.json.js +48 -23
- package/dist/admin/translations/pl.json.js.map +1 -1
- package/dist/admin/translations/pl.json.mjs +48 -23
- package/dist/admin/translations/pl.json.mjs.map +1 -1
- package/dist/server/controllers/content-types.js +42 -2
- package/dist/server/controllers/content-types.js.map +1 -1
- package/dist/server/controllers/content-types.mjs +43 -3
- package/dist/server/controllers/content-types.mjs.map +1 -1
- package/dist/server/routes/admin.js +18 -0
- package/dist/server/routes/admin.js.map +1 -1
- package/dist/server/routes/admin.mjs +18 -0
- package/dist/server/routes/admin.mjs.map +1 -1
- package/dist/server/services/fill-from-locale.js +435 -0
- package/dist/server/services/fill-from-locale.js.map +1 -0
- package/dist/server/services/fill-from-locale.mjs +433 -0
- package/dist/server/services/fill-from-locale.mjs.map +1 -0
- package/dist/server/services/index.js +3 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs +3 -1
- package/dist/server/services/index.mjs.map +1 -1
- package/dist/server/src/controllers/content-types.d.ts +1 -0
- package/dist/server/src/controllers/content-types.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +1 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +7 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/routes/admin.d.ts.map +1 -1
- package/dist/server/src/services/fill-from-locale.d.ts +16 -0
- package/dist/server/src/services/fill-from-locale.d.ts.map +1 -0
- package/dist/server/src/services/index.d.ts +6 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/utils/index.d.ts +2 -0
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/server/src/validation/content-types.d.ts +2 -1
- package/dist/server/src/validation/content-types.d.ts.map +1 -1
- package/dist/server/utils/index.js.map +1 -1
- package/dist/server/utils/index.mjs.map +1 -1
- package/dist/server/validation/content-types.js +15 -0
- package/dist/server/validation/content-types.js.map +1 -1
- package/dist/server/validation/content-types.mjs +15 -1
- package/dist/server/validation/content-types.mjs.map +1 -1
- package/dist/shared/contracts/content-manager.d.ts +27 -0
- package/dist/shared/contracts/content-manager.d.ts.map +1 -0
- package/package.json +8 -8
- package/dist/admin/src/utils/clean.d.ts +0 -4
- package/dist/admin/utils/clean.js +0 -70
- package/dist/admin/utils/clean.js.map +0 -1
- package/dist/admin/utils/clean.mjs +0 -68
- package/dist/admin/utils/clean.mjs.map +0 -1
|
@@ -1,47 +1,72 @@
|
|
|
1
1
|
var pl = {
|
|
2
|
-
"
|
|
3
|
-
"
|
|
4
|
-
"
|
|
2
|
+
"actions.delete.label": "Usuń wpis ({locale})",
|
|
3
|
+
"actions.delete.dialog.title": "Potwierdzenie",
|
|
4
|
+
"actions.delete.dialog.body": "Czy na pewno chcesz usunąć ten język?",
|
|
5
|
+
"actions.delete.error": "Wystąpił błąd podczas usuwania języka wpisu.",
|
|
6
|
+
"CMEditViewCopyLocale.copy-failure": "Nie udało się skopiować języka",
|
|
7
|
+
"CMEditViewCopyLocale.copy-success": "Język skopiowany",
|
|
8
|
+
"CMEditViewCopyLocale.copy-text": "Wypełnij używając innego języka",
|
|
9
|
+
"CMEditViewCopyLocale.cancel-text": "Nie, anuluj",
|
|
5
10
|
"CMEditViewCopyLocale.submit-text": "Tak, wypełnij",
|
|
6
|
-
"
|
|
11
|
+
"CMEditViewCopyLocale.dialog.title": "Potwierdzenie",
|
|
12
|
+
"CMEditViewCopyLocale.dialog.body": "Twoja bieżąca zawartość zostanie usunięta i wypełniona zawartością wybranego języka:",
|
|
13
|
+
"CMEditViewCopyLocale.dialog.field.label": "Język",
|
|
14
|
+
"CMEditViewCopyLocale.dialog.field.placeholder": "Wybierz jeden język...",
|
|
15
|
+
"CMEditViewBulkLocale.publish-title": "Opublikuj wiele języków",
|
|
16
|
+
"CMEditViewBulkLocale.unpublish-title": "Cofnij publikację dla wielu języków",
|
|
17
|
+
"CMEditViewBulkLocale.status": "Status",
|
|
18
|
+
"CMEditViewBulkLocale.publication-status": "Status publikacji",
|
|
19
|
+
"CMEditViewBulkLocale.draft-relation-warning": "Niektóre języki są powiązane z wersjami roboczymi. Ich opublikowanie może spowodować pozostawienie uszkodzonych linków w aplikacji.",
|
|
20
|
+
"CMEditViewBulkLocale.continue-confirmation": "Czy na pewno chcesz kontynuować?",
|
|
21
|
+
"CMEditViewAITranslation.status-aria-label": "Status translacji AI",
|
|
22
|
+
"CMEditViewAITranslation.status-title": "{enabled, select, true {Tłumaczenia AI włączone} false {Tłumaczenia AI wyłączone} other {Tłumaczenia AI wyłączone}}",
|
|
23
|
+
"CMEditViewAITranslation.status-description": "Nasza sztuczna inteligencja tłumaczy treść we wszystkich językach za każdym razem, gdy modyfikujesz ustawienia domyślne.",
|
|
24
|
+
"CMEditViewAITranslation.settings-link": "{enabled, select, true {Wyłącz w ustawieniach} false {Włącz w ustawieniach} other {Włącz w ustawieniach}}",
|
|
25
|
+
"CMEditViewAITranslation.job-completed": "Tłumaczenie AI zakończone sukcesem!",
|
|
26
|
+
"CMEditViewAITranslation.job-failed": "Tłumaczenie AI nie powiodło się. Spróbuj ponownie.",
|
|
27
|
+
"CMEditViewLocalePicker.locale.create": "Utwórz język <bold>{locale}</bold>",
|
|
28
|
+
"CMEditViewLocalePicker.locale.ai-translations": "Tłumaczenia AI:",
|
|
29
|
+
"CMListView.popover.display-locales.label": "Wyświetl przetłumaczone ustawienia języka",
|
|
30
|
+
"CMListView.popover.display-locales.more": "{locales} + {count} więcej",
|
|
7
31
|
"CheckboxConfirmation.Modal.body": "Czy chcesz to wyłączyć?",
|
|
8
32
|
"CheckboxConfirmation.Modal.button-confirm": "Tak, wyłącz",
|
|
9
33
|
"CheckboxConfirmation.Modal.content": "Wyłączenie lokalizacji sprawi, że zostanie usunięta cała zawartość oprócz tej powiązanej z domyślnym ustawieniem regionalnym (o ile taka istnieje).",
|
|
10
|
-
"Field.localized": "Ta wartość jest unikalna dla wybranych
|
|
11
|
-
"Field.not-localized": "Ta wartość jest wspólna dla wszystkich
|
|
12
|
-
"Settings.list.actions.add": "Dodaj
|
|
34
|
+
"Field.localized": "Ta wartość jest unikalna dla wybranych języków",
|
|
35
|
+
"Field.not-localized": "Ta wartość jest wspólna dla wszystkich języków",
|
|
36
|
+
"Settings.list.actions.add": "Dodaj język",
|
|
13
37
|
"Settings.list.actions.delete": "Usuń",
|
|
14
|
-
"Settings.list.actions.deleteAdditionalInfos": "Aktywne
|
|
38
|
+
"Settings.list.actions.deleteAdditionalInfos": "Aktywne wersje językowe zostaną usunięte <em>(z pluginu Internacjonalizacja)</em>",
|
|
39
|
+
"Settings.list.actions.publishAdditionalInfos": "To opublikuje aktywne wersje językowe <em>(z pluginu Internacjonalizacja)</em>",
|
|
40
|
+
"Settings.list.actions.unpublishAdditionalInfos": "To cofnie publikację aktywnych wersji językowych <em>(z pluginu Internacjonalizacja)</em>",
|
|
15
41
|
"Settings.list.actions.edit": "Edytuj",
|
|
16
|
-
"Settings.list.description": "Skonfiguruj ustawienia dla pluginu
|
|
42
|
+
"Settings.list.description": "Skonfiguruj ustawienia dla pluginu Internacjonalizacja",
|
|
17
43
|
"Settings.list.empty.description": "To nie jest standardowe zachowanie, co oznacza że ostatecznie zmieniłeś bazę danych manualnie. Aby poprawnie używać strapi upewnij się, że w bazie masz zapisane przynajmniej jedno ustawienie regionalne.",
|
|
18
|
-
"Settings.list.empty.title": "Brak
|
|
44
|
+
"Settings.list.empty.title": "Brak języków.",
|
|
45
|
+
"Settings.aiLocalizations.label": "Tłumaczenia AI",
|
|
46
|
+
"Settings.aiLocalizations.description": "Za każdym razem, gdy zapiszesz coś w Menedżerze treści, nasza sztuczna inteligencja użyje domyślnego języka, aby automatycznie przetłumaczyć wszystkie inne języki.",
|
|
19
47
|
"Settings.locales.default": "domyślne",
|
|
20
48
|
"Settings.locales.list.sort.default": "Sortuj domyślnie",
|
|
21
49
|
"Settings.locales.list.sort.displayName": "Sortuj po nazwie",
|
|
22
50
|
"Settings.locales.list.sort.id": "Sortuj po ID",
|
|
23
51
|
"Settings.locales.modal.advanced": "Ustawienia zaawansowane",
|
|
24
52
|
"Settings.locales.modal.advanced.setAsDefault": "Ustaw jako domyślne",
|
|
25
|
-
"Settings.locales.modal.advanced.setAsDefault.hint": "
|
|
53
|
+
"Settings.locales.modal.advanced.setAsDefault.hint": "Jeden domyślny język jest wymagany, zmień to poprzez wybranie innego.",
|
|
26
54
|
"Settings.locales.modal.advanced.settings": "Ustawienia",
|
|
27
55
|
"Settings.locales.modal.base": "Ustawienia podstawowe",
|
|
28
|
-
"Settings.locales.modal.create.alreadyExist": "To ustawienie już istnieje",
|
|
29
|
-
"Settings.locales.modal.create.defaultLocales.loading": "Ładowanie dostępnych ustawień regionalnych...",
|
|
30
56
|
"Settings.locales.modal.create.success": "Ustawienie dodane",
|
|
31
|
-
"Settings.locales.modal.create.
|
|
57
|
+
"Settings.locales.modal.create.code.label": "Języki",
|
|
58
|
+
"Settings.locales.modal.create.code.error": "Wybierz język",
|
|
59
|
+
"Settings.locales.modal.create.name.description": "Język będzie wyświetlany pod tą nazwą w panelu administracyjnym",
|
|
60
|
+
"Settings.locales.modal.create.name.label": "Nazwa wyświetlana",
|
|
61
|
+
"Settings.locales.modal.create.name.error.min": "Nazwa wyświetlana języka może mieć maksymalnie 50 znaków.",
|
|
62
|
+
"Settings.locales.modal.create.name.error.required": "Proszę podać nazwę wyświetlaną dla języka",
|
|
32
63
|
"Settings.locales.modal.delete.confirm": "Tak, usuń",
|
|
33
64
|
"Settings.locales.modal.delete.message": "Usunięcie tego ustawienia usunie również całą powiązaną zawartość. Jeśli chcesz zatrzymać jakąś treść upewnij się, że przeniosłeś ją do innych ustawień regionalnych.",
|
|
34
65
|
"Settings.locales.modal.delete.secondMessage": "Czy chcesz usunąć to ustawienie?",
|
|
35
66
|
"Settings.locales.modal.delete.success": "Usunięto",
|
|
36
67
|
"Settings.locales.modal.edit.confirmation": "Zakończ",
|
|
37
|
-
"Settings.locales.modal.create.code.label": "Ustawienia regionalne",
|
|
38
68
|
"Settings.locales.modal.edit.success": "Edytowano",
|
|
39
|
-
"Settings.locales.modal.edit.tab.label": "Nawigowanie pomiędzy I18N
|
|
40
|
-
"Settings.locales.modal.create.name.label": "Nazwa wyświetlana dla ustawienia regionalnego",
|
|
41
|
-
"Settings.locales.modal.create.name.label.description": "Zostanie wyświetlone pod taką nazwą w panelu administracyjnym.",
|
|
42
|
-
"Settings.locales.modal.create.name.label.error": "Nazwa wyświetlana nie może mieć więcej niż 50 znaków.",
|
|
43
|
-
"Settings.locales.modal.locales.label": "Ustawienia regionalne",
|
|
44
|
-
"Settings.locales.modal.locales.loaded": "Pomyślnie załadowane.",
|
|
69
|
+
"Settings.locales.modal.edit.tab.label": "Nawigowanie pomiędzy I18N podstawowymi a zaawansowanymi ustawieniami",
|
|
45
70
|
"Settings.locales.modal.title": "Konfiguracja",
|
|
46
71
|
"Settings.locales.row.default-locale": "Domyślne",
|
|
47
72
|
"Settings.locales.row.displayName": "Nazwa",
|
|
@@ -54,8 +79,8 @@ var pl = {
|
|
|
54
79
|
"plugin.description.long": "Ten plugin umożliwia tworzenie, czytanie i aktualizowanie treści w różnych językach, zarówno z poziomu panelu admina jak i z API.",
|
|
55
80
|
"plugin.description.short": "Ten plugin umożliwia tworzenie, czytanie i aktualizowanie treści w różnych językach, zarówno z poziomu panelu admina jak i z API.",
|
|
56
81
|
"plugin.name": "Internationalization",
|
|
57
|
-
"plugin.schema.i18n.localized.description-content-type": "Pozwala mieć treść w różnych
|
|
58
|
-
"plugin.schema.i18n.localized.description-field": "To pole może mieć różne wartości w zależności od różnych
|
|
82
|
+
"plugin.schema.i18n.localized.description-content-type": "Pozwala mieć treść w różnych językach",
|
|
83
|
+
"plugin.schema.i18n.localized.description-field": "To pole może mieć różne wartości w zależności od różnych języków",
|
|
59
84
|
"plugin.schema.i18n.localized.label-content-type": "Włącz lokalizację dla tego typu treści",
|
|
60
85
|
"plugin.schema.i18n.localized.label-field": "Włącz lokalizację dla tego pola"
|
|
61
86
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pl.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pl.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -12,7 +12,7 @@ const getFieldsProperty = fp.prop('properties.fields');
|
|
|
12
12
|
const getFirstLevelPath = fp.map((path)=>path.split('.')[0]);
|
|
13
13
|
const controller = {
|
|
14
14
|
async getNonLocalizedAttributes (ctx) {
|
|
15
|
-
const { user } = ctx.state;
|
|
15
|
+
const { user, userAbility } = ctx.state;
|
|
16
16
|
const body = ctx.request.body;
|
|
17
17
|
const { model, id, locale } = body;
|
|
18
18
|
await contentTypes.validateGetNonLocalizedAttributesInput({
|
|
@@ -20,6 +20,13 @@ const controller = {
|
|
|
20
20
|
id,
|
|
21
21
|
locale
|
|
22
22
|
});
|
|
23
|
+
const permissionChecker = strapi.plugin('content-manager').service('permission-checker').create({
|
|
24
|
+
userAbility,
|
|
25
|
+
model
|
|
26
|
+
});
|
|
27
|
+
if (permissionChecker.cannot.read()) {
|
|
28
|
+
return ctx.forbidden();
|
|
29
|
+
}
|
|
23
30
|
const { copyNonLocalizedAttributes, isLocalizedContentType, getNestedPopulateOfNonLocalizedAttributes } = index.getService('content-types');
|
|
24
31
|
const { default: { READ_ACTION, CREATE_ACTION } } = strapi.service('admin::constants');
|
|
25
32
|
const modelDef = strapi.contentType(model);
|
|
@@ -52,7 +59,15 @@ const controller = {
|
|
|
52
59
|
const localePermissions = permissions.filter((perm)=>getLocalesProperty(perm).includes(locale)).map(getFieldsProperty);
|
|
53
60
|
const permittedFields = fp.pipe(fp.flatten, getFirstLevelPath, fp.uniq)(localePermissions);
|
|
54
61
|
const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);
|
|
55
|
-
const
|
|
62
|
+
const pickedFields = fp.pick(permittedFields, nonLocalizedFields);
|
|
63
|
+
// Guard relations: omit fields that point to content types the user cannot read
|
|
64
|
+
const sanitizedNonLocalizedFields = Object.fromEntries(Object.entries(pickedFields).filter(([key])=>{
|
|
65
|
+
const attribute = modelDef.attributes?.[key];
|
|
66
|
+
if (attribute?.type === 'relation' && attribute.target) {
|
|
67
|
+
return userAbility.can(READ_ACTION, attribute.target);
|
|
68
|
+
}
|
|
69
|
+
return true;
|
|
70
|
+
}));
|
|
56
71
|
const availableLocalesResult = await strapi.plugins['content-manager'].service('document-metadata').getMetadata(model, entity, {
|
|
57
72
|
availableLocales: true
|
|
58
73
|
});
|
|
@@ -69,6 +84,31 @@ const controller = {
|
|
|
69
84
|
PUBLISHED_AT_ATTRIBUTE
|
|
70
85
|
], entity))
|
|
71
86
|
};
|
|
87
|
+
},
|
|
88
|
+
async getFillFromLocaleData (ctx) {
|
|
89
|
+
const { userAbility } = ctx.state;
|
|
90
|
+
const { model } = ctx.params;
|
|
91
|
+
await contentTypes.validateFillFromLocaleInput(ctx.query);
|
|
92
|
+
const { documentId, sourceLocale, targetLocale } = ctx.query;
|
|
93
|
+
const permissionChecker = strapi.plugin('content-manager').service('permission-checker').create({
|
|
94
|
+
userAbility,
|
|
95
|
+
model
|
|
96
|
+
});
|
|
97
|
+
if (permissionChecker.cannot.read()) {
|
|
98
|
+
return ctx.forbidden();
|
|
99
|
+
}
|
|
100
|
+
const fillFromLocaleService = index.getService('fill-from-locale');
|
|
101
|
+
const rawDocument = await fillFromLocaleService.fetchRawDocument(model, sourceLocale, documentId);
|
|
102
|
+
if (!rawDocument) {
|
|
103
|
+
return ctx.notFound();
|
|
104
|
+
}
|
|
105
|
+
// Field-level filtering: strip fields the user cannot read on this content type
|
|
106
|
+
const sanitizedDocument = await permissionChecker.sanitizeOutput(rawDocument);
|
|
107
|
+
// Transform relations to target locale, skipping those the user cannot read
|
|
108
|
+
const data = await fillFromLocaleService.transformDocument(sanitizedDocument, model, targetLocale, userAbility);
|
|
109
|
+
ctx.body = {
|
|
110
|
+
data
|
|
111
|
+
};
|
|
72
112
|
}
|
|
73
113
|
};
|
|
74
114
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-types.js","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import { pick, uniq, prop, getOr, flatten, pipe, map } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils, errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport { validateGetNonLocalizedAttributesInput } from '../validation/content-types';\n\nconst { ApplicationError } = errors;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypesUtils.constants;\n\nconst getLocalesProperty = getOr<string[]>([], 'properties.locales');\nconst getFieldsProperty = prop('properties.fields');\n\nconst getFirstLevelPath = map((path: string) => path.split('.')[0]);\n\nconst controller = {\n async getNonLocalizedAttributes(ctx) {\n const { user } = ctx.state;\n const body = ctx.request.body as any;\n const { model, id, locale } = body;\n\n await validateGetNonLocalizedAttributesInput({ model, id, locale });\n\n const {\n copyNonLocalizedAttributes,\n isLocalizedContentType,\n getNestedPopulateOfNonLocalizedAttributes,\n } = getService('content-types');\n\n const {\n default: { READ_ACTION, CREATE_ACTION },\n } = strapi.service('admin::constants');\n\n const modelDef = strapi.contentType(model);\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(model);\n\n if (!isLocalizedContentType(modelDef)) {\n throw new ApplicationError(`Model ${model} is not localized`);\n }\n\n const params = modelDef.kind === 'singleType' ? {} : { id };\n\n const entity = await strapi.db\n .query(model)\n .findOne({ where: params, populate: attributesToPopulate });\n\n if (!entity) {\n return ctx.notFound();\n }\n\n const permissions = await strapi.admin.services.permission.findMany({\n where: {\n action: [READ_ACTION, CREATE_ACTION],\n subject: model,\n role: {\n id: user.roles.map(prop('id')),\n },\n },\n });\n\n const localePermissions = permissions\n .filter((perm: any) => getLocalesProperty(perm).includes(locale))\n .map(getFieldsProperty);\n\n const permittedFields = pipe(flatten, getFirstLevelPath, uniq)(localePermissions);\n\n const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);\n const sanitizedNonLocalizedFields = pick(permittedFields, nonLocalizedFields);\n\n const availableLocalesResult = await strapi.plugins['content-manager']\n .service('document-metadata')\n .getMetadata(model, entity, {\n availableLocales: true,\n });\n\n const availableLocales = availableLocalesResult.availableLocales.map((localeResult: any) =>\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], localeResult)\n );\n\n ctx.body = {\n nonLocalizedFields: sanitizedNonLocalizedFields,\n localizations: availableLocales.concat(\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], entity)\n ),\n };\n },\n} satisfies Core.Controller;\n\nexport default controller;\n"],"names":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypesUtils","constants","getLocalesProperty","getOr","getFieldsProperty","prop","getFirstLevelPath","map","path","split","controller","getNonLocalizedAttributes","ctx","user","state","body","request","model","id","locale","validateGetNonLocalizedAttributesInput","copyNonLocalizedAttributes","isLocalizedContentType","getNestedPopulateOfNonLocalizedAttributes","getService","default","READ_ACTION","CREATE_ACTION","strapi","service","modelDef","contentType","attributesToPopulate","params","kind","entity","db","query","findOne","where","populate","notFound","permissions","admin","services","permission","findMany","action","subject","role","roles","localePermissions","filter","perm","includes","permittedFields","pipe","flatten","uniq","nonLocalizedFields","sanitizedNonLocalizedFields","pick","availableLocalesResult","plugins","getMetadata","availableLocales","localeResult","localizations","concat"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"content-types.js","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import { pick, uniq, prop, getOr, flatten, pipe, map } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils, errors } from '@strapi/utils';\nimport type { Core, UID } from '@strapi/types';\nimport type { FillFromLocale } from '../../../shared/contracts/content-manager';\nimport { getService } from '../utils';\nimport {\n validateGetNonLocalizedAttributesInput,\n validateFillFromLocaleInput,\n} from '../validation/content-types';\n\nconst { ApplicationError } = errors;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypesUtils.constants;\n\nconst getLocalesProperty = getOr<string[]>([], 'properties.locales');\nconst getFieldsProperty = prop('properties.fields');\n\nconst getFirstLevelPath = map((path: string) => path.split('.')[0]);\n\nconst controller = {\n async getNonLocalizedAttributes(ctx) {\n const { user, userAbility } = ctx.state;\n const body = ctx.request.body as any;\n const { model, id, locale } = body;\n\n await validateGetNonLocalizedAttributesInput({ model, id, locale });\n\n const permissionChecker = strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const {\n copyNonLocalizedAttributes,\n isLocalizedContentType,\n getNestedPopulateOfNonLocalizedAttributes,\n } = getService('content-types');\n\n const {\n default: { READ_ACTION, CREATE_ACTION },\n } = strapi.service('admin::constants');\n\n const modelDef = strapi.contentType(model);\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(model);\n\n if (!isLocalizedContentType(modelDef)) {\n throw new ApplicationError(`Model ${model} is not localized`);\n }\n\n const params = modelDef.kind === 'singleType' ? {} : { id };\n\n const entity = await strapi.db\n .query(model)\n .findOne({ where: params, populate: attributesToPopulate });\n\n if (!entity) {\n return ctx.notFound();\n }\n\n const permissions = await strapi.admin.services.permission.findMany({\n where: {\n action: [READ_ACTION, CREATE_ACTION],\n subject: model,\n role: {\n id: user.roles.map(prop('id')),\n },\n },\n });\n\n const localePermissions = permissions\n .filter((perm: any) => getLocalesProperty(perm).includes(locale))\n .map(getFieldsProperty);\n\n const permittedFields = pipe(flatten, getFirstLevelPath, uniq)(localePermissions);\n\n const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);\n const pickedFields = pick(permittedFields, nonLocalizedFields);\n\n // Guard relations: omit fields that point to content types the user cannot read\n const sanitizedNonLocalizedFields = Object.fromEntries(\n Object.entries(pickedFields).filter(([key]) => {\n const attribute = modelDef.attributes?.[key] as any;\n if (attribute?.type === 'relation' && attribute.target) {\n return userAbility.can(READ_ACTION, attribute.target);\n }\n return true;\n })\n );\n\n const availableLocalesResult = await strapi.plugins['content-manager']\n .service('document-metadata')\n .getMetadata(model, entity, {\n availableLocales: true,\n });\n\n const availableLocales = availableLocalesResult.availableLocales.map((localeResult: any) =>\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], localeResult)\n );\n\n ctx.body = {\n nonLocalizedFields: sanitizedNonLocalizedFields,\n localizations: availableLocales.concat(\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], entity)\n ),\n };\n },\n\n async getFillFromLocaleData(ctx) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n\n await validateFillFromLocaleInput(ctx.query);\n\n const { documentId, sourceLocale, targetLocale } = ctx.query as unknown as Omit<\n FillFromLocale.Params,\n 'model'\n >;\n\n const permissionChecker = strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const fillFromLocaleService = getService('fill-from-locale');\n\n const rawDocument = await fillFromLocaleService.fetchRawDocument(\n model as UID.ContentType,\n sourceLocale,\n documentId\n );\n\n if (!rawDocument) {\n return ctx.notFound();\n }\n\n // Field-level filtering: strip fields the user cannot read on this content type\n const sanitizedDocument = await permissionChecker.sanitizeOutput(rawDocument);\n\n // Transform relations to target locale, skipping those the user cannot read\n const data = await fillFromLocaleService.transformDocument(\n sanitizedDocument as Record<string, unknown>,\n model as UID.ContentType,\n targetLocale,\n userAbility\n );\n\n ctx.body = { data };\n },\n} satisfies Core.Controller;\n\nexport default controller;\n"],"names":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypesUtils","constants","getLocalesProperty","getOr","getFieldsProperty","prop","getFirstLevelPath","map","path","split","controller","getNonLocalizedAttributes","ctx","user","userAbility","state","body","request","model","id","locale","validateGetNonLocalizedAttributesInput","permissionChecker","strapi","plugin","service","create","cannot","read","forbidden","copyNonLocalizedAttributes","isLocalizedContentType","getNestedPopulateOfNonLocalizedAttributes","getService","default","READ_ACTION","CREATE_ACTION","modelDef","contentType","attributesToPopulate","params","kind","entity","db","query","findOne","where","populate","notFound","permissions","admin","services","permission","findMany","action","subject","role","roles","localePermissions","filter","perm","includes","permittedFields","pipe","flatten","uniq","nonLocalizedFields","pickedFields","pick","sanitizedNonLocalizedFields","Object","fromEntries","entries","key","attribute","attributes","type","target","can","availableLocalesResult","plugins","getMetadata","availableLocales","localeResult","localizations","concat","getFillFromLocaleData","validateFillFromLocaleInput","documentId","sourceLocale","targetLocale","fillFromLocaleService","rawDocument","fetchRawDocument","sanitizedDocument","sanitizeOutput","data","transformDocument"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { getOr, prop, map, pipe, flatten, uniq, pick } from 'lodash/fp';
|
|
2
2
|
import { errors, contentTypes } from '@strapi/utils';
|
|
3
3
|
import { getService } from '../utils/index.mjs';
|
|
4
|
-
import { validateGetNonLocalizedAttributesInput } from '../validation/content-types.mjs';
|
|
4
|
+
import { validateFillFromLocaleInput, validateGetNonLocalizedAttributesInput } from '../validation/content-types.mjs';
|
|
5
5
|
|
|
6
6
|
const { ApplicationError } = errors;
|
|
7
7
|
const { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;
|
|
@@ -10,7 +10,7 @@ const getFieldsProperty = prop('properties.fields');
|
|
|
10
10
|
const getFirstLevelPath = map((path)=>path.split('.')[0]);
|
|
11
11
|
const controller = {
|
|
12
12
|
async getNonLocalizedAttributes (ctx) {
|
|
13
|
-
const { user } = ctx.state;
|
|
13
|
+
const { user, userAbility } = ctx.state;
|
|
14
14
|
const body = ctx.request.body;
|
|
15
15
|
const { model, id, locale } = body;
|
|
16
16
|
await validateGetNonLocalizedAttributesInput({
|
|
@@ -18,6 +18,13 @@ const controller = {
|
|
|
18
18
|
id,
|
|
19
19
|
locale
|
|
20
20
|
});
|
|
21
|
+
const permissionChecker = strapi.plugin('content-manager').service('permission-checker').create({
|
|
22
|
+
userAbility,
|
|
23
|
+
model
|
|
24
|
+
});
|
|
25
|
+
if (permissionChecker.cannot.read()) {
|
|
26
|
+
return ctx.forbidden();
|
|
27
|
+
}
|
|
21
28
|
const { copyNonLocalizedAttributes, isLocalizedContentType, getNestedPopulateOfNonLocalizedAttributes } = getService('content-types');
|
|
22
29
|
const { default: { READ_ACTION, CREATE_ACTION } } = strapi.service('admin::constants');
|
|
23
30
|
const modelDef = strapi.contentType(model);
|
|
@@ -50,7 +57,15 @@ const controller = {
|
|
|
50
57
|
const localePermissions = permissions.filter((perm)=>getLocalesProperty(perm).includes(locale)).map(getFieldsProperty);
|
|
51
58
|
const permittedFields = pipe(flatten, getFirstLevelPath, uniq)(localePermissions);
|
|
52
59
|
const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);
|
|
53
|
-
const
|
|
60
|
+
const pickedFields = pick(permittedFields, nonLocalizedFields);
|
|
61
|
+
// Guard relations: omit fields that point to content types the user cannot read
|
|
62
|
+
const sanitizedNonLocalizedFields = Object.fromEntries(Object.entries(pickedFields).filter(([key])=>{
|
|
63
|
+
const attribute = modelDef.attributes?.[key];
|
|
64
|
+
if (attribute?.type === 'relation' && attribute.target) {
|
|
65
|
+
return userAbility.can(READ_ACTION, attribute.target);
|
|
66
|
+
}
|
|
67
|
+
return true;
|
|
68
|
+
}));
|
|
54
69
|
const availableLocalesResult = await strapi.plugins['content-manager'].service('document-metadata').getMetadata(model, entity, {
|
|
55
70
|
availableLocales: true
|
|
56
71
|
});
|
|
@@ -67,6 +82,31 @@ const controller = {
|
|
|
67
82
|
PUBLISHED_AT_ATTRIBUTE
|
|
68
83
|
], entity))
|
|
69
84
|
};
|
|
85
|
+
},
|
|
86
|
+
async getFillFromLocaleData (ctx) {
|
|
87
|
+
const { userAbility } = ctx.state;
|
|
88
|
+
const { model } = ctx.params;
|
|
89
|
+
await validateFillFromLocaleInput(ctx.query);
|
|
90
|
+
const { documentId, sourceLocale, targetLocale } = ctx.query;
|
|
91
|
+
const permissionChecker = strapi.plugin('content-manager').service('permission-checker').create({
|
|
92
|
+
userAbility,
|
|
93
|
+
model
|
|
94
|
+
});
|
|
95
|
+
if (permissionChecker.cannot.read()) {
|
|
96
|
+
return ctx.forbidden();
|
|
97
|
+
}
|
|
98
|
+
const fillFromLocaleService = getService('fill-from-locale');
|
|
99
|
+
const rawDocument = await fillFromLocaleService.fetchRawDocument(model, sourceLocale, documentId);
|
|
100
|
+
if (!rawDocument) {
|
|
101
|
+
return ctx.notFound();
|
|
102
|
+
}
|
|
103
|
+
// Field-level filtering: strip fields the user cannot read on this content type
|
|
104
|
+
const sanitizedDocument = await permissionChecker.sanitizeOutput(rawDocument);
|
|
105
|
+
// Transform relations to target locale, skipping those the user cannot read
|
|
106
|
+
const data = await fillFromLocaleService.transformDocument(sanitizedDocument, model, targetLocale, userAbility);
|
|
107
|
+
ctx.body = {
|
|
108
|
+
data
|
|
109
|
+
};
|
|
70
110
|
}
|
|
71
111
|
};
|
|
72
112
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-types.mjs","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import { pick, uniq, prop, getOr, flatten, pipe, map } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils, errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport { validateGetNonLocalizedAttributesInput } from '../validation/content-types';\n\nconst { ApplicationError } = errors;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypesUtils.constants;\n\nconst getLocalesProperty = getOr<string[]>([], 'properties.locales');\nconst getFieldsProperty = prop('properties.fields');\n\nconst getFirstLevelPath = map((path: string) => path.split('.')[0]);\n\nconst controller = {\n async getNonLocalizedAttributes(ctx) {\n const { user } = ctx.state;\n const body = ctx.request.body as any;\n const { model, id, locale } = body;\n\n await validateGetNonLocalizedAttributesInput({ model, id, locale });\n\n const {\n copyNonLocalizedAttributes,\n isLocalizedContentType,\n getNestedPopulateOfNonLocalizedAttributes,\n } = getService('content-types');\n\n const {\n default: { READ_ACTION, CREATE_ACTION },\n } = strapi.service('admin::constants');\n\n const modelDef = strapi.contentType(model);\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(model);\n\n if (!isLocalizedContentType(modelDef)) {\n throw new ApplicationError(`Model ${model} is not localized`);\n }\n\n const params = modelDef.kind === 'singleType' ? {} : { id };\n\n const entity = await strapi.db\n .query(model)\n .findOne({ where: params, populate: attributesToPopulate });\n\n if (!entity) {\n return ctx.notFound();\n }\n\n const permissions = await strapi.admin.services.permission.findMany({\n where: {\n action: [READ_ACTION, CREATE_ACTION],\n subject: model,\n role: {\n id: user.roles.map(prop('id')),\n },\n },\n });\n\n const localePermissions = permissions\n .filter((perm: any) => getLocalesProperty(perm).includes(locale))\n .map(getFieldsProperty);\n\n const permittedFields = pipe(flatten, getFirstLevelPath, uniq)(localePermissions);\n\n const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);\n const sanitizedNonLocalizedFields = pick(permittedFields, nonLocalizedFields);\n\n const availableLocalesResult = await strapi.plugins['content-manager']\n .service('document-metadata')\n .getMetadata(model, entity, {\n availableLocales: true,\n });\n\n const availableLocales = availableLocalesResult.availableLocales.map((localeResult: any) =>\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], localeResult)\n );\n\n ctx.body = {\n nonLocalizedFields: sanitizedNonLocalizedFields,\n localizations: availableLocales.concat(\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], entity)\n ),\n };\n },\n} satisfies Core.Controller;\n\nexport default controller;\n"],"names":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypesUtils","constants","getLocalesProperty","getOr","getFieldsProperty","prop","getFirstLevelPath","map","path","split","controller","getNonLocalizedAttributes","ctx","user","state","body","request","model","id","locale","validateGetNonLocalizedAttributesInput","copyNonLocalizedAttributes","isLocalizedContentType","getNestedPopulateOfNonLocalizedAttributes","getService","default","READ_ACTION","CREATE_ACTION","strapi","service","modelDef","contentType","attributesToPopulate","params","kind","entity","db","query","findOne","where","populate","notFound","permissions","admin","services","permission","findMany","action","subject","role","roles","localePermissions","filter","perm","includes","permittedFields","pipe","flatten","uniq","nonLocalizedFields","sanitizedNonLocalizedFields","pick","availableLocalesResult","plugins","getMetadata","availableLocales","localeResult","localizations","concat"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"content-types.mjs","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import { pick, uniq, prop, getOr, flatten, pipe, map } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils, errors } from '@strapi/utils';\nimport type { Core, UID } from '@strapi/types';\nimport type { FillFromLocale } from '../../../shared/contracts/content-manager';\nimport { getService } from '../utils';\nimport {\n validateGetNonLocalizedAttributesInput,\n validateFillFromLocaleInput,\n} from '../validation/content-types';\n\nconst { ApplicationError } = errors;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypesUtils.constants;\n\nconst getLocalesProperty = getOr<string[]>([], 'properties.locales');\nconst getFieldsProperty = prop('properties.fields');\n\nconst getFirstLevelPath = map((path: string) => path.split('.')[0]);\n\nconst controller = {\n async getNonLocalizedAttributes(ctx) {\n const { user, userAbility } = ctx.state;\n const body = ctx.request.body as any;\n const { model, id, locale } = body;\n\n await validateGetNonLocalizedAttributesInput({ model, id, locale });\n\n const permissionChecker = strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const {\n copyNonLocalizedAttributes,\n isLocalizedContentType,\n getNestedPopulateOfNonLocalizedAttributes,\n } = getService('content-types');\n\n const {\n default: { READ_ACTION, CREATE_ACTION },\n } = strapi.service('admin::constants');\n\n const modelDef = strapi.contentType(model);\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(model);\n\n if (!isLocalizedContentType(modelDef)) {\n throw new ApplicationError(`Model ${model} is not localized`);\n }\n\n const params = modelDef.kind === 'singleType' ? {} : { id };\n\n const entity = await strapi.db\n .query(model)\n .findOne({ where: params, populate: attributesToPopulate });\n\n if (!entity) {\n return ctx.notFound();\n }\n\n const permissions = await strapi.admin.services.permission.findMany({\n where: {\n action: [READ_ACTION, CREATE_ACTION],\n subject: model,\n role: {\n id: user.roles.map(prop('id')),\n },\n },\n });\n\n const localePermissions = permissions\n .filter((perm: any) => getLocalesProperty(perm).includes(locale))\n .map(getFieldsProperty);\n\n const permittedFields = pipe(flatten, getFirstLevelPath, uniq)(localePermissions);\n\n const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);\n const pickedFields = pick(permittedFields, nonLocalizedFields);\n\n // Guard relations: omit fields that point to content types the user cannot read\n const sanitizedNonLocalizedFields = Object.fromEntries(\n Object.entries(pickedFields).filter(([key]) => {\n const attribute = modelDef.attributes?.[key] as any;\n if (attribute?.type === 'relation' && attribute.target) {\n return userAbility.can(READ_ACTION, attribute.target);\n }\n return true;\n })\n );\n\n const availableLocalesResult = await strapi.plugins['content-manager']\n .service('document-metadata')\n .getMetadata(model, entity, {\n availableLocales: true,\n });\n\n const availableLocales = availableLocalesResult.availableLocales.map((localeResult: any) =>\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], localeResult)\n );\n\n ctx.body = {\n nonLocalizedFields: sanitizedNonLocalizedFields,\n localizations: availableLocales.concat(\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], entity)\n ),\n };\n },\n\n async getFillFromLocaleData(ctx) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n\n await validateFillFromLocaleInput(ctx.query);\n\n const { documentId, sourceLocale, targetLocale } = ctx.query as unknown as Omit<\n FillFromLocale.Params,\n 'model'\n >;\n\n const permissionChecker = strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const fillFromLocaleService = getService('fill-from-locale');\n\n const rawDocument = await fillFromLocaleService.fetchRawDocument(\n model as UID.ContentType,\n sourceLocale,\n documentId\n );\n\n if (!rawDocument) {\n return ctx.notFound();\n }\n\n // Field-level filtering: strip fields the user cannot read on this content type\n const sanitizedDocument = await permissionChecker.sanitizeOutput(rawDocument);\n\n // Transform relations to target locale, skipping those the user cannot read\n const data = await fillFromLocaleService.transformDocument(\n sanitizedDocument as Record<string, unknown>,\n model as UID.ContentType,\n targetLocale,\n userAbility\n );\n\n ctx.body = { data };\n },\n} satisfies Core.Controller;\n\nexport default controller;\n"],"names":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypesUtils","constants","getLocalesProperty","getOr","getFieldsProperty","prop","getFirstLevelPath","map","path","split","controller","getNonLocalizedAttributes","ctx","user","userAbility","state","body","request","model","id","locale","validateGetNonLocalizedAttributesInput","permissionChecker","strapi","plugin","service","create","cannot","read","forbidden","copyNonLocalizedAttributes","isLocalizedContentType","getNestedPopulateOfNonLocalizedAttributes","getService","default","READ_ACTION","CREATE_ACTION","modelDef","contentType","attributesToPopulate","params","kind","entity","db","query","findOne","where","populate","notFound","permissions","admin","services","permission","findMany","action","subject","role","roles","localePermissions","filter","perm","includes","permittedFields","pipe","flatten","uniq","nonLocalizedFields","pickedFields","pick","sanitizedNonLocalizedFields","Object","fromEntries","entries","key","attribute","attributes","type","target","can","availableLocalesResult","plugins","getMetadata","availableLocales","localeResult","localizations","concat","getFillFromLocaleData","validateFillFromLocaleInput","documentId","sourceLocale","targetLocale","fillFromLocaleService","rawDocument","fetchRawDocument","sanitizedDocument","sanitizeOutput","data","transformDocument"],"mappings":"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"}
|
|
@@ -95,6 +95,24 @@ var admin = {
|
|
|
95
95
|
]
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
|
+
{
|
|
99
|
+
method: 'GET',
|
|
100
|
+
path: '/content-manager/get-fill-from-locale/:model',
|
|
101
|
+
handler: 'content-types.getFillFromLocaleData',
|
|
102
|
+
config: {
|
|
103
|
+
policies: [
|
|
104
|
+
'admin::isAuthenticatedAdmin',
|
|
105
|
+
{
|
|
106
|
+
name: 'plugin::content-manager.hasPermissions',
|
|
107
|
+
config: {
|
|
108
|
+
actions: [
|
|
109
|
+
'plugin::content-manager.explorer.read'
|
|
110
|
+
]
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
]
|
|
114
|
+
}
|
|
115
|
+
},
|
|
98
116
|
{
|
|
99
117
|
method: 'GET',
|
|
100
118
|
path: '/settings',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.js","sources":["../../../server/src/routes/admin.ts"],"sourcesContent":["export default {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n path: '/iso-locales',\n handler: 'iso-locales.listIsoLocales',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.read'] },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/locales',\n handler: 'locales.listLocales',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'POST',\n path: '/locales',\n handler: 'locales.createLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.create'] },\n },\n ],\n },\n },\n {\n method: 'PUT',\n path: '/locales/:id',\n handler: 'locales.updateLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.update'] },\n },\n ],\n },\n },\n {\n method: 'DELETE',\n path: '/locales/:id',\n handler: 'locales.deleteLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.delete'] },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/content-manager/actions/get-non-localized-fields',\n handler: 'content-types.getNonLocalizedAttributes',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/settings',\n handler: 'settings.getSettings',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'PUT',\n path: '/settings',\n handler: 'settings.updateSettings',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/ai-localization-jobs/collection-types/:contentType/:documentId',\n handler: 'ai-localization-jobs.getJobForCollectionType',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/ai-localization-jobs/single-types/:contentType',\n handler: 'ai-localization-jobs.getJobForSingleType',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n ],\n};\n"],"names":["type","routes","method","path","handler","config","policies","name","actions"],"mappings":";;AAAA,YAAe;IACbA,IAAAA,EAAM,OAAA;IACNC,MAAAA,EAAQ;AACN,QAAA;YACEC,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,cAAA;YACNC,OAAAA,EAAS,4BAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBACEC,IAAAA,EAAM,wCAAA;wBACNF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA2B;AAAC;AAClD;AACD;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,UAAA;YACNC,OAAAA,EAAS,qBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,UAAA;YACNC,OAAAA,EAAS,sBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBACEC,IAAAA,EAAM,wCAAA;wBACNF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA6B;AAAC;AACpD;AACD;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,cAAA;YACNC,OAAAA,EAAS,sBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBACEC,IAAAA,EAAM,wCAAA;wBACNF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA6B;AAAC;AACpD;AACD;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,QAAA;YACRC,IAAAA,EAAM,cAAA;YACNC,OAAAA,EAAS,sBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBACEC,IAAAA,EAAM,wCAAA;wBACNF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA6B;AAAC;AACpD;AACD;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,mDAAA;YACNC,OAAAA,EAAS,yCAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,WAAA;YACNC,OAAAA,EAAS,sBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,WAAA;YACNC,OAAAA,EAAS,yBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,iEAAA;YACNC,OAAAA,EAAS,8CAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,iDAAA;YACNC,OAAAA,EAAS,0CAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF;AACD;AACH,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"admin.js","sources":["../../../server/src/routes/admin.ts"],"sourcesContent":["export default {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n path: '/iso-locales',\n handler: 'iso-locales.listIsoLocales',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.read'] },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/locales',\n handler: 'locales.listLocales',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'POST',\n path: '/locales',\n handler: 'locales.createLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.create'] },\n },\n ],\n },\n },\n {\n method: 'PUT',\n path: '/locales/:id',\n handler: 'locales.updateLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.update'] },\n },\n ],\n },\n },\n {\n method: 'DELETE',\n path: '/locales/:id',\n handler: 'locales.deleteLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.delete'] },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/content-manager/actions/get-non-localized-fields',\n handler: 'content-types.getNonLocalizedAttributes',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/content-manager/get-fill-from-locale/:model',\n handler: 'content-types.getFillFromLocaleData',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::content-manager.explorer.read'] },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/settings',\n handler: 'settings.getSettings',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'PUT',\n path: '/settings',\n handler: 'settings.updateSettings',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/ai-localization-jobs/collection-types/:contentType/:documentId',\n handler: 'ai-localization-jobs.getJobForCollectionType',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/ai-localization-jobs/single-types/:contentType',\n handler: 'ai-localization-jobs.getJobForSingleType',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n ],\n};\n"],"names":["type","routes","method","path","handler","config","policies","name","actions"],"mappings":"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"}
|
|
@@ -93,6 +93,24 @@ var admin = {
|
|
|
93
93
|
]
|
|
94
94
|
}
|
|
95
95
|
},
|
|
96
|
+
{
|
|
97
|
+
method: 'GET',
|
|
98
|
+
path: '/content-manager/get-fill-from-locale/:model',
|
|
99
|
+
handler: 'content-types.getFillFromLocaleData',
|
|
100
|
+
config: {
|
|
101
|
+
policies: [
|
|
102
|
+
'admin::isAuthenticatedAdmin',
|
|
103
|
+
{
|
|
104
|
+
name: 'plugin::content-manager.hasPermissions',
|
|
105
|
+
config: {
|
|
106
|
+
actions: [
|
|
107
|
+
'plugin::content-manager.explorer.read'
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
}
|
|
113
|
+
},
|
|
96
114
|
{
|
|
97
115
|
method: 'GET',
|
|
98
116
|
path: '/settings',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.mjs","sources":["../../../server/src/routes/admin.ts"],"sourcesContent":["export default {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n path: '/iso-locales',\n handler: 'iso-locales.listIsoLocales',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.read'] },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/locales',\n handler: 'locales.listLocales',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'POST',\n path: '/locales',\n handler: 'locales.createLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.create'] },\n },\n ],\n },\n },\n {\n method: 'PUT',\n path: '/locales/:id',\n handler: 'locales.updateLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.update'] },\n },\n ],\n },\n },\n {\n method: 'DELETE',\n path: '/locales/:id',\n handler: 'locales.deleteLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.delete'] },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/content-manager/actions/get-non-localized-fields',\n handler: 'content-types.getNonLocalizedAttributes',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/settings',\n handler: 'settings.getSettings',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'PUT',\n path: '/settings',\n handler: 'settings.updateSettings',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/ai-localization-jobs/collection-types/:contentType/:documentId',\n handler: 'ai-localization-jobs.getJobForCollectionType',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/ai-localization-jobs/single-types/:contentType',\n handler: 'ai-localization-jobs.getJobForSingleType',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n ],\n};\n"],"names":["type","routes","method","path","handler","config","policies","name","actions"],"mappings":"AAAA,YAAe;IACbA,IAAAA,EAAM,OAAA;IACNC,MAAAA,EAAQ;AACN,QAAA;YACEC,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,cAAA;YACNC,OAAAA,EAAS,4BAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBACEC,IAAAA,EAAM,wCAAA;wBACNF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA2B;AAAC;AAClD;AACD;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,UAAA;YACNC,OAAAA,EAAS,qBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,UAAA;YACNC,OAAAA,EAAS,sBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBACEC,IAAAA,EAAM,wCAAA;wBACNF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA6B;AAAC;AACpD;AACD;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,cAAA;YACNC,OAAAA,EAAS,sBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBACEC,IAAAA,EAAM,wCAAA;wBACNF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA6B;AAAC;AACpD;AACD;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,QAAA;YACRC,IAAAA,EAAM,cAAA;YACNC,OAAAA,EAAS,sBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBACEC,IAAAA,EAAM,wCAAA;wBACNF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA6B;AAAC;AACpD;AACD;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,mDAAA;YACNC,OAAAA,EAAS,yCAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,WAAA;YACNC,OAAAA,EAAS,sBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,WAAA;YACNC,OAAAA,EAAS,yBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,iEAAA;YACNC,OAAAA,EAAS,8CAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,iDAAA;YACNC,OAAAA,EAAS,0CAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF;AACD;AACH,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"admin.mjs","sources":["../../../server/src/routes/admin.ts"],"sourcesContent":["export default {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n path: '/iso-locales',\n handler: 'iso-locales.listIsoLocales',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.read'] },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/locales',\n handler: 'locales.listLocales',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'POST',\n path: '/locales',\n handler: 'locales.createLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.create'] },\n },\n ],\n },\n },\n {\n method: 'PUT',\n path: '/locales/:id',\n handler: 'locales.updateLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.update'] },\n },\n ],\n },\n },\n {\n method: 'DELETE',\n path: '/locales/:id',\n handler: 'locales.deleteLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.delete'] },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/content-manager/actions/get-non-localized-fields',\n handler: 'content-types.getNonLocalizedAttributes',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/content-manager/get-fill-from-locale/:model',\n handler: 'content-types.getFillFromLocaleData',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::content-manager.explorer.read'] },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/settings',\n handler: 'settings.getSettings',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'PUT',\n path: '/settings',\n handler: 'settings.updateSettings',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/ai-localization-jobs/collection-types/:contentType/:documentId',\n handler: 'ai-localization-jobs.getJobForCollectionType',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/ai-localization-jobs/single-types/:contentType',\n handler: 'ai-localization-jobs.getJobForSingleType',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n ],\n};\n"],"names":["type","routes","method","path","handler","config","policies","name","actions"],"mappings":"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"}
|