@budibase/worker 2.3.15 → 2.3.17-alpha.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 (135) hide show
  1. package/__mocks__/node-fetch.ts +23 -0
  2. package/jest-testcontainers-config.js +8 -0
  3. package/jest.config.ts +3 -2
  4. package/package.json +8 -6
  5. package/src/api/controllers/global/auth.ts +5 -2
  6. package/src/api/routes/global/tests/auth.spec.ts +30 -22
  7. package/src/api/routes/global/tests/configs.spec.ts +114 -94
  8. package/src/api/routes/global/tests/roles.spec.ts +19 -14
  9. package/src/api/routes/global/tests/users.spec.ts +33 -34
  10. package/src/ddApm.ts +7 -0
  11. package/src/elasticApm.ts +10 -0
  12. package/src/index.ts +6 -7
  13. package/src/sdk/users/users.ts +0 -1
  14. package/src/tests/TestConfiguration.ts +41 -11
  15. package/src/tests/api/auth.ts +7 -3
  16. package/src/tests/api/configs.ts +2 -2
  17. package/src/tests/api/users.ts +2 -2
  18. package/src/tests/jestSetup.ts +9 -2
  19. package/src/tests/structures/index.ts +0 -2
  20. package/coverage/clover.xml +0 -2196
  21. package/coverage/coverage-final.json +0 -84
  22. package/coverage/lcov-report/base.css +0 -224
  23. package/coverage/lcov-report/block-navigation.js +0 -87
  24. package/coverage/lcov-report/favicon.png +0 -0
  25. package/coverage/lcov-report/index.html +0 -431
  26. package/coverage/lcov-report/prettify.css +0 -1
  27. package/coverage/lcov-report/prettify.js +0 -2
  28. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  29. package/coverage/lcov-report/sorter.js +0 -196
  30. package/coverage/lcov-report/src/api/controllers/global/auth.ts.html +0 -925
  31. package/coverage/lcov-report/src/api/controllers/global/configs.ts.html +0 -1348
  32. package/coverage/lcov-report/src/api/controllers/global/email.ts.html +0 -196
  33. package/coverage/lcov-report/src/api/controllers/global/events.ts.html +0 -136
  34. package/coverage/lcov-report/src/api/controllers/global/index.html +0 -251
  35. package/coverage/lcov-report/src/api/controllers/global/license.ts.html +0 -187
  36. package/coverage/lcov-report/src/api/controllers/global/roles.ts.html +0 -283
  37. package/coverage/lcov-report/src/api/controllers/global/self.ts.html +0 -577
  38. package/coverage/lcov-report/src/api/controllers/global/templates.ts.html +0 -316
  39. package/coverage/lcov-report/src/api/controllers/global/users.ts.html +0 -838
  40. package/coverage/lcov-report/src/api/controllers/global/workspaces.ts.html +0 -244
  41. package/coverage/lcov-report/src/api/controllers/system/accounts.ts.html +0 -148
  42. package/coverage/lcov-report/src/api/controllers/system/environment.ts.html +0 -124
  43. package/coverage/lcov-report/src/api/controllers/system/index.html +0 -191
  44. package/coverage/lcov-report/src/api/controllers/system/migrations.ts.html +0 -124
  45. package/coverage/lcov-report/src/api/controllers/system/restore.ts.html +0 -124
  46. package/coverage/lcov-report/src/api/controllers/system/status.ts.html +0 -133
  47. package/coverage/lcov-report/src/api/controllers/system/tenants.ts.html +0 -154
  48. package/coverage/lcov-report/src/api/index.html +0 -116
  49. package/coverage/lcov-report/src/api/index.ts.html +0 -595
  50. package/coverage/lcov-report/src/api/routes/global/auth.ts.html +0 -349
  51. package/coverage/lcov-report/src/api/routes/global/configs.ts.html +0 -457
  52. package/coverage/lcov-report/src/api/routes/global/email.ts.html +0 -193
  53. package/coverage/lcov-report/src/api/routes/global/events.ts.html +0 -109
  54. package/coverage/lcov-report/src/api/routes/global/index.html +0 -251
  55. package/coverage/lcov-report/src/api/routes/global/license.ts.html +0 -124
  56. package/coverage/lcov-report/src/api/routes/global/roles.ts.html +0 -133
  57. package/coverage/lcov-report/src/api/routes/global/self.ts.html +0 -139
  58. package/coverage/lcov-report/src/api/routes/global/templates.ts.html +0 -196
  59. package/coverage/lcov-report/src/api/routes/global/users.ts.html +0 -475
  60. package/coverage/lcov-report/src/api/routes/global/workspaces.ts.html +0 -196
  61. package/coverage/lcov-report/src/api/routes/index.html +0 -116
  62. package/coverage/lcov-report/src/api/routes/index.ts.html +0 -202
  63. package/coverage/lcov-report/src/api/routes/system/accounts.ts.html +0 -142
  64. package/coverage/lcov-report/src/api/routes/system/environment.ts.html +0 -109
  65. package/coverage/lcov-report/src/api/routes/system/index.html +0 -191
  66. package/coverage/lcov-report/src/api/routes/system/migrations.ts.html +0 -142
  67. package/coverage/lcov-report/src/api/routes/system/restore.ts.html +0 -109
  68. package/coverage/lcov-report/src/api/routes/system/status.ts.html +0 -109
  69. package/coverage/lcov-report/src/api/routes/system/tenants.ts.html +0 -124
  70. package/coverage/lcov-report/src/api/routes/validation/index.html +0 -131
  71. package/coverage/lcov-report/src/api/routes/validation/index.ts.html +0 -88
  72. package/coverage/lcov-report/src/api/routes/validation/users.ts.html +0 -235
  73. package/coverage/lcov-report/src/constants/index.html +0 -116
  74. package/coverage/lcov-report/src/constants/index.ts.html +0 -637
  75. package/coverage/lcov-report/src/constants/templates/index.html +0 -116
  76. package/coverage/lcov-report/src/constants/templates/index.ts.html +0 -316
  77. package/coverage/lcov-report/src/db/index.html +0 -116
  78. package/coverage/lcov-report/src/db/index.ts.html +0 -115
  79. package/coverage/lcov-report/src/environment.ts.html +0 -388
  80. package/coverage/lcov-report/src/index.html +0 -131
  81. package/coverage/lcov-report/src/index.ts.html +0 -394
  82. package/coverage/lcov-report/src/middleware/cloudRestricted.ts.html +0 -139
  83. package/coverage/lcov-report/src/middleware/index.html +0 -116
  84. package/coverage/lcov-report/src/migrations/functions/globalInfoSyncUsers.ts.html +0 -145
  85. package/coverage/lcov-report/src/migrations/functions/index.html +0 -116
  86. package/coverage/lcov-report/src/migrations/index.html +0 -116
  87. package/coverage/lcov-report/src/migrations/index.ts.html +0 -271
  88. package/coverage/lcov-report/src/sdk/accounts/accounts.ts.html +0 -262
  89. package/coverage/lcov-report/src/sdk/accounts/index.html +0 -131
  90. package/coverage/lcov-report/src/sdk/accounts/index.ts.html +0 -88
  91. package/coverage/lcov-report/src/sdk/index.html +0 -116
  92. package/coverage/lcov-report/src/sdk/index.ts.html +0 -106
  93. package/coverage/lcov-report/src/sdk/users/events.ts.html +0 -601
  94. package/coverage/lcov-report/src/sdk/users/index.html +0 -146
  95. package/coverage/lcov-report/src/sdk/users/index.ts.html +0 -88
  96. package/coverage/lcov-report/src/sdk/users/users.ts.html +0 -1999
  97. package/coverage/lcov-report/src/tests/TestConfiguration.ts.html +0 -1075
  98. package/coverage/lcov-report/src/tests/api/accounts.ts.html +0 -160
  99. package/coverage/lcov-report/src/tests/api/auth.ts.html +0 -220
  100. package/coverage/lcov-report/src/tests/api/base.ts.html +0 -133
  101. package/coverage/lcov-report/src/tests/api/configs.ts.html +0 -226
  102. package/coverage/lcov-report/src/tests/api/email.ts.html +0 -148
  103. package/coverage/lcov-report/src/tests/api/environment.ts.html +0 -130
  104. package/coverage/lcov-report/src/tests/api/groups.ts.html +0 -163
  105. package/coverage/lcov-report/src/tests/api/index.html +0 -356
  106. package/coverage/lcov-report/src/tests/api/index.ts.html +0 -238
  107. package/coverage/lcov-report/src/tests/api/license.ts.html +0 -136
  108. package/coverage/lcov-report/src/tests/api/migrations.ts.html +0 -151
  109. package/coverage/lcov-report/src/tests/api/restore.ts.html +0 -127
  110. package/coverage/lcov-report/src/tests/api/roles.ts.html +0 -181
  111. package/coverage/lcov-report/src/tests/api/self.ts.html +0 -163
  112. package/coverage/lcov-report/src/tests/api/status.ts.html +0 -121
  113. package/coverage/lcov-report/src/tests/api/templates.ts.html +0 -175
  114. package/coverage/lcov-report/src/tests/api/tenants.ts.html +0 -130
  115. package/coverage/lcov-report/src/tests/api/users.ts.html +0 -514
  116. package/coverage/lcov-report/src/tests/controllers.ts.html +0 -100
  117. package/coverage/lcov-report/src/tests/index.html +0 -146
  118. package/coverage/lcov-report/src/tests/index.ts.html +0 -103
  119. package/coverage/lcov-report/src/tests/mocks/email.ts.html +0 -115
  120. package/coverage/lcov-report/src/tests/mocks/index.html +0 -131
  121. package/coverage/lcov-report/src/tests/mocks/index.ts.html +0 -106
  122. package/coverage/lcov-report/src/tests/structures/configs.ts.html +0 -313
  123. package/coverage/lcov-report/src/tests/structures/groups.ts.html +0 -118
  124. package/coverage/lcov-report/src/tests/structures/index.html +0 -161
  125. package/coverage/lcov-report/src/tests/structures/index.ts.html +0 -151
  126. package/coverage/lcov-report/src/tests/structures/users.ts.html +0 -196
  127. package/coverage/lcov-report/src/utilities/appService.ts.html +0 -208
  128. package/coverage/lcov-report/src/utilities/email.ts.html +0 -850
  129. package/coverage/lcov-report/src/utilities/fileSystem.ts.html +0 -100
  130. package/coverage/lcov-report/src/utilities/index.html +0 -206
  131. package/coverage/lcov-report/src/utilities/index.ts.html +0 -112
  132. package/coverage/lcov-report/src/utilities/redis.ts.html +0 -424
  133. package/coverage/lcov-report/src/utilities/templates.ts.html +0 -232
  134. package/coverage/lcov-report/src/utilities/users.ts.html +0 -133
  135. package/coverage/lcov.info +0 -4184
@@ -1,838 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/api/controllers/global/users.ts</title>
7
- <meta charset="utf-8" />
8
- <link rel="stylesheet" href="../../../../prettify.css" />
9
- <link rel="stylesheet" href="../../../../base.css" />
10
- <link rel="shortcut icon" type="image/x-icon" href="../../../../favicon.png" />
11
- <meta name="viewport" content="width=device-width, initial-scale=1" />
12
- <style type='text/css'>
13
- .coverage-summary .sorter {
14
- background-image: url(../../../../sort-arrow-sprite.png);
15
- }
16
- </style>
17
- </head>
18
-
19
- <body>
20
- <div class='wrapper'>
21
- <div class='pad1'>
22
- <h1><a href="../../../../index.html">All files</a> / <a href="index.html">src/api/controllers/global</a> users.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">73.8% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>93/126</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">53.12% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>17/32</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">83.87% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>26/31</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">70.79% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>80/113</span>
50
- </div>
51
-
52
-
53
- </div>
54
- <p class="quiet">
55
- Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
- </p>
57
- <template id="filterTemplate">
58
- <div class="quiet">
59
- Filter:
60
- <input oninput="onInput()" type="search" id="fileSearch">
61
- </div>
62
- </template>
63
- </div>
64
- <div class='status-line medium'></div>
65
- <pre><table class="coverage">
66
- <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
- <a name='L2'></a><a href='#L2'>2</a>
68
- <a name='L3'></a><a href='#L3'>3</a>
69
- <a name='L4'></a><a href='#L4'>4</a>
70
- <a name='L5'></a><a href='#L5'>5</a>
71
- <a name='L6'></a><a href='#L6'>6</a>
72
- <a name='L7'></a><a href='#L7'>7</a>
73
- <a name='L8'></a><a href='#L8'>8</a>
74
- <a name='L9'></a><a href='#L9'>9</a>
75
- <a name='L10'></a><a href='#L10'>10</a>
76
- <a name='L11'></a><a href='#L11'>11</a>
77
- <a name='L12'></a><a href='#L12'>12</a>
78
- <a name='L13'></a><a href='#L13'>13</a>
79
- <a name='L14'></a><a href='#L14'>14</a>
80
- <a name='L15'></a><a href='#L15'>15</a>
81
- <a name='L16'></a><a href='#L16'>16</a>
82
- <a name='L17'></a><a href='#L17'>17</a>
83
- <a name='L18'></a><a href='#L18'>18</a>
84
- <a name='L19'></a><a href='#L19'>19</a>
85
- <a name='L20'></a><a href='#L20'>20</a>
86
- <a name='L21'></a><a href='#L21'>21</a>
87
- <a name='L22'></a><a href='#L22'>22</a>
88
- <a name='L23'></a><a href='#L23'>23</a>
89
- <a name='L24'></a><a href='#L24'>24</a>
90
- <a name='L25'></a><a href='#L25'>25</a>
91
- <a name='L26'></a><a href='#L26'>26</a>
92
- <a name='L27'></a><a href='#L27'>27</a>
93
- <a name='L28'></a><a href='#L28'>28</a>
94
- <a name='L29'></a><a href='#L29'>29</a>
95
- <a name='L30'></a><a href='#L30'>30</a>
96
- <a name='L31'></a><a href='#L31'>31</a>
97
- <a name='L32'></a><a href='#L32'>32</a>
98
- <a name='L33'></a><a href='#L33'>33</a>
99
- <a name='L34'></a><a href='#L34'>34</a>
100
- <a name='L35'></a><a href='#L35'>35</a>
101
- <a name='L36'></a><a href='#L36'>36</a>
102
- <a name='L37'></a><a href='#L37'>37</a>
103
- <a name='L38'></a><a href='#L38'>38</a>
104
- <a name='L39'></a><a href='#L39'>39</a>
105
- <a name='L40'></a><a href='#L40'>40</a>
106
- <a name='L41'></a><a href='#L41'>41</a>
107
- <a name='L42'></a><a href='#L42'>42</a>
108
- <a name='L43'></a><a href='#L43'>43</a>
109
- <a name='L44'></a><a href='#L44'>44</a>
110
- <a name='L45'></a><a href='#L45'>45</a>
111
- <a name='L46'></a><a href='#L46'>46</a>
112
- <a name='L47'></a><a href='#L47'>47</a>
113
- <a name='L48'></a><a href='#L48'>48</a>
114
- <a name='L49'></a><a href='#L49'>49</a>
115
- <a name='L50'></a><a href='#L50'>50</a>
116
- <a name='L51'></a><a href='#L51'>51</a>
117
- <a name='L52'></a><a href='#L52'>52</a>
118
- <a name='L53'></a><a href='#L53'>53</a>
119
- <a name='L54'></a><a href='#L54'>54</a>
120
- <a name='L55'></a><a href='#L55'>55</a>
121
- <a name='L56'></a><a href='#L56'>56</a>
122
- <a name='L57'></a><a href='#L57'>57</a>
123
- <a name='L58'></a><a href='#L58'>58</a>
124
- <a name='L59'></a><a href='#L59'>59</a>
125
- <a name='L60'></a><a href='#L60'>60</a>
126
- <a name='L61'></a><a href='#L61'>61</a>
127
- <a name='L62'></a><a href='#L62'>62</a>
128
- <a name='L63'></a><a href='#L63'>63</a>
129
- <a name='L64'></a><a href='#L64'>64</a>
130
- <a name='L65'></a><a href='#L65'>65</a>
131
- <a name='L66'></a><a href='#L66'>66</a>
132
- <a name='L67'></a><a href='#L67'>67</a>
133
- <a name='L68'></a><a href='#L68'>68</a>
134
- <a name='L69'></a><a href='#L69'>69</a>
135
- <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a>
146
- <a name='L81'></a><a href='#L81'>81</a>
147
- <a name='L82'></a><a href='#L82'>82</a>
148
- <a name='L83'></a><a href='#L83'>83</a>
149
- <a name='L84'></a><a href='#L84'>84</a>
150
- <a name='L85'></a><a href='#L85'>85</a>
151
- <a name='L86'></a><a href='#L86'>86</a>
152
- <a name='L87'></a><a href='#L87'>87</a>
153
- <a name='L88'></a><a href='#L88'>88</a>
154
- <a name='L89'></a><a href='#L89'>89</a>
155
- <a name='L90'></a><a href='#L90'>90</a>
156
- <a name='L91'></a><a href='#L91'>91</a>
157
- <a name='L92'></a><a href='#L92'>92</a>
158
- <a name='L93'></a><a href='#L93'>93</a>
159
- <a name='L94'></a><a href='#L94'>94</a>
160
- <a name='L95'></a><a href='#L95'>95</a>
161
- <a name='L96'></a><a href='#L96'>96</a>
162
- <a name='L97'></a><a href='#L97'>97</a>
163
- <a name='L98'></a><a href='#L98'>98</a>
164
- <a name='L99'></a><a href='#L99'>99</a>
165
- <a name='L100'></a><a href='#L100'>100</a>
166
- <a name='L101'></a><a href='#L101'>101</a>
167
- <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a>
169
- <a name='L104'></a><a href='#L104'>104</a>
170
- <a name='L105'></a><a href='#L105'>105</a>
171
- <a name='L106'></a><a href='#L106'>106</a>
172
- <a name='L107'></a><a href='#L107'>107</a>
173
- <a name='L108'></a><a href='#L108'>108</a>
174
- <a name='L109'></a><a href='#L109'>109</a>
175
- <a name='L110'></a><a href='#L110'>110</a>
176
- <a name='L111'></a><a href='#L111'>111</a>
177
- <a name='L112'></a><a href='#L112'>112</a>
178
- <a name='L113'></a><a href='#L113'>113</a>
179
- <a name='L114'></a><a href='#L114'>114</a>
180
- <a name='L115'></a><a href='#L115'>115</a>
181
- <a name='L116'></a><a href='#L116'>116</a>
182
- <a name='L117'></a><a href='#L117'>117</a>
183
- <a name='L118'></a><a href='#L118'>118</a>
184
- <a name='L119'></a><a href='#L119'>119</a>
185
- <a name='L120'></a><a href='#L120'>120</a>
186
- <a name='L121'></a><a href='#L121'>121</a>
187
- <a name='L122'></a><a href='#L122'>122</a>
188
- <a name='L123'></a><a href='#L123'>123</a>
189
- <a name='L124'></a><a href='#L124'>124</a>
190
- <a name='L125'></a><a href='#L125'>125</a>
191
- <a name='L126'></a><a href='#L126'>126</a>
192
- <a name='L127'></a><a href='#L127'>127</a>
193
- <a name='L128'></a><a href='#L128'>128</a>
194
- <a name='L129'></a><a href='#L129'>129</a>
195
- <a name='L130'></a><a href='#L130'>130</a>
196
- <a name='L131'></a><a href='#L131'>131</a>
197
- <a name='L132'></a><a href='#L132'>132</a>
198
- <a name='L133'></a><a href='#L133'>133</a>
199
- <a name='L134'></a><a href='#L134'>134</a>
200
- <a name='L135'></a><a href='#L135'>135</a>
201
- <a name='L136'></a><a href='#L136'>136</a>
202
- <a name='L137'></a><a href='#L137'>137</a>
203
- <a name='L138'></a><a href='#L138'>138</a>
204
- <a name='L139'></a><a href='#L139'>139</a>
205
- <a name='L140'></a><a href='#L140'>140</a>
206
- <a name='L141'></a><a href='#L141'>141</a>
207
- <a name='L142'></a><a href='#L142'>142</a>
208
- <a name='L143'></a><a href='#L143'>143</a>
209
- <a name='L144'></a><a href='#L144'>144</a>
210
- <a name='L145'></a><a href='#L145'>145</a>
211
- <a name='L146'></a><a href='#L146'>146</a>
212
- <a name='L147'></a><a href='#L147'>147</a>
213
- <a name='L148'></a><a href='#L148'>148</a>
214
- <a name='L149'></a><a href='#L149'>149</a>
215
- <a name='L150'></a><a href='#L150'>150</a>
216
- <a name='L151'></a><a href='#L151'>151</a>
217
- <a name='L152'></a><a href='#L152'>152</a>
218
- <a name='L153'></a><a href='#L153'>153</a>
219
- <a name='L154'></a><a href='#L154'>154</a>
220
- <a name='L155'></a><a href='#L155'>155</a>
221
- <a name='L156'></a><a href='#L156'>156</a>
222
- <a name='L157'></a><a href='#L157'>157</a>
223
- <a name='L158'></a><a href='#L158'>158</a>
224
- <a name='L159'></a><a href='#L159'>159</a>
225
- <a name='L160'></a><a href='#L160'>160</a>
226
- <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a>
228
- <a name='L163'></a><a href='#L163'>163</a>
229
- <a name='L164'></a><a href='#L164'>164</a>
230
- <a name='L165'></a><a href='#L165'>165</a>
231
- <a name='L166'></a><a href='#L166'>166</a>
232
- <a name='L167'></a><a href='#L167'>167</a>
233
- <a name='L168'></a><a href='#L168'>168</a>
234
- <a name='L169'></a><a href='#L169'>169</a>
235
- <a name='L170'></a><a href='#L170'>170</a>
236
- <a name='L171'></a><a href='#L171'>171</a>
237
- <a name='L172'></a><a href='#L172'>172</a>
238
- <a name='L173'></a><a href='#L173'>173</a>
239
- <a name='L174'></a><a href='#L174'>174</a>
240
- <a name='L175'></a><a href='#L175'>175</a>
241
- <a name='L176'></a><a href='#L176'>176</a>
242
- <a name='L177'></a><a href='#L177'>177</a>
243
- <a name='L178'></a><a href='#L178'>178</a>
244
- <a name='L179'></a><a href='#L179'>179</a>
245
- <a name='L180'></a><a href='#L180'>180</a>
246
- <a name='L181'></a><a href='#L181'>181</a>
247
- <a name='L182'></a><a href='#L182'>182</a>
248
- <a name='L183'></a><a href='#L183'>183</a>
249
- <a name='L184'></a><a href='#L184'>184</a>
250
- <a name='L185'></a><a href='#L185'>185</a>
251
- <a name='L186'></a><a href='#L186'>186</a>
252
- <a name='L187'></a><a href='#L187'>187</a>
253
- <a name='L188'></a><a href='#L188'>188</a>
254
- <a name='L189'></a><a href='#L189'>189</a>
255
- <a name='L190'></a><a href='#L190'>190</a>
256
- <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a>
258
- <a name='L193'></a><a href='#L193'>193</a>
259
- <a name='L194'></a><a href='#L194'>194</a>
260
- <a name='L195'></a><a href='#L195'>195</a>
261
- <a name='L196'></a><a href='#L196'>196</a>
262
- <a name='L197'></a><a href='#L197'>197</a>
263
- <a name='L198'></a><a href='#L198'>198</a>
264
- <a name='L199'></a><a href='#L199'>199</a>
265
- <a name='L200'></a><a href='#L200'>200</a>
266
- <a name='L201'></a><a href='#L201'>201</a>
267
- <a name='L202'></a><a href='#L202'>202</a>
268
- <a name='L203'></a><a href='#L203'>203</a>
269
- <a name='L204'></a><a href='#L204'>204</a>
270
- <a name='L205'></a><a href='#L205'>205</a>
271
- <a name='L206'></a><a href='#L206'>206</a>
272
- <a name='L207'></a><a href='#L207'>207</a>
273
- <a name='L208'></a><a href='#L208'>208</a>
274
- <a name='L209'></a><a href='#L209'>209</a>
275
- <a name='L210'></a><a href='#L210'>210</a>
276
- <a name='L211'></a><a href='#L211'>211</a>
277
- <a name='L212'></a><a href='#L212'>212</a>
278
- <a name='L213'></a><a href='#L213'>213</a>
279
- <a name='L214'></a><a href='#L214'>214</a>
280
- <a name='L215'></a><a href='#L215'>215</a>
281
- <a name='L216'></a><a href='#L216'>216</a>
282
- <a name='L217'></a><a href='#L217'>217</a>
283
- <a name='L218'></a><a href='#L218'>218</a>
284
- <a name='L219'></a><a href='#L219'>219</a>
285
- <a name='L220'></a><a href='#L220'>220</a>
286
- <a name='L221'></a><a href='#L221'>221</a>
287
- <a name='L222'></a><a href='#L222'>222</a>
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">18x</span>
318
- <span class="cline-any cline-yes">18x</span>
319
- <span class="cline-any cline-yes">18x</span>
320
- <span class="cline-any cline-neutral">&nbsp;</span>
321
- <span class="cline-any cline-neutral">&nbsp;</span>
322
- <span class="cline-any cline-neutral">&nbsp;</span>
323
- <span class="cline-any cline-neutral">&nbsp;</span>
324
- <span class="cline-any cline-neutral">&nbsp;</span>
325
- <span class="cline-any cline-neutral">&nbsp;</span>
326
- <span class="cline-any cline-neutral">&nbsp;</span>
327
- <span class="cline-any cline-neutral">&nbsp;</span>
328
- <span class="cline-any cline-neutral">&nbsp;</span>
329
- <span class="cline-any cline-neutral">&nbsp;</span>
330
- <span class="cline-any cline-neutral">&nbsp;</span>
331
- <span class="cline-any cline-neutral">&nbsp;</span>
332
- <span class="cline-any cline-neutral">&nbsp;</span>
333
- <span class="cline-any cline-neutral">&nbsp;</span>
334
- <span class="cline-any cline-neutral">&nbsp;</span>
335
- <span class="cline-any cline-neutral">&nbsp;</span>
336
- <span class="cline-any cline-yes">18x</span>
337
- <span class="cline-any cline-yes">18x</span>
338
- <span class="cline-any cline-neutral">&nbsp;</span>
339
- <span class="cline-any cline-yes">18x</span>
340
- <span class="cline-any cline-neutral">&nbsp;</span>
341
- <span class="cline-any cline-yes">82x</span>
342
- <span class="cline-any cline-yes">86x</span>
343
- <span class="cline-any cline-yes">86x</span>
344
- <span class="cline-any cline-yes">86x</span>
345
- <span class="cline-any cline-neutral">&nbsp;</span>
346
- <span class="cline-any cline-yes">5x</span>
347
- <span class="cline-any cline-neutral">&nbsp;</span>
348
- <span class="cline-any cline-neutral">&nbsp;</span>
349
- <span class="cline-any cline-neutral">&nbsp;</span>
350
- <span class="cline-any cline-yes">18x</span>
351
- <span class="cline-any cline-yes">3x</span>
352
- <span class="cline-any cline-yes">1x</span>
353
- <span class="cline-any cline-neutral">&nbsp;</span>
354
- <span class="cline-any cline-yes">2x</span>
355
- <span class="cline-any cline-neutral">&nbsp;</span>
356
- <span class="cline-any cline-neutral">&nbsp;</span>
357
- <span class="cline-any cline-yes">18x</span>
358
- <span class="cline-any cline-yes">6x</span>
359
- <span class="cline-any cline-no">&nbsp;</span>
360
- <span class="cline-any cline-neutral">&nbsp;</span>
361
- <span class="cline-any cline-neutral">&nbsp;</span>
362
- <span class="cline-any cline-neutral">&nbsp;</span>
363
- <span class="cline-any cline-yes">6x</span>
364
- <span class="cline-any cline-neutral">&nbsp;</span>
365
- <span class="cline-any cline-neutral">&nbsp;</span>
366
- <span class="cline-any cline-yes">18x</span>
367
- <span class="cline-any cline-yes">9x</span>
368
- <span class="cline-any cline-yes">9x</span>
369
- <span class="cline-any cline-neutral">&nbsp;</span>
370
- <span class="cline-any cline-yes">9x</span>
371
- <span class="cline-any cline-yes">9x</span>
372
- <span class="cline-any cline-yes">6x</span>
373
- <span class="cline-any cline-neutral">&nbsp;</span>
374
- <span class="cline-any cline-yes">9x</span>
375
- <span class="cline-any cline-yes">3x</span>
376
- <span class="cline-any cline-neutral">&nbsp;</span>
377
- <span class="cline-any cline-neutral">&nbsp;</span>
378
- <span class="cline-any cline-yes">1x</span>
379
- <span class="cline-any cline-neutral">&nbsp;</span>
380
- <span class="cline-any cline-yes">8x</span>
381
- <span class="cline-any cline-neutral">&nbsp;</span>
382
- <span class="cline-any cline-neutral">&nbsp;</span>
383
- <span class="cline-any cline-yes">18x</span>
384
- <span class="cline-any cline-yes">12x</span>
385
- <span class="cline-any cline-neutral">&nbsp;</span>
386
- <span class="cline-any cline-neutral">&nbsp;</span>
387
- <span class="cline-any cline-yes">18x</span>
388
- <span class="cline-any cline-yes">6x</span>
389
- <span class="cline-any cline-neutral">&nbsp;</span>
390
- <span class="cline-any cline-yes">6x</span>
391
- <span class="cline-any cline-neutral">&nbsp;</span>
392
- <span class="cline-any cline-yes">6x</span>
393
- <span class="cline-any cline-neutral">&nbsp;</span>
394
- <span class="cline-any cline-yes">6x</span>
395
- <span class="cline-any cline-neutral">&nbsp;</span>
396
- <span class="cline-any cline-yes">6x</span>
397
- <span class="cline-any cline-no">&nbsp;</span>
398
- <span class="cline-any cline-neutral">&nbsp;</span>
399
- <span class="cline-any cline-neutral">&nbsp;</span>
400
- <span class="cline-any cline-yes">6x</span>
401
- <span class="cline-any cline-yes">6x</span>
402
- <span class="cline-any cline-no">&nbsp;</span>
403
- <span class="cline-any cline-neutral">&nbsp;</span>
404
- <span class="cline-any cline-neutral">&nbsp;</span>
405
- <span class="cline-any cline-neutral">&nbsp;</span>
406
- <span class="cline-any cline-neutral">&nbsp;</span>
407
- <span class="cline-any cline-neutral">&nbsp;</span>
408
- <span class="cline-any cline-yes">6x</span>
409
- <span class="cline-any cline-neutral">&nbsp;</span>
410
- <span class="cline-any cline-neutral">&nbsp;</span>
411
- <span class="cline-any cline-neutral">&nbsp;</span>
412
- <span class="cline-any cline-neutral">&nbsp;</span>
413
- <span class="cline-any cline-neutral">&nbsp;</span>
414
- <span class="cline-any cline-neutral">&nbsp;</span>
415
- <span class="cline-any cline-neutral">&nbsp;</span>
416
- <span class="cline-any cline-neutral">&nbsp;</span>
417
- <span class="cline-any cline-neutral">&nbsp;</span>
418
- <span class="cline-any cline-neutral">&nbsp;</span>
419
- <span class="cline-any cline-neutral">&nbsp;</span>
420
- <span class="cline-any cline-neutral">&nbsp;</span>
421
- <span class="cline-any cline-yes">6x</span>
422
- <span class="cline-any cline-neutral">&nbsp;</span>
423
- <span class="cline-any cline-neutral">&nbsp;</span>
424
- <span class="cline-any cline-yes">6x</span>
425
- <span class="cline-any cline-yes">6x</span>
426
- <span class="cline-any cline-neutral">&nbsp;</span>
427
- <span class="cline-any cline-neutral">&nbsp;</span>
428
- <span class="cline-any cline-neutral">&nbsp;</span>
429
- <span class="cline-any cline-neutral">&nbsp;</span>
430
- <span class="cline-any cline-neutral">&nbsp;</span>
431
- <span class="cline-any cline-neutral">&nbsp;</span>
432
- <span class="cline-any cline-yes">6x</span>
433
- <span class="cline-any cline-yes">6x</span>
434
- <span class="cline-any cline-neutral">&nbsp;</span>
435
- <span class="cline-any cline-yes">6x</span>
436
- <span class="cline-any cline-neutral">&nbsp;</span>
437
- <span class="cline-any cline-yes">6x</span>
438
- <span class="cline-any cline-neutral">&nbsp;</span>
439
- <span class="cline-any cline-no">&nbsp;</span>
440
- <span class="cline-any cline-neutral">&nbsp;</span>
441
- <span class="cline-any cline-neutral">&nbsp;</span>
442
- <span class="cline-any cline-neutral">&nbsp;</span>
443
- <span class="cline-any cline-neutral">&nbsp;</span>
444
- <span class="cline-any cline-yes">18x</span>
445
- <span class="cline-any cline-no">&nbsp;</span>
446
- <span class="cline-any cline-no">&nbsp;</span>
447
- <span class="cline-any cline-no">&nbsp;</span>
448
- <span class="cline-any cline-neutral">&nbsp;</span>
449
- <span class="cline-any cline-no">&nbsp;</span>
450
- <span class="cline-any cline-neutral">&nbsp;</span>
451
- <span class="cline-any cline-neutral">&nbsp;</span>
452
- <span class="cline-any cline-neutral">&nbsp;</span>
453
- <span class="cline-any cline-yes">18x</span>
454
- <span class="cline-any cline-yes">5x</span>
455
- <span class="cline-any cline-yes">5x</span>
456
- <span class="cline-any cline-yes">1x</span>
457
- <span class="cline-any cline-neutral">&nbsp;</span>
458
- <span class="cline-any cline-neutral">&nbsp;</span>
459
- <span class="cline-any cline-yes">4x</span>
460
- <span class="cline-any cline-neutral">&nbsp;</span>
461
- <span class="cline-any cline-yes">3x</span>
462
- <span class="cline-any cline-neutral">&nbsp;</span>
463
- <span class="cline-any cline-neutral">&nbsp;</span>
464
- <span class="cline-any cline-neutral">&nbsp;</span>
465
- <span class="cline-any cline-neutral">&nbsp;</span>
466
- <span class="cline-any cline-yes">18x</span>
467
- <span class="cline-any cline-no">&nbsp;</span>
468
- <span class="cline-any cline-no">&nbsp;</span>
469
- <span class="cline-any cline-neutral">&nbsp;</span>
470
- <span class="cline-any cline-no">&nbsp;</span>
471
- <span class="cline-any cline-no">&nbsp;</span>
472
- <span class="cline-any cline-no">&nbsp;</span>
473
- <span class="cline-any cline-neutral">&nbsp;</span>
474
- <span class="cline-any cline-neutral">&nbsp;</span>
475
- <span class="cline-any cline-no">&nbsp;</span>
476
- <span class="cline-any cline-neutral">&nbsp;</span>
477
- <span class="cline-any cline-neutral">&nbsp;</span>
478
- <span class="cline-any cline-neutral">&nbsp;</span>
479
- <span class="cline-any cline-yes">18x</span>
480
- <span class="cline-any cline-no">&nbsp;</span>
481
- <span class="cline-any cline-neutral">&nbsp;</span>
482
- <span class="cline-any cline-no">&nbsp;</span>
483
- <span class="cline-any cline-no">&nbsp;</span>
484
- <span class="cline-any cline-no">&nbsp;</span>
485
- <span class="cline-any cline-neutral">&nbsp;</span>
486
- <span class="cline-any cline-neutral">&nbsp;</span>
487
- <span class="cline-any cline-no">&nbsp;</span>
488
- <span class="cline-any cline-neutral">&nbsp;</span>
489
- <span class="cline-any cline-neutral">&nbsp;</span>
490
- <span class="cline-any cline-neutral">&nbsp;</span>
491
- <span class="cline-any cline-yes">18x</span>
492
- <span class="cline-any cline-yes">9x</span>
493
- <span class="cline-any cline-neutral">&nbsp;</span>
494
- <span class="cline-any cline-neutral">&nbsp;</span>
495
- <span class="cline-any cline-yes">18x</span>
496
- <span class="cline-any cline-no">&nbsp;</span>
497
- <span class="cline-any cline-no">&nbsp;</span>
498
- <span class="cline-any cline-no">&nbsp;</span>
499
- <span class="cline-any cline-no">&nbsp;</span>
500
- <span class="cline-any cline-neutral">&nbsp;</span>
501
- <span class="cline-any cline-no">&nbsp;</span>
502
- <span class="cline-any cline-neutral">&nbsp;</span>
503
- <span class="cline-any cline-neutral">&nbsp;</span>
504
- <span class="cline-any cline-neutral">&nbsp;</span>
505
- <span class="cline-any cline-yes">18x</span>
506
- <span class="cline-any cline-yes">3x</span>
507
- <span class="cline-any cline-yes">3x</span>
508
- <span class="cline-any cline-neutral">&nbsp;</span>
509
- <span class="cline-any cline-neutral">&nbsp;</span>
510
- <span class="cline-any cline-yes">3x</span>
511
- <span class="cline-any cline-yes">1x</span>
512
- <span class="cline-any cline-yes">1x</span>
513
- <span class="cline-any cline-yes">1x</span>
514
- <span class="cline-any cline-neutral">&nbsp;</span>
515
- <span class="cline-any cline-no">&nbsp;</span>
516
- <span class="cline-any cline-neutral">&nbsp;</span>
517
- <span class="cline-any cline-neutral">&nbsp;</span>
518
- <span class="cline-any cline-neutral">&nbsp;</span>
519
- <span class="cline-any cline-yes">2x</span>
520
- <span class="cline-any cline-neutral">&nbsp;</span>
521
- <span class="cline-any cline-neutral">&nbsp;</span>
522
- <span class="cline-any cline-neutral">&nbsp;</span>
523
- <span class="cline-any cline-neutral">&nbsp;</span>
524
- <span class="cline-any cline-yes">18x</span>
525
- <span class="cline-any cline-yes">2x</span>
526
- <span class="cline-any cline-yes">2x</span>
527
- <span class="cline-any cline-neutral">&nbsp;</span>
528
- <span class="cline-any cline-neutral">&nbsp;</span>
529
- <span class="cline-any cline-yes">18x</span>
530
- <span class="cline-any cline-no">&nbsp;</span>
531
- <span class="cline-any cline-neutral">&nbsp;</span>
532
- <span class="cline-any cline-no">&nbsp;</span>
533
- <span class="cline-any cline-no">&nbsp;</span>
534
- <span class="cline-any cline-neutral">&nbsp;</span>
535
- <span class="cline-any cline-no">&nbsp;</span>
536
- <span class="cline-any cline-neutral">&nbsp;</span>
537
- <span class="cline-any cline-no">&nbsp;</span>
538
- <span class="cline-any cline-neutral">&nbsp;</span>
539
- <span class="cline-any cline-neutral">&nbsp;</span>
540
- <span class="cline-any cline-neutral">&nbsp;</span>
541
- <span class="cline-any cline-neutral">&nbsp;</span>
542
- <span class="cline-any cline-yes">18x</span>
543
- <span class="cline-any cline-yes">1x</span>
544
- <span class="cline-any cline-yes">1x</span>
545
- <span class="cline-any cline-neutral">&nbsp;</span>
546
- <span class="cline-any cline-yes">1x</span>
547
- <span class="cline-any cline-yes">1x</span>
548
- <span class="cline-any cline-yes">1x</span>
549
- <span class="cline-any cline-neutral">&nbsp;</span>
550
- <span class="cline-any cline-neutral">&nbsp;</span>
551
- <span class="cline-any cline-neutral">&nbsp;</span>
552
- <span class="cline-any cline-neutral">&nbsp;</span>
553
- <span class="cline-any cline-neutral">&nbsp;</span>
554
- <span class="cline-any cline-neutral">&nbsp;</span>
555
- <span class="cline-any cline-yes">1x</span>
556
- <span class="cline-any cline-yes">1x</span>
557
- <span class="cline-any cline-yes">1x</span>
558
- <span class="cline-any cline-yes">1x</span>
559
- <span class="cline-any cline-neutral">&nbsp;</span>
560
- <span class="cline-any cline-neutral">&nbsp;</span>
561
- <span class="cline-any cline-no">&nbsp;</span>
562
- <span class="cline-any cline-neutral">&nbsp;</span>
563
- <span class="cline-any cline-no">&nbsp;</span>
564
- <span class="cline-any cline-neutral">&nbsp;</span>
565
- <span class="cline-any cline-no">&nbsp;</span>
566
- <span class="cline-any cline-neutral">&nbsp;</span>
567
- <span class="cline-any cline-neutral">&nbsp;</span>
568
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { checkInviteCode } from "../../../utilities/redis"
569
- import sdk from "../../../sdk"
570
- import env from "../../../environment"
571
- import {
572
- BulkUserRequest,
573
- BulkUserResponse,
574
- CloudAccount,
575
- CreateAdminUserRequest,
576
- InviteUserRequest,
577
- InviteUsersRequest,
578
- SearchUsersRequest,
579
- User,
580
- } from "@budibase/types"
581
- import {
582
- accounts,
583
- cache,
584
- errors,
585
- events,
586
- tenancy,
587
- } from "@budibase/backend-core"
588
- import { checkAnyUserExists } from "../../../utilities/users"
589
- &nbsp;
590
- const MAX_USERS_UPLOAD_LIMIT = 1000
591
- &nbsp;
592
- export const save = async (ctx: any) =&gt; {
593
- try {
594
- const currentUserId = ctx.user._id
595
- ctx.body = await sdk.users.save(ctx.request.body, { currentUserId })
596
- } catch (err: any) {
597
- ctx.throw(err.status || 400, err)
598
- }
599
- }
600
- &nbsp;
601
- const bulkDelete = async (userIds: string[], currentUserId: string) =&gt; {
602
- if (userIds?.indexOf(currentUserId) !== -1) {
603
- throw new Error("Unable to delete self.")
604
- }
605
- return await sdk.users.bulkDelete(userIds)
606
- }
607
- &nbsp;
608
- const bulkCreate = async (users: User[], groupIds: string[]) =&gt; {
609
- <span class="missing-if-branch" title="if path not taken" >I</span>if (!env.SELF_HOSTED &amp;&amp; users.length &gt; MAX_USERS_UPLOAD_LIMIT) {
610
- <span class="cstat-no" title="statement not covered" > throw new Error(</span>
611
- "Max limit for upload is 1000 users. Please reduce file size and try again."
612
- )
613
- }
614
- return await sdk.users.bulkCreate(users, groupIds)
615
- }
616
- &nbsp;
617
- export const bulkUpdate = async (ctx: any) =&gt; {
618
- const currentUserId = ctx.user._id
619
- const input = ctx.request.body as BulkUserRequest
620
- let created, deleted
621
- try {
622
- if (input.create) {
623
- created = await bulkCreate(input.create.users, input.create.groups)
624
- }
625
- if (input.delete) {
626
- deleted = await bulkDelete(input.delete.userIds, currentUserId)
627
- }
628
- } catch (err: any) {
629
- ctx.throw(err.status || 400, err?.message || <span class="branch-1 cbranch-no" title="branch not covered" >err)</span>
630
- }
631
- ctx.body = { created, deleted } as BulkUserResponse
632
- }
633
- &nbsp;
634
- const parseBooleanParam = (param: any) =&gt; {
635
- return !(param &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >param === "false"</span>)
636
- }
637
- &nbsp;
638
- export const adminUser = async (ctx: any) =&gt; {
639
- const { email, password, tenantId } = ctx.request
640
- .body as CreateAdminUserRequest
641
- await tenancy.doInTenant(tenantId, async () =&gt; {
642
- // account portal sends a pre-hashed password - honour param to prevent double hashing
643
- const hashPassword = parseBooleanParam(ctx.request.query.hashPassword)
644
- // account portal sends no password for SSO users
645
- const requirePassword = parseBooleanParam(ctx.request.query.requirePassword)
646
- &nbsp;
647
- <span class="missing-if-branch" title="if path not taken" >I</span>if (await tenancy.doesTenantExist(tenantId)) {
648
- <span class="cstat-no" title="statement not covered" > ctx.throw(403, "Organisation already exists.")</span>
649
- }
650
- &nbsp;
651
- const userExists = await checkAnyUserExists()
652
- <span class="missing-if-branch" title="if path not taken" >I</span>if (userExists) {
653
- <span class="cstat-no" title="statement not covered" > ctx.throw(</span>
654
- 403,
655
- "You cannot initialise once an global user has been created."
656
- )
657
- }
658
- &nbsp;
659
- const user: User = {
660
- email: email,
661
- password: password,
662
- createdAt: Date.now(),
663
- roles: {},
664
- builder: {
665
- global: true,
666
- },
667
- admin: {
668
- global: true,
669
- },
670
- tenantId,
671
- }
672
- try {
673
- // always bust checklist beforehand, if an error occurs but can proceed, don't get
674
- // stuck in a cycle
675
- await cache.bustCache(cache.CacheKey.CHECKLIST)
676
- const finalUser = await sdk.users.save(user, {
677
- hashPassword,
678
- requirePassword,
679
- })
680
- &nbsp;
681
- // events
682
- let account: CloudAccount | undefined
683
- if (!env.SELF_HOSTED &amp;&amp; !env.DISABLE_ACCOUNT_PORTAL) {
684
- account = await accounts.getAccountByTenantId(tenantId)
685
- }
686
- await events.identification.identifyTenantGroup(tenantId, account)
687
- &nbsp;
688
- ctx.body = finalUser
689
- } catch (err: any) {
690
- <span class="cstat-no" title="statement not covered" > ctx.throw(err.status || 400, err)</span>
691
- }
692
- })
693
- }
694
- &nbsp;
695
- export const countByApp = <span class="fstat-no" title="function not covered" >async (c</span>tx: any) =&gt; {
696
- const appId = <span class="cstat-no" title="statement not covered" >ctx.params.appId</span>
697
- <span class="cstat-no" title="statement not covered" > try {</span>
698
- <span class="cstat-no" title="statement not covered" > ctx.body = await sdk.users.countUsersByApp(appId)</span>
699
- } catch (err: any) {
700
- <span class="cstat-no" title="statement not covered" > ctx.throw(err.status || 400, err)</span>
701
- }
702
- }
703
- &nbsp;
704
- export const destroy = async (ctx: any) =&gt; {
705
- const id = ctx.params.id
706
- if (id === ctx.user._id) {
707
- ctx.throw(400, "Unable to delete self.")
708
- }
709
- &nbsp;
710
- await sdk.users.destroy(id, ctx.user)
711
- &nbsp;
712
- ctx.body = {
713
- message: `User ${id} deleted.`,
714
- }
715
- }
716
- &nbsp;
717
- export const search = <span class="fstat-no" title="function not covered" >async (c</span>tx: any) =&gt; {
718
- const body = <span class="cstat-no" title="statement not covered" >ctx.request.body </span>as SearchUsersRequest
719
- const paginated = <span class="cstat-no" title="statement not covered" >await sdk.users.paginatedUsers(body)</span>
720
- // user hashed password shouldn't ever be returned
721
- <span class="cstat-no" title="statement not covered" > for (let user of paginated.data) {</span>
722
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (user) {</span>
723
- <span class="cstat-no" title="statement not covered" > delete user.password</span>
724
- }
725
- }
726
- <span class="cstat-no" title="statement not covered" > ctx.body = paginated</span>
727
- }
728
- &nbsp;
729
- // called internally by app server user fetch
730
- export const fetch = <span class="fstat-no" title="function not covered" >async (c</span>tx: any) =&gt; {
731
- const all = <span class="cstat-no" title="statement not covered" >await sdk.users.allUsers()</span>
732
- // user hashed password shouldn't ever be returned
733
- <span class="cstat-no" title="statement not covered" > for (let user of all) {</span>
734
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (user) {</span>
735
- <span class="cstat-no" title="statement not covered" > delete user.password</span>
736
- }
737
- }
738
- <span class="cstat-no" title="statement not covered" > ctx.body = all</span>
739
- }
740
- &nbsp;
741
- // called internally by app server user find
742
- export const find = async (ctx: any) =&gt; {
743
- ctx.body = await sdk.users.getUser(ctx.params.id)
744
- }
745
- &nbsp;
746
- export const tenantUserLookup = <span class="fstat-no" title="function not covered" >async (c</span>tx: any) =&gt; {
747
- const id = <span class="cstat-no" title="statement not covered" >ctx.params.id</span>
748
- const user = <span class="cstat-no" title="statement not covered" >await sdk.users.getPlatformUser(id)</span>
749
- <span class="cstat-no" title="statement not covered" > if (user) {</span>
750
- <span class="cstat-no" title="statement not covered" > ctx.body = user</span>
751
- } else {
752
- <span class="cstat-no" title="statement not covered" > ctx.throw(400, "No tenant user found.")</span>
753
- }
754
- }
755
- &nbsp;
756
- export const invite = async (ctx: any) =&gt; {
757
- const request = ctx.request.body as InviteUserRequest
758
- const response = await sdk.users.invite([request])
759
- &nbsp;
760
- // explicitly throw for single user invite
761
- if (response.unsuccessful.length) {
762
- const reason = response.unsuccessful[0].reason
763
- if (reason === "Unavailable") {
764
- ctx.throw(400, reason)
765
- } else <span class="missing-if-branch" title="else path not taken" >E</span>{
766
- <span class="cstat-no" title="statement not covered" > ctx.throw(500, reason)</span>
767
- }
768
- }
769
- &nbsp;
770
- ctx.body = {
771
- message: "Invitation has been sent.",
772
- }
773
- }
774
- &nbsp;
775
- export const inviteMultiple = async (ctx: any) =&gt; {
776
- const request = ctx.request.body as InviteUsersRequest
777
- ctx.body = await sdk.users.invite(request)
778
- }
779
- &nbsp;
780
- export const checkInvite = <span class="fstat-no" title="function not covered" >async (c</span>tx: any) =&gt; {
781
- const { code } = <span class="cstat-no" title="statement not covered" >ctx.params</span>
782
- let invite
783
- <span class="cstat-no" title="statement not covered" > try {</span>
784
- <span class="cstat-no" title="statement not covered" > invite = await checkInviteCode(code, false)</span>
785
- } catch (e) {
786
- <span class="cstat-no" title="statement not covered" > ctx.throw(400, "There was a problem with the invite")</span>
787
- }
788
- <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
789
- email: invite.email,
790
- }
791
- }
792
- &nbsp;
793
- export const inviteAccept = async (ctx: any) =&gt; {
794
- const { inviteCode, password, firstName, lastName } = ctx.request.body
795
- try {
796
- // info is an extension of the user object that was stored by global
797
- const { email, info }: any = await checkInviteCode(inviteCode)
798
- ctx.body = await tenancy.doInTenant(info.tenantId, async () =&gt; {
799
- const saved = await sdk.users.save({
800
- firstName,
801
- lastName,
802
- password,
803
- email,
804
- ...info,
805
- })
806
- const db = tenancy.getGlobalDB()
807
- const user = await db.get(saved._id)
808
- await events.user.inviteAccepted(user)
809
- return saved
810
- })
811
- } catch (err: any) {
812
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (err.code === errors.codes.USAGE_LIMIT_EXCEEDED) {</span>
813
- // explicitly re-throw limit exceeded errors
814
- <span class="cstat-no" title="statement not covered" > ctx.throw(400, err)</span>
815
- }
816
- <span class="cstat-no" title="statement not covered" > ctx.throw(400, "Unable to create new user, invitation invalid.")</span>
817
- }
818
- }
819
- &nbsp;</pre></td></tr></table></pre>
820
-
821
- <div class='push'></div><!-- for sticky footer -->
822
- </div><!-- /wrapper -->
823
- <div class='footer quiet pad2 space-top1 center small'>
824
- Code coverage generated by
825
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
826
- at Wed Feb 15 2023 12:55:13 GMT+0000 (Coordinated Universal Time)
827
- </div>
828
- <script src="../../../../prettify.js"></script>
829
- <script>
830
- window.onload = function () {
831
- prettyPrint();
832
- };
833
- </script>
834
- <script src="../../../../sorter.js"></script>
835
- <script src="../../../../block-navigation.js"></script>
836
- </body>
837
- </html>
838
-