@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,214 +0,0 @@
|
|
|
1
|
-
import database from '#database/addon.js';
|
|
2
|
-
|
|
3
|
-
database.Fn('find.validation', function()
|
|
4
|
-
{
|
|
5
|
-
const validation = {};
|
|
6
|
-
|
|
7
|
-
validation.field = field =>
|
|
8
|
-
{
|
|
9
|
-
if (field === undefined || field === null)
|
|
10
|
-
{
|
|
11
|
-
throw new Error('Field name cannot be null or undefined');
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
if (typeof field !== 'string')
|
|
15
|
-
{
|
|
16
|
-
throw new Error(`Field name must be a string, received: ${typeof field}`);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
if (!(/^[a-zA-Z][a-zA-Z0-9_\.]{0,63}$/.test(field)))
|
|
20
|
-
{
|
|
21
|
-
throw new Error(`Invalid field name format: '${field}'. Must start with a letter and contain only letters, numbers, underscores, and dots. Maximum length is 64 characters.`);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
return true;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
validation.fields = fields =>
|
|
28
|
-
{
|
|
29
|
-
if (!Array.isArray(fields))
|
|
30
|
-
{
|
|
31
|
-
throw new Error(`Fields must be an array, received: ${typeof fields}`);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
if (fields.length === 0)
|
|
35
|
-
{
|
|
36
|
-
throw new Error('Fields array cannot be empty');
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
for (let i = 0; i < fields.length; i++)
|
|
40
|
-
{
|
|
41
|
-
try
|
|
42
|
-
{
|
|
43
|
-
validation.field(fields[i]);
|
|
44
|
-
}
|
|
45
|
-
catch (error)
|
|
46
|
-
{
|
|
47
|
-
throw new Error(`Invalid field at index ${i}: ${error.message}`);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return true;
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
validation.limit = limit =>
|
|
55
|
-
{
|
|
56
|
-
if (limit === undefined || limit === null)
|
|
57
|
-
{
|
|
58
|
-
throw new Error('Limit cannot be null or undefined');
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (typeof limit !== 'number')
|
|
62
|
-
{
|
|
63
|
-
throw new Error(`Limit must be a number, received: ${typeof limit}`);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if (!Number.isInteger(limit))
|
|
67
|
-
{
|
|
68
|
-
throw new Error('Limit must be an integer');
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
if (limit <= 0)
|
|
72
|
-
{
|
|
73
|
-
throw new Error(`Limit must be a positive number, received: ${limit}`);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
return true;
|
|
77
|
-
};
|
|
78
|
-
|
|
79
|
-
validation.page = page =>
|
|
80
|
-
{
|
|
81
|
-
if (page === undefined || page === null)
|
|
82
|
-
{
|
|
83
|
-
throw new Error('Page cannot be null or undefined');
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
if (typeof page !== 'number')
|
|
87
|
-
{
|
|
88
|
-
throw new Error(`Page must be a number, received: ${typeof page}`);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
if (!Number.isInteger(page))
|
|
92
|
-
{
|
|
93
|
-
throw new Error('Page must be an integer');
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
if (page < 1)
|
|
97
|
-
{
|
|
98
|
-
throw new Error(`Page must be greater than 0, received: ${page}`);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
return true;
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
validation.direction = direction =>
|
|
105
|
-
{
|
|
106
|
-
if (direction === undefined || direction === null)
|
|
107
|
-
{
|
|
108
|
-
throw new Error('Sort direction cannot be null or undefined');
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
if (typeof direction !== 'string')
|
|
112
|
-
{
|
|
113
|
-
throw new Error(`Sort direction must be a string, received: ${typeof direction}`);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
direction = direction.toLowerCase();
|
|
117
|
-
|
|
118
|
-
if (!['asc', 'desc'].includes(direction))
|
|
119
|
-
{
|
|
120
|
-
throw new Error(`Invalid sort direction: '${direction}'. Must be either 'asc' or 'desc'`);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
return direction;
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
validation.operator = (operator, operators) =>
|
|
127
|
-
{
|
|
128
|
-
if (operator === undefined || operator === null)
|
|
129
|
-
{
|
|
130
|
-
throw new Error('Operator cannot be null or undefined');
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
if (typeof operator !== 'string')
|
|
134
|
-
{
|
|
135
|
-
throw new Error(`Operator must be a string, received: ${typeof operator}`);
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
if (!operators || !Array.isArray(operators) || operators.length === 0)
|
|
139
|
-
{
|
|
140
|
-
throw new Error('Invalid operators list');
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
const normalizedOperator = operator.toUpperCase();
|
|
144
|
-
const normalizedOperators = operators.map(op => typeof op === 'string' ? op.toUpperCase() : op);
|
|
145
|
-
|
|
146
|
-
if (!normalizedOperators.includes(normalizedOperator))
|
|
147
|
-
{
|
|
148
|
-
throw new Error(`Invalid operator: '${operator}'. Allowed operators are: ${operators.join(', ')}`);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
return true;
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
validation.value = value =>
|
|
155
|
-
{
|
|
156
|
-
const validTypes = ['number', 'string', 'boolean'];
|
|
157
|
-
|
|
158
|
-
if (value !== null && !validTypes.includes(typeof value))
|
|
159
|
-
{
|
|
160
|
-
throw new Error(`Value must be a string, number, boolean. Received: ${value === undefined ? 'undefined' : typeof value}`);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
return true;
|
|
164
|
-
};
|
|
165
|
-
|
|
166
|
-
validation.between = value =>
|
|
167
|
-
{
|
|
168
|
-
if (!Array.isArray(value))
|
|
169
|
-
{
|
|
170
|
-
throw new Error(`Value for BETWEEN operator must be an array, received: ${typeof value}`);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
if (value.length !== 2)
|
|
174
|
-
{
|
|
175
|
-
throw new Error(`Value for BETWEEN operator must have exactly 2 elements, found: ${value.length}`);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
if (value[0] === undefined || value[1] === undefined)
|
|
179
|
-
{
|
|
180
|
-
throw new Error('BETWEEN values cannot contain undefined');
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
return true;
|
|
184
|
-
};
|
|
185
|
-
|
|
186
|
-
validation.inList = value =>
|
|
187
|
-
{
|
|
188
|
-
if (!Array.isArray(value))
|
|
189
|
-
{
|
|
190
|
-
throw new Error(`Value for IN operator must be an array, received: ${typeof value}`);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
if (value.length === 0)
|
|
194
|
-
{
|
|
195
|
-
throw new Error('IN operator requires a non-empty array');
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
for (let i = 0; i < value.length; i++)
|
|
199
|
-
{
|
|
200
|
-
try
|
|
201
|
-
{
|
|
202
|
-
validation.value(value[i]);
|
|
203
|
-
}
|
|
204
|
-
catch (error)
|
|
205
|
-
{
|
|
206
|
-
throw new Error(`Invalid value at index ${i} for IN operator: ${error.message}`);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
return true;
|
|
211
|
-
};
|
|
212
|
-
|
|
213
|
-
return validation;
|
|
214
|
-
});
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import database from '#database/addon.js';
|
|
2
|
-
|
|
3
|
-
database.Fn('find', function(connection, table, addon)
|
|
4
|
-
{
|
|
5
|
-
const query = {
|
|
6
|
-
filters: [],
|
|
7
|
-
joins: [],
|
|
8
|
-
sort: null,
|
|
9
|
-
limit: 10,
|
|
10
|
-
page: 1,
|
|
11
|
-
distinct: false,
|
|
12
|
-
select: null,
|
|
13
|
-
table,
|
|
14
|
-
addon,
|
|
15
|
-
connection,
|
|
16
|
-
operators: [
|
|
17
|
-
'EQUALS', 'NOT EQUALS', 'LESS', 'GREATER', 'LESS EQUALS', 'GREATER EQUALS',
|
|
18
|
-
'LIKE', 'NOT LIKE', 'ILIKE', 'NOT ILIKE', 'IN', 'NOT IN',
|
|
19
|
-
'BETWEEN', 'NOT BETWEEN', 'NULL', 'NOT NULL',
|
|
20
|
-
'CONTAINS', 'CONTAINED', 'HAS'
|
|
21
|
-
]
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
return database.Fn('find.methods', query);
|
|
25
|
-
});
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import onetype from '#framework/load.js';
|
|
2
|
-
import database from '#database/addon.js';
|
|
3
|
-
|
|
4
|
-
database.Fn('item.create', async function(item, addon, connection = null)
|
|
5
|
-
{
|
|
6
|
-
if(!connection)
|
|
7
|
-
{
|
|
8
|
-
connection = item.Get('connection');
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
const table = addon.Table();
|
|
12
|
-
|
|
13
|
-
if(!table.name)
|
|
14
|
-
{
|
|
15
|
-
throw onetype.Error(400, 'Addon must have table name set.');
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const fields = {};
|
|
19
|
-
const id = item.Get('id');
|
|
20
|
-
|
|
21
|
-
Object.values(addon.Fields().data).forEach((field) =>
|
|
22
|
-
{
|
|
23
|
-
if(field.name !== 'id')
|
|
24
|
-
{
|
|
25
|
-
try
|
|
26
|
-
{
|
|
27
|
-
const key = table.prefix ? table.prefix + field.name : field.name;
|
|
28
|
-
fields[key] = item.Get(field.name);
|
|
29
|
-
}
|
|
30
|
-
catch(error)
|
|
31
|
-
{
|
|
32
|
-
throw onetype.Error(500, 'Error in field: ' + field.name + ': ' + error.message);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
if(addon.FieldGet('updated'))
|
|
38
|
-
{
|
|
39
|
-
const updatedKey = table.prefix ? table.prefix + 'updated' : 'updated';
|
|
40
|
-
fields[updatedKey] = new Date().toISOString();
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
if(addon.FieldGet('created'))
|
|
44
|
-
{
|
|
45
|
-
const createdKey = table.prefix ? table.prefix + 'created' : 'created';
|
|
46
|
-
fields[createdKey] = new Date().toISOString();
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
if(addon.FieldGet('updated_at'))
|
|
50
|
-
{
|
|
51
|
-
const updatedKey = table.prefix ? table.prefix + 'updated_at' : 'updated_at';
|
|
52
|
-
fields[updatedKey] = new Date().toISOString();
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
if(addon.FieldGet('created_at'))
|
|
56
|
-
{
|
|
57
|
-
const createdKey = table.prefix ? table.prefix + 'created_at' : 'created_at';
|
|
58
|
-
fields[createdKey] = new Date().toISOString();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return connection(table.name).insert(fields).returning('*').then(([record]) =>
|
|
62
|
-
{
|
|
63
|
-
Object.entries(record).forEach(([key, value]) =>
|
|
64
|
-
{
|
|
65
|
-
try
|
|
66
|
-
{
|
|
67
|
-
if(value instanceof Date)
|
|
68
|
-
{
|
|
69
|
-
value = value.toISOString();
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
if(table.prefix && key.startsWith(table.prefix))
|
|
73
|
-
{
|
|
74
|
-
key = key.slice(table.prefix.length);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
item.Set(key, value);
|
|
78
|
-
}
|
|
79
|
-
catch(error)
|
|
80
|
-
{
|
|
81
|
-
throw onetype.Error(500, 'Item create set error.');
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
addon.ItemRemove(id, false);
|
|
86
|
-
|
|
87
|
-
const created = addon.ItemAdd({id: item.Get('id')}, null, false);
|
|
88
|
-
|
|
89
|
-
created.data = item.data;
|
|
90
|
-
created.store = item.store;
|
|
91
|
-
|
|
92
|
-
return created;
|
|
93
|
-
});
|
|
94
|
-
});
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import database from '#database/addon.js';
|
|
2
|
-
|
|
3
|
-
database.Fn('item.delete', async function(item, connection = null)
|
|
4
|
-
{
|
|
5
|
-
if(!connection)
|
|
6
|
-
{
|
|
7
|
-
connection = item.Get('connection');
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const addon = item.addon;
|
|
11
|
-
const table = addon.Table();
|
|
12
|
-
|
|
13
|
-
if(!table.name)
|
|
14
|
-
{
|
|
15
|
-
throw onetype.Error(400, 'Addon must have table name set.');
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const key = table.prefix ? table.prefix + 'id' : 'id';
|
|
19
|
-
|
|
20
|
-
return connection(table.name).where(key, item.Get('id')).del().then(() =>
|
|
21
|
-
{
|
|
22
|
-
item.Set('id', null);
|
|
23
|
-
return item;
|
|
24
|
-
});
|
|
25
|
-
});
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import database from '#database/addon.js';
|
|
2
|
-
|
|
3
|
-
database.Fn('item.find', function(item, connection = null)
|
|
4
|
-
{
|
|
5
|
-
if(!connection)
|
|
6
|
-
{
|
|
7
|
-
connection = item.Get('connection');
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const addon = item.addon;
|
|
11
|
-
const table = addon.Table();
|
|
12
|
-
|
|
13
|
-
if(!table.name)
|
|
14
|
-
{
|
|
15
|
-
throw onetype.Error(400, 'Addon must have table name set.');
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
return database.Fn('find', connection, table, addon);
|
|
19
|
-
});
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import database from '#database/addon.js';
|
|
2
|
-
|
|
3
|
-
database.Fn('item.save', async function(item, connection = null)
|
|
4
|
-
{
|
|
5
|
-
const itemId = item.Get('id');
|
|
6
|
-
|
|
7
|
-
if(itemId)
|
|
8
|
-
{
|
|
9
|
-
return database.Fn('item.update', item, connection);
|
|
10
|
-
}
|
|
11
|
-
else
|
|
12
|
-
{
|
|
13
|
-
return database.Fn('item.create', item, item.addon, connection);
|
|
14
|
-
}
|
|
15
|
-
});
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import database from '#database/addon.js';
|
|
2
|
-
|
|
3
|
-
database.Fn('item.transaction', function(item, callback)
|
|
4
|
-
{
|
|
5
|
-
item.Get('connection').transaction(async (trx) =>
|
|
6
|
-
{
|
|
7
|
-
try
|
|
8
|
-
{
|
|
9
|
-
await callback(trx);
|
|
10
|
-
trx.commit();
|
|
11
|
-
}
|
|
12
|
-
catch(error)
|
|
13
|
-
{
|
|
14
|
-
trx.rollback();
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
});
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import database from '#database/addon.js';
|
|
2
|
-
|
|
3
|
-
database.Fn('item.update', async function(item, connection = null)
|
|
4
|
-
{
|
|
5
|
-
if(!connection)
|
|
6
|
-
{
|
|
7
|
-
connection = item.Get('connection');
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const addon = item.addon;
|
|
11
|
-
const table = addon.Table();
|
|
12
|
-
|
|
13
|
-
if(!table.name)
|
|
14
|
-
{
|
|
15
|
-
throw onetype.Error(400, 'Addon must have table name set.');
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const fields = {};
|
|
19
|
-
|
|
20
|
-
Object.values(addon.Fields().data).forEach((field) =>
|
|
21
|
-
{
|
|
22
|
-
if(field.name !== 'id')
|
|
23
|
-
{
|
|
24
|
-
try
|
|
25
|
-
{
|
|
26
|
-
const key = table.prefix ? table.prefix + field.name : field.name;
|
|
27
|
-
fields[key] = item.Get(field.name);
|
|
28
|
-
}
|
|
29
|
-
catch(error)
|
|
30
|
-
{
|
|
31
|
-
throw onetype.Error(500, 'Item update get error.');
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
if(addon.FieldGet('updated'))
|
|
37
|
-
{
|
|
38
|
-
const updatedKey = table.prefix ? table.prefix + 'updated' : 'updated';
|
|
39
|
-
fields[updatedKey] = new Date().toISOString();
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
if(addon.FieldGet('updated_at'))
|
|
43
|
-
{
|
|
44
|
-
const updatedKey = table.prefix ? table.prefix + 'updated_at' : 'updated_at';
|
|
45
|
-
fields[updatedKey] = new Date().toISOString();
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const key = table.prefix ? table.prefix + 'id' : 'id';
|
|
49
|
-
|
|
50
|
-
return connection(table.name).where(key, item.Get('id')).update(fields).returning('*').then(([record]) =>
|
|
51
|
-
{
|
|
52
|
-
Object.entries(record).forEach(([key, value]) =>
|
|
53
|
-
{
|
|
54
|
-
try
|
|
55
|
-
{
|
|
56
|
-
if(value instanceof Date)
|
|
57
|
-
{
|
|
58
|
-
value = value.toISOString();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if(table.prefix && key.startsWith(table.prefix))
|
|
62
|
-
{
|
|
63
|
-
key = key.slice(table.prefix.length);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
item.Set(key, value);
|
|
67
|
-
}
|
|
68
|
-
catch(error)
|
|
69
|
-
{
|
|
70
|
-
throw onetype.Error(500, 'Item update set error.');
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
return item;
|
|
75
|
-
});
|
|
76
|
-
});
|