adminizer 4.0.0-commit.f9bffe6 → 4.1.0-build.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 +36 -0
- package/assets/VanillaJSONEditor-EdDEEERs.js +3833 -0
- package/assets/add-CXBzlfCv.js +1 -0
- package/assets/add-form-C1pPO9IW.js +1 -0
- package/assets/add-group-BIVpnHvQ.js +1 -0
- package/assets/add-group-form-BWu1FoyP.js +1 -0
- package/assets/add-user-BXbPJ4kC.js +1 -0
- package/assets/add-user-form-Dm9-szTc.js +1 -0
- package/assets/{app-DiNg6K-6.css → app-DMmad2-f.css} +6 -6
- package/assets/{app-layout-CLIcmUo6.js → app-layout-HvBcNP7X.js} +1 -1
- package/assets/app-shell-CeSqdfTT.js +1 -0
- package/assets/app-sidebar-BtgeHCOh.js +1 -0
- package/assets/{app-sidebar-header-C5wVa7ER.js → app-sidebar-header-pNKH1knV.js} +2 -2
- package/assets/app.js +33 -33
- package/assets/{breadcrumbs-DlS-hpHL.js → breadcrumbs-CQNon4Vl.js} +1 -1
- package/assets/{button-CcO4Q6h6.js → button-CQ9t1kLz.js} +1 -1
- package/assets/checkbox-W0nGAXIj.js +1 -0
- package/assets/dashboard-DOZBrGfi.js +1 -0
- package/assets/{date-picker-DMW7NWSI.js → date-picker-B__dVVqj.js} +2 -2
- package/assets/dropdown-menu-SEBnEIiL.js +1 -0
- package/assets/{field-renderer-CvC9UdC0.js → field-renderer-hXvJ0krZ.js} +139 -139
- package/assets/form-BMkoRYG6.js +1 -0
- package/assets/form-yYsjEajF.js +1 -0
- package/assets/{geo-json-BVpmaj6P.js → geo-json-paEzaL-W.js} +1 -1
- package/assets/handsontable-Wf0rBy4A.js +347 -0
- package/assets/home-BGYylio4.js +2 -0
- package/assets/{icon-CgDnRol2.js → icon-Bz9BMaD0.js} +1 -1
- package/assets/index-BC0yfOHo.js +1 -0
- package/assets/index-BbXEMx9n.js +1 -0
- package/assets/index-BcE9FUM6.js +1 -0
- package/assets/index-C0SL3SHw.js +41 -0
- package/assets/index-Cdb9ACvz.js +1 -0
- package/assets/index-D5ir9iUV.js +1 -0
- package/assets/index-DEk3sC8d.js +1 -0
- package/assets/index-DTRTjOmh.js +10 -0
- package/assets/index-DrWfGwtf.js +1 -0
- package/assets/index-K81GbF6O.js +1 -0
- package/assets/init-user-D9K13Tol.js +1 -0
- package/assets/{input-coEb8Hta.js → input-DF7Ue23C.js} +1 -1
- package/assets/{input-error-Dt30bqav.js → input-error-BBygona6.js} +1 -1
- package/assets/{label-BH_NLtVH.js → label-Z506NKsW.js} +1 -1
- package/assets/{list-table-CJgy5FsP.js → list-table-CE3swbOx.js} +3 -3
- package/assets/list-vQjhDdnO.js +1 -0
- package/assets/login-BKGj0WOS.js +6 -0
- package/assets/manifest.json +552 -601
- package/assets/{material-icon-DpKyAc3Z.js → material-icon-CItZiB53.js} +1 -1
- package/assets/module-BtDdcMyj.js +1 -0
- package/assets/multi-select-DOrUHH4A.js +11 -0
- package/assets/nav-footer-BoqrRyzw.js +1 -0
- package/assets/nav-main-BL-Hmm6O.js +1 -0
- package/assets/nav-user-KahV1IDw.js +1 -0
- package/assets/{pagination-render-S4EXTE9a.js → pagination-render-B57pOpFy.js} +1 -1
- package/assets/popover-I249Gg2O.js +1 -0
- package/assets/register-r-RETuTI.js +1 -0
- package/assets/select-D1N8zRPY.js +6 -0
- package/assets/{sidebar-C9-ESAx1.js → sidebar-VU5deMRj.js} +1 -1
- package/assets/{toast-editor-X2U_pFls.js → toast-editor-BQpTg1Td.js} +43 -43
- package/assets/tooltip-D2ehgLlB.js +1 -0
- package/assets/user-info-DBYoAJYJ.js +9 -0
- package/assets/{user-menu-content-D25M1xxo.js → user-menu-content-qkvdkUVd.js} +2 -2
- package/assets/utils-DjqsqOe8.js +1 -0
- package/assets/welcome-Z0ubrSPJ.js +1 -0
- package/controllers/add.js +1 -1
- package/controllers/addGroup.js +1 -1
- package/controllers/addUser.js +1 -1
- package/controllers/catalog/Catalog.js +1 -1
- package/controllers/ckeditorUpload.js +1 -1
- package/controllers/dashboard.js +1 -1
- package/controllers/edit.js +1 -1
- package/controllers/editGroup.js +1 -1
- package/controllers/editUser.js +1 -1
- package/controllers/form.js +1 -1
- package/controllers/getAllWidgets.js +1 -1
- package/controllers/initUser.js +1 -1
- package/controllers/list.js +1 -1
- package/controllers/login.js +3 -1
- package/controllers/media-manager/mediaManagerApi.js +1 -1
- package/controllers/navigation/edit.js +1 -1
- package/controllers/processInstallFinalize.js +1 -1
- package/controllers/processInstallStep.js +1 -1
- package/controllers/register.js +1 -1
- package/controllers/remove.js +1 -1
- package/controllers/timezones.js +1 -1
- package/controllers/view.js +1 -1
- package/controllers/welcome.js +1 -1
- package/controllers/widgets/Action.js +1 -1
- package/controllers/widgets/Custom.js +1 -1
- package/controllers/widgets/Info.js +1 -1
- package/controllers/widgets/switch.js +1 -1
- package/controllers/widgetsDB.js +1 -1
- package/helpers/accessRightsHelper.js +1 -1
- package/helpers/inertiaAddHelper.d.ts +1 -0
- package/interfaces/adminpanelConfig.d.ts +5 -1
- package/lib/datatable/NodeTable.js +2 -0
- package/lib/v4/POWCaptcha.js +1 -1
- package/lib/v4/model/AbstractModel.js +2 -0
- package/lib/v4/model/adapter/sequelize.d.ts +26 -0
- package/lib/v4/model/adapter/sequelize.js +280 -0
- package/lib/v4/model/adapter/waterline.js +3 -1
- package/package.json +6 -3
- package/policies/checkAuth.js +1 -1
- package/system/bindAuthorization.js +17 -2
- package/system/bindInertia.js +1 -1
- package/system/defaults.js +3 -0
- package/assets/VanillaJSONEditor-OdBvR1ds.js +0 -3807
- package/assets/add-DtkqVKek.js +0 -1
- package/assets/add-form-D7Gz1uwX.js +0 -1
- package/assets/add-group-BIUZK9CR.js +0 -1
- package/assets/add-group-form-CFw1igaY.js +0 -1
- package/assets/add-user-5Ko0sxsj.js +0 -1
- package/assets/add-user-form-fxpU-oac.js +0 -1
- package/assets/app-shell-Dgf4uNFy.js +0 -1
- package/assets/app-sidebar-D5-eQKSx.js +0 -1
- package/assets/checkbox-zNG98WS7.js +0 -1
- package/assets/dashboard-BmEpxYnQ.js +0 -1
- package/assets/dropdown-menu-CKLjASQo.js +0 -1
- package/assets/floating-ui.react-dom-DEWQUtJU.js +0 -1
- package/assets/form-BZkPiK2Z.js +0 -1
- package/assets/form-XjYeizmY.js +0 -1
- package/assets/handsontable-D_wNwOhu.js +0 -347
- package/assets/home-CmIZ3AL2.js +0 -2
- package/assets/index-B6nPyxx_.js +0 -1
- package/assets/index-B7QLmddv.js +0 -1
- package/assets/index-BNKtUMNI.js +0 -1
- package/assets/index-C4BeqGbx.js +0 -41
- package/assets/index-CJTkueDA.js +0 -1
- package/assets/index-CNFwBlc7.js +0 -1
- package/assets/index-D8YaJIVm.js +0 -1
- package/assets/index-DZ2G3GiC.js +0 -10
- package/assets/index-DlfDI23T.js +0 -1
- package/assets/index-Dv6YbCDH.js +0 -1
- package/assets/index-S2Olh4hE.js +0 -1
- package/assets/init-user-DXTgLYcI.js +0 -1
- package/assets/list-BBJBZzsm.js +0 -1
- package/assets/login-B7INjWDi.js +0 -6
- package/assets/module-D8kHGWhF.js +0 -1
- package/assets/multi-select-CgIsryRX.js +0 -11
- package/assets/nav-footer-BioIOL2n.js +0 -1
- package/assets/nav-main-CcQo_Ho4.js +0 -1
- package/assets/nav-user-p58e1wG0.js +0 -1
- package/assets/popover-DXKNm8mO.js +0 -1
- package/assets/register-B-p6hoZb.js +0 -1
- package/assets/select-B1LhFAX0.js +0 -6
- package/assets/tooltip-DXyAGFz-.js +0 -1
- package/assets/user-info-D89n2REb.js +0 -1
- package/assets/utils-jAU0Cazi.js +0 -1
- package/assets/welcome-D1l61QW1.js +0 -1
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { DataTypes, Op } from "sequelize";
|
|
2
|
+
import { AbstractAdapter, AbstractModel } from "../AbstractModel";
|
|
3
|
+
import path from "path";
|
|
4
|
+
import fs from "fs";
|
|
5
|
+
import { pathToFileURL } from "url";
|
|
6
|
+
function mapSequelizeAttributesToAbstract(attrs) {
|
|
7
|
+
const result = {};
|
|
8
|
+
for (const key in attrs) {
|
|
9
|
+
const attr = attrs[key];
|
|
10
|
+
const resolvedType = resolveType(attr.type);
|
|
11
|
+
result[key] = {
|
|
12
|
+
type: resolvedType,
|
|
13
|
+
required: !attr.allowNull,
|
|
14
|
+
primaryKey: !!attr.primaryKey,
|
|
15
|
+
unique: !!attr.unique,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return result;
|
|
19
|
+
}
|
|
20
|
+
function resolveType(type) {
|
|
21
|
+
try {
|
|
22
|
+
const sqlType = typeof type.toString === "function"
|
|
23
|
+
? type.toString().toLowerCase()
|
|
24
|
+
: "";
|
|
25
|
+
if (sqlType.includes("string"))
|
|
26
|
+
return "string";
|
|
27
|
+
if (sqlType.includes("uuid"))
|
|
28
|
+
return "string";
|
|
29
|
+
if (sqlType.includes("int") || sqlType.includes("float") || sqlType.includes("decimal"))
|
|
30
|
+
return "number";
|
|
31
|
+
if (sqlType.includes("bool"))
|
|
32
|
+
return "boolean";
|
|
33
|
+
if (sqlType.includes("json"))
|
|
34
|
+
return "json";
|
|
35
|
+
if (sqlType.includes("date"))
|
|
36
|
+
return "string"; // 👈 фикс: дата как строка
|
|
37
|
+
return "ref";
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return "ref";
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** SequelizeModel — реализация модели, совместимая с AbstractModel */
|
|
44
|
+
function convertCriteriaToSequelize(criteria) {
|
|
45
|
+
console.log("waterline criteria", criteria);
|
|
46
|
+
const result = {};
|
|
47
|
+
for (const key in criteria) {
|
|
48
|
+
const value = criteria[key];
|
|
49
|
+
if (value === undefined ||
|
|
50
|
+
value === null ||
|
|
51
|
+
(typeof value === "object" && Object.keys(value).length === 0)) {
|
|
52
|
+
continue; // ⛔ пропускаем пустые условия
|
|
53
|
+
}
|
|
54
|
+
if (typeof value === "object" && !Array.isArray(value)) {
|
|
55
|
+
const operatorEntries = Object.entries(value)
|
|
56
|
+
.filter(([_, v]) => v !== undefined && v !== null)
|
|
57
|
+
.map(([op, val]) => {
|
|
58
|
+
switch (op) {
|
|
59
|
+
case "contains": return [Op.like, `%${val}%`];
|
|
60
|
+
case "startsWith": return [Op.startsWith, val];
|
|
61
|
+
case "endsWith": return [Op.endsWith, val];
|
|
62
|
+
case ">": return [Op.gt, val];
|
|
63
|
+
case ">=": return [Op.gte, val];
|
|
64
|
+
case "<": return [Op.lt, val];
|
|
65
|
+
case "<=": return [Op.lte, val];
|
|
66
|
+
case "!=": return [Op.ne, val];
|
|
67
|
+
case "in": return [Op.in, val];
|
|
68
|
+
case "nin": return [Op.notIn, val];
|
|
69
|
+
default: return [Op.eq, val];
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
if (operatorEntries.length > 0) {
|
|
73
|
+
result[key] = Object.fromEntries(operatorEntries);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
result[key] = value;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
function convertWaterlineCriteriaToSequelizeOptions(criteria) {
|
|
83
|
+
console.log("WATERLINE CRITERIA", criteria);
|
|
84
|
+
const { where = {}, skip, limit, sort } = criteria;
|
|
85
|
+
const result = {
|
|
86
|
+
where: convertCriteriaToSequelize(where),
|
|
87
|
+
};
|
|
88
|
+
if (typeof skip === "number") {
|
|
89
|
+
result.offset = skip;
|
|
90
|
+
}
|
|
91
|
+
if (typeof limit === "number") {
|
|
92
|
+
result.limit = limit;
|
|
93
|
+
}
|
|
94
|
+
if (typeof sort === "string") {
|
|
95
|
+
const [field, direction] = sort.trim().split(/\s+/);
|
|
96
|
+
result.order = [[field, direction?.toUpperCase() === "DESC" ? "DESC" : "ASC"]];
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
export class SequelizeModel extends AbstractModel {
|
|
101
|
+
model;
|
|
102
|
+
constructor(modelName, model) {
|
|
103
|
+
super(modelName, mapSequelizeAttributesToAbstract(model.getAttributes()), model.primaryKeyAttribute, model.name);
|
|
104
|
+
this.model = model;
|
|
105
|
+
}
|
|
106
|
+
// --- CREATE ---
|
|
107
|
+
async _create(data) {
|
|
108
|
+
const created = await this.model.create(data);
|
|
109
|
+
const result = await this.model.findByPk(created.get(this.primaryKey), { raw: true });
|
|
110
|
+
return result;
|
|
111
|
+
}
|
|
112
|
+
// --- FIND ONE ---
|
|
113
|
+
async _findOne(criteria) {
|
|
114
|
+
const { where } = convertWaterlineCriteriaToSequelizeOptions(criteria);
|
|
115
|
+
const result = await this.model.findOne({
|
|
116
|
+
where,
|
|
117
|
+
include: this._buildIncludes(),
|
|
118
|
+
raw: true,
|
|
119
|
+
});
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
// --- FIND MANY ---
|
|
123
|
+
async _find(criteria = {}, options = {}) {
|
|
124
|
+
const { where, limit, offset, order } = convertWaterlineCriteriaToSequelizeOptions(criteria);
|
|
125
|
+
const include = options.populate
|
|
126
|
+
? options.populate.map(([field, opts]) => ({ association: field, ...opts }))
|
|
127
|
+
: this._buildIncludes();
|
|
128
|
+
const result = await this.model.findAll({
|
|
129
|
+
where,
|
|
130
|
+
limit,
|
|
131
|
+
offset,
|
|
132
|
+
order,
|
|
133
|
+
include,
|
|
134
|
+
raw: true,
|
|
135
|
+
});
|
|
136
|
+
return result;
|
|
137
|
+
}
|
|
138
|
+
// --- UPDATE ONE ---
|
|
139
|
+
async _updateOne(criteria, data) {
|
|
140
|
+
const { where } = convertWaterlineCriteriaToSequelizeOptions(criteria);
|
|
141
|
+
const record = await this.model.findOne({ where });
|
|
142
|
+
if (!record) {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
await record.update(data);
|
|
146
|
+
const result = await this.model.findByPk(record.get(this.primaryKey), { raw: true });
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
// --- UPDATE MANY ---
|
|
150
|
+
async _update(criteria, data) {
|
|
151
|
+
const { where } = convertWaterlineCriteriaToSequelizeOptions(criteria);
|
|
152
|
+
await this.model.update(data, { where });
|
|
153
|
+
const result = await this.model.findAll({ where, raw: true });
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
// --- DESTROY ONE ---
|
|
157
|
+
async _destroyOne(criteria) {
|
|
158
|
+
const { where } = convertWaterlineCriteriaToSequelizeOptions(criteria);
|
|
159
|
+
const record = await this.model.findOne({ where });
|
|
160
|
+
if (!record) {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
const raw = record.get({ plain: true });
|
|
164
|
+
await record.destroy();
|
|
165
|
+
return raw;
|
|
166
|
+
}
|
|
167
|
+
// --- DESTROY MANY ---
|
|
168
|
+
async _destroy(criteria) {
|
|
169
|
+
const { where } = convertWaterlineCriteriaToSequelizeOptions(criteria);
|
|
170
|
+
const records = await this.model.findAll({ where });
|
|
171
|
+
const raw = records.map(r => r.get({ plain: true }));
|
|
172
|
+
await this.model.destroy({ where });
|
|
173
|
+
return raw;
|
|
174
|
+
}
|
|
175
|
+
// --- COUNT ---
|
|
176
|
+
async _count(criteria = {}) {
|
|
177
|
+
const { where } = convertWaterlineCriteriaToSequelizeOptions(criteria);
|
|
178
|
+
const result = await this.model.count({ where });
|
|
179
|
+
return result;
|
|
180
|
+
}
|
|
181
|
+
// --- HELPER ---
|
|
182
|
+
_buildIncludes() {
|
|
183
|
+
return Object.keys(this.model.associations).map(key => ({ association: key }));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/** SequelizeAdapter — адаптер, заменяющий WaterlineAdapter */
|
|
187
|
+
export class SequelizeAdapter extends AbstractAdapter {
|
|
188
|
+
sequelize;
|
|
189
|
+
Model = SequelizeModel;
|
|
190
|
+
constructor(sequelize) {
|
|
191
|
+
super("sequelize", sequelize);
|
|
192
|
+
this.sequelize = sequelize;
|
|
193
|
+
}
|
|
194
|
+
get models() {
|
|
195
|
+
return this.sequelize.models;
|
|
196
|
+
}
|
|
197
|
+
getModel(modelName) {
|
|
198
|
+
const matchedKey = Object.keys(this.sequelize.models).find(key => key.toLowerCase() === modelName.toLowerCase());
|
|
199
|
+
if (!matchedKey) {
|
|
200
|
+
return undefined;
|
|
201
|
+
}
|
|
202
|
+
return this.sequelize.models[matchedKey];
|
|
203
|
+
}
|
|
204
|
+
getAttributes(modelName) {
|
|
205
|
+
const model = this.getModel(modelName);
|
|
206
|
+
return model?.getAttributes();
|
|
207
|
+
}
|
|
208
|
+
/** Регистрация системных моделей */
|
|
209
|
+
static async registerSystemModels(sequelize) {
|
|
210
|
+
const modelsDir = path.resolve(import.meta.dirname, "../../../../models");
|
|
211
|
+
const files = fs.readdirSync(modelsDir).filter(f => f.endsWith(".js"));
|
|
212
|
+
for (const file of files) {
|
|
213
|
+
const modelName = path.basename(file, path.extname(file));
|
|
214
|
+
const filePath = path.resolve(modelsDir, file);
|
|
215
|
+
const definition = (await import(pathToFileURL(filePath).href)).default;
|
|
216
|
+
generateSequelizeModel(sequelize, modelName, definition);
|
|
217
|
+
}
|
|
218
|
+
await sequelize.sync();
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/** Генерация модели Sequelize из определения, аналог WaterlineCollection.extend */
|
|
222
|
+
function generateSequelizeModel(sequelize, modelName, rawAttributes) {
|
|
223
|
+
const attributes = {};
|
|
224
|
+
let primaryKey = null;
|
|
225
|
+
for (const field in rawAttributes) {
|
|
226
|
+
const attr = { ...rawAttributes[field] };
|
|
227
|
+
// 💥 Skip associations (handled separately)
|
|
228
|
+
if (attr.model || attr.collection) {
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
if (attr.primaryKey) {
|
|
232
|
+
primaryKey = field;
|
|
233
|
+
attr.primaryKey = true;
|
|
234
|
+
}
|
|
235
|
+
if (attr.uuid && attr.type === "string") {
|
|
236
|
+
attr.type = DataTypes.UUID;
|
|
237
|
+
attr.defaultValue = DataTypes.UUIDV4;
|
|
238
|
+
delete attr.uuid;
|
|
239
|
+
}
|
|
240
|
+
if (attr.autoIncrement) {
|
|
241
|
+
attr.autoIncrement = true;
|
|
242
|
+
}
|
|
243
|
+
if (attr.unique) {
|
|
244
|
+
attr.unique = true;
|
|
245
|
+
}
|
|
246
|
+
if (typeof attr.type === "string") {
|
|
247
|
+
switch (attr.type) {
|
|
248
|
+
case "string":
|
|
249
|
+
attr.type = DataTypes.STRING;
|
|
250
|
+
break;
|
|
251
|
+
case "number":
|
|
252
|
+
attr.type = DataTypes.INTEGER;
|
|
253
|
+
break;
|
|
254
|
+
case "boolean":
|
|
255
|
+
attr.type = DataTypes.BOOLEAN;
|
|
256
|
+
break;
|
|
257
|
+
case "json":
|
|
258
|
+
attr.type = DataTypes.JSON;
|
|
259
|
+
break;
|
|
260
|
+
case "ref":
|
|
261
|
+
attr.type = DataTypes.JSON;
|
|
262
|
+
break;
|
|
263
|
+
case "datetime":
|
|
264
|
+
case "date":
|
|
265
|
+
attr.type = DataTypes.DATE;
|
|
266
|
+
break;
|
|
267
|
+
default:
|
|
268
|
+
throw new Error(`Unrecognized datatype "${attr.type}" for field "${field}" in model "${modelName}"`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
attributes[field] = attr;
|
|
272
|
+
}
|
|
273
|
+
if (!primaryKey) {
|
|
274
|
+
throw new Error(`Model "${modelName}" must have a primary key`);
|
|
275
|
+
}
|
|
276
|
+
return sequelize.define(modelName, attributes, {
|
|
277
|
+
tableName: modelName.toLowerCase(),
|
|
278
|
+
timestamps: true,
|
|
279
|
+
});
|
|
280
|
+
}
|
|
@@ -47,7 +47,9 @@ export class WaterlineModel extends AbstractModel {
|
|
|
47
47
|
if (options.limit && typeof options.limit === "number") {
|
|
48
48
|
query = query.limit(options.limit);
|
|
49
49
|
}
|
|
50
|
-
|
|
50
|
+
let result = await query;
|
|
51
|
+
console.log(result, "result");
|
|
52
|
+
return result;
|
|
51
53
|
}
|
|
52
54
|
async _updateOne(criteria, data) {
|
|
53
55
|
return await this.model.updateOne(criteria).set(data);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "adminizer",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "4.
|
|
4
|
+
"version": "4.1.0-build.0",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"test": "echo \"Error: no test specified\" && exit 1",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"build:assets:modules": "npm run build:assets && npm run copy:modules",
|
|
20
20
|
"start:seed": "cross-env SEED_DATA=true tsx --tsconfig ./waterlineFixture/tsconfig.json ./waterlineFixture/index.ts",
|
|
21
21
|
"demo:build": "npm run copy:backend && npm run compile:backend && npm run build:assets && npm run copy:modules",
|
|
22
|
-
"demo": "npm run start:seed"
|
|
22
|
+
"demo": "cross-env DEMO=true npm run start:seed"
|
|
23
23
|
},
|
|
24
24
|
"keywords": [],
|
|
25
25
|
"author": "",
|
|
@@ -117,6 +117,9 @@
|
|
|
117
117
|
"vite": "^6.1.0",
|
|
118
118
|
"vite-plugin-externals": "^0.6.2",
|
|
119
119
|
"vite-plugin-full-reload": "^1.2.0",
|
|
120
|
-
"waterline": "^0.15.2"
|
|
120
|
+
"waterline": "^0.15.2",
|
|
121
|
+
"sqlite3": "^5.1.7",
|
|
122
|
+
"sequelize": "^6.37.5",
|
|
123
|
+
"sequelize-typescript": "^2.1.6"
|
|
121
124
|
}
|
|
122
125
|
}
|
package/policies/checkAuth.js
CHANGED
|
@@ -3,7 +3,7 @@ export default async function checkAuth(req, res, proceed) {
|
|
|
3
3
|
if (typeof req.adminizer.config.translation !== 'boolean') {
|
|
4
4
|
locale = req.adminizer.config.translation.defaultLocale;
|
|
5
5
|
}
|
|
6
|
-
if (!req.adminizer.config.auth) {
|
|
6
|
+
if (!req.adminizer.config.auth.enable) {
|
|
7
7
|
if (req.session.UserAP) {
|
|
8
8
|
req.session.UserAP.isAdministrator = true;
|
|
9
9
|
}
|
|
@@ -60,15 +60,30 @@ export default async function bindAuthorization(adminizer) {
|
|
|
60
60
|
console.table(adminsCredentials);
|
|
61
61
|
console.groupEnd();
|
|
62
62
|
}
|
|
63
|
+
else if (process.env.ADMINPANEL_DEMO_ADMIN_ENABLE !== undefined) {
|
|
64
|
+
try {
|
|
65
|
+
let passwordHashed = generate("demodemo");
|
|
66
|
+
let password = 'masked';
|
|
67
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
68
|
+
await adminizer.modelHandler.model.get("UserAP")?.["_create"]({
|
|
69
|
+
login: 'demo', password: 'demo', passwordHashed: passwordHashed, fullName: "Administrator",
|
|
70
|
+
isActive: true, isAdministrator: true
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
Adminizer.log.error("Could not create demo administrator profile", e);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
63
78
|
else { // try to create one if we don't
|
|
64
|
-
if (adminizer.config.auth) {
|
|
79
|
+
if (adminizer.config.auth.enable) {
|
|
65
80
|
Adminizer.log.debug(`Adminpanel does not have an administrator`);
|
|
66
81
|
adminizer.config.policies.push(initUserPolicy);
|
|
67
82
|
//@ts-ignore
|
|
68
83
|
adminizer.app.use(`${adminizer.config.routePrefix}/init_user`, _initUser);
|
|
69
84
|
}
|
|
70
85
|
}
|
|
71
|
-
if (adminizer.config.auth) {
|
|
86
|
+
if (adminizer.config.auth.enable) {
|
|
72
87
|
adminizer.app.use(baseRoute + '/login', adminizer.policyManager.bindPolicies(policies, _login));
|
|
73
88
|
adminizer.app.use(baseRoute + '/logout', adminizer.policyManager.bindPolicies(policies, _login));
|
|
74
89
|
adminizer.app.use(baseRoute + '/register', adminizer.policyManager.bindPolicies(policies, _register));
|
package/system/bindInertia.js
CHANGED
|
@@ -132,7 +132,7 @@ function checkAuth(req, adminizer) {
|
|
|
132
132
|
if (typeof adminizer.config.translation !== 'boolean') {
|
|
133
133
|
locale = adminizer.config.translation.defaultLocale;
|
|
134
134
|
}
|
|
135
|
-
if (!adminizer.config.auth) {
|
|
135
|
+
if (!adminizer.config.auth.enable) {
|
|
136
136
|
if (req.session.UserAP) {
|
|
137
137
|
req.session.UserAP.isAdministrator = true;
|
|
138
138
|
}
|