@intranefr/superbackend 1.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/.commiat +4 -0
  2. package/.env.example +47 -0
  3. package/README.md +110 -0
  4. package/index.js +94 -0
  5. package/package.json +67 -0
  6. package/public/css/styles.css +139 -0
  7. package/public/js/animations.js +41 -0
  8. package/sdk/error-tracking/browser/package.json +16 -0
  9. package/sdk/error-tracking/browser/src/core.js +270 -0
  10. package/sdk/error-tracking/browser/src/embed.js +18 -0
  11. package/sdk/error-tracking/browser/src/index.js +1 -0
  12. package/server.js +5 -0
  13. package/src/admin/endpointRegistry.js +300 -0
  14. package/src/controllers/admin.controller.js +321 -0
  15. package/src/controllers/adminAssets.controller.js +530 -0
  16. package/src/controllers/adminAssetsStorage.controller.js +260 -0
  17. package/src/controllers/adminEjsVirtual.controller.js +354 -0
  18. package/src/controllers/adminFeatureFlags.controller.js +155 -0
  19. package/src/controllers/adminHeadless.controller.js +1071 -0
  20. package/src/controllers/adminI18n.controller.js +604 -0
  21. package/src/controllers/adminJsonConfigs.controller.js +97 -0
  22. package/src/controllers/adminLlm.controller.js +273 -0
  23. package/src/controllers/adminMigration.controller.js +257 -0
  24. package/src/controllers/adminSeoConfig.controller.js +515 -0
  25. package/src/controllers/adminStats.controller.js +121 -0
  26. package/src/controllers/adminUploadNamespaces.controller.js +208 -0
  27. package/src/controllers/assets.controller.js +248 -0
  28. package/src/controllers/auth.controller.js +93 -0
  29. package/src/controllers/billing.controller.js +223 -0
  30. package/src/controllers/featureFlags.controller.js +35 -0
  31. package/src/controllers/forms.controller.js +217 -0
  32. package/src/controllers/globalSettings.controller.js +252 -0
  33. package/src/controllers/headlessCrud.controller.js +126 -0
  34. package/src/controllers/i18n.controller.js +12 -0
  35. package/src/controllers/invite.controller.js +249 -0
  36. package/src/controllers/jsonConfigs.controller.js +19 -0
  37. package/src/controllers/metrics.controller.js +149 -0
  38. package/src/controllers/notificationAdmin.controller.js +264 -0
  39. package/src/controllers/notifications.controller.js +131 -0
  40. package/src/controllers/org.controller.js +357 -0
  41. package/src/controllers/orgAdmin.controller.js +491 -0
  42. package/src/controllers/stripeAdmin.controller.js +410 -0
  43. package/src/controllers/user.controller.js +361 -0
  44. package/src/controllers/userAdmin.controller.js +277 -0
  45. package/src/controllers/waitingList.controller.js +167 -0
  46. package/src/controllers/webhook.controller.js +200 -0
  47. package/src/middleware/auth.js +66 -0
  48. package/src/middleware/errorCapture.js +170 -0
  49. package/src/middleware/headlessApiTokenAuth.js +57 -0
  50. package/src/middleware/org.js +108 -0
  51. package/src/middleware.js +901 -0
  52. package/src/models/ActionEvent.js +31 -0
  53. package/src/models/ActivityLog.js +41 -0
  54. package/src/models/Asset.js +84 -0
  55. package/src/models/AuditEvent.js +93 -0
  56. package/src/models/EmailLog.js +28 -0
  57. package/src/models/ErrorAggregate.js +72 -0
  58. package/src/models/FormSubmission.js +41 -0
  59. package/src/models/GlobalSetting.js +38 -0
  60. package/src/models/HeadlessApiToken.js +24 -0
  61. package/src/models/HeadlessModelDefinition.js +41 -0
  62. package/src/models/I18nEntry.js +77 -0
  63. package/src/models/I18nLocale.js +33 -0
  64. package/src/models/Invite.js +70 -0
  65. package/src/models/JsonConfig.js +46 -0
  66. package/src/models/Notification.js +60 -0
  67. package/src/models/Organization.js +57 -0
  68. package/src/models/OrganizationMember.js +43 -0
  69. package/src/models/StripeCatalogItem.js +77 -0
  70. package/src/models/StripeWebhookEvent.js +57 -0
  71. package/src/models/User.js +89 -0
  72. package/src/models/VirtualEjsFile.js +60 -0
  73. package/src/models/VirtualEjsFileVersion.js +43 -0
  74. package/src/models/VirtualEjsGroupChange.js +32 -0
  75. package/src/models/WaitingList.js +41 -0
  76. package/src/models/Webhook.js +63 -0
  77. package/src/models/Workflow.js +29 -0
  78. package/src/models/WorkflowExecution.js +12 -0
  79. package/src/routes/admin.routes.js +26 -0
  80. package/src/routes/adminAssets.routes.js +28 -0
  81. package/src/routes/adminAssetsStorage.routes.js +13 -0
  82. package/src/routes/adminAudit.routes.js +196 -0
  83. package/src/routes/adminEjsVirtual.routes.js +17 -0
  84. package/src/routes/adminErrors.routes.js +164 -0
  85. package/src/routes/adminFeatureFlags.routes.js +12 -0
  86. package/src/routes/adminHeadless.routes.js +38 -0
  87. package/src/routes/adminI18n.routes.js +22 -0
  88. package/src/routes/adminJsonConfigs.routes.js +15 -0
  89. package/src/routes/adminLlm.routes.js +12 -0
  90. package/src/routes/adminMigration.routes.js +81 -0
  91. package/src/routes/adminSeoConfig.routes.js +20 -0
  92. package/src/routes/adminUploadNamespaces.routes.js +13 -0
  93. package/src/routes/assets.routes.js +21 -0
  94. package/src/routes/auth.routes.js +12 -0
  95. package/src/routes/billing.routes.js +11 -0
  96. package/src/routes/errorTracking.routes.js +31 -0
  97. package/src/routes/featureFlags.routes.js +9 -0
  98. package/src/routes/forms.routes.js +9 -0
  99. package/src/routes/formsAdmin.routes.js +13 -0
  100. package/src/routes/globalSettings.routes.js +18 -0
  101. package/src/routes/headless.routes.js +15 -0
  102. package/src/routes/i18n.routes.js +8 -0
  103. package/src/routes/invite.routes.js +9 -0
  104. package/src/routes/jsonConfigs.routes.js +8 -0
  105. package/src/routes/log.routes.js +111 -0
  106. package/src/routes/metrics.routes.js +9 -0
  107. package/src/routes/notificationAdmin.routes.js +15 -0
  108. package/src/routes/notifications.routes.js +12 -0
  109. package/src/routes/org.routes.js +31 -0
  110. package/src/routes/orgAdmin.routes.js +20 -0
  111. package/src/routes/publicAssets.routes.js +7 -0
  112. package/src/routes/stripeAdmin.routes.js +20 -0
  113. package/src/routes/user.routes.js +22 -0
  114. package/src/routes/userAdmin.routes.js +15 -0
  115. package/src/routes/waitingList.routes.js +13 -0
  116. package/src/routes/waitingListAdmin.routes.js +9 -0
  117. package/src/routes/webhook.routes.js +32 -0
  118. package/src/routes/workflowWebhook.routes.js +54 -0
  119. package/src/routes/workflows.routes.js +110 -0
  120. package/src/services/assets.service.js +110 -0
  121. package/src/services/audit.service.js +62 -0
  122. package/src/services/auditLogger.js +165 -0
  123. package/src/services/ejsVirtual.service.js +614 -0
  124. package/src/services/email.service.js +351 -0
  125. package/src/services/errorLogger.js +221 -0
  126. package/src/services/featureFlags.service.js +202 -0
  127. package/src/services/forms.service.js +214 -0
  128. package/src/services/globalSettings.service.js +49 -0
  129. package/src/services/headlessApiTokens.service.js +158 -0
  130. package/src/services/headlessCrypto.service.js +31 -0
  131. package/src/services/headlessModels.service.js +356 -0
  132. package/src/services/i18n.service.js +314 -0
  133. package/src/services/i18nInferredKeys.service.js +337 -0
  134. package/src/services/jsonConfigs.service.js +392 -0
  135. package/src/services/llm.service.js +749 -0
  136. package/src/services/migration.service.js +581 -0
  137. package/src/services/migrationAssets/fsLocal.js +58 -0
  138. package/src/services/migrationAssets/index.js +134 -0
  139. package/src/services/migrationAssets/s3.js +75 -0
  140. package/src/services/migrationAssets/sftp.js +92 -0
  141. package/src/services/notification.service.js +212 -0
  142. package/src/services/objectStorage.service.js +514 -0
  143. package/src/services/seoConfig.service.js +402 -0
  144. package/src/services/storage.js +150 -0
  145. package/src/services/stripe.service.js +185 -0
  146. package/src/services/stripeHelper.service.js +264 -0
  147. package/src/services/uploadNamespaces.service.js +326 -0
  148. package/src/services/webhook.service.js +157 -0
  149. package/src/services/workflow.service.js +271 -0
  150. package/src/utils/asyncHandler.js +5 -0
  151. package/src/utils/encryption.js +80 -0
  152. package/src/utils/jwt.js +40 -0
  153. package/src/utils/orgRoles.js +156 -0
  154. package/src/utils/validation.js +26 -0
  155. package/src/utils/webhookRetry.js +93 -0
  156. package/views/admin-assets.ejs +444 -0
  157. package/views/admin-audit.ejs +283 -0
  158. package/views/admin-coolify-deploy.ejs +207 -0
  159. package/views/admin-dashboard-home.ejs +291 -0
  160. package/views/admin-dashboard.ejs +397 -0
  161. package/views/admin-ejs-virtual.ejs +280 -0
  162. package/views/admin-errors.ejs +368 -0
  163. package/views/admin-feature-flags.ejs +390 -0
  164. package/views/admin-forms.ejs +526 -0
  165. package/views/admin-global-settings.ejs +436 -0
  166. package/views/admin-headless.ejs +2020 -0
  167. package/views/admin-i18n-locales.ejs +221 -0
  168. package/views/admin-i18n.ejs +728 -0
  169. package/views/admin-json-configs.ejs +410 -0
  170. package/views/admin-llm.ejs +884 -0
  171. package/views/admin-metrics.ejs +274 -0
  172. package/views/admin-migration.ejs +814 -0
  173. package/views/admin-notifications.ejs +430 -0
  174. package/views/admin-organizations.ejs +984 -0
  175. package/views/admin-seo-config.ejs +673 -0
  176. package/views/admin-stripe-pricing.ejs +558 -0
  177. package/views/admin-test.ejs +342 -0
  178. package/views/admin-users.ejs +452 -0
  179. package/views/admin-waiting-list.ejs +547 -0
  180. package/views/admin-webhooks.ejs +329 -0
  181. package/views/admin-workflows.ejs +310 -0
  182. package/views/partials/admin-assets-script.ejs +2022 -0
  183. package/views/partials/admin-test-sidebar.ejs +14 -0
  184. package/views/partials/dashboard/nav-items.ejs +66 -0
  185. package/views/partials/dashboard/palette.ejs +63 -0
  186. package/views/partials/dashboard/sidebar.ejs +21 -0
  187. package/views/partials/dashboard/tab-bar.ejs +26 -0
  188. package/views/partials/footer.ejs +3 -0
@@ -0,0 +1,221 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>i18n Locales - Admin</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <style>
9
+ .toast { animation: slideIn 0.3s ease-out; }
10
+ @keyframes slideIn { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } }
11
+ .fade-out { animation: fadeOut 0.3s ease-out forwards; }
12
+ @keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } }
13
+ </style>
14
+ </head>
15
+ <body class="bg-gray-100">
16
+ <div class="min-h-screen">
17
+ <div class="bg-white shadow">
18
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-4">
19
+ <div class="flex justify-between items-center">
20
+ <div>
21
+ <h1 class="text-2xl font-bold text-gray-900">i18n Locales</h1>
22
+ <p class="text-sm text-gray-600 mt-1">Manage locales and default locale</p>
23
+ </div>
24
+ <div class="flex items-center gap-4">
25
+ </div>
26
+ </div>
27
+ </div>
28
+ </div>
29
+
30
+ <div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8">
31
+ <div class="bg-white rounded-lg shadow p-6">
32
+ <div class="flex justify-between items-center">
33
+ <button onclick="loadLocales()" class="bg-blue-500 text-white px-4 py-2 rounded hover:bg-blue-600">Refresh</button>
34
+ <button onclick="showCreate()" class="bg-green-500 text-white px-4 py-2 rounded hover:bg-green-600">New Locale</button>
35
+ </div>
36
+
37
+ <div class="mt-6 overflow-auto">
38
+ <table class="min-w-full text-sm">
39
+ <thead>
40
+ <tr class="text-left border-b">
41
+ <th class="py-2 pr-4">Code</th>
42
+ <th class="py-2 pr-4">Name</th>
43
+ <th class="py-2 pr-4">Enabled</th>
44
+ <th class="py-2 pr-4">Default</th>
45
+ <th class="py-2 pr-4"></th>
46
+ </tr>
47
+ </thead>
48
+ <tbody id="rows"></tbody>
49
+ </table>
50
+ </div>
51
+ </div>
52
+ </div>
53
+ </div>
54
+
55
+ <div id="toast-container" class="fixed top-4 right-4 space-y-2 z-50"></div>
56
+
57
+ <div id="modal" class="hidden fixed inset-0 bg-gray-600 bg-opacity-50 overflow-y-auto h-full w-full z-50">
58
+ <div class="relative top-20 mx-auto p-5 border w-full max-w-xl shadow-lg rounded-md bg-white">
59
+ <div class="flex justify-between items-center mb-4">
60
+ <h3 class="text-xl font-bold" id="modalTitle">Locale</h3>
61
+ <button onclick="closeModal()" class="text-gray-400 hover:text-gray-600">✕</button>
62
+ </div>
63
+ <form onsubmit="saveLocale(event)">
64
+ <input type="hidden" id="mode" />
65
+ <div class="mb-4">
66
+ <label class="block text-sm font-medium mb-2">Code</label>
67
+ <input id="code" class="w-full border rounded px-3 py-2" required />
68
+ </div>
69
+ <div class="mb-4">
70
+ <label class="block text-sm font-medium mb-2">Name</label>
71
+ <input id="name" class="w-full border rounded px-3 py-2" required />
72
+ </div>
73
+ <div class="mb-4 flex items-center gap-2">
74
+ <input id="enabled" type="checkbox" checked />
75
+ <label for="enabled" class="text-sm">Enabled</label>
76
+ </div>
77
+ <div class="mb-4 flex items-center gap-2">
78
+ <input id="isDefault" type="checkbox" />
79
+ <label for="isDefault" class="text-sm">Set as default</label>
80
+ </div>
81
+ <div class="flex justify-end gap-2">
82
+ <button type="button" onclick="closeModal()" class="px-4 py-2 bg-gray-300 text-gray-700 rounded hover:bg-gray-400">Cancel</button>
83
+ <button type="submit" class="px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600">Save</button>
84
+ </div>
85
+ </form>
86
+ </div>
87
+ </div>
88
+
89
+ <script>
90
+ const API_BASE = window.location.origin + "<%= baseUrl %>" || window.location.origin;
91
+
92
+ function showToast(message, type = 'success') {
93
+ const container = document.getElementById('toast-container');
94
+ const toast = document.createElement('div');
95
+ toast.className = `toast px-6 py-4 rounded-lg shadow-lg text-white ${type === 'success' ? 'bg-green-500' : 'bg-red-500'}`;
96
+ toast.textContent = message;
97
+ container.appendChild(toast);
98
+ setTimeout(() => {
99
+ toast.classList.add('fade-out');
100
+ setTimeout(() => toast.remove(), 300);
101
+ }, 3000);
102
+ }
103
+
104
+ function escapeHtml(text) {
105
+ const div = document.createElement('div');
106
+ div.textContent = text;
107
+ return div.innerHTML;
108
+ }
109
+
110
+ function localeRow(l) {
111
+ return `
112
+ <tr class="border-b">
113
+ <td class="py-2 pr-4 font-mono text-xs">${escapeHtml(l.code)}</td>
114
+ <td class="py-2 pr-4">${escapeHtml(l.name)}</td>
115
+ <td class="py-2 pr-4">${l.enabled ? 'yes' : 'no'}</td>
116
+ <td class="py-2 pr-4">${l.isDefault ? 'yes' : ''}</td>
117
+ <td class="py-2 pr-4 text-right">
118
+ <button onclick="editLocale('${escapeHtml(l.code)}')" class="text-blue-600 hover:text-blue-800">Edit</button>
119
+ </td>
120
+ </tr>
121
+ `;
122
+ }
123
+
124
+ async function loadLocales() {
125
+ try {
126
+ const res = await fetch(`${API_BASE}/api/admin/i18n/locales`);
127
+ if (!res.ok) throw new Error('Failed to load locales');
128
+ const data = await res.json();
129
+ document.getElementById('rows').innerHTML = (data.locales || []).map(localeRow).join('');
130
+ showToast('Locales loaded');
131
+ } catch (e) {
132
+ showToast(e.message, 'error');
133
+ }
134
+ }
135
+
136
+ function showCreate() {
137
+ document.getElementById('modalTitle').textContent = 'Create Locale';
138
+ document.getElementById('mode').value = 'create';
139
+ document.getElementById('code').value = '';
140
+ document.getElementById('name').value = '';
141
+ document.getElementById('enabled').checked = true;
142
+ document.getElementById('isDefault').checked = false;
143
+ document.getElementById('code').disabled = false;
144
+ document.getElementById('modal').classList.remove('hidden');
145
+ }
146
+
147
+ async function editLocale(code) {
148
+ try {
149
+ const res = await fetch(`${API_BASE}/api/admin/i18n/locales`);
150
+ if (!res.ok) throw new Error('Failed to load locale');
151
+ const data = await res.json();
152
+ const l = (data.locales || []).find(x => x.code === code);
153
+ if (!l) throw new Error('Locale not found');
154
+
155
+ document.getElementById('modalTitle').textContent = 'Edit Locale';
156
+ document.getElementById('mode').value = 'edit';
157
+ document.getElementById('code').value = l.code;
158
+ document.getElementById('name').value = l.name;
159
+ document.getElementById('enabled').checked = !!l.enabled;
160
+ document.getElementById('isDefault').checked = !!l.isDefault;
161
+ document.getElementById('code').disabled = true;
162
+
163
+ document.getElementById('modal').classList.remove('hidden');
164
+ } catch (e) {
165
+ showToast(e.message, 'error');
166
+ }
167
+ }
168
+
169
+ function closeModal() {
170
+ document.getElementById('modal').classList.add('hidden');
171
+ }
172
+
173
+ async function saveLocale(event) {
174
+ event.preventDefault();
175
+ try {
176
+ const mode = document.getElementById('mode').value;
177
+ const code = document.getElementById('code').value;
178
+ const name = document.getElementById('name').value;
179
+ const enabled = document.getElementById('enabled').checked;
180
+ const isDefault = document.getElementById('isDefault').checked;
181
+
182
+ let res;
183
+ if (mode === 'create') {
184
+ res = await fetch(`${API_BASE}/api/admin/i18n/locales`, {
185
+ method: 'POST',
186
+ headers: { 'Content-Type': 'application/json' },
187
+ body: JSON.stringify({ code, name, enabled, isDefault })
188
+ });
189
+ } else {
190
+ res = await fetch(`${API_BASE}/api/admin/i18n/locales/${encodeURIComponent(code)}`, {
191
+ method: 'PUT',
192
+ headers: { 'Content-Type': 'application/json' },
193
+ body: JSON.stringify({ name, enabled, isDefault })
194
+ });
195
+ }
196
+
197
+ if (!res.ok) {
198
+ const data = await res.json();
199
+ throw new Error(data.error || 'Save failed');
200
+ }
201
+
202
+ closeModal();
203
+ await loadLocales();
204
+ showToast('Saved');
205
+ } catch (e) {
206
+ showToast(e.message, 'error');
207
+ }
208
+ }
209
+
210
+ loadLocales();
211
+ </script>
212
+ <script>
213
+ window.addEventListener("keydown", (e) => {
214
+ if ((e.ctrlKey || e.metaKey) && e.key === "k") {
215
+ e.preventDefault();
216
+ window.parent.postMessage({ type: "keydown", ctrlK: true }, "*");
217
+ }
218
+ });
219
+ </script>
220
+ </body>
221
+ </html>