kempo 4.6.2 → 4.8.0
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 +8 -1
- package/app-public/account/index.page.html +2 -0
- package/app-public/nav.fragment.html +2 -1
- package/app-templates/emails/email.template.html +14 -0
- package/app-templates/emails/reset-password.page.html +19 -0
- package/app-templates/emails/test.page.html +21 -0
- package/app-templates/emails/verify-email.page.html +18 -0
- package/bin/cli.js +18 -33
- package/dist/admin/components/Dashboard.js +2 -2
- package/dist/admin/components/Dashboard.js.map +1 -1
- package/dist/admin/components/EmailTemplates.js +25 -0
- package/dist/admin/components/EmailTemplates.js.map +1 -0
- package/dist/admin/components/Emails.js +49 -0
- package/dist/admin/components/Emails.js.map +1 -0
- package/dist/admin/components/Menus.js +103 -0
- package/dist/admin/components/Menus.js.map +1 -0
- package/dist/admin/components/settings/AdminSettings.js +7 -0
- package/dist/admin/components/settings/AdminSettings.js.map +1 -0
- package/dist/admin/components/settings/BooleanSetting.js +2 -0
- package/dist/admin/components/settings/BooleanSetting.js.map +1 -0
- package/dist/admin/components/settings/JsonSetting.js +2 -0
- package/dist/admin/components/settings/JsonSetting.js.map +1 -0
- package/dist/admin/components/settings/NumberSetting.js +2 -0
- package/dist/admin/components/settings/NumberSetting.js.map +1 -0
- package/dist/admin/components/settings/SecretSetting.js +2 -0
- package/dist/admin/components/settings/SecretSetting.js.map +1 -0
- package/dist/admin/components/settings/Setting.js +2 -0
- package/dist/admin/components/settings/Setting.js.map +1 -0
- package/dist/admin/components/settings/SettingEditor.js +2 -0
- package/dist/admin/components/settings/SettingEditor.js.map +1 -0
- package/dist/admin/components/settings/SettingsPanel.js +24 -0
- package/dist/admin/components/settings/SettingsPanel.js.map +1 -0
- package/dist/admin/components/settings/StringSetting.js +2 -0
- package/dist/admin/components/settings/StringSetting.js.map +1 -0
- package/dist/admin/components/settings/humanize.js +2 -0
- package/dist/admin/components/settings/humanize.js.map +1 -0
- package/dist/admin/content/menus/index.page.html +11 -0
- package/dist/admin/emails/index.page.html +14 -0
- package/dist/admin/icons/mail.svg +1 -0
- package/dist/admin/nav.fragment.html +12 -0
- package/dist/admin/settings/[owner]/[name]/index.page.html +1 -1
- package/dist/admin/settings/index.page.html +6 -289
- package/dist/kempo/api/email-templates/GET.js +2 -0
- package/dist/kempo/api/email-templates/GET.js.map +1 -0
- package/dist/kempo/api/email-templates/file/DELETE.js +2 -0
- package/dist/kempo/api/email-templates/file/DELETE.js.map +1 -0
- package/dist/kempo/api/email-templates/file/GET.js +2 -0
- package/dist/kempo/api/email-templates/file/GET.js.map +1 -0
- package/dist/kempo/api/email-templates/file/PUT.js +2 -0
- package/dist/kempo/api/email-templates/file/PUT.js.map +1 -0
- package/dist/kempo/api/email-templates/preview/GET.js +2 -0
- package/dist/kempo/api/email-templates/preview/GET.js.map +1 -0
- package/dist/kempo/api/emails/GET.js +2 -0
- package/dist/kempo/api/emails/GET.js.map +1 -0
- package/dist/kempo/api/emails/[id]/GET.js +2 -0
- package/dist/kempo/api/emails/[id]/GET.js.map +1 -0
- package/dist/kempo/api/emails/[id]/retry/POST.js +2 -0
- package/dist/kempo/api/emails/[id]/retry/POST.js.map +1 -0
- package/dist/kempo/api/emails/test/POST.js +2 -0
- package/dist/kempo/api/emails/test/POST.js.map +1 -0
- package/dist/kempo/api/fragments/DELETE.js +1 -1
- package/dist/kempo/api/fragments/DELETE.js.map +1 -1
- package/dist/kempo/api/fragments/GET.js +1 -1
- package/dist/kempo/api/fragments/GET.js.map +1 -1
- package/dist/kempo/api/fragments/POST.js +1 -1
- package/dist/kempo/api/fragments/POST.js.map +1 -1
- package/dist/kempo/api/fragments/disable/PUT.js +1 -1
- package/dist/kempo/api/fragments/disable/PUT.js.map +1 -1
- package/dist/kempo/api/fragments/enable/PUT.js +1 -1
- package/dist/kempo/api/fragments/enable/PUT.js.map +1 -1
- package/dist/kempo/api/fragments/file/GET.js +1 -1
- package/dist/kempo/api/fragments/file/GET.js.map +1 -1
- package/dist/kempo/api/fragments/file/PATCH.js +1 -1
- package/dist/kempo/api/fragments/file/PATCH.js.map +1 -1
- package/dist/kempo/api/fragments/file/PUT.js +1 -1
- package/dist/kempo/api/fragments/file/PUT.js.map +1 -1
- package/dist/kempo/api/fragments/lock/PUT.js +1 -1
- package/dist/kempo/api/fragments/lock/PUT.js.map +1 -1
- package/dist/kempo/api/globals/DELETE.js +1 -1
- package/dist/kempo/api/globals/DELETE.js.map +1 -1
- package/dist/kempo/api/globals/GET.js +1 -1
- package/dist/kempo/api/globals/GET.js.map +1 -1
- package/dist/kempo/api/globals/POST.js +1 -1
- package/dist/kempo/api/globals/POST.js.map +1 -1
- package/dist/kempo/api/globals/disable/PUT.js +1 -1
- package/dist/kempo/api/globals/disable/PUT.js.map +1 -1
- package/dist/kempo/api/globals/enable/PUT.js +1 -1
- package/dist/kempo/api/globals/enable/PUT.js.map +1 -1
- package/dist/kempo/api/globals/entry/GET.js +1 -1
- package/dist/kempo/api/globals/entry/GET.js.map +1 -1
- package/dist/kempo/api/globals/entry/PUT.js +1 -1
- package/dist/kempo/api/globals/entry/PUT.js.map +1 -1
- package/dist/kempo/api/globals/lock/PUT.js +1 -1
- package/dist/kempo/api/globals/lock/PUT.js.map +1 -1
- package/dist/kempo/api/menus/DELETE.js +2 -0
- package/dist/kempo/api/menus/DELETE.js.map +1 -0
- package/dist/kempo/api/menus/GET.js +2 -0
- package/dist/kempo/api/menus/GET.js.map +1 -0
- package/dist/kempo/api/menus/POST.js +2 -0
- package/dist/kempo/api/menus/POST.js.map +1 -0
- package/dist/kempo/api/menus/adopt/PUT.js +2 -0
- package/dist/kempo/api/menus/adopt/PUT.js.map +1 -0
- package/dist/kempo/api/menus/items/DELETE.js +2 -0
- package/dist/kempo/api/menus/items/DELETE.js.map +1 -0
- package/dist/kempo/api/menus/items/POST.js +2 -0
- package/dist/kempo/api/menus/items/POST.js.map +1 -0
- package/dist/kempo/api/menus/items/enabled/PUT.js +2 -0
- package/dist/kempo/api/menus/items/enabled/PUT.js.map +1 -0
- package/dist/kempo/api/menus/items/order/PUT.js +2 -0
- package/dist/kempo/api/menus/items/order/PUT.js.map +1 -0
- package/dist/kempo/api/menus/location/PUT.js +2 -0
- package/dist/kempo/api/menus/location/PUT.js.map +1 -0
- package/dist/kempo/api/pages/DELETE.js +1 -1
- package/dist/kempo/api/pages/DELETE.js.map +1 -1
- package/dist/kempo/api/pages/GET.js +1 -1
- package/dist/kempo/api/pages/GET.js.map +1 -1
- package/dist/kempo/api/pages/POST.js +1 -1
- package/dist/kempo/api/pages/POST.js.map +1 -1
- package/dist/kempo/api/pages/directories/GET.js +1 -1
- package/dist/kempo/api/pages/directories/GET.js.map +1 -1
- package/dist/kempo/api/pages/disable/PUT.js +1 -1
- package/dist/kempo/api/pages/disable/PUT.js.map +1 -1
- package/dist/kempo/api/pages/enable/PUT.js +1 -1
- package/dist/kempo/api/pages/enable/PUT.js.map +1 -1
- package/dist/kempo/api/pages/file/GET.js +1 -1
- package/dist/kempo/api/pages/file/GET.js.map +1 -1
- package/dist/kempo/api/pages/file/PATCH.js +1 -1
- package/dist/kempo/api/pages/file/PATCH.js.map +1 -1
- package/dist/kempo/api/pages/file/PUT.js +1 -1
- package/dist/kempo/api/pages/file/PUT.js.map +1 -1
- package/dist/kempo/api/pages/lock/PUT.js +1 -1
- package/dist/kempo/api/pages/lock/PUT.js.map +1 -1
- package/dist/kempo/api/pages/rescan/POST.js +1 -1
- package/dist/kempo/api/pages/rescan/POST.js.map +1 -1
- package/dist/kempo/api/pages/search/GET.js +1 -1
- package/dist/kempo/api/pages/search/GET.js.map +1 -1
- package/dist/kempo/api/pages/templates/GET.js +1 -1
- package/dist/kempo/api/pages/templates/GET.js.map +1 -1
- package/dist/kempo/api/settings/[owner]/[name]/POST.js +1 -1
- package/dist/kempo/api/settings/[owner]/[name]/POST.js.map +1 -1
- package/dist/kempo/api/templates/DELETE.js +1 -1
- package/dist/kempo/api/templates/DELETE.js.map +1 -1
- package/dist/kempo/api/templates/GET.js +1 -1
- package/dist/kempo/api/templates/GET.js.map +1 -1
- package/dist/kempo/api/templates/POST.js +1 -1
- package/dist/kempo/api/templates/POST.js.map +1 -1
- package/dist/kempo/api/templates/disable/PUT.js +1 -1
- package/dist/kempo/api/templates/disable/PUT.js.map +1 -1
- package/dist/kempo/api/templates/enable/PUT.js +1 -1
- package/dist/kempo/api/templates/enable/PUT.js.map +1 -1
- package/dist/kempo/api/templates/file/GET.js +1 -1
- package/dist/kempo/api/templates/file/GET.js.map +1 -1
- package/dist/kempo/api/templates/file/PATCH.js +1 -1
- package/dist/kempo/api/templates/file/PATCH.js.map +1 -1
- package/dist/kempo/api/templates/file/PUT.js +1 -1
- package/dist/kempo/api/templates/file/PUT.js.map +1 -1
- package/dist/kempo/api/templates/lock/PUT.js +1 -1
- package/dist/kempo/api/templates/lock/PUT.js.map +1 -1
- package/dist/kempo/components/DashboardWidget.js +4 -4
- package/dist/kempo/components/DashboardWidget.js.map +1 -1
- package/dist/kempo/icons/campaign.svg +1 -0
- package/dist/kempo/icons/fields.svg +1 -0
- package/dist/kempo/icons/open_in_new.svg +1 -0
- package/dist/kempo/sdk.js +1 -1
- package/dist/kempo/sdk.js.map +1 -1
- package/middleware/kempo.js +69 -12
- package/package.json +3 -4
- package/server/db/schema.js +56 -0
- package/server/sdk.js +26 -0
- package/server/utils/auth/requestPasswordReset.js +9 -3
- package/server/utils/auth/verifyEmail.js +10 -1
- package/server/utils/dashboard/coreWidgets.js +1 -0
- package/server/utils/dashboard/helpers.js +6 -0
- package/server/utils/email/defaultSender.js +2 -0
- package/server/utils/email/dispatchEmail.js +56 -0
- package/server/utils/email/emailSettings.js +21 -0
- package/server/utils/email/emailTemplatePaths.js +36 -0
- package/server/utils/email/getEmail.js +14 -0
- package/server/utils/email/getSenderEmail.js +11 -0
- package/server/utils/email/getSenderFrom.js +18 -0
- package/server/utils/email/isValidSender.js +4 -0
- package/server/utils/email/listEmailTemplates.js +23 -0
- package/server/utils/email/listEmails.js +35 -0
- package/server/utils/email/maintainEmails.js +46 -0
- package/server/utils/email/pruneEmails.js +29 -0
- package/server/utils/email/readEmailTemplate.js +28 -0
- package/server/utils/email/renderEmailTemplate.js +63 -0
- package/server/utils/email/resetEmailTemplate.js +15 -0
- package/server/utils/email/retryEmail.js +21 -0
- package/server/utils/email/saveEmailTemplate.js +38 -0
- package/server/utils/email/sendEmail.js +22 -32
- package/server/utils/email/sendEmailFromTemplate.js +9 -27
- package/server/utils/extensions/aliases.js +71 -0
- package/server/utils/extensions/checkClaims.js +32 -0
- package/server/utils/extensions/claims.js +54 -0
- package/server/utils/extensions/createTablesFromSchema.js +13 -20
- package/server/utils/extensions/enableExtensionTree.js +8 -0
- package/server/utils/extensions/installExtension.js +32 -0
- package/server/utils/extensions/readKempoConfig.js +2 -2
- package/server/utils/extensions/scopeCache.js +14 -1
- package/server/utils/extensions/scopes.js +72 -0
- package/server/utils/extensions/uninstallExtensionTree.js +2 -1
- package/server/utils/extensions/updateExtension.js +35 -0
- package/server/utils/global-content/createGlobalContent.js +8 -18
- package/server/utils/global-content/deleteGlobalContent.js +1 -16
- package/server/utils/global-content/disableGlobalContent.js +1 -16
- package/server/utils/global-content/enableGlobalContent.js +1 -16
- package/server/utils/global-content/helpers.js +40 -6
- package/server/utils/global-content/listGlobalContent.js +2 -2
- package/server/utils/global-content/setGlobalContentLocked.js +1 -16
- package/server/utils/global-content/updateGlobalContent.js +1 -16
- package/server/utils/hooks/triggerHook.js +17 -4
- package/server/utils/menus/adoptMenuItem.js +58 -0
- package/server/utils/menus/assignMenuLocation.js +47 -0
- package/server/utils/menus/deleteMenu.js +27 -0
- package/server/utils/menus/deleteMenuItems.js +27 -0
- package/server/utils/menus/findMenuLocations.js +41 -0
- package/server/utils/menus/findNavItems.js +74 -0
- package/server/utils/menus/findPages.js +73 -0
- package/server/utils/menus/listMenus.js +103 -0
- package/server/utils/menus/markup.js +55 -0
- package/server/utils/menus/reorderMenuItems.js +36 -0
- package/server/utils/menus/saveMenu.js +54 -0
- package/server/utils/menus/saveMenuItem.js +122 -0
- package/server/utils/menus/setMenuItemEnabled.js +31 -0
- package/server/utils/menus/store.js +90 -0
- package/server/utils/scheduler/helpers.js +36 -0
- package/server/utils/scheduler/listJobs.js +11 -0
- package/server/utils/scheduler/registerJobs.js +37 -0
- package/server/utils/scheduler/runJobs.js +90 -0
- package/server/utils/scheduler/scheduler.js +37 -0
- package/server/utils/scheduler/unregisterJobs.js +16 -0
- package/server/utils/settings/ensureEncryptionKey.js +132 -0
- package/server/utils/settings/listSettings.js +10 -5
- package/server/utils/settings/secretCrypto.js +5 -1
- package/server/utils/settings/setSetting.js +4 -0
- package/server/utils/settings/settingRules.js +21 -0
- package/server/utils/settings/systemSettings.js +40 -0
- package/server/utils/setup/seedDatabase.js +5 -60
- package/server/utils/setup/systemPermissions.js +75 -0
- package/dist/kempo/icons/create_new_folder.svg +0 -1
- package/dist/kempo/icons/credit_card.svg +0 -1
- package/dist/kempo/icons/login.svg +0 -1
- package/dist/kempo/icons/payments.svg +0 -1
- package/dist/kempo/icons/toll.svg +0 -1
- package/dist/kempo/icons/wallet.svg +0 -1
|
@@ -3,297 +3,14 @@
|
|
|
3
3
|
-->
|
|
4
4
|
<page title="Settings - Admin">
|
|
5
5
|
<content>
|
|
6
|
-
<script type="module" src="/
|
|
7
|
-
<script type="module" src="/kempo-ui/components/controls/TcFirstPage.js"></script>
|
|
8
|
-
<script type="module" src="/kempo-ui/components/controls/TcPrevPage.js"></script>
|
|
9
|
-
<script type="module" src="/kempo-ui/components/controls/TcNextPage.js"></script>
|
|
10
|
-
<script type="module" src="/kempo-ui/components/controls/TcLastPage.js"></script>
|
|
11
|
-
<script type="module" src="/kempo-ui/components/controls/TcPageSelect.js"></script>
|
|
12
|
-
<script type="module" src="/kempo-ui/components/controls/TcPageSize.js"></script>
|
|
13
|
-
<script type="module" src="/kempo-ui/components/controls/TcEdit.js"></script>
|
|
14
|
-
<script type="module" src="/kempo-ui/components/controls/TcDeleteRecord.js"></script>
|
|
15
|
-
<script type="module" src="/kempo-ui/components/controls/TcDeleteSelected.js"></script>
|
|
16
|
-
<script type="module" src="/admin/components/TableRowLink.js"></script>
|
|
17
|
-
<script type="module" src="/kempo/components/Permission.js"></script>
|
|
6
|
+
<script type="module" src="/admin/components/settings/AdminSettings.js"></script>
|
|
18
7
|
|
|
19
|
-
<
|
|
20
|
-
<h1 class="flex mb0">Settings</h1>
|
|
21
|
-
<k-permission has="system:custom-settings:manage">
|
|
22
|
-
<button id="createSettingBtn" class="primary">Create Setting</button>
|
|
23
|
-
</k-permission>
|
|
24
|
-
</div>
|
|
8
|
+
<h1>Settings</h1>
|
|
25
9
|
|
|
26
|
-
<
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
<div>
|
|
31
|
-
<k-permission has="system:custom-settings:manage">
|
|
32
|
-
<kc-tc-delete-selected></kc-tc-delete-selected>
|
|
33
|
-
</k-permission>
|
|
34
|
-
</div>
|
|
35
|
-
</div>
|
|
36
|
-
<div class="d-f full" style="align-items: center;">
|
|
37
|
-
<div>
|
|
38
|
-
<kc-tc-first-page></kc-tc-first-page>
|
|
39
|
-
<kc-tc-prev-page></kc-tc-prev-page>
|
|
40
|
-
<kc-tc-next-page></kc-tc-next-page>
|
|
41
|
-
<kc-tc-last-page></kc-tc-last-page>
|
|
42
|
-
</div>
|
|
43
|
-
<div class="flex"></div>
|
|
44
|
-
<div><kc-tc-page-select></kc-tc-page-select></div>
|
|
45
|
-
<div class="flex"></div>
|
|
46
|
-
<div><kc-tc-page-size></kc-tc-page-size></div>
|
|
47
|
-
</div>
|
|
48
|
-
</k-table>
|
|
49
|
-
|
|
50
|
-
<h2>Extension Settings</h2>
|
|
51
|
-
<k-table id="extensionTable" enable-pages page-size="25" page-size-options="[10,25,50,100]" placeholder="No extension settings installed.">
|
|
52
|
-
<admin-table-row-link slot="before" url-pattern="{_link}" field-name="_link"></admin-table-row-link>
|
|
53
|
-
<div class="d-f full" style="align-items: center;">
|
|
54
|
-
<div>
|
|
55
|
-
<kc-tc-first-page></kc-tc-first-page>
|
|
56
|
-
<kc-tc-prev-page></kc-tc-prev-page>
|
|
57
|
-
<kc-tc-next-page></kc-tc-next-page>
|
|
58
|
-
<kc-tc-last-page></kc-tc-last-page>
|
|
59
|
-
</div>
|
|
60
|
-
<div class="flex"></div>
|
|
61
|
-
<div><kc-tc-page-select></kc-tc-page-select></div>
|
|
62
|
-
<div class="flex"></div>
|
|
63
|
-
<div><kc-tc-page-size></kc-tc-page-size></div>
|
|
64
|
-
</div>
|
|
65
|
-
</k-table>
|
|
66
|
-
|
|
67
|
-
<h2>System Settings</h2>
|
|
68
|
-
<k-table id="systemTable" enable-pages page-size="25" page-size-options="[10,25,50,100]" placeholder="No system settings found.">
|
|
69
|
-
<admin-table-row-link slot="before" url-pattern="{_link}" field-name="_link"></admin-table-row-link>
|
|
70
|
-
<div class="d-f full" style="align-items: center;">
|
|
71
|
-
<div>
|
|
72
|
-
<kc-tc-first-page></kc-tc-first-page>
|
|
73
|
-
<kc-tc-prev-page></kc-tc-prev-page>
|
|
74
|
-
<kc-tc-next-page></kc-tc-next-page>
|
|
75
|
-
<kc-tc-last-page></kc-tc-last-page>
|
|
76
|
-
</div>
|
|
77
|
-
<div class="flex"></div>
|
|
78
|
-
<div><kc-tc-page-select></kc-tc-page-select></div>
|
|
79
|
-
<div class="flex"></div>
|
|
80
|
-
<div><kc-tc-page-size></kc-tc-page-size></div>
|
|
81
|
-
</div>
|
|
82
|
-
</k-table>
|
|
83
|
-
|
|
84
|
-
<script type="module">
|
|
85
|
-
import { listSettings, setSetting, deleteSetting, getAllCurrentUserPermissions } from '/kempo/sdk.js';
|
|
86
|
-
import { html } from '/kempo-ui/lit-all.min.js';
|
|
87
|
-
import Toast from '/kempo-ui/components/Toast.js';
|
|
88
|
-
import Dialog from '/kempo-ui/components/Dialog.js';
|
|
89
|
-
|
|
90
|
-
await window.customElements.whenDefined('k-table');
|
|
91
|
-
|
|
92
|
-
const [, permData] = await getAllCurrentUserPermissions();
|
|
93
|
-
const myPerms = new Set(permData?.permissions ?? []);
|
|
94
|
-
const canManageSystem = myPerms.has('system:settings:update');
|
|
95
|
-
const canManageCustom = myPerms.has('system:custom-settings:manage');
|
|
96
|
-
|
|
97
|
-
const buildFields = (editable, showOwner = false) => [
|
|
98
|
-
...(showOwner ? [{ name: 'owner', label: 'Owner', size: 120, editable: false, calculator: r => r.name.split(':')[0] }] : []),
|
|
99
|
-
{ name: 'name', label: 'Name', size: 220, editable: false, calculator: r => r.name.split(':').slice(1).join(':') },
|
|
100
|
-
{ name: 'value', label: 'Value', size: 280, editable, formatter: v => {
|
|
101
|
-
if(v === null || v === undefined) return '';
|
|
102
|
-
const s = String(v);
|
|
103
|
-
return s.length > 120 ? s.slice(0, 117) + '...' : s;
|
|
104
|
-
}},
|
|
105
|
-
{ name: 'type', label: 'Type', size: 90, editable },
|
|
106
|
-
{ name: 'isPublic', label: 'Public', size: 80, editable, formatter: v => String(v) },
|
|
107
|
-
{ name: 'description', label: 'Description', size: 320, editable },
|
|
108
|
-
{ name: 'updatedAt', label: 'Updated', size: 190, editable: false, formatter: v => new Date(v).toLocaleString() }
|
|
109
|
-
];
|
|
110
|
-
|
|
111
|
-
const coerceValue = (value, type) => {
|
|
112
|
-
if(type === 'number') return Number(value);
|
|
113
|
-
if(type === 'boolean') return String(value).toLowerCase() === 'true';
|
|
114
|
-
if(type === 'json') return JSON.parse(String(value));
|
|
115
|
-
return String(value);
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
const setupTable = ($table, owner, canEdit, loadFn) => {
|
|
119
|
-
if(canEdit){
|
|
120
|
-
$table.setAttribute('request-edit', '');
|
|
121
|
-
const edit = document.createElement('kc-tc-edit');
|
|
122
|
-
edit.setAttribute('slot', 'after');
|
|
123
|
-
$table.appendChild(edit);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
if(owner === 'custom' && canEdit){
|
|
127
|
-
$table.setAttribute('request-delete', '');
|
|
128
|
-
$table.setAttribute('enable-selection', '');
|
|
129
|
-
const del = document.createElement('kc-tc-delete-record');
|
|
130
|
-
del.setAttribute('slot', 'after');
|
|
131
|
-
$table.appendChild(del);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
$table.addEventListener('requestSave', async ({ detail: { record, newData, approve, reject } }) => {
|
|
135
|
-
const type = newData.type ?? record.type;
|
|
136
|
-
let value = newData.value !== undefined ? newData.value : record.value;
|
|
137
|
-
|
|
138
|
-
try {
|
|
139
|
-
value = coerceValue(value, type);
|
|
140
|
-
} catch(e){
|
|
141
|
-
reject();
|
|
142
|
-
Toast.error(`Invalid ${type} value`);
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
const isPublic = newData.isPublic !== undefined
|
|
147
|
-
? String(newData.isPublic).toLowerCase() === 'true'
|
|
148
|
-
: record.isPublic;
|
|
149
|
-
const [recordOwner, ...nameParts] = record.name.split(':');
|
|
150
|
-
const name = nameParts.join(':');
|
|
151
|
-
const [error] = await setSetting(recordOwner, name, {
|
|
152
|
-
value,
|
|
153
|
-
type,
|
|
154
|
-
isPublic,
|
|
155
|
-
description: newData.description ?? record.description
|
|
156
|
-
});
|
|
157
|
-
|
|
158
|
-
if(error){ reject(); Toast.error(error.msg || 'Failed to update setting'); return; }
|
|
159
|
-
approve();
|
|
160
|
-
Toast.success('Setting updated');
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
if(owner === 'custom' && canEdit){
|
|
164
|
-
$table.addEventListener('requestDelete', ({ detail: { records, approve, reject } }) => {
|
|
165
|
-
const displayName = r => r.name.split(':').slice(1).join(':');
|
|
166
|
-
const count = records.length;
|
|
167
|
-
const msg = count === 1
|
|
168
|
-
? `<div class="p"><p>Delete "${displayName(records[0])}"? This action cannot be undone.</p></div>`
|
|
169
|
-
: `<div class="p"><p>Delete ${count} settings? This action cannot be undone.</p></div>`;
|
|
170
|
-
Dialog.confirm(msg, async (confirmed) => {
|
|
171
|
-
if(!confirmed){ reject(); return; }
|
|
172
|
-
let failed = 0;
|
|
173
|
-
for(const record of records){
|
|
174
|
-
const [recOwner, ...nameParts] = record.name.split(':');
|
|
175
|
-
const [error] = await deleteSetting(recOwner, nameParts.join(':'));
|
|
176
|
-
if(error) failed++;
|
|
177
|
-
}
|
|
178
|
-
if(failed){
|
|
179
|
-
reject();
|
|
180
|
-
Toast.error(`Failed to delete ${failed} setting${failed !== 1 ? 's' : ''}`);
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
approve();
|
|
184
|
-
Toast.success(count === 1 ? 'Setting deleted' : `${count} settings deleted`);
|
|
185
|
-
loadFn();
|
|
186
|
-
});
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
};
|
|
190
|
-
|
|
191
|
-
const addLinks = settings => {
|
|
192
|
-
settings.forEach(s => {
|
|
193
|
-
const [o, ...parts] = s.name.split(':');
|
|
194
|
-
s._link = `/admin/settings/${encodeURIComponent(o)}/${encodeURIComponent(parts.join(':'))}/`;
|
|
195
|
-
});
|
|
196
|
-
};
|
|
197
|
-
|
|
198
|
-
const loadTable = async ($table, owner, canEdit) => {
|
|
199
|
-
const [error, data] = await listSettings({ owner });
|
|
200
|
-
if(error){ Toast.error(error.msg || 'Failed to load settings'); return; }
|
|
201
|
-
addLinks(data.settings);
|
|
202
|
-
$table.setData({ records: data.settings, fields: buildFields(canEdit, owner === 'extension') });
|
|
203
|
-
$table.setupFetchRecords(data.total, async (start, count) => {
|
|
204
|
-
const [err, d] = await listSettings({ owner, limit: count, offset: start });
|
|
205
|
-
if(err) return [];
|
|
206
|
-
addLinks(d.settings);
|
|
207
|
-
return d.settings;
|
|
208
|
-
});
|
|
209
|
-
};
|
|
210
|
-
|
|
211
|
-
const $customTable = document.getElementById('customTable');
|
|
212
|
-
const $extensionTable = document.getElementById('extensionTable');
|
|
213
|
-
const $systemTable = document.getElementById('systemTable');
|
|
214
|
-
|
|
215
|
-
setupTable($customTable, 'custom', canManageCustom, () => loadTable($customTable, 'custom', canManageCustom));
|
|
216
|
-
setupTable($extensionTable, 'extension', false, () => loadTable($extensionTable, 'extension', false));
|
|
217
|
-
setupTable($systemTable, 'system', canManageSystem, () => loadTable($systemTable, 'system', canManageSystem));
|
|
218
|
-
|
|
219
|
-
await Promise.all([
|
|
220
|
-
loadTable($customTable, 'custom', canManageCustom),
|
|
221
|
-
loadTable($extensionTable, 'extension', false),
|
|
222
|
-
loadTable($systemTable, 'system', canManageSystem)
|
|
223
|
-
]);
|
|
224
|
-
|
|
225
|
-
if(canManageCustom){
|
|
226
|
-
document.getElementById('createSettingBtn').addEventListener('click', () => {
|
|
227
|
-
const $dialog = Dialog.create(html`
|
|
228
|
-
<div class="p">
|
|
229
|
-
<div class="mb">
|
|
230
|
-
<label class="d-b mb-sm">Name</label>
|
|
231
|
-
<input type="text" id="dlg-name" class="full" placeholder="e.g. my-setting" required>
|
|
232
|
-
</div>
|
|
233
|
-
<div class="mb">
|
|
234
|
-
<label class="d-b mb-sm">Value</label>
|
|
235
|
-
<input type="text" id="dlg-value" class="full">
|
|
236
|
-
</div>
|
|
237
|
-
<div class="mb">
|
|
238
|
-
<label class="d-b mb-sm">Type</label>
|
|
239
|
-
<select id="dlg-type" class="full">
|
|
240
|
-
<option value="string">String</option>
|
|
241
|
-
<option value="number">Number</option>
|
|
242
|
-
<option value="boolean">Boolean</option>
|
|
243
|
-
<option value="json">JSON</option>
|
|
244
|
-
<option value="secret">Secret</option>
|
|
245
|
-
</select>
|
|
246
|
-
</div>
|
|
247
|
-
<div class="mb d-f" style="align-items: center; gap: var(--spacer-sm);" id="dlg-isPublic-row">
|
|
248
|
-
<input type="checkbox" id="dlg-isPublic">
|
|
249
|
-
<label for="dlg-isPublic">Public (accessible without authentication)</label>
|
|
250
|
-
</div>
|
|
251
|
-
<div>
|
|
252
|
-
<label class="d-b mb-sm">Description</label>
|
|
253
|
-
<input type="text" id="dlg-description" class="full">
|
|
254
|
-
</div>
|
|
255
|
-
</div>
|
|
256
|
-
`, {
|
|
257
|
-
title: 'Create Setting',
|
|
258
|
-
confirmText: 'Create',
|
|
259
|
-
confirmAction: async () => {
|
|
260
|
-
const name = $dialog.querySelector('#dlg-name').value.trim();
|
|
261
|
-
if(!name){ Toast.error('Name is required'); return; }
|
|
262
|
-
if(name.includes(':')){ Toast.error('Name cannot contain ":"'); return; }
|
|
263
|
-
|
|
264
|
-
const rawValue = $dialog.querySelector('#dlg-value').value;
|
|
265
|
-
const type = $dialog.querySelector('#dlg-type').value;
|
|
266
|
-
const isPublic = $dialog.querySelector('#dlg-isPublic').checked;
|
|
267
|
-
const description = $dialog.querySelector('#dlg-description').value.trim();
|
|
268
|
-
|
|
269
|
-
let value;
|
|
270
|
-
try {
|
|
271
|
-
value = coerceValue(rawValue, type);
|
|
272
|
-
} catch(e){
|
|
273
|
-
Toast.error(`Invalid ${type} value`);
|
|
274
|
-
return;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
const [error] = await setSetting('custom', name, { value, type, isPublic, description });
|
|
278
|
-
if(error){ Toast.error(error.msg || 'Failed to create setting'); return; }
|
|
279
|
-
Toast.success('Setting created');
|
|
280
|
-
loadTable($customTable, 'custom', canManageCustom);
|
|
281
|
-
},
|
|
282
|
-
cancelText: 'Cancel'
|
|
283
|
-
});
|
|
284
|
-
|
|
285
|
-
const $dlgValue = $dialog.querySelector('#dlg-value');
|
|
286
|
-
const $dlgIsPublic = $dialog.querySelector('#dlg-isPublic');
|
|
287
|
-
const $dlgIsPublicRow = $dialog.querySelector('#dlg-isPublic-row');
|
|
288
|
-
$dialog.querySelector('#dlg-type').addEventListener('change', e => {
|
|
289
|
-
const isSecret = e.target.value === 'secret';
|
|
290
|
-
$dlgValue.type = isSecret ? 'password' : 'text';
|
|
291
|
-
$dlgIsPublicRow.style.display = isSecret ? 'none' : '';
|
|
292
|
-
if(isSecret) $dlgIsPublic.checked = false;
|
|
293
|
-
});
|
|
294
|
-
});
|
|
295
|
-
}
|
|
296
|
-
</script>
|
|
10
|
+
<k-admin-settings>
|
|
11
|
+
<location name="admin-settings-tabs" />
|
|
12
|
+
</k-admin-settings>
|
|
13
|
+
<location name="admin-settings-scripts" />
|
|
297
14
|
|
|
298
15
|
</content>
|
|
299
16
|
</page>
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import s from"../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../server/utils/email/listEmailTemplates.js";export default async(r,t)=>{const[o,i]=await s(r.cookies.session_token,"system:pages:read");if(o)return t.status(o.code).json({error:o.msg});if(!i)return t.status(403).json({error:"Insufficient permissions"});const[n,a]=await e({owner:r.query.owner||null});if(n)return t.status(n.code).json({error:n.msg});t.json({templates:a})};
|
|
2
|
+
//# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\email-templates\GET.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"src\\kempo\\api\\email-templates\\GET.js","names":["currentUserHasPermission","listEmailTemplates","async","request","response","permError","hasPermission","cookies","session_token","status","code","json","error","msg","templates","owner","query"],"sources":["0"],"sourcesContent":["import currentUserHasPermission from '../../../../server/utils/permissions/currentUserHasPermission.js';\nimport listEmailTemplates from '../../../../server/utils/email/listEmailTemplates.js';\n\n/* The email templates of the extension named in `?owner=`, or kempo's own and the site's when there is none. */\nexport default async (request, response) => {\n\tconst [permError, hasPermission] = await currentUserHasPermission(request.cookies.session_token, 'system:pages:read');\n\tif(permError) return response.status(permError.code).json({ error: permError.msg });\n\tif(!hasPermission) return response.status(403).json({ error: 'Insufficient permissions' });\n\n\tconst [error, templates] = await listEmailTemplates({ owner: request.query.owner || null });\n\tif(error) return response.status(error.code).json({ error: error.msg });\n\n\tresponse.json({ templates });\n};\n"],"mappings":"OAAOA,MAA8B,0EAC9BC,MAAwB,sEAGhBC,MAAOC,EAASC,KAC9B,MAAOC,EAAWC,SAAuBN,EAAyBG,EAAQI,QAAQC,cAAe,qBACjG,GAAGH,EAAW,OAAOD,EAASK,OAAOJ,EAAUK,MAAMC,KAAK,CAAEC,MAAOP,EAAUQ,MAC7E,IAAIP,EAAe,OAAOF,EAASK,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAE7D,MAAOA,EAAOE,SAAmBb,EAAmB,CAAEc,MAAOZ,EAAQa,MAAMD,OAAS,OACpF,GAAGH,EAAO,OAAOR,EAASK,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAEjET,EAASO,KAAK,CAAEG","ignoreList":[]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import s from"../../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../../server/utils/email/resetEmailTemplate.js";export default async(r,t)=>{const[o,i]=await s(r.cookies.session_token,"system:pages:update");if(o)return t.status(o.code).json({error:o.msg});if(!i)return t.status(403).json({error:"Insufficient permissions"});const[n,a]=await e({template:r.body?.template});if(n)return t.status(n.code).json({error:n.msg});t.json(a)};
|
|
2
|
+
//# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\email-templates\file\DELETE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"src\\kempo\\api\\email-templates\\file\\DELETE.js","names":["currentUserHasPermission","resetEmailTemplate","async","request","response","permError","hasPermission","cookies","session_token","status","code","json","error","msg","reset","template","body"],"sources":["0"],"sourcesContent":["import currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\nimport resetEmailTemplate from '../../../../../server/utils/email/resetEmailTemplate.js';\n\n/* Goes back to the packaged version of an email template, by removing the site's own. Body: `{ template }`. */\nexport default async (request, response) => {\n\tconst [permError, hasPermission] = await currentUserHasPermission(request.cookies.session_token, 'system:pages:update');\n\tif(permError) return response.status(permError.code).json({ error: permError.msg });\n\tif(!hasPermission) return response.status(403).json({ error: 'Insufficient permissions' });\n\n\tconst [error, reset] = await resetEmailTemplate({ template: request.body?.template });\n\tif(error) return response.status(error.code).json({ error: error.msg });\n\n\tresponse.json(reset);\n};\n"],"mappings":"OAAOA,MAA8B,6EAC9BC,MAAwB,yEAGhBC,MAAOC,EAASC,KAC9B,MAAOC,EAAWC,SAAuBN,EAAyBG,EAAQI,QAAQC,cAAe,uBACjG,GAAGH,EAAW,OAAOD,EAASK,OAAOJ,EAAUK,MAAMC,KAAK,CAAEC,MAAOP,EAAUQ,MAC7E,IAAIP,EAAe,OAAOF,EAASK,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAE7D,MAAOA,EAAOE,SAAeb,EAAmB,CAAEc,SAAUZ,EAAQa,MAAMD,WAC1E,GAAGH,EAAO,OAAOR,EAASK,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAEjET,EAASO,KAAKG","ignoreList":[]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import s from"../../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../../server/utils/email/readEmailTemplate.js";export default async(r,t)=>{const[o,i]=await s(r.cookies.session_token,"system:pages:read");if(o)return t.status(o.code).json({error:o.msg});if(!i)return t.status(403).json({error:"Insufficient permissions"});const[a,n]=await e({template:r.query.template});if(a)return t.status(a.code).json({error:a.msg});t.json(n)};
|
|
2
|
+
//# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\email-templates\file\GET.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"src\\kempo\\api\\email-templates\\file\\GET.js","names":["currentUserHasPermission","readEmailTemplate","async","request","response","permError","hasPermission","cookies","session_token","status","code","json","error","msg","template","query"],"sources":["0"],"sourcesContent":["import currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\nimport readEmailTemplate from '../../../../../server/utils/email/readEmailTemplate.js';\n\n/* One email template: what the site sends now, and the packaged version it can go back to. `?template=owner/name`. */\nexport default async (request, response) => {\n\tconst [permError, hasPermission] = await currentUserHasPermission(request.cookies.session_token, 'system:pages:read');\n\tif(permError) return response.status(permError.code).json({ error: permError.msg });\n\tif(!hasPermission) return response.status(403).json({ error: 'Insufficient permissions' });\n\n\tconst [error, template] = await readEmailTemplate({ template: request.query.template });\n\tif(error) return response.status(error.code).json({ error: error.msg });\n\n\tresponse.json(template);\n};\n"],"mappings":"OAAOA,MAA8B,6EAC9BC,MAAuB,wEAGfC,MAAOC,EAASC,KAC9B,MAAOC,EAAWC,SAAuBN,EAAyBG,EAAQI,QAAQC,cAAe,qBACjG,GAAGH,EAAW,OAAOD,EAASK,OAAOJ,EAAUK,MAAMC,KAAK,CAAEC,MAAOP,EAAUQ,MAC7E,IAAIP,EAAe,OAAOF,EAASK,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAE7D,MAAOA,EAAOE,SAAkBb,EAAkB,CAAEa,SAAUX,EAAQY,MAAMD,WAC5E,GAAGF,EAAO,OAAOR,EAASK,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAEjET,EAASO,KAAKG","ignoreList":[]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import s from"../../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../../server/utils/email/saveEmailTemplate.js";export default async(r,t)=>{const[o,i]=await s(r.cookies.session_token,"system:pages:update");if(o)return t.status(o.code).json({error:o.msg});if(!i)return t.status(403).json({error:"Insufficient permissions"});const[a,n]=await e({template:r.body?.template,source:r.body?.source});if(a)return t.status(a.code).json({error:a.msg});t.json(n)};
|
|
2
|
+
//# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\email-templates\file\PUT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"src\\kempo\\api\\email-templates\\file\\PUT.js","names":["currentUserHasPermission","saveEmailTemplate","async","request","response","permError","hasPermission","cookies","session_token","status","code","json","error","msg","saved","template","body","source"],"sources":["0"],"sourcesContent":["import currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\nimport saveEmailTemplate from '../../../../../server/utils/email/saveEmailTemplate.js';\n\n/* Saves the site's version of an email template. Body: `{ template, source }`. */\nexport default async (request, response) => {\n\tconst [permError, hasPermission] = await currentUserHasPermission(request.cookies.session_token, 'system:pages:update');\n\tif(permError) return response.status(permError.code).json({ error: permError.msg });\n\tif(!hasPermission) return response.status(403).json({ error: 'Insufficient permissions' });\n\n\tconst [error, saved] = await saveEmailTemplate({ template: request.body?.template, source: request.body?.source });\n\tif(error) return response.status(error.code).json({ error: error.msg });\n\n\tresponse.json(saved);\n};\n"],"mappings":"OAAOA,MAA8B,6EAC9BC,MAAuB,wEAGfC,MAAOC,EAASC,KAC9B,MAAOC,EAAWC,SAAuBN,EAAyBG,EAAQI,QAAQC,cAAe,uBACjG,GAAGH,EAAW,OAAOD,EAASK,OAAOJ,EAAUK,MAAMC,KAAK,CAAEC,MAAOP,EAAUQ,MAC7E,IAAIP,EAAe,OAAOF,EAASK,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAE7D,MAAOA,EAAOE,SAAeb,EAAkB,CAAEc,SAAUZ,EAAQa,MAAMD,SAAUE,OAAQd,EAAQa,MAAMC,SACzG,GAAGL,EAAO,OAAOR,EAASK,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAEjET,EAASO,KAAKG","ignoreList":[]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import s from"../../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../../server/utils/email/renderEmailTemplate.js";export default async(r,t)=>{const[o,i]=await s(r.cookies.session_token,"system:pages:read");if(o)return t.status(o.code).json({error:o.msg});if(!i)return t.status(403).json({error:"Insufficient permissions"});const[a,n]=await e({template:r.query.template,data:{}});if(a)return t.status(a.code).json({error:a.msg});t.type("html").send(n)};
|
|
2
|
+
//# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\email-templates\preview\GET.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"src\\kempo\\api\\email-templates\\preview\\GET.js","names":["currentUserHasPermission","renderEmailTemplate","async","request","response","permError","hasPermission","cookies","session_token","status","code","json","error","msg","page","template","query","data","type","send"],"sources":["0"],"sourcesContent":["import currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\nimport renderEmailTemplate from '../../../../../server/utils/email/renderEmailTemplate.js';\n\n/*\n An email template drawn with no data, to open in a tab: what the site would send, with the parts that need data left blank. An\n extension that can do better (real or sample data) serves its own preview and gives it to <k-email-templates> as `preview-url`.\n*/\nexport default async (request, response) => {\n\tconst [permError, hasPermission] = await currentUserHasPermission(request.cookies.session_token, 'system:pages:read');\n\tif(permError) return response.status(permError.code).json({ error: permError.msg });\n\tif(!hasPermission) return response.status(403).json({ error: 'Insufficient permissions' });\n\n\tconst [error, page] = await renderEmailTemplate({ template: request.query.template, data: {} });\n\tif(error) return response.status(error.code).json({ error: error.msg });\n\n\tresponse.type('html').send(page);\n};\n"],"mappings":"OAAOA,MAA8B,6EAC9BC,MAAyB,0EAMjBC,MAAOC,EAASC,KAC9B,MAAOC,EAAWC,SAAuBN,EAAyBG,EAAQI,QAAQC,cAAe,qBACjG,GAAGH,EAAW,OAAOD,EAASK,OAAOJ,EAAUK,MAAMC,KAAK,CAAEC,MAAOP,EAAUQ,MAC7E,IAAIP,EAAe,OAAOF,EAASK,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAE7D,MAAOA,EAAOE,SAAcb,EAAoB,CAAEc,SAAUZ,EAAQa,MAAMD,SAAUE,KAAM,CAAC,IAC3F,GAAGL,EAAO,OAAOR,EAASK,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAEjET,EAASc,KAAK,QAAQC,KAAKL","ignoreList":[]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import s from"../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../server/utils/email/listEmails.js";export default async(r,t)=>{const[i,o]=await s(r.cookies.session_token,"system:emails:read");if(i)return t.status(i.code).json({error:i.msg});if(!o)return t.status(403).json({error:"Insufficient permissions"});const{status:a,type:n,search:m,limit:u,offset:f}=r.query,[c,l]=await e({status:a,type:n,search:m,limit:u,offset:f});if(c)return t.status(c.code).json({error:c.msg});t.json(l)};
|
|
2
|
+
//# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\emails\GET.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"src\\kempo\\api\\emails\\GET.js","names":["currentUserHasPermission","listEmails","async","request","response","permError","hasPermission","cookies","session_token","status","code","json","error","msg","type","search","limit","offset","query","data"],"sources":["0"],"sourcesContent":["import currentUserHasPermission from '../../../../server/utils/permissions/currentUserHasPermission.js';\nimport listEmails from '../../../../server/utils/email/listEmails.js';\n\n/* The log of emails, newest first, without their bodies. `?status=`, `?type=`, `?search=`, `?limit=`, `?offset=`. */\nexport default async (request, response) => {\n\tconst [permError, hasPermission] = await currentUserHasPermission(request.cookies.session_token, 'system:emails:read');\n\tif(permError) return response.status(permError.code).json({ error: permError.msg });\n\tif(!hasPermission) return response.status(403).json({ error: 'Insufficient permissions' });\n\n\tconst { status, type, search, limit, offset } = request.query;\n\tconst [error, data] = await listEmails({ status, type, search, limit, offset });\n\tif(error) return response.status(error.code).json({ error: error.msg });\n\n\tresponse.json(data);\n};\n"],"mappings":"OAAOA,MAA8B,0EAC9BC,MAAgB,8DAGRC,MAAOC,EAASC,KAC9B,MAAOC,EAAWC,SAAuBN,EAAyBG,EAAQI,QAAQC,cAAe,sBACjG,GAAGH,EAAW,OAAOD,EAASK,OAAOJ,EAAUK,MAAMC,KAAK,CAAEC,MAAOP,EAAUQ,MAC7E,IAAIP,EAAe,OAAOF,EAASK,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAE7D,MAAMH,OAAEA,EAAMK,KAAEA,EAAIC,OAAEA,EAAMC,MAAEA,EAAKC,OAAEA,GAAWd,EAAQe,OACjDN,EAAOO,SAAclB,EAAW,CAAEQ,SAAQK,OAAMC,SAAQC,QAAOC,WACtE,GAAGL,EAAO,OAAOR,EAASK,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAEjET,EAASO,KAAKQ","ignoreList":[]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import s from"../../../../../server/utils/permissions/currentUserHasPermission.js";import r from"../../../../../server/utils/email/getEmail.js";export default async(e,t)=>{const[i,o]=await s(e.cookies.session_token,"system:emails:read");if(i)return t.status(i.code).json({error:i.msg});if(!o)return t.status(403).json({error:"Insufficient permissions"});const[n,a]=await r(e.params.id);if(n)return t.status(n.code).json({error:n.msg});t.json(a)};
|
|
2
|
+
//# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\emails\[id]\GET.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"src\\kempo\\api\\emails\\[id]\\GET.js","names":["currentUserHasPermission","getEmail","async","request","response","permError","hasPermission","cookies","session_token","status","code","json","error","msg","found","params","id"],"sources":["0"],"sourcesContent":["import currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\nimport getEmail from '../../../../../server/utils/email/getEmail.js';\n\n/* One email with its whole body. */\nexport default async (request, response) => {\n\tconst [permError, hasPermission] = await currentUserHasPermission(request.cookies.session_token, 'system:emails:read');\n\tif(permError) return response.status(permError.code).json({ error: permError.msg });\n\tif(!hasPermission) return response.status(403).json({ error: 'Insufficient permissions' });\n\n\tconst [error, found] = await getEmail(request.params.id);\n\tif(error) return response.status(error.code).json({ error: error.msg });\n\n\tresponse.json(found);\n};\n"],"mappings":"OAAOA,MAA8B,6EAC9BC,MAAc,+DAGNC,MAAOC,EAASC,KAC9B,MAAOC,EAAWC,SAAuBN,EAAyBG,EAAQI,QAAQC,cAAe,sBACjG,GAAGH,EAAW,OAAOD,EAASK,OAAOJ,EAAUK,MAAMC,KAAK,CAAEC,MAAOP,EAAUQ,MAC7E,IAAIP,EAAe,OAAOF,EAASK,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAE7D,MAAOA,EAAOE,SAAeb,EAASE,EAAQY,OAAOC,IACrD,GAAGJ,EAAO,OAAOR,EAASK,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAEjET,EAASO,KAAKG","ignoreList":[]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import s from"../../../../../../server/utils/permissions/currentUserHasPermission.js";import r from"../../../../../../server/utils/email/retryEmail.js";export default async(e,o)=>{const[t,i]=await s(e.cookies.session_token,"system:emails:manage");if(t)return o.status(t.code).json({error:t.msg});if(!i)return o.status(403).json({error:"Insufficient permissions"});const[n,a]=await r(e.params.id);if(n)return 502===n.code||503===n.code?o.json({sent:!1,error:n.msg}):o.status(n.code).json({error:n.msg});o.json({sent:!0,...a})};
|
|
2
|
+
//# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\emails\[id]\retry\POST.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"src\\kempo\\api\\emails\\[id]\\retry\\POST.js","names":["currentUserHasPermission","retryEmail","async","request","response","permError","hasPermission","cookies","session_token","status","code","json","error","msg","result","params","id","sent"],"sources":["0"],"sourcesContent":["import currentUserHasPermission from '../../../../../../server/utils/permissions/currentUserHasPermission.js';\nimport retryEmail from '../../../../../../server/utils/email/retryEmail.js';\n\n/* Tries an email that is waiting or failed again. Answers with how that try went. */\nexport default async (request, response) => {\n\tconst [permError, hasPermission] = await currentUserHasPermission(request.cookies.session_token, 'system:emails:manage');\n\tif(permError) return response.status(permError.code).json({ error: permError.msg });\n\tif(!hasPermission) return response.status(403).json({ error: 'Insufficient permissions' });\n\n\tconst [error, result] = await retryEmail(request.params.id);\n\tif(error) return error.code === 502 || error.code === 503 ? response.json({ sent: false, error: error.msg }) : response.status(error.code).json({ error: error.msg });\n\n\tresponse.json({ sent: true, ...result });\n};\n"],"mappings":"OAAOA,MAA8B,gFAC9BC,MAAgB,oEAGRC,MAAOC,EAASC,KAC9B,MAAOC,EAAWC,SAAuBN,EAAyBG,EAAQI,QAAQC,cAAe,wBACjG,GAAGH,EAAW,OAAOD,EAASK,OAAOJ,EAAUK,MAAMC,KAAK,CAAEC,MAAOP,EAAUQ,MAC7E,IAAIP,EAAe,OAAOF,EAASK,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAE7D,MAAOA,EAAOE,SAAgBb,EAAWE,EAAQY,OAAOC,IACxD,GAAGJ,EAAO,OAAsB,MAAfA,EAAMF,MAA+B,MAAfE,EAAMF,KAAeN,EAASO,KAAK,CAAEM,MAAM,EAAOL,MAAOA,EAAMC,MAAST,EAASK,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAE/JT,EAASO,KAAK,CAAEM,MAAM,KAASH","ignoreList":[]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import s from"../../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../../server/utils/email/sendEmail.js";import t from"../../../../../server/utils/email/isValidSender.js";export default async(r,i)=>{const[o,n]=await s(r.cookies.session_token,"system:emails:manage");if(o)return i.status(o.code).json({error:o.msg});if(!n)return i.status(403).json({error:"Insufficient permissions"});const a=String(r.body?.to??"").trim();if(!t(a)||a.includes("<"))return i.status(400).json({error:"Enter an email address to send the test to"});const[m,l]=await e({to:a,subject:"A test email from Kempo",html:"<p>This is a test email. If you can read it, sending email works.</p>",template:"test"});if(m)return i.json({sent:!1,error:m.msg,emailId:m.emailId});i.json({sent:!0,...l})};
|
|
2
|
+
//# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\emails\test\POST.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"src\\kempo\\api\\emails\\test\\POST.js","names":["currentUserHasPermission","sendEmail","isValidSender","async","request","response","permError","hasPermission","cookies","session_token","status","code","json","error","msg","to","String","body","trim","includes","result","subject","html","template","sent","emailId"],"sources":["0"],"sourcesContent":["import currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\nimport sendEmail from '../../../../../server/utils/email/sendEmail.js';\nimport isValidSender from '../../../../../server/utils/email/isValidSender.js';\n\n/* Sends a short test email to an address, through whichever email extension is installed. Body: `{ to }`. Answers with how it went. */\nexport default async (request, response) => {\n\tconst [permError, hasPermission] = await currentUserHasPermission(request.cookies.session_token, 'system:emails:manage');\n\tif(permError) return response.status(permError.code).json({ error: permError.msg });\n\tif(!hasPermission) return response.status(403).json({ error: 'Insufficient permissions' });\n\n\tconst to = String(request.body?.to ?? '').trim();\n\tif(!isValidSender(to) || to.includes('<')) return response.status(400).json({ error: 'Enter an email address to send the test to' });\n\n\tconst [error, result] = await sendEmail({\n\t\tto,\n\t\tsubject: 'A test email from Kempo',\n\t\thtml: '<p>This is a test email. If you can read it, sending email works.</p>',\n\t\ttemplate: 'test',\n\t});\n\tif(error) return response.json({ sent: false, error: error.msg, emailId: error.emailId });\n\n\tresponse.json({ sent: true, ...result });\n};\n"],"mappings":"OAAOA,MAA8B,6EAC9BC,MAAe,wDACfC,MAAmB,oEAGXC,MAAOC,EAASC,KAC9B,MAAOC,EAAWC,SAAuBP,EAAyBI,EAAQI,QAAQC,cAAe,wBACjG,GAAGH,EAAW,OAAOD,EAASK,OAAOJ,EAAUK,MAAMC,KAAK,CAAEC,MAAOP,EAAUQ,MAC7E,IAAIP,EAAe,OAAOF,EAASK,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAE7D,MAAME,EAAKC,OAAOZ,EAAQa,MAAMF,IAAM,IAAIG,OAC1C,IAAIhB,EAAca,IAAOA,EAAGI,SAAS,KAAM,OAAOd,EAASK,OAAO,KAAKE,KAAK,CAAEC,MAAO,+CAErF,MAAOA,EAAOO,SAAgBnB,EAAU,CACvCc,KACAM,QAAS,0BACTC,KAAM,wEACNC,SAAU,SAEX,GAAGV,EAAO,OAAOR,EAASO,KAAK,CAAEY,MAAM,EAAOX,MAAOA,EAAMC,IAAKW,QAASZ,EAAMY,UAE/EpB,EAASO,KAAK,CAAEY,MAAM,KAASJ","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{resolve as
|
|
1
|
+
import{existsSync as r}from"fs";import{resolve as s,join as e}from"path";import t from"../../../../server/utils/permissions/currentUserHasPermission.js";import o from"../../../../server/utils/fragments/getFragmentMetadata.js";import i from"../../../../server/utils/fragments/deleteFragment.js";const n=r(e(process.cwd(),"public"))?e(process.cwd(),"public"):s(import.meta.dirname,"../../../../app-public");export default async(r,s)=>{const e=r.cookies.session_token,[a,f]=await t(e,"system:fragments:delete");if(a)return s.status(a.code).json({error:a.msg});if(!f)return s.status(403).json({error:"Insufficient permissions"});const{files:m}=r.body||{};if(!m?.length)return s.status(400).json({error:"No files specified"});for(const r of m){const[e,t]=await o({rootDir:n,file:r});if(!e&&t.locked)return s.status(403).json({error:`Cannot delete locked fragment: ${r}`})}const[c,u]=await i({rootDir:n,files:m});if(c)return s.status(c.code).json({error:c.msg});s.json(u)};
|
|
2
2
|
//# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\fragments\DELETE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"src\\kempo\\api\\fragments\\DELETE.js","names":["resolve","join","currentUserHasPermission","getFragmentMetadata","deleteFragment","rootDir","
|
|
1
|
+
{"version":3,"file":"src\\kempo\\api\\fragments\\DELETE.js","names":["existsSync","resolve","join","currentUserHasPermission","getFragmentMetadata","deleteFragment","rootDir","process","cwd","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","files","body","length","file","metaError","metadata","locked","result"],"sources":["0"],"sourcesContent":["import { existsSync } from 'fs';\r\nimport { resolve, join } from 'path';\r\nimport currentUserHasPermission from '../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport getFragmentMetadata from '../../../../server/utils/fragments/getFragmentMetadata.js';\r\nimport deleteFragment from '../../../../server/utils/fragments/deleteFragment.js';\r\n\r\nconst rootDir = existsSync(join(process.cwd(), 'public')) ? join(process.cwd(), 'public') : resolve(import.meta.dirname, '../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:fragments:delete');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { files } = request.body || {};\r\n\r\n\tif(!files?.length){\r\n\t\treturn response.status(400).json({ error: 'No files specified' });\r\n\t}\r\n\r\n\tfor(const file of files){\r\n\t\tconst [metaError, metadata] = await getFragmentMetadata({ rootDir, file });\r\n\t\tif(!metaError && metadata.locked){\r\n\t\t\treturn response.status(403).json({ error: `Cannot delete locked fragment: ${file}` });\r\n\t\t}\r\n\t}\r\n\r\n\tconst [error, result] = await deleteFragment({ rootDir, files });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(result);\r\n};\r\n"],"mappings":"qBAASA,MAAkB,uBAClBC,UAASC,MAAY,cACvBC,MAA8B,0EAC9BC,MAAyB,mEACzBC,MAAoB,uDAE3B,MAAMC,EAAUN,EAAWE,EAAKK,QAAQC,MAAO,WAAaN,EAAKK,QAAQC,MAAO,UAAYP,cAAoBQ,QAAS,yCAE1GC,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBd,EAAyBU,EAAO,2BAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,MAAEA,GAAUZ,EAAQa,MAAQ,CAAC,EAEnC,IAAID,GAAOE,OACV,OAAOb,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,uBAG3C,IAAI,MAAMK,KAAQH,EAAM,CACvB,MAAOI,EAAWC,SAAkBxB,EAAoB,CAAEE,UAASoB,SACnE,IAAIC,GAAaC,EAASC,OACzB,OAAOjB,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,kCAAkCK,KAE9E,CAEA,MAAOL,EAAOS,SAAgBzB,EAAe,CAAEC,UAASiB,UAExD,GAAGF,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKU","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{resolve as
|
|
1
|
+
import{existsSync as s}from"fs";import{resolve as r,join as t}from"path";import o from"../../../../server/utils/permissions/currentUserHasPermission.js";import e from"../../../../server/utils/fragments/listFragments.js";const i=s(t(process.cwd(),"public"))?t(process.cwd(),"public"):r(import.meta.dirname,"../../../../app-public");export default async(s,r)=>{const t=s.cookies.session_token,[n,m]=await o(t,"system:fragments:read");if(n)return r.status(n.code).json({error:n.msg});if(!m)return r.status(403).json({error:"Insufficient permissions"});const[a,c]=await e({rootDir:i});if(a)return r.status(a.code).json({error:a.msg});r.json(c)};
|
|
2
2
|
//# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\fragments\GET.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"src\\kempo\\api\\fragments\\GET.js","names":["resolve","join","currentUserHasPermission","listFragments","rootDir","
|
|
1
|
+
{"version":3,"file":"src\\kempo\\api\\fragments\\GET.js","names":["existsSync","resolve","join","currentUserHasPermission","listFragments","rootDir","process","cwd","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","data"],"sources":["0"],"sourcesContent":["import { existsSync } from 'fs';\r\nimport { resolve, join } from 'path';\r\nimport currentUserHasPermission from '../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport listFragments from '../../../../server/utils/fragments/listFragments.js';\r\n\r\nconst rootDir = existsSync(join(process.cwd(), 'public')) ? join(process.cwd(), 'public') : resolve(import.meta.dirname, '../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:fragments:read');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst [error, data] = await listFragments({ rootDir });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(data);\r\n};\r\n"],"mappings":"qBAASA,MAAkB,uBAClBC,UAASC,MAAY,cACvBC,MAA8B,0EAC9BC,MAAmB,sDAE1B,MAAMC,EAAUL,EAAWE,EAAKI,QAAQC,MAAO,WAAaL,EAAKI,QAAQC,MAAO,UAAYN,cAAoBO,QAAS,yCAE1GC,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBb,EAAyBS,EAAO,yBAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAOA,EAAOE,SAAclB,EAAc,CAAEC,YAE5C,GAAGe,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKG","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{resolve as
|
|
1
|
+
import{existsSync as r}from"fs";import{resolve as s,join as e}from"path";import t from"../../../../server/utils/permissions/currentUserHasPermission.js";import o from"../../../../server/utils/auth/getSession.js";import i from"../../../../server/utils/fragments/createFragment.js";const n=r(e(process.cwd(),"public"))?e(process.cwd(),"public"):s(import.meta.dirname,"../../../../app-public");export default async(r,s)=>{const e=r.cookies.session_token,[a,m]=await t(e,"system:fragments:create");if(a)return s.status(a.code).json({error:a.msg});if(!m)return s.status(403).json({error:"Insufficient permissions"});const{directory:u,name:c}=r.body;if(!c)return s.status(400).json({error:"Fragment name is required"});const[,p]=await o({token:e}),f=p?.user?.name||"",[d,j]=await i({rootDir:n,directory:u,name:c,author:f});if(d)return s.status(d.code).json({error:d.msg});s.status(201).json(j)};
|
|
2
2
|
//# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\fragments\POST.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"src\\kempo\\api\\fragments\\POST.js","names":["resolve","join","currentUserHasPermission","getSession","createFragment","rootDir","
|
|
1
|
+
{"version":3,"file":"src\\kempo\\api\\fragments\\POST.js","names":["existsSync","resolve","join","currentUserHasPermission","getSession","createFragment","rootDir","process","cwd","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","directory","name","body","sessionData","author","user","data"],"sources":["0"],"sourcesContent":["import { existsSync } from 'fs';\r\nimport { resolve, join } from 'path';\r\nimport currentUserHasPermission from '../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport getSession from '../../../../server/utils/auth/getSession.js';\r\nimport createFragment from '../../../../server/utils/fragments/createFragment.js';\r\n\r\nconst rootDir = existsSync(join(process.cwd(), 'public')) ? join(process.cwd(), 'public') : resolve(import.meta.dirname, '../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:fragments:create');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { directory, name } = request.body;\r\n\r\n\tif(!name){\r\n\t\treturn response.status(400).json({ error: 'Fragment name is required' });\r\n\t}\r\n\r\n\tconst [, sessionData] = await getSession({ token });\r\n\tconst author = sessionData?.user?.name || '';\r\n\r\n\tconst [error, data] = await createFragment({ rootDir, directory, name, author });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.status(201).json(data);\r\n};\r\n"],"mappings":"qBAASA,MAAkB,uBAClBC,UAASC,MAAY,cACvBC,MAA8B,0EAC9BC,MAAgB,qDAChBC,MAAoB,uDAE3B,MAAMC,EAAUN,EAAWE,EAAKK,QAAQC,MAAO,WAAaN,EAAKK,QAAQC,MAAO,UAAYP,cAAoBQ,QAAS,yCAE1GC,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBd,EAAyBU,EAAO,2BAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,UAAEA,EAASC,KAAEA,GAASb,EAAQc,KAEpC,IAAID,EACH,OAAOZ,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,8BAG3C,MAAO,CAAEK,SAAqBtB,EAAW,CAAES,UACrCc,EAASD,GAAaE,MAAMJ,MAAQ,IAEnCH,EAAOQ,SAAcxB,EAAe,CAAEC,UAASiB,YAAWC,OAAMG,WAEvE,GAAGN,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASM,OAAO,KAAKE,KAAKS","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{resolve as
|
|
1
|
+
import{existsSync as r}from"fs";import{resolve as s,join as e}from"path";import t from"../../../../../server/utils/permissions/currentUserHasPermission.js";import o from"../../../../../server/utils/fragments/getFragmentMetadata.js";import i from"../../../../../server/utils/fragments/disableFragment.js";const a=r(e(process.cwd(),"public"))?e(process.cwd(),"public"):s(import.meta.dirname,"../../../../../app-public");export default async(r,s)=>{const e=r.cookies.session_token,[n,m]=await t(e,"system:pages:update");if(n)return s.status(n.code).json({error:n.msg});if(!m)return s.status(403).json({error:"Insufficient permissions"});const{file:u}=r.body||{};if(!u)return s.status(400).json({error:"File path is required"});const[c,f]=await o({rootDir:a,file:u});if(!c&&f.locked)return s.status(403).json({error:"Cannot disable a locked fragment"});const[p,l]=await i({rootDir:a,file:u});if(p)return s.status(p.code).json({error:p.msg});s.json(l)};
|
|
2
2
|
//# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\fragments\disable\PUT.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"src\\kempo\\api\\fragments\\disable\\PUT.js","names":["resolve","join","currentUserHasPermission","getFragmentMetadata","disableFragment","rootDir","
|
|
1
|
+
{"version":3,"file":"src\\kempo\\api\\fragments\\disable\\PUT.js","names":["existsSync","resolve","join","currentUserHasPermission","getFragmentMetadata","disableFragment","rootDir","process","cwd","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","file","body","metaError","metadata","locked","result"],"sources":["0"],"sourcesContent":["import { existsSync } from 'fs';\r\nimport { resolve, join } from 'path';\r\nimport currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport getFragmentMetadata from '../../../../../server/utils/fragments/getFragmentMetadata.js';\r\nimport disableFragment from '../../../../../server/utils/fragments/disableFragment.js';\r\n\r\nconst rootDir = existsSync(join(process.cwd(), 'public')) ? join(process.cwd(), 'public') : resolve(import.meta.dirname, '../../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:pages:update');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { file } = request.body || {};\r\n\r\n\tif(!file){\r\n\t\treturn response.status(400).json({ error: 'File path is required' });\r\n\t}\r\n\r\n\tconst [metaError, metadata] = await getFragmentMetadata({ rootDir, file });\r\n\tif(!metaError && metadata.locked){\r\n\t\treturn response.status(403).json({ error: 'Cannot disable a locked fragment' });\r\n\t}\r\n\r\n\tconst [error, result] = await disableFragment({ rootDir, file });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(result);\r\n};\r\n"],"mappings":"qBAASA,MAAkB,uBAClBC,UAASC,MAAY,cACvBC,MAA8B,6EAC9BC,MAAyB,sEACzBC,MAAqB,2DAE5B,MAAMC,EAAUN,EAAWE,EAAKK,QAAQC,MAAO,WAAaN,EAAKK,QAAQC,MAAO,UAAYP,cAAoBQ,QAAS,4CAE1GC,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBd,EAAyBU,EAAO,uBAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,KAAEA,GAASZ,EAAQa,MAAQ,CAAC,EAElC,IAAID,EACH,OAAOX,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,0BAG3C,MAAOI,EAAWC,SAAkBtB,EAAoB,CAAEE,UAASiB,SACnE,IAAIE,GAAaC,EAASC,OACzB,OAAOf,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,qCAG3C,MAAOA,EAAOO,SAAgBvB,EAAgB,CAAEC,UAASiB,SAEzD,GAAGF,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKQ","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{resolve as
|
|
1
|
+
import{existsSync as s}from"fs";import{resolve as r,join as e}from"path";import t from"../../../../../server/utils/permissions/currentUserHasPermission.js";import o from"../../../../../server/utils/fragments/enableFragment.js";const i=s(e(process.cwd(),"public"))?e(process.cwd(),"public"):r(import.meta.dirname,"../../../../../app-public");export default async(s,r)=>{const e=s.cookies.session_token,[n,a]=await t(e,"system:pages:update");if(n)return r.status(n.code).json({error:n.msg});if(!a)return r.status(403).json({error:"Insufficient permissions"});const{file:m}=s.body||{};if(!m)return r.status(400).json({error:"File path is required"});const[p,u]=await o({rootDir:i,file:m});if(p)return r.status(p.code).json({error:p.msg});r.json(u)};
|
|
2
2
|
//# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\fragments\enable\PUT.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"src\\kempo\\api\\fragments\\enable\\PUT.js","names":["resolve","join","currentUserHasPermission","enableFragment","rootDir","
|
|
1
|
+
{"version":3,"file":"src\\kempo\\api\\fragments\\enable\\PUT.js","names":["existsSync","resolve","join","currentUserHasPermission","enableFragment","rootDir","process","cwd","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","file","body","result"],"sources":["0"],"sourcesContent":["import { existsSync } from 'fs';\r\nimport { resolve, join } from 'path';\r\nimport currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport enableFragment from '../../../../../server/utils/fragments/enableFragment.js';\r\n\r\nconst rootDir = existsSync(join(process.cwd(), 'public')) ? join(process.cwd(), 'public') : resolve(import.meta.dirname, '../../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:pages:update');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { file } = request.body || {};\r\n\r\n\tif(!file){\r\n\t\treturn response.status(400).json({ error: 'File path is required' });\r\n\t}\r\n\r\n\tconst [error, result] = await enableFragment({ rootDir, file });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(result);\r\n};\r\n"],"mappings":"qBAASA,MAAkB,uBAClBC,UAASC,MAAY,cACvBC,MAA8B,6EAC9BC,MAAoB,0DAE3B,MAAMC,EAAUL,EAAWE,EAAKI,QAAQC,MAAO,WAAaL,EAAKI,QAAQC,MAAO,UAAYN,cAAoBO,QAAS,4CAE1GC,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBb,EAAyBS,EAAO,uBAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,KAAEA,GAASZ,EAAQa,MAAQ,CAAC,EAElC,IAAID,EACH,OAAOX,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,0BAG3C,MAAOA,EAAOI,SAAgBpB,EAAe,CAAEC,UAASiB,SAExD,GAAGF,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKK","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{resolve as
|
|
1
|
+
import{existsSync as r}from"fs";import{resolve as s,join as e}from"path";import t from"../../../../../server/utils/permissions/currentUserHasPermission.js";import o from"../../../../../server/utils/fragments/getFragment.js";const i=r(e(process.cwd(),"public"))?e(process.cwd(),"public"):s(import.meta.dirname,"../../../../../app-public");export default async(r,s)=>{const e=r.cookies.session_token,[n,a]=await t(e,"system:fragments:read");if(n)return s.status(n.code).json({error:n.msg});if(!a)return s.status(403).json({error:"Insufficient permissions"});const{file:m}=r.query;if(!m)return s.status(400).json({error:"File path is required"});const[u,c]=await o({rootDir:i,file:m});if(u)return s.status(u.code).json({error:u.msg});s.json(c)};
|
|
2
2
|
//# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\fragments\file\GET.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"src\\kempo\\api\\fragments\\file\\GET.js","names":["resolve","join","currentUserHasPermission","getFragment","rootDir","
|
|
1
|
+
{"version":3,"file":"src\\kempo\\api\\fragments\\file\\GET.js","names":["existsSync","resolve","join","currentUserHasPermission","getFragment","rootDir","process","cwd","dirname","async","request","response","token","cookies","session_token","permError","hasPermission","status","code","json","error","msg","file","query","data"],"sources":["0"],"sourcesContent":["import { existsSync } from 'fs';\r\nimport { resolve, join } from 'path';\r\nimport currentUserHasPermission from '../../../../../server/utils/permissions/currentUserHasPermission.js';\r\nimport getFragment from '../../../../../server/utils/fragments/getFragment.js';\r\n\r\nconst rootDir = existsSync(join(process.cwd(), 'public')) ? join(process.cwd(), 'public') : resolve(import.meta.dirname, '../../../../../app-public');\r\n\r\nexport default async (request, response) => {\r\n\tconst token = request.cookies.session_token;\r\n\tconst [permError, hasPermission] = await currentUserHasPermission(token, 'system:fragments:read');\r\n\r\n\tif(permError){\r\n\t\treturn response.status(permError.code).json({ error: permError.msg });\r\n\t}\r\n\r\n\tif(!hasPermission){\r\n\t\treturn response.status(403).json({ error: 'Insufficient permissions' });\r\n\t}\r\n\r\n\tconst { file } = request.query;\r\n\r\n\tif(!file){\r\n\t\treturn response.status(400).json({ error: 'File path is required' });\r\n\t}\r\n\r\n\tconst [error, data] = await getFragment({ rootDir, file });\r\n\r\n\tif(error){\r\n\t\treturn response.status(error.code).json({ error: error.msg });\r\n\t}\r\n\r\n\tresponse.json(data);\r\n};\r\n"],"mappings":"qBAASA,MAAkB,uBAClBC,UAASC,MAAY,cACvBC,MAA8B,6EAC9BC,MAAiB,uDAExB,MAAMC,EAAUL,EAAWE,EAAKI,QAAQC,MAAO,WAAaL,EAAKI,QAAQC,MAAO,UAAYN,cAAoBO,QAAS,4CAE1GC,MAAOC,EAASC,KAC9B,MAAMC,EAAQF,EAAQG,QAAQC,eACvBC,EAAWC,SAAuBb,EAAyBS,EAAO,yBAEzE,GAAGG,EACF,OAAOJ,EAASM,OAAOF,EAAUG,MAAMC,KAAK,CAAEC,MAAOL,EAAUM,MAGhE,IAAIL,EACH,OAAOL,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,6BAG3C,MAAME,KAAEA,GAASZ,EAAQa,MAEzB,IAAID,EACH,OAAOX,EAASM,OAAO,KAAKE,KAAK,CAAEC,MAAO,0BAG3C,MAAOA,EAAOI,SAAcpB,EAAY,CAAEC,UAASiB,SAEnD,GAAGF,EACF,OAAOT,EAASM,OAAOG,EAAMF,MAAMC,KAAK,CAAEC,MAAOA,EAAMC,MAGxDV,EAASQ,KAAKK","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{resolve as
|
|
1
|
+
import{existsSync as r}from"fs";import{resolve as s,join as e}from"path";import t from"../../../../../server/utils/permissions/currentUserHasPermission.js";import o from"../../../../../server/utils/fragments/moveFragment.js";const i=r(e(process.cwd(),"public"))?e(process.cwd(),"public"):s(import.meta.dirname,"../../../../../app-public");export default async(r,s)=>{const e=r.cookies.session_token,[n,a]=await t(e,"system:pages:update");if(n)return s.status(n.code).json({error:n.msg});if(!a)return s.status(403).json({error:"Insufficient permissions"});const{file:u,newFile:m}=r.body;if(!u)return s.status(400).json({error:"File path is required"});if(!m)return s.status(400).json({error:"New file path is required"});const[p,c]=await o({rootDir:i,file:u,newFile:m});if(p)return s.status(p.code).json({error:p.msg});s.json(c)};
|
|
2
2
|
//# sourceMappingURL=C:\Users\dusti\dev\kempo\dist\kempo\api\fragments\file\PATCH.js.map
|