@onetype/framework 2.0.49 → 2.0.51
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/addons/core/commands/front/directives/run.js +1 -1
- package/addons/core/commands/front/directives/submit.js +1 -1
- package/addons/core/commands/front/functions/api.js +1 -1
- package/addons/core/database/back/addon.js +14 -0
- package/addons/core/database/back/events/addon.init.js +42 -0
- package/addons/core/database/back/events/addon.item.init.js +24 -0
- package/addons/core/database/back/functions/item/create.js +92 -0
- package/addons/core/database/back/functions/item/delete.js +34 -0
- package/addons/core/database/back/functions/item/save.js +13 -0
- package/addons/core/database/back/functions/item/update.js +90 -0
- package/addons/core/database/back/functions/items/builder.js +160 -0
- package/addons/core/database/back/functions/items/filter.js +32 -0
- package/addons/core/database/back/functions/items/filters.js +7 -0
- package/addons/core/database/back/functions/items/find.js +28 -0
- package/addons/core/database/back/functions/items/methods/aggregate.js +15 -0
- package/addons/core/database/back/functions/items/methods/count.js +12 -0
- package/addons/core/database/back/functions/items/methods/exists.js +8 -0
- package/addons/core/database/back/functions/items/methods/many.js +13 -0
- package/addons/core/database/back/functions/items/methods/one.js +8 -0
- package/addons/core/database/back/functions/items/methods/plain.js +29 -0
- package/addons/core/database/back/functions/items/methods/query.js +33 -0
- package/addons/core/database/back/functions/items/methods.js +142 -0
- package/addons/core/database/back/functions/items/transform/join.js +63 -0
- package/addons/core/database/back/functions/items/transform/translate.js +57 -0
- package/addons/core/database/back/functions/items/validation.js +125 -0
- package/addons/core/database/back/item/catch/add.js +1 -1
- package/addons/core/database/back/items/commands/create.js +54 -0
- package/addons/core/database/back/items/commands/delete.js +62 -0
- package/addons/core/database/back/items/commands/find.js +118 -0
- package/addons/core/database/back/items/commands/update.js +70 -0
- package/addons/core/database/back/load.js +27 -26
- package/addons/core/database/front/events/addon.init.js +42 -0
- package/addons/core/database/front/functions/create.js +11 -0
- package/addons/core/database/front/functions/delete.js +10 -0
- package/addons/core/database/front/functions/find.js +96 -142
- package/addons/core/database/front/functions/update.js +12 -0
- package/addons/float/popup/css/popup.css +141 -18
- package/addons/float/popup/js/addon.js +5 -0
- package/addons/float/popup/js/functions/confirm.js +100 -0
- package/addons/float/popup/js/functions/toast.js +1 -1
- package/addons/float/popup/js/items/directives/tooltip.js +5 -1
- package/addons/render/directives/front/addon.js +5 -0
- package/addons/render/directives/front/functions/process/data.js +19 -1
- package/addons/render/directives/front/functions/process/locale.js +46 -0
- package/addons/render/directives/front/functions/process.js +4 -1
- package/addons/render/directives/front/items/self/660-form.js +74 -163
- package/addons/render/directives/front/items/self/750-html.js +1 -1
- package/addons/render/elements/front/items/self/form/button/button.css +9 -0
- package/addons/render/elements/front/items/self/form/button/button.js +1 -1
- package/addons/render/elements/front/items/self/form/color/color.css +1 -1
- package/addons/render/elements/front/items/self/form/color/color.js +25 -10
- package/addons/render/elements/front/items/self/form/editor-markdown/editor-markdown.css +410 -0
- package/addons/render/elements/front/items/self/form/editor-markdown/editor-markdown.js +191 -0
- package/addons/render/elements/front/items/self/form/field/field.css +18 -4
- package/addons/render/elements/front/items/self/form/field/field.js +6 -1
- package/addons/render/elements/front/items/self/form/section/section.js +3 -1
- package/addons/render/elements/front/items/self/navigation/tabs/tabs.css +8 -3
- package/addons/render/pages/core/addon.js +1 -1
- package/addons/render/pages/front/items/directives/change.js +1 -1
- package/addons/render/pages/front/styles/page.css +0 -7
- package/addons/render/transforms/js/functions/data.js +21 -2
- package/lib/src/classes/addon/class.js +0 -16
- package/lib/src/classes/addon/classes/item/class.js +0 -2
- package/lib/src/classes/addon/classes/item/mixins/get.js +0 -1
- package/lib/src/classes/addon/classes/render/mixins/compile.js +3 -2
- package/lib/src/classes/addon/mixins/items.js +2 -0
- package/lib/src/mixins/addons.js +2 -0
- package/lib/src/mixins/data.js +10 -9
- package/lib/src/mixins/emitter.js +5 -1
- package/lib/src/mixins/form.js +4 -0
- package/lib/src/mixins/function.js +6 -1
- package/lib/src/mixins/language.js +55 -0
- package/lib/src/mixins/locale.js +49 -0
- package/lib/src/onetype.js +6 -11
- package/package.json +1 -1
- package/addons/core/database/back/events/addon.add.js +0 -18
- package/addons/core/database/back/events/middleware/addon.items.find.js +0 -24
- package/addons/core/database/back/events/middleware/item.crud.create.js +0 -24
- package/addons/core/database/back/events/middleware/item.crud.delete.js +0 -24
- package/addons/core/database/back/events/middleware/item.crud.update.js +0 -24
- package/addons/core/database/back/functions/create.js +0 -6
- package/addons/core/database/back/functions/delete.js +0 -6
- package/addons/core/database/back/functions/find/builder.js +0 -160
- package/addons/core/database/back/functions/find/count.js +0 -12
- package/addons/core/database/back/functions/find/filter.js +0 -37
- package/addons/core/database/back/functions/find/filters.js +0 -7
- package/addons/core/database/back/functions/find/many.js +0 -93
- package/addons/core/database/back/functions/find/methods.js +0 -235
- package/addons/core/database/back/functions/find/plain.js +0 -25
- package/addons/core/database/back/functions/find/validation.js +0 -214
- package/addons/core/database/back/functions/find.js +0 -25
- package/addons/core/database/back/functions/update.js +0 -6
- package/addons/core/database/back/item/functions/create.js +0 -94
- package/addons/core/database/back/item/functions/delete.js +0 -25
- package/addons/core/database/back/item/functions/find.js +0 -19
- package/addons/core/database/back/item/functions/save.js +0 -15
- package/addons/core/database/back/item/functions/transaction.js +0 -17
- package/addons/core/database/back/item/functions/update.js +0 -76
- package/addons/core/database/back/items/commands/expose.js +0 -321
- package/addons/core/database/front/events/addon.add.js +0 -13
- package/lib/src/classes/addon/classes/item/mixins/crud.js +0 -28
- package/lib/src/classes/addon/mixins/find.js +0 -12
- package/lib/src/classes/addon/mixins/table.js +0 -35
- package/lib/src/mixins/dependencies.js +0 -104
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
import database from '#database/addon.js';
|
|
2
|
-
|
|
3
|
-
database.Fn('find.builder', function()
|
|
4
|
-
{
|
|
5
|
-
const builder = {};
|
|
6
|
-
|
|
7
|
-
builder.applyFilters = (knexQuery, filters) =>
|
|
8
|
-
{
|
|
9
|
-
if(!filters.length)
|
|
10
|
-
{
|
|
11
|
-
return;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const groups = {};
|
|
15
|
-
|
|
16
|
-
filters.forEach(filter =>
|
|
17
|
-
{
|
|
18
|
-
if(!groups[filter.group])
|
|
19
|
-
{
|
|
20
|
-
groups[filter.group] = { type: 'AND', filters: [] };
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
if(filter.groupStart)
|
|
24
|
-
{
|
|
25
|
-
groups[filter.group].type = filter.type;
|
|
26
|
-
}
|
|
27
|
-
else
|
|
28
|
-
{
|
|
29
|
-
groups[filter.group].filters.push(filter);
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
knexQuery.where(function()
|
|
34
|
-
{
|
|
35
|
-
let first = true;
|
|
36
|
-
|
|
37
|
-
Object.entries(groups).forEach(([groupId, group]) =>
|
|
38
|
-
{
|
|
39
|
-
if(!group.filters.length)
|
|
40
|
-
{
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const method = first ? 'where' : (group.type === 'OR' ? 'orWhere' : 'andWhere');
|
|
45
|
-
first = false;
|
|
46
|
-
|
|
47
|
-
this[method](function()
|
|
48
|
-
{
|
|
49
|
-
group.filters.forEach((filter, i) =>
|
|
50
|
-
{
|
|
51
|
-
builder.applyFilter(this, filter, i);
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
builder.applyFilter = (query, filter, index) =>
|
|
59
|
-
{
|
|
60
|
-
const method = index === 0 ? 'where' : (filter.type === 'OR' ? 'orWhere' : 'where');
|
|
61
|
-
const operator = filter.operator.toUpperCase();
|
|
62
|
-
|
|
63
|
-
if(operator === 'NULL')
|
|
64
|
-
{
|
|
65
|
-
query[method + 'Null'](filter.field);
|
|
66
|
-
}
|
|
67
|
-
else if(operator === 'NOT NULL')
|
|
68
|
-
{
|
|
69
|
-
query[method + 'NotNull'](filter.field);
|
|
70
|
-
}
|
|
71
|
-
else if(operator === 'BETWEEN')
|
|
72
|
-
{
|
|
73
|
-
query[method + 'Between'](filter.field, filter.value);
|
|
74
|
-
}
|
|
75
|
-
else if(operator === 'NOT BETWEEN')
|
|
76
|
-
{
|
|
77
|
-
query[method + 'NotBetween'](filter.field, filter.value);
|
|
78
|
-
}
|
|
79
|
-
else if(operator === 'CONTAINS')
|
|
80
|
-
{
|
|
81
|
-
const val = Array.isArray(filter.value) ? filter.value : [filter.value];
|
|
82
|
-
const type = typeof val[0] === 'number' ? '::int[]' : '::varchar[]';
|
|
83
|
-
query.whereRaw(`?? @> ARRAY[${val.map(() => '?').join(',')}]${type}`, [filter.field, ...val]);
|
|
84
|
-
}
|
|
85
|
-
else if(operator === 'CONTAINED')
|
|
86
|
-
{
|
|
87
|
-
const val = Array.isArray(filter.value) ? filter.value : [filter.value];
|
|
88
|
-
const type = typeof val[0] === 'number' ? '::int[]' : '::varchar[]';
|
|
89
|
-
query.whereRaw(`?? <@ ARRAY[${val.map(() => '?').join(',')}]${type}`, [filter.field, ...val]);
|
|
90
|
-
}
|
|
91
|
-
else if(operator === 'HAS')
|
|
92
|
-
{
|
|
93
|
-
query.whereRaw(`?? ? ?`, [filter.field, filter.value]);
|
|
94
|
-
}
|
|
95
|
-
else if(['IN', 'NOT IN'].includes(operator))
|
|
96
|
-
{
|
|
97
|
-
const values = Array.isArray(filter.value) ? filter.value : [filter.value];
|
|
98
|
-
query[method](filter.field, operatorToKnex(operator), values);
|
|
99
|
-
}
|
|
100
|
-
else
|
|
101
|
-
{
|
|
102
|
-
query[method](filter.field, operatorToKnex(operator), filter.value);
|
|
103
|
-
}
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
const operatorToKnex = (operator) =>
|
|
107
|
-
{
|
|
108
|
-
const map = {
|
|
109
|
-
'EQUALS': '=',
|
|
110
|
-
'NOT EQUALS': '!=',
|
|
111
|
-
'LESS': '<',
|
|
112
|
-
'GREATER': '>',
|
|
113
|
-
'LESS EQUALS': '<=',
|
|
114
|
-
'GREATER EQUALS': '>=',
|
|
115
|
-
'LIKE': 'like',
|
|
116
|
-
'NOT LIKE': 'not like',
|
|
117
|
-
'ILIKE': 'ilike',
|
|
118
|
-
'NOT ILIKE': 'not ilike',
|
|
119
|
-
'IN': 'in',
|
|
120
|
-
'NOT IN': 'not in'
|
|
121
|
-
};
|
|
122
|
-
|
|
123
|
-
return map[operator] || operator.toLowerCase();
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
builder.applySort = (knexQuery, sort) =>
|
|
127
|
-
{
|
|
128
|
-
if(sort)
|
|
129
|
-
{
|
|
130
|
-
knexQuery.orderBy(sort.field, sort.direction);
|
|
131
|
-
}
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
builder.applyPagination = (knexQuery, limit, page) =>
|
|
135
|
-
{
|
|
136
|
-
if(limit > 0)
|
|
137
|
-
{
|
|
138
|
-
knexQuery.limit(limit);
|
|
139
|
-
|
|
140
|
-
if(page > 1)
|
|
141
|
-
{
|
|
142
|
-
knexQuery.offset((page - 1) * limit);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
builder.applySelect = (knexQuery, select, distinct) =>
|
|
148
|
-
{
|
|
149
|
-
if(select)
|
|
150
|
-
{
|
|
151
|
-
knexQuery[distinct ? 'distinct' : 'select'](select);
|
|
152
|
-
}
|
|
153
|
-
else
|
|
154
|
-
{
|
|
155
|
-
knexQuery[distinct ? 'distinct' : 'select']('*');
|
|
156
|
-
}
|
|
157
|
-
};
|
|
158
|
-
|
|
159
|
-
return builder;
|
|
160
|
-
});
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import database from '#database/addon.js';
|
|
2
|
-
|
|
3
|
-
database.Fn('find.count', async function(query)
|
|
4
|
-
{
|
|
5
|
-
const builder = database.Fn('find.builder');
|
|
6
|
-
const knexQuery = query.connection(query.table.name).count('* as count');
|
|
7
|
-
|
|
8
|
-
builder.applyFilters(knexQuery, query.filters);
|
|
9
|
-
|
|
10
|
-
const result = await knexQuery;
|
|
11
|
-
return parseInt(result[0]?.count || 0);
|
|
12
|
-
});
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import database from '#database/addon.js';
|
|
2
|
-
|
|
3
|
-
database.Fn('find.filter', function(query, field, value, operator, type, group, returnMethods)
|
|
4
|
-
{
|
|
5
|
-
const validation = database.Fn('find.validation');
|
|
6
|
-
const normalizedOperator = operator.toUpperCase();
|
|
7
|
-
|
|
8
|
-
if(normalizedOperator === 'NULL' || normalizedOperator === 'NOT NULL')
|
|
9
|
-
{
|
|
10
|
-
validation.field(field);
|
|
11
|
-
}
|
|
12
|
-
else if(normalizedOperator === 'BETWEEN' || normalizedOperator === 'NOT BETWEEN')
|
|
13
|
-
{
|
|
14
|
-
validation.field(field);
|
|
15
|
-
validation.between(value);
|
|
16
|
-
}
|
|
17
|
-
else if(normalizedOperator === 'IN' || normalizedOperator === 'NOT IN')
|
|
18
|
-
{
|
|
19
|
-
validation.field(field);
|
|
20
|
-
validation.operator(normalizedOperator, query.operators.map(op => op.toUpperCase()));
|
|
21
|
-
validation.inList(value);
|
|
22
|
-
}
|
|
23
|
-
else
|
|
24
|
-
{
|
|
25
|
-
validation.field(field);
|
|
26
|
-
validation.operator(normalizedOperator, query.operators.map(op => op.toUpperCase()));
|
|
27
|
-
validation.value(value);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if(query.table.prefix)
|
|
31
|
-
{
|
|
32
|
-
field = query.table.prefix + field;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
query.filters.push({ field, value, operator: normalizedOperator, type, group });
|
|
36
|
-
return returnMethods;
|
|
37
|
-
});
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import onetype from '#framework/load.js';
|
|
2
|
-
import database from '#database/addon.js';
|
|
3
|
-
|
|
4
|
-
database.Fn('find.many', async function(query, set = false)
|
|
5
|
-
{
|
|
6
|
-
const builder = database.Fn('find.builder');
|
|
7
|
-
const knexQuery = query.connection(query.table.name);
|
|
8
|
-
|
|
9
|
-
builder.applySelect(knexQuery, query.select, query.distinct);
|
|
10
|
-
builder.applyFilters(knexQuery, query.filters);
|
|
11
|
-
builder.applySort(knexQuery, query.sort);
|
|
12
|
-
builder.applyPagination(knexQuery, query.limit, query.page);
|
|
13
|
-
|
|
14
|
-
const result = await knexQuery;
|
|
15
|
-
|
|
16
|
-
const items = result.map((record) =>
|
|
17
|
-
{
|
|
18
|
-
const data = {};
|
|
19
|
-
|
|
20
|
-
Object.entries(record).forEach(([key, value]) =>
|
|
21
|
-
{
|
|
22
|
-
if(value instanceof Date)
|
|
23
|
-
{
|
|
24
|
-
value = value.toISOString();
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
if(query.table.prefix && key.startsWith(query.table.prefix))
|
|
28
|
-
{
|
|
29
|
-
key = key.slice(query.table.prefix.length);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
data[key] = value;
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
return query.addon.ItemAdd(data, null, false, set);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
if(query.joins.length)
|
|
39
|
-
{
|
|
40
|
-
for(const join of query.joins)
|
|
41
|
-
{
|
|
42
|
-
const addon = onetype.AddonGet(join.addon);
|
|
43
|
-
|
|
44
|
-
if(!addon)
|
|
45
|
-
{
|
|
46
|
-
throw new Error(`Join addon '${join.addon}' not found`);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const ids = [];
|
|
50
|
-
|
|
51
|
-
items.forEach(item =>
|
|
52
|
-
{
|
|
53
|
-
const value = item.Get(join.field);
|
|
54
|
-
|
|
55
|
-
if(join.many && Array.isArray(value))
|
|
56
|
-
{
|
|
57
|
-
value.forEach(id => { if(id && !ids.includes(id)) ids.push(id); });
|
|
58
|
-
}
|
|
59
|
-
else if(value && !ids.includes(value))
|
|
60
|
-
{
|
|
61
|
-
ids.push(value);
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
if(!ids.length)
|
|
66
|
-
{
|
|
67
|
-
continue;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const joined = await addon.Find(query.connection).filter('id', ids, 'IN').limit(ids.length).many();
|
|
71
|
-
const map = {};
|
|
72
|
-
|
|
73
|
-
const fields = Object.keys(addon.Fields().data);
|
|
74
|
-
joined.forEach(item => { map[String(item.Get('id'))] = item.Get(fields); });
|
|
75
|
-
|
|
76
|
-
items.forEach(item =>
|
|
77
|
-
{
|
|
78
|
-
const value = item.Get(join.field);
|
|
79
|
-
|
|
80
|
-
if(join.many && Array.isArray(value))
|
|
81
|
-
{
|
|
82
|
-
item.Set(join.output, value.map(id => map[String(id)]).filter(Boolean));
|
|
83
|
-
}
|
|
84
|
-
else if(value)
|
|
85
|
-
{
|
|
86
|
-
item.Set(join.output, map[String(value)] || null);
|
|
87
|
-
}
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
return items;
|
|
93
|
-
});
|
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
import onetype from '#framework/load.js';
|
|
2
|
-
import database from '#database/addon.js';
|
|
3
|
-
|
|
4
|
-
database.Fn('find.methods', function(query, context = null, groupId = 'default')
|
|
5
|
-
{
|
|
6
|
-
const validation = database.Fn('find.validation');
|
|
7
|
-
const methods = {};
|
|
8
|
-
|
|
9
|
-
methods.limit = limit =>
|
|
10
|
-
{
|
|
11
|
-
try
|
|
12
|
-
{
|
|
13
|
-
validation.limit(limit);
|
|
14
|
-
query.limit = limit;
|
|
15
|
-
return methods;
|
|
16
|
-
}
|
|
17
|
-
catch (error)
|
|
18
|
-
{
|
|
19
|
-
throw new Error(`Invalid limit parameter: ${error.message}`);
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
methods.page = page =>
|
|
24
|
-
{
|
|
25
|
-
try
|
|
26
|
-
{
|
|
27
|
-
validation.page(page);
|
|
28
|
-
query.page = page;
|
|
29
|
-
return methods;
|
|
30
|
-
}
|
|
31
|
-
catch (error)
|
|
32
|
-
{
|
|
33
|
-
throw new Error(`Invalid page parameter: ${error.message}`);
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
methods.sort = (field, direction = 'asc') =>
|
|
38
|
-
{
|
|
39
|
-
try
|
|
40
|
-
{
|
|
41
|
-
validation.field(field);
|
|
42
|
-
direction = validation.direction(direction);
|
|
43
|
-
|
|
44
|
-
if(query.table.prefix)
|
|
45
|
-
{
|
|
46
|
-
field = query.table.prefix + field;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
query.sort = { field, direction };
|
|
50
|
-
return methods;
|
|
51
|
-
}
|
|
52
|
-
catch (error)
|
|
53
|
-
{
|
|
54
|
-
throw new Error(`Invalid sort parameters: ${error.message}`);
|
|
55
|
-
}
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
methods.select = fields =>
|
|
59
|
-
{
|
|
60
|
-
try
|
|
61
|
-
{
|
|
62
|
-
if (fields === undefined || fields === null)
|
|
63
|
-
{
|
|
64
|
-
throw new Error('Fields parameter cannot be null or undefined');
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
fields = Array.isArray(fields) ? fields : [fields];
|
|
68
|
-
validation.fields(fields);
|
|
69
|
-
|
|
70
|
-
if(query.table.prefix)
|
|
71
|
-
{
|
|
72
|
-
fields = fields.map(f => query.table.prefix + f);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
query.select = fields;
|
|
76
|
-
return methods;
|
|
77
|
-
}
|
|
78
|
-
catch (error)
|
|
79
|
-
{
|
|
80
|
-
throw new Error(`Invalid select parameters: ${error.message}`);
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
methods.distinct = (value = true) =>
|
|
85
|
-
{
|
|
86
|
-
query.distinct = Boolean(value);
|
|
87
|
-
return methods;
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
methods.filter = (field, value, operator = 'EQUALS') =>
|
|
91
|
-
{
|
|
92
|
-
try
|
|
93
|
-
{
|
|
94
|
-
return database.Fn('find.filter', query, field, value, operator, 'AND', groupId, methods);
|
|
95
|
-
}
|
|
96
|
-
catch (error)
|
|
97
|
-
{
|
|
98
|
-
throw new Error(`Filter error for field '${field}': ${error.message}`);
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
|
|
102
|
-
methods.orFilter = (field, value, operator = 'EQUALS') =>
|
|
103
|
-
{
|
|
104
|
-
try
|
|
105
|
-
{
|
|
106
|
-
return database.Fn('find.filter', query, field, value, operator, 'OR', groupId, methods);
|
|
107
|
-
}
|
|
108
|
-
catch (error)
|
|
109
|
-
{
|
|
110
|
-
throw new Error(`OR filter error for field '${field}': ${error.message}`);
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
methods.group = (type = 'AND') =>
|
|
115
|
-
{
|
|
116
|
-
try
|
|
117
|
-
{
|
|
118
|
-
if (type !== 'AND' && type !== 'OR')
|
|
119
|
-
{
|
|
120
|
-
throw new Error(`Group type must be 'AND' or 'OR', received: ${type}`);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
const TID = onetype.GenerateTID();
|
|
124
|
-
|
|
125
|
-
if (!query.filters)
|
|
126
|
-
{
|
|
127
|
-
query.filters = [];
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
query.filters.push({ groupStart: true, group: TID, type });
|
|
131
|
-
|
|
132
|
-
const groupMethods = database.Fn('find.methods', query, methods, TID);
|
|
133
|
-
groupMethods.end = () => context || methods;
|
|
134
|
-
|
|
135
|
-
return groupMethods;
|
|
136
|
-
}
|
|
137
|
-
catch (error)
|
|
138
|
-
{
|
|
139
|
-
throw new Error(`Error creating filter group: ${error.message}`);
|
|
140
|
-
}
|
|
141
|
-
};
|
|
142
|
-
|
|
143
|
-
methods.join = (addon, field, output = null) =>
|
|
144
|
-
{
|
|
145
|
-
try
|
|
146
|
-
{
|
|
147
|
-
const config = query.addon.FieldGet(field);
|
|
148
|
-
|
|
149
|
-
if(!config)
|
|
150
|
-
{
|
|
151
|
-
throw new Error(`Field '${field}' not found in addon`);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
const parsed = onetype.DataParseConfig(config.define);
|
|
155
|
-
const many = parsed.type.includes('array');
|
|
156
|
-
|
|
157
|
-
query.joins.push({ addon, field, output: output || field, many });
|
|
158
|
-
|
|
159
|
-
return methods;
|
|
160
|
-
}
|
|
161
|
-
catch (error)
|
|
162
|
-
{
|
|
163
|
-
throw new Error(`Join error for field '${field}': ${error.message}`);
|
|
164
|
-
}
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
methods.many = async (set = false) =>
|
|
168
|
-
{
|
|
169
|
-
try
|
|
170
|
-
{
|
|
171
|
-
return database.Fn('find.many', query, set);
|
|
172
|
-
}
|
|
173
|
-
catch (error)
|
|
174
|
-
{
|
|
175
|
-
throw new Error(`Error executing 'many' query: ${error.message}`);
|
|
176
|
-
}
|
|
177
|
-
};
|
|
178
|
-
|
|
179
|
-
methods.plain = async () =>
|
|
180
|
-
{
|
|
181
|
-
try
|
|
182
|
-
{
|
|
183
|
-
return database.Fn('find.plain', query);
|
|
184
|
-
}
|
|
185
|
-
catch (error)
|
|
186
|
-
{
|
|
187
|
-
throw new Error(`Error executing 'plain' query: ${error.message}`);
|
|
188
|
-
}
|
|
189
|
-
};
|
|
190
|
-
|
|
191
|
-
methods.count = async () =>
|
|
192
|
-
{
|
|
193
|
-
try
|
|
194
|
-
{
|
|
195
|
-
return database.Fn('find.count', query);
|
|
196
|
-
}
|
|
197
|
-
catch (error)
|
|
198
|
-
{
|
|
199
|
-
throw new Error(`Error executing 'count' query: ${error.message}`);
|
|
200
|
-
}
|
|
201
|
-
};
|
|
202
|
-
|
|
203
|
-
methods.one = async (set = false) =>
|
|
204
|
-
{
|
|
205
|
-
try
|
|
206
|
-
{
|
|
207
|
-
const results = await methods.limit(1).many(set);
|
|
208
|
-
return results.length > 0 ? results[0] : null;
|
|
209
|
-
}
|
|
210
|
-
catch (error)
|
|
211
|
-
{
|
|
212
|
-
throw new Error(`Error executing 'one' query: ${error.message}`);
|
|
213
|
-
}
|
|
214
|
-
};
|
|
215
|
-
|
|
216
|
-
methods.exists = async () =>
|
|
217
|
-
{
|
|
218
|
-
try
|
|
219
|
-
{
|
|
220
|
-
const count = await methods.limit(1).count();
|
|
221
|
-
return count > 0;
|
|
222
|
-
}
|
|
223
|
-
catch (error)
|
|
224
|
-
{
|
|
225
|
-
throw new Error(`Error executing 'exists' query: ${error.message}`);
|
|
226
|
-
}
|
|
227
|
-
};
|
|
228
|
-
|
|
229
|
-
if(context)
|
|
230
|
-
{
|
|
231
|
-
methods.end = () => context;
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
return methods;
|
|
235
|
-
});
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import database from '#database/addon.js';
|
|
2
|
-
|
|
3
|
-
database.Fn('find.plain', async function(query)
|
|
4
|
-
{
|
|
5
|
-
const builder = database.Fn('find.builder');
|
|
6
|
-
const countQuery = query.connection(query.table.name).count('* as count');
|
|
7
|
-
|
|
8
|
-
builder.applyFilters(countQuery, query.filters);
|
|
9
|
-
|
|
10
|
-
const [items, countResult] = await Promise.all([
|
|
11
|
-
database.Fn('find.many', query),
|
|
12
|
-
countQuery
|
|
13
|
-
]);
|
|
14
|
-
|
|
15
|
-
const total = parseInt(countResult[0]?.count || 0);
|
|
16
|
-
const fields = Object.keys(query.addon.Fields().data);
|
|
17
|
-
|
|
18
|
-
return {
|
|
19
|
-
items: items.map(item => item.Get(fields)),
|
|
20
|
-
total,
|
|
21
|
-
page: query.page,
|
|
22
|
-
pages: query.limit > 0 ? Math.ceil(total / query.limit) : 1,
|
|
23
|
-
limit: query.limit
|
|
24
|
-
};
|
|
25
|
-
});
|