domma-cms 0.3.0 → 0.5.2
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 +3 -3
- package/admin/css/admin.css +1 -1
- package/admin/dist/domma/domma-tools.css +2313 -0
- package/admin/dist/domma/domma-tools.min.js +10 -0
- package/admin/index.html +4 -0
- package/admin/js/api.js +1 -1
- package/admin/js/app.js +8 -4
- package/admin/js/config/sidebar-config.js +1 -1
- package/admin/js/lib/markdown-toolbar.js +18 -10
- package/admin/js/templates/action-editor.html +171 -0
- package/admin/js/templates/actions-list.html +19 -0
- package/admin/js/templates/api-reference.html +1411 -0
- package/admin/js/templates/block-editor.html +158 -0
- package/admin/js/templates/blocks.html +8 -0
- package/admin/js/templates/collection-editor.html +47 -0
- package/admin/js/templates/collection-entries.html +3 -0
- package/admin/js/templates/collections.html +51 -4
- package/admin/js/templates/documentation.html +258 -0
- package/{plugins/form-builder/admin → admin/js}/templates/form-editor.html +238 -199
- package/{plugins/form-builder/admin → admin/js}/templates/form-submissions.html +30 -30
- package/{plugins/form-builder/admin/templates/forms-list.html → admin/js/templates/forms.html} +17 -17
- package/admin/js/templates/login.html +29 -4
- package/admin/js/templates/my-profile.html +17 -0
- package/admin/js/templates/page-editor.html +39 -0
- package/admin/js/templates/pages.html +6 -1
- package/admin/js/templates/pro-docs.html +259 -0
- package/admin/js/templates/role-editor.html +59 -0
- package/admin/js/templates/roles.html +10 -0
- package/admin/js/templates/settings.html +167 -23
- package/admin/js/templates/tutorials.html +81 -0
- package/admin/js/templates/user-editor.html +7 -0
- package/admin/js/templates/users.html +3 -26
- package/admin/js/templates/view-editor.html +201 -0
- package/admin/js/templates/view-preview.html +51 -0
- package/admin/js/templates/views-list.html +19 -0
- package/admin/js/views/action-editor.js +1 -0
- package/admin/js/views/actions-list.js +1 -0
- package/admin/js/views/api-reference.js +1 -0
- package/admin/js/views/block-editor.js +8 -0
- package/admin/js/views/blocks.js +4 -0
- package/admin/js/views/collection-editor.js +3 -3
- package/admin/js/views/collection-entries.js +1 -1
- package/admin/js/views/collections.js +1 -1
- package/admin/js/views/dashboard.js +1 -1
- package/admin/js/views/form-editor.js +8 -0
- package/admin/js/views/form-submissions.js +1 -0
- package/admin/js/views/forms.js +1 -0
- package/admin/js/views/index.js +1 -1
- package/admin/js/views/login.js +2 -2
- package/admin/js/views/media.js +1 -1
- package/admin/js/views/my-profile.js +1 -0
- package/admin/js/views/page-editor.js +34 -15
- package/admin/js/views/pages.js +5 -5
- package/admin/js/views/plugins.js +10 -10
- package/admin/js/views/pro-docs.js +1 -0
- package/admin/js/views/role-editor.js +1 -0
- package/admin/js/views/roles.js +4 -0
- package/admin/js/views/settings.js +3 -1
- package/admin/js/views/user-editor.js +1 -1
- package/admin/js/views/users.js +4 -7
- package/admin/js/views/view-editor.js +1 -0
- package/admin/js/views/view-preview.js +1 -0
- package/admin/js/views/views-list.js +1 -0
- package/bin/cli.js +1 -1
- package/config/auth.json +1 -0
- package/config/connections.json.bak +9 -0
- package/config/connections.json.example +9 -0
- package/config/navigation.json +5 -15
- package/config/plugins.json +19 -29
- package/config/server.json +6 -6
- package/config/site.json +16 -6
- package/package.json +25 -10
- package/plugins/example-analytics/stats.json +17 -12
- package/plugins/form-builder/data/forms/contacts.json +62 -62
- package/plugins/form-builder/data/forms/enquiries.json +103 -0
- package/plugins/form-builder/data/forms/feedback.json +17 -16
- package/plugins/form-builder/data/forms/notes.json +79 -0
- package/plugins/form-builder/data/forms/to-do.json +100 -0
- package/plugins/form-builder/data/submissions/contacts.json +1 -26
- package/plugins/form-builder/data/submissions/notes.json +1 -0
- package/plugins/form-builder/data/submissions/to-do.json +1 -0
- package/plugins/theme-roller/admin/templates/theme-roller.html +71 -0
- package/plugins/theme-roller/admin/views/theme-roller-view.js +403 -0
- package/plugins/theme-roller/config.js +1 -0
- package/plugins/theme-roller/plugin.js +233 -0
- package/plugins/theme-roller/plugin.json +31 -0
- package/plugins/theme-roller/public/active-theme.css +0 -0
- package/plugins/theme-roller/public/inject-head-late.html +1 -0
- package/public/css/forms.css +1 -0
- package/public/css/site.css +1 -1
- package/public/js/forms.js +1 -0
- package/public/js/site.js +1 -1
- package/scripts/build.js +194 -129
- package/scripts/pro.js +254 -0
- package/scripts/reset.js +33 -8
- package/scripts/seed.js +677 -128
- package/scripts/setup.js +1 -0
- package/server/middleware/auth.js +136 -120
- package/server/routes/api/actions.js +200 -0
- package/server/routes/api/auth.js +292 -146
- package/server/routes/api/blocks.js +84 -0
- package/server/routes/api/collections.js +79 -27
- package/{plugins/form-builder/plugin.js → server/routes/api/forms.js} +491 -505
- package/server/routes/api/layouts.js +49 -39
- package/server/routes/api/media.js +118 -92
- package/server/routes/api/navigation.js +40 -36
- package/server/routes/api/pages.js +132 -118
- package/server/routes/api/plugins.js +6 -3
- package/server/routes/api/settings.js +104 -88
- package/server/routes/api/users.js +27 -19
- package/server/routes/api/views.js +148 -0
- package/server/routes/public.js +124 -108
- package/server/server.js +269 -181
- package/server/services/actions.js +387 -0
- package/server/services/adapterRegistry.js +98 -0
- package/server/services/adapters/FileAdapter.js +192 -0
- package/server/services/adapters/MongoAdapter.js +220 -0
- package/server/services/blocks.js +162 -0
- package/server/services/collections.js +74 -86
- package/server/services/connectionManager.js +102 -0
- package/server/services/content.js +312 -307
- package/server/services/email.js +126 -0
- package/server/services/forms.js +173 -0
- package/server/services/markdown.js +1378 -747
- package/server/services/permissionRegistry.js +173 -0
- package/server/services/presetCollections.js +251 -0
- package/server/services/renderer.js +98 -2
- package/server/services/roles.js +227 -0
- package/server/services/rowAccess.js +104 -0
- package/server/services/userProfiles.js +199 -0
- package/server/services/users.js +281 -212
- package/server/services/views.js +280 -0
- package/server/templates/page.html +124 -113
- package/plugins/form-builder/admin/templates/form-settings.html +0 -29
- package/plugins/form-builder/admin/views/form-editor.js +0 -1444
- package/plugins/form-builder/admin/views/form-settings.js +0 -38
- package/plugins/form-builder/admin/views/form-submissions.js +0 -295
- package/plugins/form-builder/admin/views/forms-list.js +0 -164
- package/plugins/form-builder/config.js +0 -9
- package/plugins/form-builder/data/forms/consent.json +0 -104
- package/plugins/form-builder/data/forms/contact-details.json +0 -99
- package/plugins/form-builder/data/submissions/consent.json +0 -13
- package/plugins/form-builder/plugin.json +0 -52
- package/plugins/form-builder/public/inject-body.html +0 -352
- package/plugins/form-builder/public/inject-head.html +0 -58
- package/plugins/form-builder/public/package.json +0 -1
- package/scripts/copy-domma.js +0 -48
- package/server/services/userTypes.js +0 -167
- /package/plugins/form-builder/data/submissions/{contact-details.json → enquiries.json} +0 -0
- /package/{plugins/form-builder/public → public/js}/form-logic-engine.js +0 -0
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* User Types Service
|
|
3
|
-
* Preset Collection — seeds roles on first startup, caches them in memory.
|
|
4
|
-
* Auth middleware calls getRoleMap() / getPermissionsFor() at request time.
|
|
5
|
-
*/
|
|
6
|
-
import fs from 'fs/promises';
|
|
7
|
-
import path from 'path';
|
|
8
|
-
import { v4 as uuidv4 } from 'uuid';
|
|
9
|
-
import { config } from '../config.js';
|
|
10
|
-
|
|
11
|
-
const COLLECTIONS_DIR = path.resolve(config.content.collectionsDir);
|
|
12
|
-
const SLUG = 'user-types';
|
|
13
|
-
const DIR = path.join(COLLECTIONS_DIR, SLUG);
|
|
14
|
-
const SCHEMA_PATH = path.join(DIR, 'schema.json');
|
|
15
|
-
const DATA_PATH = path.join(DIR, 'data.json');
|
|
16
|
-
|
|
17
|
-
const RESOURCES = ['pages', 'settings', 'navigation', 'layouts', 'media', 'users', 'plugins', 'collections'];
|
|
18
|
-
|
|
19
|
-
const PRESET_SCHEMA = {
|
|
20
|
-
slug: SLUG,
|
|
21
|
-
title: 'User Types',
|
|
22
|
-
description: 'CMS role definitions — managed by the system.',
|
|
23
|
-
preset: true,
|
|
24
|
-
fields: [
|
|
25
|
-
{ name: 'name', label: 'Name (slug)', type: 'text', required: true },
|
|
26
|
-
{ name: 'label', label: 'Label', type: 'text', required: true },
|
|
27
|
-
{ name: 'level', label: 'Level', type: 'number', required: true },
|
|
28
|
-
{ name: 'permissions', label: 'Permissions', type: 'multi-select', options: RESOURCES },
|
|
29
|
-
{ name: 'badgeClass', label: 'Badge Class', type: 'select',
|
|
30
|
-
options: ['badge-danger','badge-warning','badge-info','badge-secondary','badge-success','badge-primary'] }
|
|
31
|
-
],
|
|
32
|
-
api: {
|
|
33
|
-
create: { enabled: false, access: 'admin' },
|
|
34
|
-
read: { enabled: false, access: 'admin' },
|
|
35
|
-
update: { enabled: false, access: 'admin' },
|
|
36
|
-
delete: { enabled: false, access: 'admin' }
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
const SEED_ENTRIES = [
|
|
41
|
-
{ name: 'admin', label: 'Admin', level: 0, permissions: RESOURCES, badgeClass: 'badge-danger' },
|
|
42
|
-
{ name: 'manager', label: 'Manager', level: 1, permissions: ['pages','settings','navigation','layouts','media','users','collections'], badgeClass: 'badge-warning' },
|
|
43
|
-
{ name: 'editor', label: 'Editor', level: 2, permissions: ['pages','media'], badgeClass: 'badge-info' },
|
|
44
|
-
{ name: 'subscriber', label: 'Subscriber', level: 3, permissions: [], badgeClass: 'badge-secondary' }
|
|
45
|
-
];
|
|
46
|
-
|
|
47
|
-
// ---------------------------------------------------------------------------
|
|
48
|
-
// In-memory cache
|
|
49
|
-
// ---------------------------------------------------------------------------
|
|
50
|
-
|
|
51
|
-
/** @type {Map<string,{label:string,level:number,badgeClass:string}>} */
|
|
52
|
-
let roleMap = new Map();
|
|
53
|
-
|
|
54
|
-
/** @type {Map<string,string[]>} */
|
|
55
|
-
let permissionsMap = new Map();
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Build in-memory maps from an array of data entries.
|
|
59
|
-
*
|
|
60
|
-
* @param {object[]} entries
|
|
61
|
-
*/
|
|
62
|
-
function buildCache(entries) {
|
|
63
|
-
roleMap = new Map();
|
|
64
|
-
permissionsMap = new Map();
|
|
65
|
-
|
|
66
|
-
for (const entry of entries) {
|
|
67
|
-
const d = entry.data;
|
|
68
|
-
roleMap.set(d.name, { label: d.label, level: d.level, badgeClass: d.badgeClass || '' });
|
|
69
|
-
for (const resource of (d.permissions || [])) {
|
|
70
|
-
if (!permissionsMap.has(resource)) permissionsMap.set(resource, []);
|
|
71
|
-
permissionsMap.get(resource).push(d.name);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// ---------------------------------------------------------------------------
|
|
77
|
-
// Public API
|
|
78
|
-
// ---------------------------------------------------------------------------
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Seed the preset collection on first startup (no-op if data.json already exists).
|
|
82
|
-
*
|
|
83
|
-
* @returns {Promise<void>}
|
|
84
|
-
*/
|
|
85
|
-
export async function seed() {
|
|
86
|
-
await fs.mkdir(DIR, { recursive: true });
|
|
87
|
-
|
|
88
|
-
// Always write schema (overwrite to keep in sync with code)
|
|
89
|
-
await fs.writeFile(SCHEMA_PATH, JSON.stringify(PRESET_SCHEMA, null, 2) + '\n', 'utf8');
|
|
90
|
-
|
|
91
|
-
// Only write data if it doesn't exist yet
|
|
92
|
-
try {
|
|
93
|
-
await fs.access(DATA_PATH);
|
|
94
|
-
} catch {
|
|
95
|
-
const entries = SEED_ENTRIES.map(data => ({
|
|
96
|
-
id: uuidv4(),
|
|
97
|
-
data,
|
|
98
|
-
createdAt: new Date().toISOString(),
|
|
99
|
-
updatedAt: new Date().toISOString()
|
|
100
|
-
}));
|
|
101
|
-
await fs.writeFile(DATA_PATH, JSON.stringify(entries, null, 2) + '\n', 'utf8');
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Load the collection from disk into the in-memory cache.
|
|
107
|
-
*
|
|
108
|
-
* @returns {Promise<void>}
|
|
109
|
-
*/
|
|
110
|
-
export async function load() {
|
|
111
|
-
try {
|
|
112
|
-
const raw = await fs.readFile(DATA_PATH, 'utf8');
|
|
113
|
-
const entries = JSON.parse(raw);
|
|
114
|
-
buildCache(entries);
|
|
115
|
-
} catch (err) {
|
|
116
|
-
console.warn('[userTypes] Failed to load user-types collection:', err.message);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Reload from disk — call after any CRUD on the user-types collection.
|
|
122
|
-
*
|
|
123
|
-
* @returns {Promise<void>}
|
|
124
|
-
*/
|
|
125
|
-
export async function invalidate() {
|
|
126
|
-
await load();
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Return the full role map.
|
|
131
|
-
*
|
|
132
|
-
* @returns {Map<string,{label:string,level:number,badgeClass:string}>}
|
|
133
|
-
*/
|
|
134
|
-
export function getRoleMap() {
|
|
135
|
-
return roleMap;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Return the level for a named role, or Infinity if not found.
|
|
140
|
-
*
|
|
141
|
-
* @param {string} roleName
|
|
142
|
-
* @returns {number}
|
|
143
|
-
*/
|
|
144
|
-
export function getRoleLevel(roleName) {
|
|
145
|
-
return roleMap.get(roleName)?.level ?? Infinity;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* Return the role names allowed to access a resource, or [] if resource unknown.
|
|
150
|
-
*
|
|
151
|
-
* @param {string} resource
|
|
152
|
-
* @returns {string[]}
|
|
153
|
-
*/
|
|
154
|
-
export function getPermissionsFor(resource) {
|
|
155
|
-
return permissionsMap.get(resource) ?? [];
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* Return role names ordered from most to least privileged.
|
|
160
|
-
*
|
|
161
|
-
* @returns {string[]}
|
|
162
|
-
*/
|
|
163
|
-
export function getRoleHierarchy() {
|
|
164
|
-
return [...roleMap.entries()]
|
|
165
|
-
.sort((a, b) => a[1].level - b[1].level)
|
|
166
|
-
.map(([key]) => key);
|
|
167
|
-
}
|
|
File without changes
|
|
File without changes
|