@saltcorn/data 1.4.1-beta.2 → 1.4.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/dist/base-plugin/actions.d.ts.map +1 -1
- package/dist/base-plugin/actions.js +3 -2
- package/dist/base-plugin/actions.js.map +1 -1
- package/dist/db/state.d.ts.map +1 -1
- package/dist/db/state.js +6 -4
- package/dist/db/state.js.map +1 -1
- package/dist/migrations/202511081024.d.ts +2 -0
- package/dist/migrations/202511081024.d.ts.map +1 -0
- package/dist/migrations/202511081024.js +4 -0
- package/dist/migrations/202511081024.js.map +1 -0
- package/dist/mobile-mocks/models/internal/mail_queue.d.ts +1 -0
- package/dist/mobile-mocks/models/internal/mail_queue.d.ts.map +1 -0
- package/dist/mobile-mocks/models/internal/mail_queue.js +2 -0
- package/dist/mobile-mocks/models/internal/mail_queue.js.map +1 -0
- package/dist/models/internal/mail_queue.d.ts +24 -0
- package/dist/models/internal/mail_queue.d.ts.map +1 -0
- package/dist/models/internal/mail_queue.js +172 -0
- package/dist/models/internal/mail_queue.js.map +1 -0
- package/dist/models/view.d.ts.map +1 -1
- package/dist/models/view.js +2 -0
- package/dist/models/view.js.map +1 -1
- package/dist/tests/mail_queue.test.d.ts +2 -0
- package/dist/tests/mail_queue.test.d.ts.map +1 -0
- package/dist/tests/mail_queue.test.js +122 -0
- package/dist/tests/mail_queue.test.js.map +1 -0
- package/package.json +8 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mail_queue.test.d.ts","sourceRoot":"","sources":["../../tests/mail_queue.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const notification_1 = __importDefault(require("../models/notification"));
|
|
7
|
+
const user_1 = __importDefault(require("../models/user"));
|
|
8
|
+
const globals_1 = require("@jest/globals");
|
|
9
|
+
const nodemailer_1 = require("nodemailer");
|
|
10
|
+
const mocks_1 = __importDefault(require("./mocks"));
|
|
11
|
+
const { sleep } = mocks_1.default;
|
|
12
|
+
const assertions_1 = require("./assertions");
|
|
13
|
+
const { getState } = require("../db/state");
|
|
14
|
+
const db = require("../db");
|
|
15
|
+
afterAll(db.close);
|
|
16
|
+
beforeAll(async () => {
|
|
17
|
+
await require("../db/reset_schema")();
|
|
18
|
+
await require("../db/fixtures")();
|
|
19
|
+
const admin = await user_1.default.findOne({ email: "admin@foo.com" });
|
|
20
|
+
if (admin) {
|
|
21
|
+
await admin.update({ _attributes: { notify_email: true } });
|
|
22
|
+
}
|
|
23
|
+
await getState().setConfig("mail_throttle_per_user", 2);
|
|
24
|
+
await getState().refresh_config();
|
|
25
|
+
});
|
|
26
|
+
globals_1.jest.mock("nodemailer");
|
|
27
|
+
globals_1.jest.setTimeout(600 * 1000);
|
|
28
|
+
const emptyNotificationsTable = async () => {
|
|
29
|
+
await db.deleteWhere("_sc_notifications", {});
|
|
30
|
+
};
|
|
31
|
+
(0, globals_1.describe)("Mail queue", () => {
|
|
32
|
+
(0, globals_1.it)("should send when there are no previous mails", async () => {
|
|
33
|
+
let sentEmail;
|
|
34
|
+
// @ts-ignore
|
|
35
|
+
nodemailer_1.createTransport.mockReturnValue({
|
|
36
|
+
sendMail: (email) => {
|
|
37
|
+
sentEmail = email;
|
|
38
|
+
return new Promise((resolve) => resolve(true));
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
const notification = await notification_1.default.create({
|
|
42
|
+
title: "test A",
|
|
43
|
+
created: new Date(),
|
|
44
|
+
user_id: 1,
|
|
45
|
+
});
|
|
46
|
+
(0, assertions_1.assertIsSet)(notification.id);
|
|
47
|
+
(0, globals_1.expect)(nodemailer_1.createTransport).toHaveBeenCalledTimes(1);
|
|
48
|
+
const fromDb = await notification_1.default.findOne({ id: notification.id });
|
|
49
|
+
(0, globals_1.expect)(fromDb?.send_status).toBe("sent");
|
|
50
|
+
});
|
|
51
|
+
(0, globals_1.it)("should schedule when the min interval has not passed", async () => {
|
|
52
|
+
await emptyNotificationsTable();
|
|
53
|
+
let sentEmail;
|
|
54
|
+
// @ts-ignore
|
|
55
|
+
nodemailer_1.createTransport.mockClear();
|
|
56
|
+
// @ts-ignore
|
|
57
|
+
nodemailer_1.createTransport.mockReturnValue({
|
|
58
|
+
sendMail: (email) => {
|
|
59
|
+
sentEmail = email;
|
|
60
|
+
return new Promise((resolve) => resolve(true));
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
const minDelay = getState().getConfig("mail_throttle_per_user", 30) * 1000;
|
|
64
|
+
(0, globals_1.expect)(minDelay).toBe(2000);
|
|
65
|
+
const notificationA = await notification_1.default.create({
|
|
66
|
+
title: "title A",
|
|
67
|
+
created: new Date(),
|
|
68
|
+
user_id: 1,
|
|
69
|
+
});
|
|
70
|
+
(0, assertions_1.assertIsSet)(notificationA.id);
|
|
71
|
+
const fromDbA = await notification_1.default.findOne({ id: notificationA.id });
|
|
72
|
+
(0, globals_1.expect)(fromDbA?.send_status).toBe("sent");
|
|
73
|
+
(0, globals_1.expect)(nodemailer_1.createTransport).toHaveBeenCalledTimes(1);
|
|
74
|
+
const notificationB = await notification_1.default.create({
|
|
75
|
+
title: "title B",
|
|
76
|
+
created: new Date(),
|
|
77
|
+
user_id: 1,
|
|
78
|
+
});
|
|
79
|
+
(0, assertions_1.assertIsSet)(notificationB.id);
|
|
80
|
+
let fromDbB = await notification_1.default.findOne({ id: notificationB.id });
|
|
81
|
+
(0, globals_1.expect)(fromDbB?.send_status).toBe("pending");
|
|
82
|
+
await sleep(minDelay + 500);
|
|
83
|
+
fromDbB = await notification_1.default.findOne({ id: notificationB.id });
|
|
84
|
+
(0, globals_1.expect)(fromDbB?.send_status).toBe("sent");
|
|
85
|
+
(0, globals_1.expect)(nodemailer_1.createTransport).toHaveBeenCalledTimes(2);
|
|
86
|
+
});
|
|
87
|
+
(0, globals_1.it)("should send when the min interval has passed", async () => {
|
|
88
|
+
await emptyNotificationsTable();
|
|
89
|
+
let sentEmail;
|
|
90
|
+
// @ts-ignore
|
|
91
|
+
nodemailer_1.createTransport.mockClear();
|
|
92
|
+
// @ts-ignore
|
|
93
|
+
nodemailer_1.createTransport.mockReturnValue({
|
|
94
|
+
sendMail: (email) => {
|
|
95
|
+
sentEmail = email;
|
|
96
|
+
return new Promise((resolve) => resolve(true));
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
const minDelay = getState().getConfig("mail_throttle_per_user", 30) * 1000;
|
|
100
|
+
(0, globals_1.expect)(minDelay).toBe(2000);
|
|
101
|
+
const notificationA = await notification_1.default.create({
|
|
102
|
+
title: "title A",
|
|
103
|
+
created: new Date(Date.now() - minDelay - 1000),
|
|
104
|
+
user_id: 1,
|
|
105
|
+
});
|
|
106
|
+
(0, assertions_1.assertIsSet)(notificationA.id);
|
|
107
|
+
const fromDbA = await notification_1.default.findOne({ id: notificationA.id });
|
|
108
|
+
(0, globals_1.expect)(fromDbA?.send_status).toBe("sent");
|
|
109
|
+
(0, globals_1.expect)(nodemailer_1.createTransport).toHaveBeenCalledTimes(1);
|
|
110
|
+
await sleep(minDelay + 1);
|
|
111
|
+
const notificationB = await notification_1.default.create({
|
|
112
|
+
title: "title B",
|
|
113
|
+
created: new Date(),
|
|
114
|
+
user_id: 1,
|
|
115
|
+
});
|
|
116
|
+
(0, assertions_1.assertIsSet)(notificationB.id);
|
|
117
|
+
let fromDbB = await notification_1.default.findOne({ id: notificationB.id });
|
|
118
|
+
(0, globals_1.expect)(fromDbB?.send_status).toBe("sent");
|
|
119
|
+
(0, globals_1.expect)(nodemailer_1.createTransport).toHaveBeenCalledTimes(2);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
//# sourceMappingURL=mail_queue.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mail_queue.test.js","sourceRoot":"","sources":["../../tests/mail_queue.test.ts"],"names":[],"mappings":";;;;;AACA,0EAAkD;AAClD,0DAAkC;AAElC,2CAA2D;AAC3D,2CAA6C;AAC7C,oDAA4B;AAC5B,MAAM,EAAE,KAAK,EAAE,GAAG,eAAK,CAAC;AACxB,6CAA2C;AAC3C,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAC5C,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAE5B,QAAQ,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;AACnB,SAAS,CAAC,KAAK,IAAI,EAAE;IACnB,MAAM,OAAO,CAAC,oBAAoB,CAAC,EAAE,CAAC;IACtC,MAAM,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,MAAM,cAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;IAC7D,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,QAAQ,EAAE,CAAC,SAAS,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;IACxD,MAAM,QAAQ,EAAE,CAAC,cAAc,EAAE,CAAC;AACpC,CAAC,CAAC,CAAC;AAEH,cAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAExB,cAAI,CAAC,UAAU,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;AAE5B,MAAM,uBAAuB,GAAG,KAAK,IAAI,EAAE;IACzC,MAAM,EAAE,CAAC,WAAW,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;AAChD,CAAC,CAAC;AAEF,IAAA,kBAAQ,EAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,IAAA,YAAE,EAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,IAAI,SAAc,CAAC;QACnB,aAAa;QACb,4BAAe,CAAC,eAAe,CAAC;YAC9B,QAAQ,EAAE,CAAC,KAAU,EAAE,EAAE;gBACvB,SAAS,GAAG,KAAK,CAAC;gBAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACjD,CAAC;SACF,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,sBAAY,CAAC,MAAM,CAAC;YAC7C,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,IAAI,IAAI,EAAE;YACnB,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QACH,IAAA,wBAAW,EAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAA,gBAAM,EAAC,4BAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,MAAM,sBAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC;QACnE,IAAA,gBAAM,EAAC,MAAM,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,IAAA,YAAE,EAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,uBAAuB,EAAE,CAAC;QAChC,IAAI,SAAc,CAAC;QACnB,aAAa;QACb,4BAAe,CAAC,SAAS,EAAE,CAAC;QAC5B,aAAa;QACb,4BAAe,CAAC,eAAe,CAAC;YAC9B,QAAQ,EAAE,CAAC,KAAU,EAAE,EAAE;gBACvB,SAAS,GAAG,KAAK,CAAC;gBAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACjD,CAAC;SACF,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAC,SAAS,CAAC,wBAAwB,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;QAC3E,IAAA,gBAAM,EAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE5B,MAAM,aAAa,GAAG,MAAM,sBAAY,CAAC,MAAM,CAAC;YAC9C,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,IAAI,IAAI,EAAE;YACnB,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QACH,IAAA,wBAAW,EAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,sBAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,IAAA,gBAAM,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAA,gBAAM,EAAC,4BAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEjD,MAAM,aAAa,GAAG,MAAM,sBAAY,CAAC,MAAM,CAAC;YAC9C,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,IAAI,IAAI,EAAE;YACnB,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QACH,IAAA,wBAAW,EAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,OAAO,GAAG,MAAM,sBAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;QACnE,IAAA,gBAAM,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAE7C,MAAM,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;QAC5B,OAAO,GAAG,MAAM,sBAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/D,IAAA,gBAAM,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAA,gBAAM,EAAC,4BAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,IAAA,YAAE,EAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,uBAAuB,EAAE,CAAC;QAChC,IAAI,SAAc,CAAC;QACnB,aAAa;QACb,4BAAe,CAAC,SAAS,EAAE,CAAC;QAC5B,aAAa;QACb,4BAAe,CAAC,eAAe,CAAC;YAC9B,QAAQ,EAAE,CAAC,KAAU,EAAE,EAAE;gBACvB,SAAS,GAAG,KAAK,CAAC;gBAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YACjD,CAAC;SACF,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAC,SAAS,CAAC,wBAAwB,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;QAC3E,IAAA,gBAAM,EAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE5B,MAAM,aAAa,GAAG,MAAM,sBAAY,CAAC,MAAM,CAAC;YAC9C,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC;YAC/C,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QACH,IAAA,wBAAW,EAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,sBAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;QACrE,IAAA,gBAAM,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAA,gBAAM,EAAC,4BAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAEjD,MAAM,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QAE1B,MAAM,aAAa,GAAG,MAAM,sBAAY,CAAC,MAAM,CAAC;YAC9C,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,IAAI,IAAI,EAAE;YACnB,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;QACH,IAAA,wBAAW,EAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC9B,IAAI,OAAO,GAAG,MAAM,sBAAY,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;QACnE,IAAA,gBAAM,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAA,gBAAM,EAAC,4BAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@saltcorn/data",
|
|
3
|
-
"version": "1.4.1
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"description": "Data models for Saltcorn, open-source no-code platform",
|
|
5
5
|
"homepage": "https://saltcorn.com",
|
|
6
6
|
"scripts": {
|
|
@@ -37,15 +37,15 @@
|
|
|
37
37
|
"!dist/tsconfig.ref.tsbuildinfo"
|
|
38
38
|
],
|
|
39
39
|
"optionalDependencies": {
|
|
40
|
-
"@saltcorn/postgres": "1.4.1
|
|
41
|
-
"@saltcorn/sqlite": "1.4.1
|
|
40
|
+
"@saltcorn/postgres": "1.4.1",
|
|
41
|
+
"@saltcorn/sqlite": "1.4.1"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@saltcorn/types": "1.4.1
|
|
45
|
-
"@saltcorn/markup": "1.4.1
|
|
46
|
-
"@saltcorn/common-code": "1.4.1
|
|
47
|
-
"@saltcorn/db-common": "1.4.1
|
|
48
|
-
"@saltcorn/sqlite-mobile": "1.4.1
|
|
44
|
+
"@saltcorn/types": "1.4.1",
|
|
45
|
+
"@saltcorn/markup": "1.4.1",
|
|
46
|
+
"@saltcorn/common-code": "1.4.1",
|
|
47
|
+
"@saltcorn/db-common": "1.4.1",
|
|
48
|
+
"@saltcorn/sqlite-mobile": "1.4.1",
|
|
49
49
|
"@saltcorn/plain-date": "0.2.5",
|
|
50
50
|
"acorn": "^8.14.0",
|
|
51
51
|
"assert": "^2.1.0",
|