@budibase/worker 2.1.22-alpha.5 → 2.1.22-alpha.7
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/__mocks__/oauth.ts +57 -0
- package/coverage/clover.xml +1255 -1174
- package/coverage/coverage-final.json +77 -72
- package/coverage/lcov-report/index.html +96 -96
- package/coverage/lcov-report/src/api/controllers/global/auth.ts.html +110 -98
- package/coverage/lcov-report/src/api/controllers/global/configs.js.html +52 -52
- package/coverage/lcov-report/src/api/controllers/global/email.js.html +4 -4
- package/coverage/lcov-report/src/api/controllers/global/index.html +38 -38
- package/coverage/lcov-report/src/api/controllers/global/license.ts.html +7 -7
- package/coverage/lcov-report/src/api/controllers/global/roles.js.html +10 -10
- package/coverage/lcov-report/src/api/controllers/global/self.ts.html +59 -59
- package/coverage/lcov-report/src/api/controllers/global/templates.ts.html +11 -11
- package/coverage/lcov-report/src/api/controllers/global/users.ts.html +75 -69
- package/coverage/lcov-report/src/api/controllers/global/workspaces.js.html +7 -7
- package/coverage/lcov-report/src/api/controllers/system/accounts.ts.html +4 -4
- package/coverage/lcov-report/src/api/controllers/system/{environment.js.html → environment.ts.html} +21 -18
- package/coverage/lcov-report/src/api/controllers/system/index.html +63 -63
- package/coverage/lcov-report/src/api/controllers/system/migrations.ts.html +23 -23
- package/coverage/lcov-report/src/api/controllers/system/restore.ts.html +22 -22
- package/coverage/lcov-report/src/api/controllers/system/{status.js.html → status.ts.html} +29 -26
- package/coverage/lcov-report/src/api/controllers/system/tenants.ts.html +34 -163
- package/coverage/lcov-report/src/api/index.html +11 -11
- package/coverage/lcov-report/src/api/index.ts.html +113 -44
- package/coverage/lcov-report/src/api/routes/global/auth.js.html +38 -89
- package/coverage/lcov-report/src/api/routes/global/configs.js.html +26 -26
- package/coverage/lcov-report/src/api/routes/global/email.js.html +11 -11
- package/coverage/lcov-report/src/api/routes/global/index.html +11 -11
- package/coverage/lcov-report/src/api/routes/global/license.ts.html +6 -6
- package/coverage/lcov-report/src/api/routes/global/roles.js.html +7 -7
- package/coverage/lcov-report/src/api/routes/global/self.ts.html +8 -8
- package/coverage/lcov-report/src/api/routes/global/templates.ts.html +13 -13
- package/coverage/lcov-report/src/api/routes/global/users.js.html +17 -17
- package/coverage/lcov-report/src/api/routes/global/workspaces.js.html +10 -10
- package/coverage/lcov-report/src/api/routes/index.html +1 -1
- package/coverage/lcov-report/src/api/routes/index.ts.html +19 -19
- package/coverage/lcov-report/src/api/routes/system/accounts.ts.html +7 -7
- package/coverage/lcov-report/src/api/routes/system/{environment.js.html → environment.ts.html} +11 -11
- package/coverage/lcov-report/src/api/routes/system/index.html +4 -4
- package/coverage/lcov-report/src/api/routes/system/migrations.ts.html +7 -7
- package/coverage/lcov-report/src/api/routes/system/restore.ts.html +6 -6
- package/coverage/lcov-report/src/api/routes/system/{status.js.html → status.ts.html} +11 -11
- package/coverage/lcov-report/src/api/routes/system/{tenants.js.html → tenants.ts.html} +20 -17
- package/coverage/lcov-report/src/api/routes/validation/index.html +1 -1
- package/coverage/lcov-report/src/api/routes/validation/index.ts.html +2 -2
- package/coverage/lcov-report/src/api/routes/validation/users.ts.html +13 -13
- package/coverage/lcov-report/src/constants/index.html +10 -10
- package/coverage/lcov-report/src/constants/{index.js.html → index.ts.html} +103 -124
- package/coverage/lcov-report/src/constants/templates/index.html +1 -1
- package/coverage/lcov-report/src/constants/templates/index.js.html +12 -12
- package/coverage/lcov-report/src/db/index.html +1 -1
- package/coverage/lcov-report/src/db/index.ts.html +8 -8
- package/coverage/lcov-report/src/environment.ts.html +15 -15
- package/coverage/lcov-report/src/index.html +1 -1
- package/coverage/lcov-report/src/index.ts.html +40 -40
- package/coverage/lcov-report/src/middleware/cloudRestricted.js.html +23 -23
- package/coverage/lcov-report/src/middleware/index.html +21 -21
- package/coverage/lcov-report/src/migrations/functions/globalInfoSyncUsers.ts.html +3 -3
- package/coverage/lcov-report/src/migrations/functions/index.html +1 -1
- package/coverage/lcov-report/src/migrations/index.html +1 -1
- package/coverage/lcov-report/src/migrations/index.ts.html +17 -17
- package/coverage/lcov-report/src/sdk/accounts/accounts.ts.html +6 -6
- package/coverage/lcov-report/src/sdk/accounts/index.html +1 -1
- package/coverage/lcov-report/src/sdk/accounts/index.ts.html +2 -2
- package/coverage/lcov-report/src/sdk/index.html +1 -1
- package/coverage/lcov-report/src/sdk/index.ts.html +4 -4
- package/coverage/lcov-report/src/sdk/users/events.ts.html +43 -43
- package/coverage/lcov-report/src/sdk/users/index.html +19 -19
- package/coverage/lcov-report/src/sdk/users/index.ts.html +2 -2
- package/coverage/lcov-report/src/sdk/users/users.ts.html +99 -99
- package/coverage/lcov-report/src/tests/TestConfiguration.ts.html +275 -128
- package/coverage/lcov-report/src/tests/api/accounts.ts.html +12 -21
- package/coverage/lcov-report/src/tests/api/auth.ts.html +11 -20
- package/coverage/lcov-report/src/tests/api/base.ts.html +133 -0
- package/coverage/lcov-report/src/tests/api/configs.ts.html +44 -23
- package/coverage/lcov-report/src/tests/api/email.ts.html +9 -18
- package/coverage/lcov-report/src/tests/api/environment.ts.html +130 -0
- package/coverage/lcov-report/src/tests/api/index.html +106 -16
- package/coverage/lcov-report/src/tests/api/index.ts.html +62 -17
- package/coverage/lcov-report/src/tests/{structures/accounts.ts.html → api/migrations.ts.html} +31 -37
- package/coverage/lcov-report/src/tests/api/restore.ts.html +127 -0
- package/coverage/lcov-report/src/tests/api/self.ts.html +31 -16
- package/coverage/lcov-report/src/tests/api/status.ts.html +121 -0
- package/coverage/lcov-report/src/tests/api/tenants.ts.html +130 -0
- package/coverage/lcov-report/src/tests/api/users.ts.html +121 -25
- package/coverage/lcov-report/src/tests/controllers.js.html +2 -2
- package/coverage/lcov-report/src/tests/index.html +21 -21
- package/coverage/lcov-report/src/tests/index.ts.html +21 -9
- package/coverage/lcov-report/src/tests/mocks/email.js.html +2 -2
- package/coverage/lcov-report/src/tests/mocks/index.html +1 -1
- package/coverage/lcov-report/src/tests/mocks/index.ts.html +4 -4
- package/coverage/lcov-report/src/tests/structures/configs.js.html +14 -14
- package/coverage/lcov-report/src/tests/structures/groups.ts.html +2 -2
- package/coverage/lcov-report/src/tests/structures/index.html +9 -24
- package/coverage/lcov-report/src/tests/structures/index.ts.html +21 -15
- package/coverage/lcov-report/src/tests/structures/users.ts.html +13 -10
- package/coverage/lcov-report/src/utilities/appService.js.html +14 -14
- package/coverage/lcov-report/src/utilities/{email.js.html → email.ts.html} +172 -73
- package/coverage/lcov-report/src/utilities/fileSystem.js.html +4 -4
- package/coverage/lcov-report/src/utilities/index.html +23 -23
- package/coverage/lcov-report/src/utilities/index.js.html +2 -2
- package/coverage/lcov-report/src/utilities/{redis.js.html → redis.ts.html} +63 -48
- package/coverage/lcov-report/src/utilities/{templates.js.html → templates.ts.html} +41 -41
- package/coverage/lcov-report/src/utilities/users.js.html +8 -8
- package/coverage/lcov.info +2058 -1820
- package/jest.config.ts +1 -0
- package/package.json +8 -6
- package/scripts/localdomain.js +33 -7
- package/src/api/controllers/global/auth.ts +35 -31
- package/src/api/controllers/global/configs.js +17 -17
- package/src/api/controllers/global/self.ts +2 -2
- package/src/api/controllers/global/users.ts +3 -1
- package/src/api/controllers/system/{environment.js → environment.ts} +3 -2
- package/src/api/controllers/system/{status.js → status.ts} +4 -3
- package/src/api/controllers/system/tenants.ts +8 -51
- package/src/api/index.ts +29 -6
- package/src/api/routes/global/auth.js +22 -39
- package/src/api/routes/global/configs.js +9 -9
- package/src/api/routes/global/templates.ts +2 -2
- package/src/api/routes/global/tests/auth.spec.ts +134 -64
- package/src/api/routes/global/tests/configs.spec.ts +34 -35
- package/src/api/routes/global/tests/email.spec.ts +4 -3
- package/src/api/routes/global/tests/license.spec.ts +31 -0
- package/src/api/routes/global/tests/realEmail.spec.ts +2 -3
- package/src/api/routes/global/tests/roles.spec.ts +27 -0
- package/src/api/routes/global/tests/self.spec.ts +3 -4
- package/src/api/routes/global/tests/templates.spec.ts +35 -0
- package/src/api/routes/global/tests/users.spec.ts +51 -43
- package/src/api/routes/global/tests/workspaces.spec.ts +29 -0
- package/src/api/routes/system/environment.ts +8 -0
- package/src/api/routes/system/status.ts +8 -0
- package/src/api/routes/system/tenants.ts +13 -0
- package/src/api/routes/system/tests/accounts.spec.ts +5 -6
- package/src/api/routes/system/tests/environment.spec.ts +29 -0
- package/src/api/routes/system/tests/migrations.spec.ts +63 -0
- package/src/api/routes/system/tests/restore.spec.ts +36 -0
- package/src/api/routes/system/tests/status.spec.ts +48 -0
- package/src/api/routes/system/tests/tenants.spec.ts +61 -0
- package/src/constants/{index.js → index.ts} +57 -64
- package/src/constants/templates/index.js +2 -2
- package/src/middleware/cloudRestricted.js +2 -2
- package/src/middleware/tests/tenancy.spec.ts +73 -0
- package/src/tests/TestConfiguration.ts +97 -48
- package/src/tests/api/accounts.ts +5 -8
- package/src/tests/api/auth.ts +3 -6
- package/src/tests/api/base.ts +16 -0
- package/src/tests/api/configs.ts +15 -8
- package/src/tests/api/email.ts +3 -6
- package/src/tests/api/environment.ts +15 -0
- package/src/tests/api/index.ts +15 -0
- package/src/tests/api/migrations.ts +22 -0
- package/src/tests/api/restore.ts +14 -0
- package/src/tests/api/self.ts +11 -6
- package/src/tests/api/status.ts +12 -0
- package/src/tests/api/tenants.ts +15 -0
- package/src/tests/api/users.ts +38 -6
- package/src/tests/index.ts +4 -0
- package/src/tests/jestSetup.ts +7 -1
- package/src/tests/structures/configs.js +6 -6
- package/src/tests/structures/index.ts +4 -2
- package/src/tests/structures/users.ts +1 -0
- package/src/utilities/appService.js +3 -3
- package/src/utilities/{email.js → email.ts} +78 -45
- package/src/utilities/{redis.js → redis.ts} +29 -24
- package/src/utilities/templates.ts +49 -0
- package/tsconfig.build.json +3 -3
- package/__mocks__/node-fetch.ts +0 -1
- package/src/api/routes/system/environment.js +0 -8
- package/src/api/routes/system/status.js +0 -8
- package/src/api/routes/system/tenants.js +0 -12
- package/src/tests/structures/accounts.ts +0 -24
- package/src/utilities/templates.js +0 -49
|
@@ -96,15 +96,15 @@
|
|
|
96
96
|
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
97
|
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
98
|
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
-
<a name='L34'></a><a href='#L34'>34</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">
|
|
100
|
-
<span class="cline-any cline-yes">
|
|
101
|
-
<span class="cline-any cline-yes">
|
|
102
|
-
<span class="cline-any cline-yes">
|
|
103
|
-
<span class="cline-any cline-yes">
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">17x</span>
|
|
100
|
+
<span class="cline-any cline-yes">17x</span>
|
|
101
|
+
<span class="cline-any cline-yes">17x</span>
|
|
102
|
+
<span class="cline-any cline-yes">17x</span>
|
|
103
|
+
<span class="cline-any cline-yes">17x</span>
|
|
104
104
|
<span class="cline-any cline-neutral"> </span>
|
|
105
105
|
<span class="cline-any cline-neutral"> </span>
|
|
106
|
-
<span class="cline-any cline-yes">
|
|
107
|
-
<span class="cline-any cline-yes">
|
|
106
|
+
<span class="cline-any cline-yes">93x</span>
|
|
107
|
+
<span class="cline-any cline-yes">93x</span>
|
|
108
108
|
<span class="cline-any cline-neutral"> </span>
|
|
109
109
|
<span class="cline-any cline-no"> </span>
|
|
110
110
|
<span class="cline-any cline-no"> </span>
|
|
@@ -119,18 +119,18 @@
|
|
|
119
119
|
<span class="cline-any cline-no"> </span>
|
|
120
120
|
<span class="cline-any cline-neutral"> </span>
|
|
121
121
|
<span class="cline-any cline-neutral"> </span>
|
|
122
|
-
<span class="cline-any cline-yes">
|
|
123
|
-
<span class="cline-any cline-yes">
|
|
122
|
+
<span class="cline-any cline-yes">17x</span>
|
|
123
|
+
<span class="cline-any cline-yes">93x</span>
|
|
124
124
|
<span class="cline-any cline-neutral"> </span>
|
|
125
125
|
<span class="cline-any cline-neutral"> </span>
|
|
126
126
|
<span class="cline-any cline-neutral"> </span>
|
|
127
127
|
<span class="cline-any cline-neutral"> </span>
|
|
128
|
-
<span class="cline-any cline-yes">
|
|
128
|
+
<span class="cline-any cline-yes">93x</span>
|
|
129
129
|
<span class="cline-any cline-no"> </span>
|
|
130
130
|
<span class="cline-any cline-neutral"> </span>
|
|
131
131
|
<span class="cline-any cline-neutral"> </span>
|
|
132
132
|
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">const fetch = require("node-fetch")
|
|
133
|
-
const {
|
|
133
|
+
const { Header } = require("@budibase/backend-core/constants")
|
|
134
134
|
const { getTenantId, isTenantIdSet } = require("@budibase/backend-core/tenancy")
|
|
135
135
|
const { checkSlashesInUrl } = require("../utilities")
|
|
136
136
|
const env = require("../environment")
|
|
@@ -140,9 +140,9 @@ async function makeAppRequest(url, method, body) {
|
|
|
140
140
|
return
|
|
141
141
|
}
|
|
142
142
|
const request = <span class="cstat-no" title="statement not covered" >{ headers: {} }</span>
|
|
143
|
-
<span class="cstat-no" title="statement not covered" > request.headers[
|
|
143
|
+
<span class="cstat-no" title="statement not covered" > request.headers[Header.API_KEY] = env.INTERNAL_API_KEY</span>
|
|
144
144
|
<span class="cstat-no" title="statement not covered" > if (isTenantIdSet()) {</span>
|
|
145
|
-
<span class="cstat-no" title="statement not covered" > request.headers[
|
|
145
|
+
<span class="cstat-no" title="statement not covered" > request.headers[Header.TENANT_ID] = getTenantId()</span>
|
|
146
146
|
}
|
|
147
147
|
<span class="cstat-no" title="statement not covered" > if (body) {</span>
|
|
148
148
|
<span class="cstat-no" title="statement not covered" > request.headers["Content-Type"] = "application/json"</span>
|
|
@@ -169,7 +169,7 @@ exports.syncUserInApps = async userId => {
|
|
|
169
169
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
170
170
|
Code coverage generated by
|
|
171
171
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
172
|
-
at
|
|
172
|
+
at Thu Nov 17 2022 16:59:05 GMT+0000 (Coordinated Universal Time)
|
|
173
173
|
</div>
|
|
174
174
|
<script src="../../prettify.js"></script>
|
|
175
175
|
<script>
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<html lang="en">
|
|
4
4
|
|
|
5
5
|
<head>
|
|
6
|
-
<title>Code coverage report for src/utilities/email.
|
|
6
|
+
<title>Code coverage report for src/utilities/email.ts</title>
|
|
7
7
|
<meta charset="utf-8" />
|
|
8
8
|
<link rel="stylesheet" href="../../prettify.css" />
|
|
9
9
|
<link rel="stylesheet" href="../../base.css" />
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
<body>
|
|
20
20
|
<div class='wrapper'>
|
|
21
21
|
<div class='pad1'>
|
|
22
|
-
<h1><a href="../../index.html">All files</a> / <a href="index.html">src/utilities</a> email.
|
|
22
|
+
<h1><a href="../../index.html">All files</a> / <a href="index.html">src/utilities</a> email.ts</h1>
|
|
23
23
|
<div class='clearfix'>
|
|
24
24
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
@@ -30,9 +30,9 @@
|
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">67.05% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>57/85</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
@@ -285,20 +285,71 @@
|
|
|
285
285
|
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
286
|
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
287
|
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
-
<a name='L223'></a><a href='#L223'>223</a
|
|
289
|
-
<
|
|
290
|
-
<
|
|
291
|
-
<
|
|
292
|
-
<
|
|
293
|
-
<
|
|
294
|
-
<
|
|
295
|
-
<
|
|
296
|
-
<
|
|
288
|
+
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
+
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
+
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
+
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
+
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
+
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
+
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
+
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
+
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
+
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
+
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
+
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
+
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
+
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
+
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
+
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
+
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
+
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
+
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
+
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
+
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
+
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
+
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
+
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
+
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
+
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
+
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
+
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
+
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
+
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
+
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
+
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
+
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
+
<a name='L256'></a><a href='#L256'>256</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">17x</span>
|
|
322
|
+
<span class="cline-any cline-yes">17x</span>
|
|
323
|
+
<span class="cline-any cline-yes">17x</span>
|
|
324
|
+
<span class="cline-any cline-yes">17x</span>
|
|
325
|
+
<span class="cline-any cline-yes">17x</span>
|
|
326
|
+
<span class="cline-any cline-yes">17x</span>
|
|
327
|
+
<span class="cline-any cline-neutral"> </span>
|
|
328
|
+
<span class="cline-any cline-yes">17x</span>
|
|
329
|
+
<span class="cline-any cline-yes">17x</span>
|
|
330
|
+
<span class="cline-any cline-neutral"> </span>
|
|
331
|
+
<span class="cline-any cline-neutral"> </span>
|
|
332
|
+
<span class="cline-any cline-neutral"> </span>
|
|
333
|
+
<span class="cline-any cline-neutral"> </span>
|
|
297
334
|
<span class="cline-any cline-neutral"> </span>
|
|
298
|
-
<span class="cline-any cline-yes">7x</span>
|
|
299
|
-
<span class="cline-any cline-yes">7x</span>
|
|
300
335
|
<span class="cline-any cline-neutral"> </span>
|
|
301
|
-
<span class="cline-any cline-
|
|
336
|
+
<span class="cline-any cline-neutral"> </span>
|
|
337
|
+
<span class="cline-any cline-neutral"> </span>
|
|
338
|
+
<span class="cline-any cline-neutral"> </span>
|
|
339
|
+
<span class="cline-any cline-neutral"> </span>
|
|
340
|
+
<span class="cline-any cline-neutral"> </span>
|
|
341
|
+
<span class="cline-any cline-neutral"> </span>
|
|
342
|
+
<span class="cline-any cline-neutral"> </span>
|
|
343
|
+
<span class="cline-any cline-neutral"> </span>
|
|
344
|
+
<span class="cline-any cline-neutral"> </span>
|
|
345
|
+
<span class="cline-any cline-neutral"> </span>
|
|
346
|
+
<span class="cline-any cline-neutral"> </span>
|
|
347
|
+
<span class="cline-any cline-neutral"> </span>
|
|
348
|
+
<span class="cline-any cline-neutral"> </span>
|
|
349
|
+
<span class="cline-any cline-yes">17x</span>
|
|
350
|
+
<span class="cline-any cline-yes">17x</span>
|
|
351
|
+
<span class="cline-any cline-neutral"> </span>
|
|
352
|
+
<span class="cline-any cline-yes">17x</span>
|
|
302
353
|
<span class="cline-any cline-neutral"> </span>
|
|
303
354
|
<span class="cline-any cline-neutral"> </span>
|
|
304
355
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -340,6 +391,11 @@
|
|
|
340
391
|
<span class="cline-any cline-neutral"> </span>
|
|
341
392
|
<span class="cline-any cline-neutral"> </span>
|
|
342
393
|
<span class="cline-any cline-neutral"> </span>
|
|
394
|
+
<span class="cline-any cline-neutral"> </span>
|
|
395
|
+
<span class="cline-any cline-neutral"> </span>
|
|
396
|
+
<span class="cline-any cline-neutral"> </span>
|
|
397
|
+
<span class="cline-any cline-neutral"> </span>
|
|
398
|
+
<span class="cline-any cline-neutral"> </span>
|
|
343
399
|
<span class="cline-any cline-yes">7x</span>
|
|
344
400
|
<span class="cline-any cline-neutral"> </span>
|
|
345
401
|
<span class="cline-any cline-yes">2x</span>
|
|
@@ -361,6 +417,11 @@
|
|
|
361
417
|
<span class="cline-any cline-neutral"> </span>
|
|
362
418
|
<span class="cline-any cline-neutral"> </span>
|
|
363
419
|
<span class="cline-any cline-neutral"> </span>
|
|
420
|
+
<span class="cline-any cline-neutral"> </span>
|
|
421
|
+
<span class="cline-any cline-neutral"> </span>
|
|
422
|
+
<span class="cline-any cline-neutral"> </span>
|
|
423
|
+
<span class="cline-any cline-neutral"> </span>
|
|
424
|
+
<span class="cline-any cline-neutral"> </span>
|
|
364
425
|
<span class="cline-any cline-yes">7x</span>
|
|
365
426
|
<span class="cline-any cline-no"> </span>
|
|
366
427
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -401,6 +462,10 @@
|
|
|
401
462
|
<span class="cline-any cline-neutral"> </span>
|
|
402
463
|
<span class="cline-any cline-neutral"> </span>
|
|
403
464
|
<span class="cline-any cline-neutral"> </span>
|
|
465
|
+
<span class="cline-any cline-neutral"> </span>
|
|
466
|
+
<span class="cline-any cline-neutral"> </span>
|
|
467
|
+
<span class="cline-any cline-neutral"> </span>
|
|
468
|
+
<span class="cline-any cline-neutral"> </span>
|
|
404
469
|
<span class="cline-any cline-yes">9x</span>
|
|
405
470
|
<span class="cline-any cline-neutral"> </span>
|
|
406
471
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -433,7 +498,7 @@
|
|
|
433
498
|
<span class="cline-any cline-neutral"> </span>
|
|
434
499
|
<span class="cline-any cline-neutral"> </span>
|
|
435
500
|
<span class="cline-any cline-neutral"> </span>
|
|
436
|
-
<span class="cline-any cline-yes">
|
|
501
|
+
<span class="cline-any cline-yes">17x</span>
|
|
437
502
|
<span class="cline-any cline-neutral"> </span>
|
|
438
503
|
<span class="cline-any cline-yes">2x</span>
|
|
439
504
|
<span class="cline-any cline-no"> </span>
|
|
@@ -452,18 +517,13 @@
|
|
|
452
517
|
<span class="cline-any cline-neutral"> </span>
|
|
453
518
|
<span class="cline-any cline-neutral"> </span>
|
|
454
519
|
<span class="cline-any cline-neutral"> </span>
|
|
455
|
-
<span class="cline-any cline-
|
|
456
|
-
<span class="cline-any cline-neutral"> </span>
|
|
520
|
+
<span class="cline-any cline-yes">17x</span>
|
|
457
521
|
<span class="cline-any cline-neutral"> </span>
|
|
458
522
|
<span class="cline-any cline-neutral"> </span>
|
|
459
523
|
<span class="cline-any cline-neutral"> </span>
|
|
460
524
|
<span class="cline-any cline-neutral"> </span>
|
|
461
525
|
<span class="cline-any cline-yes">7x</span>
|
|
462
526
|
<span class="cline-any cline-neutral"> </span>
|
|
463
|
-
<span class="cline-any cline-neutral"> </span>
|
|
464
|
-
<span class="cline-any cline-neutral"> </span>
|
|
465
|
-
<span class="cline-any cline-neutral"> </span>
|
|
466
|
-
<span class="cline-any cline-yes">7x</span>
|
|
467
527
|
<span class="cline-any cline-yes">7x</span>
|
|
468
528
|
<span class="cline-any cline-yes">7x</span>
|
|
469
529
|
<span class="cline-any cline-no"> </span>
|
|
@@ -471,8 +531,11 @@
|
|
|
471
531
|
<span class="cline-any cline-yes">7x</span>
|
|
472
532
|
<span class="cline-any cline-neutral"> </span>
|
|
473
533
|
<span class="cline-any cline-yes">7x</span>
|
|
534
|
+
<span class="cline-any cline-neutral"> </span>
|
|
535
|
+
<span class="cline-any cline-yes">7x</span>
|
|
474
536
|
<span class="cline-any cline-yes">7x</span>
|
|
475
537
|
<span class="cline-any cline-neutral"> </span>
|
|
538
|
+
<span class="cline-any cline-neutral"> </span>
|
|
476
539
|
<span class="cline-any cline-yes">7x</span>
|
|
477
540
|
<span class="cline-any cline-neutral"> </span>
|
|
478
541
|
<span class="cline-any cline-neutral"> </span>
|
|
@@ -491,6 +554,9 @@
|
|
|
491
554
|
<span class="cline-any cline-yes">7x</span>
|
|
492
555
|
<span class="cline-any cline-yes">7x</span>
|
|
493
556
|
<span class="cline-any cline-neutral"> </span>
|
|
557
|
+
<span class="cline-any cline-neutral"> </span>
|
|
558
|
+
<span class="cline-any cline-neutral"> </span>
|
|
559
|
+
<span class="cline-any cline-neutral"> </span>
|
|
494
560
|
<span class="cline-any cline-yes">7x</span>
|
|
495
561
|
<span class="cline-any cline-yes">7x</span>
|
|
496
562
|
<span class="cline-any cline-no"> </span>
|
|
@@ -503,22 +569,40 @@
|
|
|
503
569
|
<span class="cline-any cline-neutral"> </span>
|
|
504
570
|
<span class="cline-any cline-neutral"> </span>
|
|
505
571
|
<span class="cline-any cline-neutral"> </span>
|
|
506
|
-
<span class="cline-any cline-yes">
|
|
572
|
+
<span class="cline-any cline-yes">17x</span>
|
|
507
573
|
<span class="cline-any cline-yes">15x</span>
|
|
508
574
|
<span class="cline-any cline-yes">15x</span>
|
|
509
575
|
<span class="cline-any cline-neutral"> </span>
|
|
510
|
-
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
const
|
|
576
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import env from "../environment"
|
|
577
|
+
import { EmailTemplatePurpose, TemplateType, Config } from "../constants"
|
|
578
|
+
import { getTemplateByPurpose } from "../constants/templates"
|
|
579
|
+
import { getSettingsTemplateContext } from "./templates"
|
|
580
|
+
import { processString } from "@budibase/string-templates"
|
|
581
|
+
import { getResetPasswordCode, getInviteCode } from "./redis"
|
|
582
|
+
import { User, Database } from "@budibase/types"
|
|
583
|
+
import { tenancy, db as dbCore } from "@budibase/backend-core"
|
|
584
|
+
const nodemailer = require("nodemailer")
|
|
585
|
+
|
|
586
|
+
type SendEmailOpts = {
|
|
587
|
+
// workspaceId If finer grain controls being used then this will lookup config for workspace.
|
|
588
|
+
workspaceId?: string
|
|
589
|
+
// user If sending to an existing user the object can be provided, this is used in the context.
|
|
590
|
+
user: User
|
|
591
|
+
// from If sending from an address that is not what is configured in the SMTP config.
|
|
592
|
+
from?: string
|
|
593
|
+
// contents If sending a custom email then can supply contents which will be added to it.
|
|
594
|
+
contents?: string
|
|
595
|
+
// subject A custom subject can be specified if the config one is not desired.
|
|
596
|
+
subject?: string
|
|
597
|
+
// info Pass in a structure of information to be stored alongside the invitation.
|
|
598
|
+
info?: any
|
|
599
|
+
cc?: boolean
|
|
600
|
+
bcc?: boolean
|
|
601
|
+
automation?: boolean
|
|
602
|
+
}
|
|
519
603
|
|
|
520
604
|
const TEST_MODE = false
|
|
521
|
-
const TYPE =
|
|
605
|
+
const TYPE = TemplateType.EMAIL
|
|
522
606
|
|
|
523
607
|
const FULL_EMAIL_PURPOSES = [
|
|
524
608
|
EmailTemplatePurpose.INVITATION,
|
|
@@ -527,8 +611,8 @@ const FULL_EMAIL_PURPOSES = [
|
|
|
527
611
|
EmailTemplatePurpose.CUSTOM,
|
|
528
612
|
]
|
|
529
613
|
|
|
530
|
-
function createSMTPTransport(config) {
|
|
531
|
-
let options
|
|
614
|
+
function createSMTPTransport(config: any) {
|
|
615
|
+
let options: any
|
|
532
616
|
let secure = config.secure
|
|
533
617
|
// default it if not specified
|
|
534
618
|
<span class="missing-if-branch" title="if path not taken" >I</span>if (secure == null) {
|
|
@@ -561,10 +645,15 @@ function createSMTPTransport(config) {
|
|
|
561
645
|
return nodemailer.createTransport(options)
|
|
562
646
|
}
|
|
563
647
|
|
|
564
|
-
async function getLinkCode(
|
|
648
|
+
async function getLinkCode(
|
|
649
|
+
purpose: EmailTemplatePurpose,
|
|
650
|
+
email: string,
|
|
651
|
+
user: User,
|
|
652
|
+
info: any = null
|
|
653
|
+
) {
|
|
565
654
|
switch (purpose) {
|
|
566
655
|
case EmailTemplatePurpose.PASSWORD_RECOVERY:
|
|
567
|
-
return getResetPasswordCode(user._id
|
|
656
|
+
return getResetPasswordCode(user._id!, info)
|
|
568
657
|
case EmailTemplatePurpose.INVITATION:
|
|
569
658
|
return getInviteCode(email, info)
|
|
570
659
|
<span class="branch-2 cbranch-no" title="branch not covered" > default:</span>
|
|
@@ -581,7 +670,12 @@ async function getLinkCode(purpose, email, user, info = null) {
|
|
|
581
670
|
* @param {string|null} contents if using a custom template can supply contents for context.
|
|
582
671
|
* @return {Promise<string>} returns the built email HTML if all provided parameters were valid.
|
|
583
672
|
*/
|
|
584
|
-
async function buildEmail(
|
|
673
|
+
async function buildEmail(
|
|
674
|
+
purpose: EmailTemplatePurpose,
|
|
675
|
+
email: string,
|
|
676
|
+
context: any,
|
|
677
|
+
{ user, contents }: any = <span class="branch-0 cbranch-no" title="branch not covered" >{}</span>
|
|
678
|
+
) {
|
|
585
679
|
// this isn't a full email
|
|
586
680
|
<span class="missing-if-branch" title="if path not taken" >I</span>if (FULL_EMAIL_PURPOSES.indexOf(purpose) === -1) {
|
|
587
681
|
<span class="cstat-no" title="statement not covered" > throw `Unable to build an email of type ${purpose}`</span>
|
|
@@ -622,22 +716,26 @@ async function buildEmail(purpose, email, context, { user, contents } = <span cl
|
|
|
622
716
|
* @param {boolean|null} automation Whether or not the configuration is being fetched for an email automation.
|
|
623
717
|
* @return {Promise<object|null>} returns the SMTP configuration if it exists
|
|
624
718
|
*/
|
|
625
|
-
async function getSmtpConfiguration(
|
|
626
|
-
|
|
627
|
-
|
|
719
|
+
async function getSmtpConfiguration(
|
|
720
|
+
db: Database,
|
|
721
|
+
workspaceId?: string,
|
|
722
|
+
automation?: boolean
|
|
723
|
+
) {
|
|
724
|
+
const params: any = {
|
|
725
|
+
type: Config.SMTP,
|
|
628
726
|
}
|
|
629
727
|
<span class="missing-if-branch" title="if path not taken" >I</span>if (workspaceId) {
|
|
630
728
|
<span class="cstat-no" title="statement not covered" > params.workspace = workspaceId</span>
|
|
631
729
|
}
|
|
632
730
|
|
|
633
|
-
const customConfig = await getScopedConfig(db, params)
|
|
731
|
+
const customConfig = await dbCore.getScopedConfig(db, params)
|
|
634
732
|
|
|
635
|
-
|
|
733
|
+
if (customConfig) {
|
|
636
734
|
return customConfig
|
|
637
735
|
}
|
|
638
736
|
|
|
639
737
|
// Use an SMTP fallback configuration from env variables
|
|
640
|
-
<span class="cstat-no" title="statement not covered" > if (!automation && env.SMTP_FALLBACK_ENABLED) {</span>
|
|
738
|
+
<span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!automation && env.SMTP_FALLBACK_ENABLED) {</span>
|
|
641
739
|
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
642
740
|
port: env.SMTP_PORT,
|
|
643
741
|
host: env.SMTP_HOST,
|
|
@@ -655,12 +753,12 @@ async function getSmtpConfiguration(db, workspaceId = null, automation) {
|
|
|
655
753
|
* Checks if a SMTP config exists based on passed in parameters.
|
|
656
754
|
* @return {Promise<boolean>} returns true if there is a configuration that can be used.
|
|
657
755
|
*/
|
|
658
|
-
|
|
756
|
+
export async function isEmailConfigured(workspaceId?: string) {
|
|
659
757
|
// when "testing" or smtp fallback is enabled simply return true
|
|
660
758
|
<span class="missing-if-branch" title="if path not taken" >I</span>if (TEST_MODE || env.SMTP_FALLBACK_ENABLED) {
|
|
661
759
|
<span class="cstat-no" title="statement not covered" > return true</span>
|
|
662
760
|
}
|
|
663
|
-
const db = getGlobalDB()
|
|
761
|
+
const db = tenancy.getGlobalDB()
|
|
664
762
|
const config = await getSmtpConfiguration(db, workspaceId)
|
|
665
763
|
return config != null
|
|
666
764
|
}
|
|
@@ -670,48 +768,49 @@ exports.isEmailConfigured = async (workspaceId = null) => {
|
|
|
670
768
|
* send an email using it.
|
|
671
769
|
* @param {string} email The email address to send to.
|
|
672
770
|
* @param {string} purpose The purpose of the email being sent (e.g. reset password).
|
|
673
|
-
* @param {
|
|
674
|
-
* @param {object|undefined} user If sending to an existing user the object can be provided, this is used in the context.
|
|
675
|
-
* @param {string|undefined} from If sending from an address that is not what is configured in the SMTP config.
|
|
676
|
-
* @param {string|undefined} contents If sending a custom email then can supply contents which will be added to it.
|
|
677
|
-
* @param {string|undefined} subject A custom subject can be specified if the config one is not desired.
|
|
678
|
-
* @param {object|undefined} info Pass in a structure of information to be stored alongside the invitation.
|
|
679
|
-
* @param {boolean|undefined} disableFallback Prevent email being sent from SMTP fallback to avoid spam.
|
|
771
|
+
* @param {object} opts The options for sending the email.
|
|
680
772
|
* @return {Promise<object>} returns details about the attempt to send email, e.g. if it is successful; based on
|
|
681
773
|
* nodemailer response.
|
|
682
774
|
*/
|
|
683
|
-
|
|
684
|
-
email,
|
|
685
|
-
purpose,
|
|
686
|
-
|
|
687
|
-
)
|
|
688
|
-
const db = getGlobalDB()
|
|
689
|
-
let config =
|
|
775
|
+
export async function sendEmail(
|
|
776
|
+
email: string,
|
|
777
|
+
purpose: EmailTemplatePurpose,
|
|
778
|
+
opts: SendEmailOpts
|
|
779
|
+
) {
|
|
780
|
+
const db = tenancy.getGlobalDB()
|
|
781
|
+
let config =
|
|
782
|
+
(await getSmtpConfiguration(db, opts<span class="branch-0 cbranch-no" title="branch not covered" >?.w</span>orkspaceId, opts<span class="branch-0 cbranch-no" title="branch not covered" >?.a</span>utomation)) || <span class="branch-1 cbranch-no" title="branch not covered" >{}</span>
|
|
690
783
|
<span class="missing-if-branch" title="if path not taken" >I</span>if (Object.keys(config).length === 0 && <span class="branch-1 cbranch-no" title="branch not covered" >!TEST_MODE)</span> {
|
|
691
784
|
<span class="cstat-no" title="statement not covered" > throw "Unable to find SMTP configuration."</span>
|
|
692
785
|
}
|
|
693
786
|
const transport = createSMTPTransport(config)
|
|
694
787
|
// if there is a link code needed this will retrieve it
|
|
695
|
-
const code = await getLinkCode(purpose, email, user,
|
|
696
|
-
|
|
788
|
+
const code = await getLinkCode(purpose, email, opts.user, opts<span class="branch-0 cbranch-no" title="branch not covered" >?.i</span>nfo)
|
|
789
|
+
let context
|
|
790
|
+
if (code) {
|
|
791
|
+
context = await getSettingsTemplateContext(purpose, code)
|
|
792
|
+
}
|
|
697
793
|
|
|
698
|
-
let message = {
|
|
699
|
-
from:
|
|
794
|
+
let message: any = {
|
|
795
|
+
from: opts<span class="branch-0 cbranch-no" title="branch not covered" >?.f</span>rom || config.from,
|
|
700
796
|
html: await buildEmail(purpose, email, context, {
|
|
701
|
-
user,
|
|
702
|
-
contents,
|
|
797
|
+
user: opts<span class="branch-0 cbranch-no" title="branch not covered" >?.u</span>ser,
|
|
798
|
+
contents: opts<span class="branch-0 cbranch-no" title="branch not covered" >?.c</span>ontents,
|
|
703
799
|
}),
|
|
704
800
|
}
|
|
705
801
|
|
|
706
802
|
message = {
|
|
707
803
|
...message,
|
|
708
804
|
to: email,
|
|
709
|
-
cc:
|
|
710
|
-
bcc:
|
|
805
|
+
cc: opts<span class="branch-0 cbranch-no" title="branch not covered" >?.c</span>c,
|
|
806
|
+
bcc: opts<span class="branch-0 cbranch-no" title="branch not covered" >?.b</span>cc,
|
|
711
807
|
}
|
|
712
808
|
|
|
713
|
-
<span class="
|
|
714
|
-
message.subject = await processString(
|
|
809
|
+
if (opts<span class="branch-0 cbranch-no" title="branch not covered" >?.s</span>ubject || config.subject) {
|
|
810
|
+
message.subject = await processString(
|
|
811
|
+
opts<span class="branch-0 cbranch-no" title="branch not covered" >?.s</span>ubject || config.subject,
|
|
812
|
+
context
|
|
813
|
+
)
|
|
715
814
|
}
|
|
716
815
|
const response = await transport.sendMail(message)
|
|
717
816
|
<span class="missing-if-branch" title="if path not taken" >I</span>if (TEST_MODE) {
|
|
@@ -725,7 +824,7 @@ exports.sendEmail = async (
|
|
|
725
824
|
* @param {object} config an SMTP configuration - this is based on the nodemailer API.
|
|
726
825
|
* @return {Promise<boolean>} returns true if the configuration is valid.
|
|
727
826
|
*/
|
|
728
|
-
|
|
827
|
+
export async function verifyConfig(config: any) {
|
|
729
828
|
const transport = createSMTPTransport(config)
|
|
730
829
|
await transport.verify()
|
|
731
830
|
}
|
|
@@ -736,7 +835,7 @@ exports.verifyConfig = async config => {
|
|
|
736
835
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
737
836
|
Code coverage generated by
|
|
738
837
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
739
|
-
at
|
|
838
|
+
at Thu Nov 17 2022 16:59:05 GMT+0000 (Coordinated Universal Time)
|
|
740
839
|
</div>
|
|
741
840
|
<script src="../../prettify.js"></script>
|
|
742
841
|
<script>
|
|
@@ -68,10 +68,10 @@
|
|
|
68
68
|
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
69
|
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
70
|
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
-
<a name='L6'></a><a href='#L6'>6</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">17x</span>
|
|
72
72
|
<span class="cline-any cline-neutral"> </span>
|
|
73
|
-
<span class="cline-any cline-yes">
|
|
74
|
-
<span class="cline-any cline-yes">
|
|
73
|
+
<span class="cline-any cline-yes">17x</span>
|
|
74
|
+
<span class="cline-any cline-yes">85x</span>
|
|
75
75
|
<span class="cline-any cline-neutral"> </span>
|
|
76
76
|
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">const { readFileSync } = require("fs")
|
|
77
77
|
|
|
@@ -85,7 +85,7 @@ exports.readStaticFile = path => {
|
|
|
85
85
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
86
86
|
Code coverage generated by
|
|
87
87
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
88
|
-
at
|
|
88
|
+
at Thu Nov 17 2022 16:59:05 GMT+0000 (Coordinated Universal Time)
|
|
89
89
|
</div>
|
|
90
90
|
<script src="../../prettify.js"></script>
|
|
91
91
|
<script>
|