@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.
Files changed (104) hide show
  1. package/addons/core/commands/front/directives/run.js +1 -1
  2. package/addons/core/commands/front/directives/submit.js +1 -1
  3. package/addons/core/commands/front/functions/api.js +1 -1
  4. package/addons/core/database/back/addon.js +14 -0
  5. package/addons/core/database/back/events/addon.init.js +42 -0
  6. package/addons/core/database/back/events/addon.item.init.js +24 -0
  7. package/addons/core/database/back/functions/item/create.js +92 -0
  8. package/addons/core/database/back/functions/item/delete.js +34 -0
  9. package/addons/core/database/back/functions/item/save.js +13 -0
  10. package/addons/core/database/back/functions/item/update.js +90 -0
  11. package/addons/core/database/back/functions/items/builder.js +160 -0
  12. package/addons/core/database/back/functions/items/filter.js +32 -0
  13. package/addons/core/database/back/functions/items/filters.js +7 -0
  14. package/addons/core/database/back/functions/items/find.js +28 -0
  15. package/addons/core/database/back/functions/items/methods/aggregate.js +15 -0
  16. package/addons/core/database/back/functions/items/methods/count.js +12 -0
  17. package/addons/core/database/back/functions/items/methods/exists.js +8 -0
  18. package/addons/core/database/back/functions/items/methods/many.js +13 -0
  19. package/addons/core/database/back/functions/items/methods/one.js +8 -0
  20. package/addons/core/database/back/functions/items/methods/plain.js +29 -0
  21. package/addons/core/database/back/functions/items/methods/query.js +33 -0
  22. package/addons/core/database/back/functions/items/methods.js +142 -0
  23. package/addons/core/database/back/functions/items/transform/join.js +63 -0
  24. package/addons/core/database/back/functions/items/transform/translate.js +57 -0
  25. package/addons/core/database/back/functions/items/validation.js +125 -0
  26. package/addons/core/database/back/item/catch/add.js +1 -1
  27. package/addons/core/database/back/items/commands/create.js +54 -0
  28. package/addons/core/database/back/items/commands/delete.js +62 -0
  29. package/addons/core/database/back/items/commands/find.js +118 -0
  30. package/addons/core/database/back/items/commands/update.js +70 -0
  31. package/addons/core/database/back/load.js +27 -26
  32. package/addons/core/database/front/events/addon.init.js +42 -0
  33. package/addons/core/database/front/functions/create.js +11 -0
  34. package/addons/core/database/front/functions/delete.js +10 -0
  35. package/addons/core/database/front/functions/find.js +96 -142
  36. package/addons/core/database/front/functions/update.js +12 -0
  37. package/addons/float/popup/css/popup.css +141 -18
  38. package/addons/float/popup/js/addon.js +5 -0
  39. package/addons/float/popup/js/functions/confirm.js +100 -0
  40. package/addons/float/popup/js/functions/toast.js +1 -1
  41. package/addons/float/popup/js/items/directives/tooltip.js +5 -1
  42. package/addons/render/directives/front/addon.js +5 -0
  43. package/addons/render/directives/front/functions/process/data.js +19 -1
  44. package/addons/render/directives/front/functions/process/locale.js +46 -0
  45. package/addons/render/directives/front/functions/process.js +4 -1
  46. package/addons/render/directives/front/items/self/660-form.js +74 -163
  47. package/addons/render/directives/front/items/self/750-html.js +1 -1
  48. package/addons/render/elements/front/items/self/form/button/button.css +9 -0
  49. package/addons/render/elements/front/items/self/form/button/button.js +1 -1
  50. package/addons/render/elements/front/items/self/form/color/color.css +1 -1
  51. package/addons/render/elements/front/items/self/form/color/color.js +25 -10
  52. package/addons/render/elements/front/items/self/form/editor-markdown/editor-markdown.css +410 -0
  53. package/addons/render/elements/front/items/self/form/editor-markdown/editor-markdown.js +191 -0
  54. package/addons/render/elements/front/items/self/form/field/field.css +18 -4
  55. package/addons/render/elements/front/items/self/form/field/field.js +6 -1
  56. package/addons/render/elements/front/items/self/form/section/section.js +3 -1
  57. package/addons/render/elements/front/items/self/navigation/tabs/tabs.css +8 -3
  58. package/addons/render/pages/core/addon.js +1 -1
  59. package/addons/render/pages/front/items/directives/change.js +1 -1
  60. package/addons/render/pages/front/styles/page.css +0 -7
  61. package/addons/render/transforms/js/functions/data.js +21 -2
  62. package/lib/src/classes/addon/class.js +0 -16
  63. package/lib/src/classes/addon/classes/item/class.js +0 -2
  64. package/lib/src/classes/addon/classes/item/mixins/get.js +0 -1
  65. package/lib/src/classes/addon/classes/render/mixins/compile.js +3 -2
  66. package/lib/src/classes/addon/mixins/items.js +2 -0
  67. package/lib/src/mixins/addons.js +2 -0
  68. package/lib/src/mixins/data.js +10 -9
  69. package/lib/src/mixins/emitter.js +5 -1
  70. package/lib/src/mixins/form.js +4 -0
  71. package/lib/src/mixins/function.js +6 -1
  72. package/lib/src/mixins/language.js +55 -0
  73. package/lib/src/mixins/locale.js +49 -0
  74. package/lib/src/onetype.js +6 -11
  75. package/package.json +1 -1
  76. package/addons/core/database/back/events/addon.add.js +0 -18
  77. package/addons/core/database/back/events/middleware/addon.items.find.js +0 -24
  78. package/addons/core/database/back/events/middleware/item.crud.create.js +0 -24
  79. package/addons/core/database/back/events/middleware/item.crud.delete.js +0 -24
  80. package/addons/core/database/back/events/middleware/item.crud.update.js +0 -24
  81. package/addons/core/database/back/functions/create.js +0 -6
  82. package/addons/core/database/back/functions/delete.js +0 -6
  83. package/addons/core/database/back/functions/find/builder.js +0 -160
  84. package/addons/core/database/back/functions/find/count.js +0 -12
  85. package/addons/core/database/back/functions/find/filter.js +0 -37
  86. package/addons/core/database/back/functions/find/filters.js +0 -7
  87. package/addons/core/database/back/functions/find/many.js +0 -93
  88. package/addons/core/database/back/functions/find/methods.js +0 -235
  89. package/addons/core/database/back/functions/find/plain.js +0 -25
  90. package/addons/core/database/back/functions/find/validation.js +0 -214
  91. package/addons/core/database/back/functions/find.js +0 -25
  92. package/addons/core/database/back/functions/update.js +0 -6
  93. package/addons/core/database/back/item/functions/create.js +0 -94
  94. package/addons/core/database/back/item/functions/delete.js +0 -25
  95. package/addons/core/database/back/item/functions/find.js +0 -19
  96. package/addons/core/database/back/item/functions/save.js +0 -15
  97. package/addons/core/database/back/item/functions/transaction.js +0 -17
  98. package/addons/core/database/back/item/functions/update.js +0 -76
  99. package/addons/core/database/back/items/commands/expose.js +0 -321
  100. package/addons/core/database/front/events/addon.add.js +0 -13
  101. package/lib/src/classes/addon/classes/item/mixins/crud.js +0 -28
  102. package/lib/src/classes/addon/mixins/find.js +0 -12
  103. package/lib/src/classes/addon/mixins/table.js +0 -35
  104. package/lib/src/mixins/dependencies.js +0 -104
@@ -8,7 +8,7 @@ onetype.AddonReady('directives', function(directives)
8
8
  category: 'data',
9
9
  trigger: 'node',
10
10
  order: 664,
11
- strict: false,
11
+ strict: true,
12
12
  tag: 'ot-command',
13
13
  attributes: {
14
14
  'command': ['string', null, true],
@@ -8,7 +8,7 @@ onetype.AddonReady('directives', function(directives)
8
8
  category: 'data',
9
9
  trigger: 'node',
10
10
  order: 665,
11
- strict: false,
11
+ strict: true,
12
12
  tag: 'ot-command-submit',
13
13
  attributes: {
14
14
  'command': ['string', null, true],
@@ -14,7 +14,7 @@ commands.Fn('api', async function(id, data = {})
14
14
 
15
15
  if(result.code !== 200)
16
16
  {
17
- throw result.data;
17
+ throw new Error(result.message);
18
18
  }
19
19
 
20
20
  return { time: result.time, ...result.data };
@@ -9,6 +9,20 @@ const database = onetype.Addon('database', (addon) =>
9
9
  addon.Field('username', ['string']);
10
10
  addon.Field('password', ['string']);
11
11
  addon.Field('database', ['string']);
12
+
13
+ addon.translations = onetype.Addon('database.translations', (addon) =>
14
+ {
15
+ addon.Table('translations');
16
+
17
+ addon.Field('id', ['string']);
18
+ addon.Field('entity', ['string', null, true]);
19
+ addon.Field('entity_id', ['string', null, true]);
20
+ addon.Field('language', ['string', null, true]);
21
+ addon.Field('field', ['string', null, true]);
22
+ addon.Field('value', ['string']);
23
+ addon.Field('updated_at', ['string']);
24
+ addon.Field('created_at', ['string']);
25
+ });
12
26
  });
13
27
 
14
28
  export default database;
@@ -0,0 +1,42 @@
1
+ import onetype from '#framework/load.js';
2
+
3
+ onetype.EmitOn('@addon.init', (addon) =>
4
+ {
5
+ addon.database =
6
+ {
7
+ expose: null,
8
+ table: null,
9
+ translations: null
10
+ };
11
+
12
+ addon.Table = function(name)
13
+ {
14
+ addon.database.table = { name };
15
+ };
16
+
17
+ addon.Expose = function(config)
18
+ {
19
+ addon.database.expose = onetype.DataDefine(config,
20
+ {
21
+ filter: ['array', []],
22
+ sort: ['array', []],
23
+ select: ['array', []],
24
+ find: ['function'],
25
+ create: ['function'],
26
+ update: ['function'],
27
+ delete: ['function']
28
+ });
29
+ };
30
+
31
+ addon.Translations = function(config)
32
+ {
33
+ addon.database.translations = config;
34
+ };
35
+
36
+ addon.Find = function({connection = 'primary', translation = null} = {})
37
+ {
38
+ translation = onetype.LanguageValidate(translation || onetype.Language());
39
+
40
+ return onetype.AddonGet('database').Fn('items.find', {connection, translation, table: addon.database.table, addon});
41
+ };
42
+ });
@@ -0,0 +1,24 @@
1
+ import onetype from '#framework/load.js';
2
+ import database from '#database/addon.js';
3
+
4
+ onetype.EmitOn('@addon.item.init', (item) =>
5
+ {
6
+ item.Create = async function({connection = 'primary', translation = null} = {})
7
+ {
8
+ translation = onetype.LanguageValidate(translation || onetype.Language());
9
+
10
+ return database.Fn('item.create', item, {connection, translation});
11
+ };
12
+
13
+ item.Update = async function({connection = 'primary', translation = null} = {})
14
+ {
15
+ translation = onetype.LanguageValidate(translation || onetype.Language());
16
+
17
+ return database.Fn('item.update', item, {connection, translation});
18
+ };
19
+
20
+ item.Delete = async function({connection = 'primary'} = {})
21
+ {
22
+ return database.Fn('item.delete', item, {connection});
23
+ };
24
+ });
@@ -0,0 +1,92 @@
1
+ import onetype from '#framework/load.js';
2
+ import database from '#database/addon.js';
3
+
4
+ database.Fn('item.create', async function(item, {connection = 'primary', translation = 'en'} = {})
5
+ {
6
+ const fields = {};
7
+ const id = item.Get('id');
8
+ const knex = database.ItemGet(connection)?.Get('connection');
9
+
10
+ const { table, translations } = item.addon.database;
11
+
12
+ if(!knex)
13
+ {
14
+ throw onetype.Error(400, 'Database :1 not found.', connection);
15
+ }
16
+
17
+ if(!table)
18
+ {
19
+ throw onetype.Error(400, 'Addon :1 must have table name set.', item.addon.name);
20
+ }
21
+
22
+ Object.values(item.addon.Fields().data).forEach((field) =>
23
+ {
24
+ if(field.name === 'id')
25
+ {
26
+ return;
27
+ }
28
+
29
+ try
30
+ {
31
+ fields[field.name] = item.Get(field.name);
32
+ }
33
+ catch(error)
34
+ {
35
+ throw onetype.Error(500, 'Error in field: ' + field.name + ': ' + error.message);
36
+ }
37
+ });
38
+
39
+ ['updated', 'created', 'updated_at', 'created_at'].forEach((field) =>
40
+ {
41
+ if(item.addon.FieldGet(field))
42
+ {
43
+ fields[field] = new Date().toISOString();
44
+ }
45
+ });
46
+
47
+ return knex.transaction(async (trx) =>
48
+ {
49
+ const [record] = await trx(table.name).insert(fields).returning('*');
50
+
51
+ Object.entries(record).forEach(([key, value]) =>
52
+ {
53
+ if(value instanceof Date)
54
+ {
55
+ value = value.toISOString();
56
+ }
57
+
58
+ item.Set(key, value);
59
+ });
60
+
61
+ if(translations)
62
+ {
63
+ const rows = translations
64
+ .filter(field => item.Get(field) !== null && item.Get(field) !== undefined)
65
+ .map(field => ({
66
+ entity: item.addon.name,
67
+ entity_id: String(item.Get('id')),
68
+ language: translation,
69
+ field,
70
+ value: String(item.Get(field)),
71
+ updated_at: new Date().toISOString()
72
+ }));
73
+
74
+ if(rows.length)
75
+ {
76
+ await trx('translations')
77
+ .insert(rows)
78
+ .onConflict(['entity', 'entity_id', 'language', 'field'])
79
+ .merge(['value', 'updated_at']);
80
+ }
81
+ }
82
+
83
+ item.addon.ItemRemove(id, false);
84
+
85
+ const created = item.addon.ItemAdd({id: item.Get('id')}, null, false);
86
+
87
+ created.data = item.data;
88
+ created.store = item.store;
89
+
90
+ return created;
91
+ });
92
+ });
@@ -0,0 +1,34 @@
1
+ import onetype from '#framework/load.js';
2
+ import database from '#database/addon.js';
3
+
4
+ database.Fn('item.delete', async function(item, {connection = 'primary'} = {})
5
+ {
6
+ const knex = database.ItemGet(connection)?.Get('connection');
7
+ const { table, translations } = item.addon.database;
8
+
9
+ if(!knex)
10
+ {
11
+ throw onetype.Error(400, 'Database :1 not found.', connection);
12
+ }
13
+
14
+ if(!table)
15
+ {
16
+ throw onetype.Error(400, 'Addon :1 must have table name set.', item.addon.name);
17
+ }
18
+
19
+ return knex.transaction(async (trx) =>
20
+ {
21
+ if(translations)
22
+ {
23
+ await trx('translations')
24
+ .where({entity: item.addon.name, entity_id: String(item.Get('id'))})
25
+ .del();
26
+ }
27
+
28
+ await trx(table.name).where('id', item.Get('id')).del();
29
+
30
+ item.Set('id', null);
31
+
32
+ return item;
33
+ });
34
+ });
@@ -0,0 +1,13 @@
1
+ import database from '#database/addon.js';
2
+
3
+ database.Fn('item.save', async function(item, {connection = 'primary', translations = null} = {})
4
+ {
5
+ if(item.Get('id'))
6
+ {
7
+ return database.Fn('item.update', item, {connection, translations});
8
+ }
9
+ else
10
+ {
11
+ return database.Fn('item.create', item, {connection, translations});
12
+ }
13
+ });
@@ -0,0 +1,90 @@
1
+ import onetype from '#framework/load.js';
2
+ import database from '#database/addon.js';
3
+
4
+ database.Fn('item.update', async function(item, {connection = 'primary', translation = 'en'} = {})
5
+ {
6
+ const fields = {};
7
+ const knex = database.ItemGet(connection)?.Get('connection');
8
+ const { table, translations } = item.addon.database;
9
+
10
+ if(!knex)
11
+ {
12
+ throw onetype.Error(400, 'Database :1 not found.', connection);
13
+ }
14
+
15
+ if(!table)
16
+ {
17
+ throw onetype.Error(400, 'Addon :1 must have table name set.', item.addon.name);
18
+ }
19
+
20
+ const isDefault = translation === onetype.Language();
21
+
22
+ Object.values(item.addon.Fields().data).forEach((field) =>
23
+ {
24
+ if(field.name === 'id')
25
+ {
26
+ return;
27
+ }
28
+
29
+ if(translations && !isDefault && translations.includes(field.name))
30
+ {
31
+ return;
32
+ }
33
+
34
+ try
35
+ {
36
+ fields[field.name] = item.Get(field.name);
37
+ }
38
+ catch(error)
39
+ {
40
+ throw onetype.Error(500, 'Error in field: ' + field.name + ': ' + error.message);
41
+ }
42
+ });
43
+
44
+ ['updated', 'updated_at'].forEach((field) =>
45
+ {
46
+ if(item.addon.FieldGet(field))
47
+ {
48
+ fields[field] = new Date().toISOString();
49
+ }
50
+ });
51
+
52
+ return knex.transaction(async (trx) =>
53
+ {
54
+ const [record] = await trx(table.name).where('id', item.Get('id')).update(fields).returning('*');
55
+
56
+ Object.entries(record).forEach(([key, value]) =>
57
+ {
58
+ if(value instanceof Date)
59
+ {
60
+ value = value.toISOString();
61
+ }
62
+
63
+ item.Set(key, value);
64
+ });
65
+
66
+ if(translations)
67
+ {
68
+ const rows = translations
69
+ .filter(field => item.Get(field) !== null && item.Get(field) !== undefined)
70
+ .map(field => ({
71
+ entity: item.addon.name,
72
+ entity_id: String(item.Get('id')),
73
+ language: translation,
74
+ field,
75
+ value: String(item.Get(field)),
76
+ updated_at: new Date().toISOString()
77
+ }));
78
+
79
+ if(rows.length)
80
+ {
81
+ await trx('translations')
82
+ .insert(rows)
83
+ .onConflict(['entity', 'entity_id', 'language', 'field'])
84
+ .merge(['value', 'updated_at']);
85
+ }
86
+ }
87
+
88
+ return item;
89
+ });
90
+ });
@@ -0,0 +1,160 @@
1
+ import database from '#database/addon.js';
2
+
3
+ database.Fn('items.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
+ });
@@ -0,0 +1,32 @@
1
+ import database from '#database/addon.js';
2
+
3
+ database.Fn('items.filter', function(query, field, value, operator, type, group, returnMethods)
4
+ {
5
+ const validation = database.Fn('items.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
+ query.filters.push({ field, value, operator: normalizedOperator, type, group });
31
+ return returnMethods;
32
+ });
@@ -0,0 +1,7 @@
1
+ import database from '#database/addon.js';
2
+
3
+ database.Fn('items.filters', function(knexQuery, filters = [])
4
+ {
5
+ const builder = database.Fn('items.builder');
6
+ builder.applyFilters(knexQuery, filters);
7
+ });
@@ -0,0 +1,28 @@
1
+ import database from '#database/addon.js';
2
+
3
+ database.Fn('items.find', function({connection = 'primary', translation = 'en', table, addon})
4
+ {
5
+ const knex = database.ItemGet(connection)?.Get('connection');
6
+
7
+ const query = {
8
+ filters: [],
9
+ joins: [],
10
+ sort: null,
11
+ limit: 10,
12
+ page: 1,
13
+ distinct: false,
14
+ select: null,
15
+ table,
16
+ addon,
17
+ knex,
18
+ translation,
19
+ operators: [
20
+ 'EQUALS', 'NOT EQUALS', 'LESS', 'GREATER', 'LESS EQUALS', 'GREATER EQUALS',
21
+ 'LIKE', 'NOT LIKE', 'ILIKE', 'NOT ILIKE', 'IN', 'NOT IN',
22
+ 'BETWEEN', 'NOT BETWEEN', 'NULL', 'NOT NULL',
23
+ 'CONTAINS', 'CONTAINED', 'HAS'
24
+ ]
25
+ };
26
+
27
+ return database.Fn('items.methods', query);
28
+ });
@@ -0,0 +1,15 @@
1
+ import database from '#database/addon.js';
2
+
3
+ database.Fn('items.methods.aggregate', async function(query, type, field)
4
+ {
5
+ const validation = database.Fn('items.validation');
6
+ validation.field(field);
7
+
8
+ const builder = database.Fn('items.builder');
9
+ const knexQuery = query.knex(query.table.name)[type](`${field} as result`);
10
+
11
+ builder.applyFilters(knexQuery, query.filters);
12
+
13
+ const result = await knexQuery;
14
+ return parseFloat(result[0]?.result || 0);
15
+ });
@@ -0,0 +1,12 @@
1
+ import database from '#database/addon.js';
2
+
3
+ database.Fn('items.methods.count', async function(query)
4
+ {
5
+ const builder = database.Fn('items.builder');
6
+ const knexQuery = query.knex(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
+ });
@@ -0,0 +1,8 @@
1
+ import database from '#database/addon.js';
2
+
3
+ database.Fn('items.methods.exists', async function(query)
4
+ {
5
+ query.limit = 1;
6
+ const count = await database.Fn('items.methods.count', query);
7
+ return count > 0;
8
+ });
@@ -0,0 +1,13 @@
1
+ import database from '#database/addon.js';
2
+
3
+ database.Fn('items.methods.many', async function(query, set = false)
4
+ {
5
+ let records = await database.Fn('items.methods.query', query);
6
+
7
+ if(query.joins.length)
8
+ {
9
+ records = await database.Fn('items.transform.join', records, query.joins);
10
+ }
11
+
12
+ return records.map(data => query.addon.ItemAdd(data, null, false, set));
13
+ });
@@ -0,0 +1,8 @@
1
+ import database from '#database/addon.js';
2
+
3
+ database.Fn('items.methods.one', async function(query, set = false)
4
+ {
5
+ query.limit = 1;
6
+ const results = await database.Fn('items.methods.many', query, set);
7
+ return results.length > 0 ? results[0] : null;
8
+ });
@@ -0,0 +1,29 @@
1
+ import database from '#database/addon.js';
2
+
3
+ database.Fn('items.methods.plain', async function(query)
4
+ {
5
+ const builder = database.Fn('items.builder');
6
+ const countQuery = query.knex(query.table.name).count('* as count');
7
+
8
+ builder.applyFilters(countQuery, query.filters);
9
+
10
+ let [records, countResult] = await Promise.all([
11
+ database.Fn('items.methods.query', query),
12
+ countQuery
13
+ ]);
14
+
15
+ if(query.joins.length)
16
+ {
17
+ records = await database.Fn('items.transform.join', records, query.joins);
18
+ }
19
+
20
+ const total = parseInt(countResult[0]?.count || 0);
21
+
22
+ return {
23
+ items: records,
24
+ total,
25
+ page: query.page,
26
+ pages: query.limit > 0 ? Math.ceil(total / query.limit) : 1,
27
+ limit: query.limit
28
+ };
29
+ });