@storecraft/database-mongodb 1.0.1
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 +50 -0
- package/db-strategy.md +284 -0
- package/index.js +193 -0
- package/jsconfig.json +14 -0
- package/migrate.js +39 -0
- package/migrations/00000_init_tables.js +60 -0
- package/migrations/00001_seed_email_templates.js +271 -0
- package/package.json +38 -0
- package/src/con.auth_users.js +147 -0
- package/src/con.collections.js +232 -0
- package/src/con.customers.js +172 -0
- package/src/con.discounts.js +261 -0
- package/src/con.discounts.utils.js +137 -0
- package/src/con.images.js +173 -0
- package/src/con.notifications.js +101 -0
- package/src/con.orders.js +61 -0
- package/src/con.posts.js +149 -0
- package/src/con.products.js +537 -0
- package/src/con.search.js +162 -0
- package/src/con.shared.js +333 -0
- package/src/con.shipping.js +153 -0
- package/src/con.storefronts.js +223 -0
- package/src/con.tags.js +62 -0
- package/src/con.templates.js +62 -0
- package/src/utils.funcs.js +152 -0
- package/src/utils.query.js +186 -0
- package/src/utils.relations.js +410 -0
- package/tests/mongo-ping.test.js +34 -0
- package/tests/query.cursor.test.js +389 -0
- package/tests/query.vql.test.js +71 -0
- package/tests/runner.test.js +35 -0
- package/tests/sandbox.test.js +56 -0
- package/types.public.d.ts +22 -0
@@ -0,0 +1,137 @@
|
|
1
|
+
import { enums } from "@storecraft/core/v-api";
|
2
|
+
import { to_objid_safe } from "./utils.funcs.js";
|
3
|
+
|
4
|
+
/** @param {import("@storecraft/core/v-api").DiscountType} d */
|
5
|
+
const is_order_discount = d => {
|
6
|
+
return (d.info.details.meta.id===enums.DiscountMetaEnum.order.id);
|
7
|
+
}
|
8
|
+
|
9
|
+
/** @param {import("@storecraft/core/v-api").DiscountType} d */
|
10
|
+
const is_automatic_discount = d => {
|
11
|
+
return (d.application.id===enums.DiscountApplicationEnum.Auto.id);
|
12
|
+
}
|
13
|
+
|
14
|
+
const extract_abs_number = v => {
|
15
|
+
return v && !isNaN(v) && v!==Infinity && Math.abs(v);
|
16
|
+
}
|
17
|
+
|
18
|
+
/**
|
19
|
+
* create a mongodb conjunctions clauses from discount, intended
|
20
|
+
* for filtering.
|
21
|
+
*
|
22
|
+
*
|
23
|
+
* @param {import("@storecraft/core/v-api").DiscountType} d
|
24
|
+
*/
|
25
|
+
export const discount_to_mongo_conjunctions = d => {
|
26
|
+
// discount has to be product discount + automatic + active + has filters
|
27
|
+
const conjunctions = [];
|
28
|
+
const is_good = !is_order_discount(d) && is_automatic_discount(d) &&
|
29
|
+
d.active && d?.info?.filters?.length;
|
30
|
+
if(!is_good) conjunctions;
|
31
|
+
|
32
|
+
const filters = d.info.filters;
|
33
|
+
|
34
|
+
for(const filter of filters) {
|
35
|
+
const op = filter.meta.op;
|
36
|
+
|
37
|
+
switch (op) {
|
38
|
+
case enums.FilterMetaEnum.p_all.op:
|
39
|
+
// do nothing
|
40
|
+
break;
|
41
|
+
case enums.FilterMetaEnum.p_in_products.op:
|
42
|
+
{
|
43
|
+
/** @type {import("@storecraft/core/v-api").FilterValue_p_in_products} */
|
44
|
+
const cast = filter.value ?? [];
|
45
|
+
|
46
|
+
conjunctions.push(
|
47
|
+
{ handle: { $in: cast.map(it => it.handle) } }
|
48
|
+
);
|
49
|
+
}
|
50
|
+
break;
|
51
|
+
case enums.FilterMetaEnum.p_not_in_products.op:
|
52
|
+
{
|
53
|
+
/** @type {import("@storecraft/core/v-api").FilterValue_p_not_in_products} */
|
54
|
+
const cast = filter.value ?? [];
|
55
|
+
|
56
|
+
conjunctions.push(
|
57
|
+
{ handle: { $nin: cast.map(it => it.handle) } }
|
58
|
+
);
|
59
|
+
}
|
60
|
+
break;
|
61
|
+
case enums.FilterMetaEnum.p_in_tags.op:
|
62
|
+
{
|
63
|
+
/** @type {import("@storecraft/core/v-api").FilterValue_p_in_tags} */
|
64
|
+
const cast = filter.value ?? [];
|
65
|
+
|
66
|
+
conjunctions.push(
|
67
|
+
{ tags: { $in: cast } }
|
68
|
+
);
|
69
|
+
}
|
70
|
+
break;
|
71
|
+
case enums.FilterMetaEnum.p_not_in_tags.op:
|
72
|
+
{
|
73
|
+
/** @type {import("@storecraft/core/v-api").FilterValue_p_not_in_tags} */
|
74
|
+
const cast = filter.value ?? [];
|
75
|
+
|
76
|
+
conjunctions.push(
|
77
|
+
{ tags: { $nin: cast } }
|
78
|
+
);
|
79
|
+
}
|
80
|
+
break;
|
81
|
+
case enums.FilterMetaEnum.p_in_collections.op:
|
82
|
+
{
|
83
|
+
/** @type {import("@storecraft/core/v-api").FilterValue_p_in_collections} */
|
84
|
+
const cast = filter.value ?? [];
|
85
|
+
|
86
|
+
conjunctions.push(
|
87
|
+
{
|
88
|
+
'_relations.collections.ids': {
|
89
|
+
$in: cast.map(c => to_objid_safe(c.id)).filter(Boolean)
|
90
|
+
}
|
91
|
+
}
|
92
|
+
);
|
93
|
+
}
|
94
|
+
break;
|
95
|
+
case enums.FilterMetaEnum.p_not_in_collections.op:
|
96
|
+
{
|
97
|
+
/** @type {import("@storecraft/core/v-api").FilterValue_p_not_in_collections} */
|
98
|
+
const cast = filter.value ?? [];
|
99
|
+
|
100
|
+
conjunctions.push(
|
101
|
+
{
|
102
|
+
'_relations.collections.ids': {
|
103
|
+
$nin: cast.map(c => to_objid_safe(c.id)).filter(Boolean)
|
104
|
+
}
|
105
|
+
}
|
106
|
+
);
|
107
|
+
}
|
108
|
+
break;
|
109
|
+
case enums.FilterMetaEnum.p_in_price_range.op:
|
110
|
+
{
|
111
|
+
/** @type {import("@storecraft/core/v-api").FilterValue_p_in_price_range} */
|
112
|
+
const cast = {
|
113
|
+
from: 0,
|
114
|
+
to: Number.POSITIVE_INFINITY,
|
115
|
+
...(filter?.value ?? {})
|
116
|
+
};
|
117
|
+
|
118
|
+
const from = extract_abs_number(cast.from);
|
119
|
+
const to = extract_abs_number(cast.to);
|
120
|
+
|
121
|
+
const conj = { price: { $and: [] } };
|
122
|
+
|
123
|
+
if(from) conj.price.$and.push({ $gte: from });
|
124
|
+
if(to) conj.price.$and.push({ $lt: to });
|
125
|
+
|
126
|
+
(to || from) && conjunctions.push(conj);
|
127
|
+
|
128
|
+
}
|
129
|
+
break;
|
130
|
+
|
131
|
+
default:
|
132
|
+
break;
|
133
|
+
}
|
134
|
+
}
|
135
|
+
|
136
|
+
return conjunctions;
|
137
|
+
}
|
@@ -0,0 +1,173 @@
|
|
1
|
+
import { Collection } from 'mongodb'
|
2
|
+
import { MongoDB } from '../index.js'
|
3
|
+
import { count_regular, get_regular, list_regular,
|
4
|
+
upsert_regular } from './con.shared.js'
|
5
|
+
import { handle_or_id, to_objid } from './utils.funcs.js';
|
6
|
+
import { func } from '@storecraft/core/v-api';
|
7
|
+
import { ID } from '@storecraft/core/v-api/utils.func.js';
|
8
|
+
import {
|
9
|
+
image_url_to_handle, image_url_to_name
|
10
|
+
} from '@storecraft/core/v-api/con.images.logic.js';
|
11
|
+
|
12
|
+
/**
|
13
|
+
* @typedef {import('@storecraft/core/v-database').db_images} db_col
|
14
|
+
*/
|
15
|
+
|
16
|
+
/**
|
17
|
+
* @param {MongoDB} d @returns {Collection<db_col["$type_get"]>}
|
18
|
+
*/
|
19
|
+
const col = (d) => d.collection('images');
|
20
|
+
|
21
|
+
/**
|
22
|
+
* @param {MongoDB} driver
|
23
|
+
*/
|
24
|
+
const upsert = (driver) => upsert_regular(driver, col(driver));
|
25
|
+
|
26
|
+
/**
|
27
|
+
* @param {MongoDB} driver
|
28
|
+
*/
|
29
|
+
const get = (driver) => get_regular(driver, col(driver));
|
30
|
+
|
31
|
+
|
32
|
+
/**
|
33
|
+
* @param {MongoDB} driver
|
34
|
+
*
|
35
|
+
*
|
36
|
+
* @returns {db_col["remove"]}
|
37
|
+
*/
|
38
|
+
const remove = (driver) => {
|
39
|
+
return async (id) => {
|
40
|
+
const image = await col(driver).findOne(handle_or_id(id));
|
41
|
+
if(!image) return;
|
42
|
+
|
43
|
+
const session = driver.mongo_client.startSession();
|
44
|
+
try {
|
45
|
+
await session.withTransaction(
|
46
|
+
async () => {
|
47
|
+
////
|
48
|
+
// EVERYTHING --> IMAGES URL
|
49
|
+
////
|
50
|
+
const filter = { media : image.url };
|
51
|
+
const update = { $pull: { media: image.url } };
|
52
|
+
const options = { session };
|
53
|
+
|
54
|
+
await Promise.all(
|
55
|
+
[
|
56
|
+
driver.resources.collections._col.updateMany(filter, update, options),
|
57
|
+
driver.resources.discounts._col.updateMany(filter, update, options),
|
58
|
+
driver.resources.posts._col.updateMany(filter, update, options),
|
59
|
+
driver.resources.products._col.updateMany(filter, update, options),
|
60
|
+
driver.resources.shipping_methods._col.updateMany(filter, update, options),
|
61
|
+
driver.resources.storefronts._col.updateMany(filter, update, options),
|
62
|
+
]
|
63
|
+
);
|
64
|
+
|
65
|
+
// DELETE ME
|
66
|
+
const res = await col(driver).deleteOne(
|
67
|
+
{ _id: image._id },
|
68
|
+
options
|
69
|
+
);
|
70
|
+
}
|
71
|
+
);
|
72
|
+
} catch(e) {
|
73
|
+
console.log(e);
|
74
|
+
return false;
|
75
|
+
} finally {
|
76
|
+
await session.endSession();
|
77
|
+
}
|
78
|
+
|
79
|
+
return true;
|
80
|
+
}
|
81
|
+
|
82
|
+
}
|
83
|
+
|
84
|
+
/**
|
85
|
+
* report media usages
|
86
|
+
*
|
87
|
+
*
|
88
|
+
* @param {MongoDB} driver
|
89
|
+
*
|
90
|
+
*
|
91
|
+
* @returns {db_col["report_document_media"]}
|
92
|
+
*/
|
93
|
+
export const report_document_media = (driver) => {
|
94
|
+
return async (data, session) => {
|
95
|
+
if(!(data?.media?.length))
|
96
|
+
return;
|
97
|
+
|
98
|
+
const add_to_search_index = func.union(
|
99
|
+
data['title'], func.to_tokens(data['title'])
|
100
|
+
);
|
101
|
+
|
102
|
+
const dates = func.apply_dates({});
|
103
|
+
|
104
|
+
/**
|
105
|
+
* @param {string} url
|
106
|
+
*
|
107
|
+
*
|
108
|
+
* @returns {import('mongodb').AnyBulkWriteOperation<
|
109
|
+
* import('@storecraft/core/v-api').ImageType>
|
110
|
+
* }
|
111
|
+
*/
|
112
|
+
const url_to_update = url => {
|
113
|
+
const id_on_insert = ID('img');
|
114
|
+
return {
|
115
|
+
updateOne: {
|
116
|
+
filter: { handle: image_url_to_handle(url) },
|
117
|
+
update: {
|
118
|
+
$addToSet : { '_relations.search': { $each: add_to_search_index} },
|
119
|
+
$set: {
|
120
|
+
name: image_url_to_name(url),
|
121
|
+
url: url,
|
122
|
+
updated_at: dates.updated_at
|
123
|
+
},
|
124
|
+
$setOnInsert: {
|
125
|
+
created_at: dates.created_at,
|
126
|
+
_id: to_objid(id_on_insert),
|
127
|
+
id: id_on_insert
|
128
|
+
}
|
129
|
+
},
|
130
|
+
upsert: true
|
131
|
+
}
|
132
|
+
}
|
133
|
+
}
|
134
|
+
|
135
|
+
const ops = data.media.map(url_to_update);
|
136
|
+
|
137
|
+
await driver.resources.images._col.bulkWrite(
|
138
|
+
ops, { session }
|
139
|
+
);
|
140
|
+
|
141
|
+
}
|
142
|
+
}
|
143
|
+
|
144
|
+
/**
|
145
|
+
* @param {MongoDB} driver
|
146
|
+
*/
|
147
|
+
const list = (driver) => list_regular(driver, col(driver));
|
148
|
+
|
149
|
+
|
150
|
+
/**
|
151
|
+
* @param {MongoDB} driver
|
152
|
+
*/
|
153
|
+
const count = (driver) => count_regular(driver, col(driver));
|
154
|
+
|
155
|
+
|
156
|
+
/**
|
157
|
+
* @param {MongoDB} driver
|
158
|
+
*
|
159
|
+
*
|
160
|
+
* @return {db_col & { _col: ReturnType<col>}}
|
161
|
+
* */
|
162
|
+
export const impl = (driver) => {
|
163
|
+
|
164
|
+
return {
|
165
|
+
_col: col(driver),
|
166
|
+
get: get(driver),
|
167
|
+
upsert: upsert(driver),
|
168
|
+
remove: remove(driver),
|
169
|
+
list: list(driver),
|
170
|
+
count: count(driver),
|
171
|
+
report_document_media: report_document_media(driver)
|
172
|
+
}
|
173
|
+
}
|
@@ -0,0 +1,101 @@
|
|
1
|
+
import { Collection } from 'mongodb'
|
2
|
+
import { MongoDB } from '../index.js'
|
3
|
+
import { count_regular, get_regular, list_regular,
|
4
|
+
remove_regular, upsert_regular } from './con.shared.js'
|
5
|
+
import { to_objid } from './utils.funcs.js';
|
6
|
+
import { add_search_terms_relation_on } from './utils.relations.js';
|
7
|
+
import { union } from '@storecraft/core/v-api/utils.func.js';
|
8
|
+
|
9
|
+
/**
|
10
|
+
* @typedef {import('@storecraft/core/v-database').db_notifications} db_col
|
11
|
+
*/
|
12
|
+
|
13
|
+
/**
|
14
|
+
* @param {MongoDB} d
|
15
|
+
*
|
16
|
+
*
|
17
|
+
* @returns {Collection<db_col["$type_get"]>}
|
18
|
+
*/
|
19
|
+
const col = (d) => d.collection('notifications');
|
20
|
+
|
21
|
+
/**
|
22
|
+
* @param {MongoDB} driver
|
23
|
+
*
|
24
|
+
* @returns {db_col["upsert"]}
|
25
|
+
*/
|
26
|
+
const upsert = (driver) => {
|
27
|
+
return (item, search_terms=[]) => {
|
28
|
+
return upsertBulk(driver)([item], [search_terms]);
|
29
|
+
}
|
30
|
+
}
|
31
|
+
|
32
|
+
|
33
|
+
/**
|
34
|
+
* @param {MongoDB} driver
|
35
|
+
*
|
36
|
+
*
|
37
|
+
* @returns {db_col["upsertBulk"]}
|
38
|
+
*/
|
39
|
+
const upsertBulk = (driver) => {
|
40
|
+
return async (items, search_terms=[]) => {
|
41
|
+
|
42
|
+
items = items.map(item => ({...item}));
|
43
|
+
items.forEach(
|
44
|
+
(item, ix) => {
|
45
|
+
item._id = to_objid(item.id);
|
46
|
+
|
47
|
+
add_search_terms_relation_on(
|
48
|
+
item,
|
49
|
+
union(item.search, search_terms[ix])
|
50
|
+
);
|
51
|
+
}
|
52
|
+
);
|
53
|
+
|
54
|
+
// SEARCH
|
55
|
+
|
56
|
+
const res = await col(driver).insertMany(
|
57
|
+
items
|
58
|
+
);
|
59
|
+
|
60
|
+
return true;
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
/**
|
65
|
+
* @param {MongoDB} driver
|
66
|
+
*/
|
67
|
+
const get = (driver) => get_regular(driver, col(driver));
|
68
|
+
|
69
|
+
/**
|
70
|
+
* @param {MongoDB} driver
|
71
|
+
*/
|
72
|
+
const remove = (driver) => remove_regular(driver, col(driver));
|
73
|
+
|
74
|
+
/**
|
75
|
+
* @param {MongoDB} driver
|
76
|
+
*/
|
77
|
+
const list = (driver) => list_regular(driver, col(driver));
|
78
|
+
|
79
|
+
/**
|
80
|
+
* @param {MongoDB} driver
|
81
|
+
*/
|
82
|
+
const count = (driver) => count_regular(driver, col(driver));
|
83
|
+
|
84
|
+
/**
|
85
|
+
* @param {MongoDB} driver
|
86
|
+
*
|
87
|
+
*
|
88
|
+
* @return {db_col & { _col: ReturnType<col>}}
|
89
|
+
*/
|
90
|
+
export const impl = (driver) => {
|
91
|
+
|
92
|
+
return {
|
93
|
+
_col: col(driver),
|
94
|
+
get: get(driver),
|
95
|
+
upsert: upsert(driver),
|
96
|
+
upsertBulk: upsertBulk(driver),
|
97
|
+
remove: remove(driver),
|
98
|
+
list: list(driver),
|
99
|
+
count: count(driver)
|
100
|
+
}
|
101
|
+
}
|
@@ -0,0 +1,61 @@
|
|
1
|
+
import { Collection } from 'mongodb'
|
2
|
+
import { MongoDB } from '../index.js'
|
3
|
+
import { count_regular, get_regular, list_regular,
|
4
|
+
remove_regular, upsert_regular } from './con.shared.js'
|
5
|
+
|
6
|
+
/**
|
7
|
+
* @typedef {import('@storecraft/core/v-database').db_orders} db_col
|
8
|
+
*/
|
9
|
+
|
10
|
+
/**
|
11
|
+
* @param {MongoDB} d
|
12
|
+
*
|
13
|
+
*
|
14
|
+
* @returns {Collection<db_col["$type_get"]>}
|
15
|
+
*/
|
16
|
+
const col = (d) => d.collection('orders');
|
17
|
+
|
18
|
+
/**
|
19
|
+
* @param {MongoDB} driver
|
20
|
+
*/
|
21
|
+
const upsert = (driver) => upsert_regular(driver, col(driver));
|
22
|
+
|
23
|
+
/**
|
24
|
+
* @param {MongoDB} driver
|
25
|
+
*/
|
26
|
+
const get = (driver) => get_regular(driver, col(driver));
|
27
|
+
|
28
|
+
|
29
|
+
/**
|
30
|
+
* @param {MongoDB} driver
|
31
|
+
*/
|
32
|
+
const remove = (driver) => remove_regular(driver, col(driver));
|
33
|
+
|
34
|
+
/**
|
35
|
+
* @param {MongoDB} driver
|
36
|
+
*/
|
37
|
+
const list = (driver) => list_regular(driver, col(driver));
|
38
|
+
|
39
|
+
/**
|
40
|
+
* @param {MongoDB} driver
|
41
|
+
*/
|
42
|
+
const count = (driver) => count_regular(driver, col(driver));
|
43
|
+
|
44
|
+
|
45
|
+
/**
|
46
|
+
* @param {MongoDB} driver
|
47
|
+
*
|
48
|
+
*
|
49
|
+
* @return {db_col & { _col: ReturnType<col>}}
|
50
|
+
*/
|
51
|
+
export const impl = (driver) => {
|
52
|
+
|
53
|
+
return {
|
54
|
+
_col: col(driver),
|
55
|
+
get: get(driver),
|
56
|
+
upsert: upsert(driver),
|
57
|
+
remove: remove(driver),
|
58
|
+
list: list(driver),
|
59
|
+
count: count(driver),
|
60
|
+
}
|
61
|
+
}
|
package/src/con.posts.js
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
import { Collection } from 'mongodb'
|
2
|
+
import { MongoDB } from '../index.js'
|
3
|
+
import { count_regular, get_regular, list_regular } from './con.shared.js'
|
4
|
+
import { handle_or_id, to_objid } from './utils.funcs.js';
|
5
|
+
import { report_document_media } from './con.images.js';
|
6
|
+
import {
|
7
|
+
add_search_terms_relation_on, delete_me,
|
8
|
+
remove_entry_from_all_connection_of_relation, save_me,
|
9
|
+
update_entry_on_all_connection_of_relation
|
10
|
+
} from './utils.relations.js';
|
11
|
+
|
12
|
+
|
13
|
+
/**
|
14
|
+
* @typedef {import('@storecraft/core/v-database').db_posts} db_col
|
15
|
+
*/
|
16
|
+
|
17
|
+
/**
|
18
|
+
* @param {MongoDB} d
|
19
|
+
*
|
20
|
+
*
|
21
|
+
* @returns {Collection<import('./utils.relations.js').WithRelations<db_col["$type_get"]>>}
|
22
|
+
*/
|
23
|
+
const col = (d) => d.collection('posts');
|
24
|
+
|
25
|
+
/**
|
26
|
+
* @param {MongoDB} driver
|
27
|
+
*
|
28
|
+
*
|
29
|
+
* @returns {db_col["upsert"]}
|
30
|
+
*/
|
31
|
+
const upsert = (driver) => {
|
32
|
+
return async (data, search_terms=[]) => {
|
33
|
+
data = {...data};
|
34
|
+
const objid = to_objid(data.id);
|
35
|
+
const session = driver.mongo_client.startSession();
|
36
|
+
|
37
|
+
try {
|
38
|
+
await session.withTransaction(
|
39
|
+
async () => {
|
40
|
+
|
41
|
+
// SEARCH
|
42
|
+
add_search_terms_relation_on(data, search_terms);
|
43
|
+
|
44
|
+
////
|
45
|
+
// STOREFRONTS --> POSTS RELATION
|
46
|
+
////
|
47
|
+
|
48
|
+
await update_entry_on_all_connection_of_relation(
|
49
|
+
driver, 'storefronts', 'posts', objid, data, session
|
50
|
+
);
|
51
|
+
|
52
|
+
////
|
53
|
+
// REPORT IMAGES USAGE
|
54
|
+
////
|
55
|
+
await report_document_media(driver)(data, session);
|
56
|
+
|
57
|
+
// SAVE ME
|
58
|
+
await save_me(driver, 'posts', objid, data, session);
|
59
|
+
|
60
|
+
}
|
61
|
+
);
|
62
|
+
} catch(e) {
|
63
|
+
console.log(e);
|
64
|
+
return false;
|
65
|
+
} finally {
|
66
|
+
await session.endSession();
|
67
|
+
}
|
68
|
+
|
69
|
+
return true;
|
70
|
+
}
|
71
|
+
|
72
|
+
}
|
73
|
+
/**
|
74
|
+
* @param {MongoDB} driver
|
75
|
+
*/
|
76
|
+
const get = (driver) => get_regular(driver, col(driver));
|
77
|
+
|
78
|
+
/**
|
79
|
+
* @param {MongoDB} driver
|
80
|
+
*
|
81
|
+
*
|
82
|
+
* @returns {db_col["remove"]}
|
83
|
+
*/
|
84
|
+
const remove = (driver) => {
|
85
|
+
return async (id_or_handle) => {
|
86
|
+
const item = await col(driver).findOne(handle_or_id(id_or_handle));
|
87
|
+
|
88
|
+
if(!item) return;
|
89
|
+
|
90
|
+
const objid = to_objid(item.id)
|
91
|
+
const session = driver.mongo_client.startSession();
|
92
|
+
|
93
|
+
try {
|
94
|
+
await session.withTransaction(
|
95
|
+
async () => {
|
96
|
+
////
|
97
|
+
// STOREFRONTS --> POSTS RELATION
|
98
|
+
////
|
99
|
+
await remove_entry_from_all_connection_of_relation(
|
100
|
+
driver, 'storefronts', 'posts', objid, session
|
101
|
+
);
|
102
|
+
|
103
|
+
// DELETE ME
|
104
|
+
await delete_me(
|
105
|
+
driver, 'posts', objid, session
|
106
|
+
);
|
107
|
+
|
108
|
+
}
|
109
|
+
);
|
110
|
+
} catch(e) {
|
111
|
+
console.log(e);
|
112
|
+
return false;
|
113
|
+
} finally {
|
114
|
+
await session.endSession();
|
115
|
+
}
|
116
|
+
|
117
|
+
return true;
|
118
|
+
}
|
119
|
+
|
120
|
+
}
|
121
|
+
|
122
|
+
|
123
|
+
/**
|
124
|
+
* @param {MongoDB} driver
|
125
|
+
*/
|
126
|
+
const list = (driver) => list_regular(driver, col(driver));
|
127
|
+
|
128
|
+
/**
|
129
|
+
* @param {MongoDB} driver
|
130
|
+
*/
|
131
|
+
const count = (driver) => count_regular(driver, col(driver));
|
132
|
+
|
133
|
+
/**
|
134
|
+
* @param {MongoDB} driver
|
135
|
+
*
|
136
|
+
*
|
137
|
+
* @return {db_col & { _col: ReturnType<col>}}
|
138
|
+
*/
|
139
|
+
export const impl = (driver) => {
|
140
|
+
|
141
|
+
return {
|
142
|
+
_col: col(driver),
|
143
|
+
get: get(driver),
|
144
|
+
upsert: upsert(driver),
|
145
|
+
remove: remove(driver),
|
146
|
+
list: list(driver),
|
147
|
+
count: count(driver),
|
148
|
+
}
|
149
|
+
}
|