@storecraft/database-sql-base 1.0.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.
Files changed (49) hide show
  1. package/README.md +126 -0
  2. package/TODO.md +2 -0
  3. package/db-strategy.md +3 -0
  4. package/driver.js +190 -0
  5. package/index.js +3 -0
  6. package/migrate.js +66 -0
  7. package/migrations.mssql/00000_init_tables.js +268 -0
  8. package/migrations.mysql/00000_init_tables.js +372 -0
  9. package/migrations.mysql/00001_seed_email_templates.js +1 -0
  10. package/migrations.postgres/00000_init_tables.js +358 -0
  11. package/migrations.postgres/00001_seed_email_templates.js +1 -0
  12. package/migrations.shared/00001_seed_email_templates.js +260 -0
  13. package/migrations.sqlite/00000_init_tables.js +357 -0
  14. package/migrations.sqlite/00001_seed_email_templates.js +1 -0
  15. package/package.json +47 -0
  16. package/src/con.auth_users.js +159 -0
  17. package/src/con.collections.js +197 -0
  18. package/src/con.customers.js +202 -0
  19. package/src/con.discounts.js +225 -0
  20. package/src/con.discounts.utils.js +180 -0
  21. package/src/con.helpers.json.js +231 -0
  22. package/src/con.helpers.json.mssql.js +233 -0
  23. package/src/con.helpers.json.mysql.js +239 -0
  24. package/src/con.helpers.json.postgres.js +223 -0
  25. package/src/con.helpers.json.sqlite.js +263 -0
  26. package/src/con.images.js +230 -0
  27. package/src/con.notifications.js +149 -0
  28. package/src/con.orders.js +156 -0
  29. package/src/con.posts.js +147 -0
  30. package/src/con.products.js +497 -0
  31. package/src/con.search.js +148 -0
  32. package/src/con.shared.js +616 -0
  33. package/src/con.shipping.js +147 -0
  34. package/src/con.storefronts.js +301 -0
  35. package/src/con.tags.js +120 -0
  36. package/src/con.templates.js +133 -0
  37. package/src/kysely.sanitize.plugin.js +40 -0
  38. package/src/utils.funcs.js +77 -0
  39. package/src/utils.query.js +195 -0
  40. package/tests/query.cursor.test.js +389 -0
  41. package/tests/query.vql.test.js +71 -0
  42. package/tests/runner.mssql-local.test.js +118 -0
  43. package/tests/runner.mysql-local.test.js +101 -0
  44. package/tests/runner.postgres-local.test.js +99 -0
  45. package/tests/runner.sqlite-local.test.js +99 -0
  46. package/tests/sandbox.test.js +71 -0
  47. package/tsconfig.json +21 -0
  48. package/types.public.d.ts +19 -0
  49. package/types.sql.tables.d.ts +247 -0
@@ -0,0 +1,156 @@
1
+ import { SQL } from '../driver.js'
2
+ import { report_document_media } from './con.images.js'
3
+ import { count_regular, delete_me, delete_media_of, delete_search_of,
4
+ delete_tags_of, insert_media_of, insert_search_of,
5
+ insert_tags_of, regular_upsert_me, where_id_or_handle_table,
6
+ with_media, with_tags} from './con.shared.js'
7
+ import { sanitize_array } from './utils.funcs.js'
8
+ import { query_to_eb, query_to_sort } from './utils.query.js'
9
+
10
+ /**
11
+ * @typedef {import('@storecraft/core/v-database').db_orders} db_col
12
+ */
13
+ export const table_name = 'orders'
14
+
15
+ /**
16
+ * @param {SQL} driver
17
+ *
18
+ *
19
+ * @returns {db_col["upsert"]}
20
+ */
21
+ const upsert = (driver) => {
22
+ return async (item, search_terms) => {
23
+ const c = driver.client;
24
+ try {
25
+ const t = await c.transaction().execute(
26
+ async (trx) => {
27
+ await insert_search_of(trx, search_terms, item.id, item.id, table_name);
28
+ await insert_media_of(trx, item.media, item.id, item.id, table_name);
29
+ await insert_tags_of(trx, item.tags, item.id, item.id, table_name);
30
+ await report_document_media(driver)(item, trx);
31
+ await regular_upsert_me(trx, table_name, {
32
+ attributes: JSON.stringify(item.attributes),
33
+ description: item.description,
34
+ created_at: item.created_at,
35
+ updated_at: item.updated_at,
36
+ id: item.id,
37
+ handle: item.id,
38
+ address: JSON.stringify(item.address),
39
+ contact: JSON.stringify(item.contact),
40
+ coupons: JSON.stringify(item.coupons),
41
+ line_items: JSON.stringify(item.line_items),
42
+ notes: item.notes,
43
+ payment_gateway: JSON.stringify(item.payment_gateway),
44
+ pricing: JSON.stringify(item.pricing),
45
+ shipping_method: JSON.stringify(item.shipping_method),
46
+ status: JSON.stringify(item.status),
47
+ validation: JSON.stringify(item.validation),
48
+ _customer_id: item?.contact?.customer_id,
49
+ _customer_email: item?.contact?.email,
50
+ _status_checkout_id: item?.status?.checkout?.id,
51
+ _status_payment_id: item?.status?.payment?.id,
52
+ _status_fulfillment_id: item?.status?.fulfillment?.id,
53
+ });
54
+ }
55
+ );
56
+ } catch(e) {
57
+ console.log(e);
58
+ return false;
59
+ }
60
+ return true;
61
+ }
62
+ }
63
+
64
+
65
+ /**
66
+ * @param {SQL} driver
67
+ * @returns {db_col["get"]}
68
+ */
69
+ const get = (driver) => {
70
+ return (id_or_handle, options) => {
71
+ return driver.client
72
+ .selectFrom(table_name)
73
+ .selectAll()
74
+ .select(eb => [
75
+ with_media(eb, id_or_handle, driver.dialectType),
76
+ with_tags(eb, id_or_handle, driver.dialectType),
77
+ ]
78
+ .filter(Boolean))
79
+ .where(where_id_or_handle_table(id_or_handle))
80
+ .executeTakeFirst();
81
+ }
82
+ }
83
+
84
+
85
+ /**
86
+ * @param {SQL} driver
87
+ * @returns {db_col["remove"]}
88
+ */
89
+ const remove = (driver) => {
90
+ return async (id_or_handle) => {
91
+ try {
92
+ await driver.client.transaction().execute(
93
+ async (trx) => {
94
+
95
+ // entities
96
+ await delete_search_of(trx, id_or_handle);
97
+ await delete_media_of(trx, id_or_handle);
98
+ await delete_tags_of(trx, id_or_handle);
99
+ // delete me
100
+ await delete_me(trx, table_name, id_or_handle);
101
+ }
102
+ );
103
+
104
+ } catch(e) {
105
+ console.log(e);
106
+ return false;
107
+ }
108
+ return true;
109
+ }
110
+ }
111
+
112
+
113
+ /**
114
+ * @param {SQL} driver
115
+ * @returns {db_col["list"]}
116
+ */
117
+ const list = (driver) => {
118
+ return async (query) => {
119
+
120
+ const items = await driver.client
121
+ .selectFrom(table_name)
122
+ .selectAll()
123
+ .select(eb => [
124
+ with_media(eb, eb.ref('orders.id'), driver.dialectType),
125
+ with_tags(eb, eb.ref('orders.id'), driver.dialectType),
126
+ ].filter(Boolean))
127
+ .where(
128
+ (eb) => {
129
+ return query_to_eb(eb, query, table_name);
130
+ }
131
+ )
132
+ .orderBy(query_to_sort(query))
133
+ .limit(query.limitToLast ?? query.limit ?? 10)
134
+ .execute();
135
+
136
+ if(query.limitToLast) items.reverse();
137
+
138
+ return sanitize_array(items);
139
+ }
140
+ }
141
+
142
+
143
+ /**
144
+ * @param {SQL} driver
145
+ * @return {db_col}}
146
+ * */
147
+ export const impl = (driver) => {
148
+
149
+ return {
150
+ get: get(driver),
151
+ upsert: upsert(driver),
152
+ remove: remove(driver),
153
+ list: list(driver),
154
+ count: count_regular(driver, table_name),
155
+ }
156
+ }
@@ -0,0 +1,147 @@
1
+ import { SQL } from '../driver.js'
2
+ import { report_document_media } from './con.images.js'
3
+ import { count_regular, delete_entity_values_by_value_or_reporter,
4
+ delete_me, delete_media_of, delete_search_of, delete_tags_of,
5
+ insert_media_of, insert_search_of, insert_tags_of,
6
+ regular_upsert_me, where_id_or_handle_table,
7
+ with_media, with_tags} from './con.shared.js'
8
+ import { sanitize_array } from './utils.funcs.js'
9
+ import { query_to_eb, query_to_sort } from './utils.query.js'
10
+
11
+ /**
12
+ * @typedef {import('@storecraft/core/v-database').db_posts} db_col
13
+ */
14
+ export const table_name = 'posts'
15
+
16
+ /**
17
+ * @param {SQL} driver
18
+ * @returns {db_col["upsert"]}
19
+ */
20
+ const upsert = (driver) => {
21
+ return async (item, search_terms) => {
22
+ const c = driver.client;
23
+ try {
24
+ const t = await c.transaction().execute(
25
+ async (trx) => {
26
+ await insert_search_of(trx, search_terms, item.id, item.handle, table_name);
27
+ await insert_media_of(trx, item.media, item.id, item.handle, table_name);
28
+ await insert_tags_of(trx, item.tags, item.id, item.handle, table_name);
29
+ await report_document_media(driver)(item, trx);
30
+ await regular_upsert_me(trx, table_name, {
31
+ active: item.active ? 1 : 0,
32
+ attributes: JSON.stringify(item.attributes),
33
+ description: item.description,
34
+ created_at: item.created_at,
35
+ updated_at: item.updated_at,
36
+ id: item.id,
37
+ handle: item.handle,
38
+ title: item.title,
39
+ text: item.text
40
+ });
41
+ }
42
+ );
43
+ } catch(e) {
44
+ console.log(e);
45
+ return false;
46
+ }
47
+ return true;
48
+ }
49
+ }
50
+
51
+
52
+ /**
53
+ * @param {SQL} driver
54
+ * @returns {db_col["get"]}
55
+ */
56
+ const get = (driver) => {
57
+ return (id_or_handle, options) => {
58
+ return driver.client
59
+ .selectFrom(table_name)
60
+ .selectAll()
61
+ .select(eb => [
62
+ with_media(eb, id_or_handle, driver.dialectType),
63
+ with_tags(eb, id_or_handle, driver.dialectType),
64
+ ]
65
+ .filter(Boolean))
66
+ .where(where_id_or_handle_table(id_or_handle))
67
+ .executeTakeFirst();
68
+ }
69
+ }
70
+
71
+
72
+ /**
73
+ * @param {SQL} driver
74
+ * @returns {db_col["remove"]}
75
+ */
76
+ const remove = (driver) => {
77
+ return async (id_or_handle) => {
78
+ try {
79
+ await driver.client.transaction().execute(
80
+ async (trx) => {
81
+
82
+ // entities
83
+ await delete_search_of(trx, id_or_handle);
84
+ await delete_media_of(trx, id_or_handle);
85
+ await delete_tags_of(trx, id_or_handle);
86
+ // STOREFRONT => POSTS
87
+ await delete_entity_values_by_value_or_reporter('storefronts_to_other')(
88
+ trx, id_or_handle, id_or_handle
89
+ );
90
+ // delete me
91
+ await delete_me(trx, table_name, id_or_handle);
92
+ }
93
+ );
94
+
95
+ } catch(e) {
96
+ console.log(e);
97
+ return false;
98
+ }
99
+ return true;
100
+ }
101
+ }
102
+
103
+
104
+ /**
105
+ * @param {SQL} driver
106
+ * @returns {db_col["list"]}
107
+ */
108
+ const list = (driver) => {
109
+ return async (query) => {
110
+
111
+ const items = await driver.client
112
+ .selectFrom(table_name)
113
+ .selectAll()
114
+ .select(eb => [
115
+ with_media(eb, eb.ref('posts.id'), driver.dialectType),
116
+ with_tags(eb, eb.ref('posts.id'), driver.dialectType),
117
+ ].filter(Boolean))
118
+ .where(
119
+ (eb) => {
120
+ return query_to_eb(eb, query, table_name);
121
+ }
122
+ )
123
+ .orderBy(query_to_sort(query))
124
+ .limit(query.limitToLast ?? query.limit ?? 10)
125
+ .execute();
126
+
127
+ if(query.limitToLast) items.reverse();
128
+
129
+ return sanitize_array(items);
130
+ }
131
+ }
132
+
133
+
134
+ /**
135
+ * @param {SQL} driver
136
+ * @return {db_col}}
137
+ * */
138
+ export const impl = (driver) => {
139
+
140
+ return {
141
+ get: get(driver),
142
+ upsert: upsert(driver),
143
+ remove: remove(driver),
144
+ list: list(driver),
145
+ count: count_regular(driver, table_name),
146
+ }
147
+ }