@budibase/worker 2.3.17 → 2.3.18-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 (166) 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 +10 -7
  5. package/scripts/dev/manage.js +1 -0
  6. package/src/api/controllers/global/auth.ts +77 -70
  7. package/src/api/controllers/global/self.ts +28 -44
  8. package/src/api/controllers/global/users.ts +65 -25
  9. package/src/api/controllers/system/accounts.ts +7 -5
  10. package/src/api/controllers/system/tenants.ts +4 -8
  11. package/src/api/index.ts +4 -20
  12. package/src/api/routes/global/auth.ts +10 -7
  13. package/src/api/routes/global/tests/auth.spec.ts +226 -17
  14. package/src/api/routes/global/tests/configs.spec.ts +5 -5
  15. package/src/api/routes/global/tests/roles.spec.ts +20 -14
  16. package/src/api/routes/global/tests/self.spec.ts +3 -4
  17. package/src/api/routes/global/tests/users.spec.ts +24 -27
  18. package/src/api/routes/system/tenants.ts +1 -1
  19. package/src/api/routes/system/tests/accounts.spec.ts +4 -4
  20. package/src/api/routes/system/tests/migrations.spec.ts +2 -2
  21. package/src/api/routes/system/tests/restore.spec.ts +2 -2
  22. package/src/api/routes/system/tests/status.spec.ts +5 -5
  23. package/src/ddApm.ts +7 -0
  24. package/src/elasticApm.ts +10 -0
  25. package/src/environment.ts +15 -1
  26. package/src/index.ts +12 -7
  27. package/src/middleware/tests/tenancy.spec.ts +4 -4
  28. package/src/migrations/functions/globalInfoSyncUsers.ts +4 -3
  29. package/src/sdk/accounts/index.ts +2 -1
  30. package/src/sdk/accounts/{accounts.ts → metadata.ts} +0 -1
  31. package/src/sdk/auth/auth.ts +86 -0
  32. package/src/sdk/auth/index.ts +1 -0
  33. package/src/sdk/tenants/index.ts +1 -0
  34. package/src/sdk/tenants/tenants.ts +76 -0
  35. package/src/sdk/users/events.ts +4 -0
  36. package/src/sdk/users/index.ts +1 -0
  37. package/src/sdk/users/tests/users.spec.ts +52 -0
  38. package/src/sdk/users/users.ts +53 -46
  39. package/src/tests/TestConfiguration.ts +41 -62
  40. package/src/tests/api/auth.ts +42 -14
  41. package/src/tests/api/base.ts +2 -1
  42. package/src/tests/api/configs.ts +2 -2
  43. package/src/tests/api/restore.ts +1 -0
  44. package/src/tests/api/users.ts +2 -2
  45. package/src/tests/jestEnv.ts +2 -1
  46. package/src/tests/jestSetup.ts +10 -6
  47. package/src/tests/logging.ts +34 -0
  48. package/src/tests/structures/index.ts +0 -4
  49. package/src/utilities/email.ts +3 -3
  50. package/coverage/clover.xml +0 -2199
  51. package/coverage/coverage-final.json +0 -84
  52. package/coverage/lcov-report/base.css +0 -224
  53. package/coverage/lcov-report/block-navigation.js +0 -87
  54. package/coverage/lcov-report/favicon.png +0 -0
  55. package/coverage/lcov-report/index.html +0 -431
  56. package/coverage/lcov-report/prettify.css +0 -1
  57. package/coverage/lcov-report/prettify.js +0 -2
  58. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  59. package/coverage/lcov-report/sorter.js +0 -196
  60. package/coverage/lcov-report/src/api/controllers/global/auth.ts.html +0 -934
  61. package/coverage/lcov-report/src/api/controllers/global/configs.ts.html +0 -1348
  62. package/coverage/lcov-report/src/api/controllers/global/email.ts.html +0 -196
  63. package/coverage/lcov-report/src/api/controllers/global/events.ts.html +0 -136
  64. package/coverage/lcov-report/src/api/controllers/global/index.html +0 -251
  65. package/coverage/lcov-report/src/api/controllers/global/license.ts.html +0 -187
  66. package/coverage/lcov-report/src/api/controllers/global/roles.ts.html +0 -283
  67. package/coverage/lcov-report/src/api/controllers/global/self.ts.html +0 -577
  68. package/coverage/lcov-report/src/api/controllers/global/templates.ts.html +0 -316
  69. package/coverage/lcov-report/src/api/controllers/global/users.ts.html +0 -838
  70. package/coverage/lcov-report/src/api/controllers/global/workspaces.ts.html +0 -244
  71. package/coverage/lcov-report/src/api/controllers/system/accounts.ts.html +0 -148
  72. package/coverage/lcov-report/src/api/controllers/system/environment.ts.html +0 -124
  73. package/coverage/lcov-report/src/api/controllers/system/index.html +0 -191
  74. package/coverage/lcov-report/src/api/controllers/system/migrations.ts.html +0 -124
  75. package/coverage/lcov-report/src/api/controllers/system/restore.ts.html +0 -124
  76. package/coverage/lcov-report/src/api/controllers/system/status.ts.html +0 -133
  77. package/coverage/lcov-report/src/api/controllers/system/tenants.ts.html +0 -154
  78. package/coverage/lcov-report/src/api/index.html +0 -116
  79. package/coverage/lcov-report/src/api/index.ts.html +0 -595
  80. package/coverage/lcov-report/src/api/routes/global/auth.ts.html +0 -349
  81. package/coverage/lcov-report/src/api/routes/global/configs.ts.html +0 -457
  82. package/coverage/lcov-report/src/api/routes/global/email.ts.html +0 -193
  83. package/coverage/lcov-report/src/api/routes/global/events.ts.html +0 -109
  84. package/coverage/lcov-report/src/api/routes/global/index.html +0 -251
  85. package/coverage/lcov-report/src/api/routes/global/license.ts.html +0 -124
  86. package/coverage/lcov-report/src/api/routes/global/roles.ts.html +0 -133
  87. package/coverage/lcov-report/src/api/routes/global/self.ts.html +0 -139
  88. package/coverage/lcov-report/src/api/routes/global/templates.ts.html +0 -196
  89. package/coverage/lcov-report/src/api/routes/global/users.ts.html +0 -475
  90. package/coverage/lcov-report/src/api/routes/global/workspaces.ts.html +0 -196
  91. package/coverage/lcov-report/src/api/routes/index.html +0 -116
  92. package/coverage/lcov-report/src/api/routes/index.ts.html +0 -202
  93. package/coverage/lcov-report/src/api/routes/system/accounts.ts.html +0 -142
  94. package/coverage/lcov-report/src/api/routes/system/environment.ts.html +0 -109
  95. package/coverage/lcov-report/src/api/routes/system/index.html +0 -191
  96. package/coverage/lcov-report/src/api/routes/system/migrations.ts.html +0 -142
  97. package/coverage/lcov-report/src/api/routes/system/restore.ts.html +0 -109
  98. package/coverage/lcov-report/src/api/routes/system/status.ts.html +0 -109
  99. package/coverage/lcov-report/src/api/routes/system/tenants.ts.html +0 -124
  100. package/coverage/lcov-report/src/api/routes/validation/index.html +0 -131
  101. package/coverage/lcov-report/src/api/routes/validation/index.ts.html +0 -88
  102. package/coverage/lcov-report/src/api/routes/validation/users.ts.html +0 -235
  103. package/coverage/lcov-report/src/constants/index.html +0 -116
  104. package/coverage/lcov-report/src/constants/index.ts.html +0 -637
  105. package/coverage/lcov-report/src/constants/templates/index.html +0 -116
  106. package/coverage/lcov-report/src/constants/templates/index.ts.html +0 -316
  107. package/coverage/lcov-report/src/db/index.html +0 -116
  108. package/coverage/lcov-report/src/db/index.ts.html +0 -115
  109. package/coverage/lcov-report/src/environment.ts.html +0 -388
  110. package/coverage/lcov-report/src/index.html +0 -131
  111. package/coverage/lcov-report/src/index.ts.html +0 -394
  112. package/coverage/lcov-report/src/middleware/cloudRestricted.ts.html +0 -139
  113. package/coverage/lcov-report/src/middleware/index.html +0 -116
  114. package/coverage/lcov-report/src/migrations/functions/globalInfoSyncUsers.ts.html +0 -145
  115. package/coverage/lcov-report/src/migrations/functions/index.html +0 -116
  116. package/coverage/lcov-report/src/migrations/index.html +0 -116
  117. package/coverage/lcov-report/src/migrations/index.ts.html +0 -271
  118. package/coverage/lcov-report/src/sdk/accounts/accounts.ts.html +0 -262
  119. package/coverage/lcov-report/src/sdk/accounts/index.html +0 -131
  120. package/coverage/lcov-report/src/sdk/accounts/index.ts.html +0 -88
  121. package/coverage/lcov-report/src/sdk/index.html +0 -116
  122. package/coverage/lcov-report/src/sdk/index.ts.html +0 -106
  123. package/coverage/lcov-report/src/sdk/users/events.ts.html +0 -601
  124. package/coverage/lcov-report/src/sdk/users/index.html +0 -146
  125. package/coverage/lcov-report/src/sdk/users/index.ts.html +0 -88
  126. package/coverage/lcov-report/src/sdk/users/users.ts.html +0 -1999
  127. package/coverage/lcov-report/src/tests/TestConfiguration.ts.html +0 -1075
  128. package/coverage/lcov-report/src/tests/api/accounts.ts.html +0 -160
  129. package/coverage/lcov-report/src/tests/api/auth.ts.html +0 -220
  130. package/coverage/lcov-report/src/tests/api/base.ts.html +0 -133
  131. package/coverage/lcov-report/src/tests/api/configs.ts.html +0 -226
  132. package/coverage/lcov-report/src/tests/api/email.ts.html +0 -148
  133. package/coverage/lcov-report/src/tests/api/environment.ts.html +0 -130
  134. package/coverage/lcov-report/src/tests/api/groups.ts.html +0 -163
  135. package/coverage/lcov-report/src/tests/api/index.html +0 -356
  136. package/coverage/lcov-report/src/tests/api/index.ts.html +0 -238
  137. package/coverage/lcov-report/src/tests/api/license.ts.html +0 -136
  138. package/coverage/lcov-report/src/tests/api/migrations.ts.html +0 -151
  139. package/coverage/lcov-report/src/tests/api/restore.ts.html +0 -127
  140. package/coverage/lcov-report/src/tests/api/roles.ts.html +0 -181
  141. package/coverage/lcov-report/src/tests/api/self.ts.html +0 -163
  142. package/coverage/lcov-report/src/tests/api/status.ts.html +0 -121
  143. package/coverage/lcov-report/src/tests/api/templates.ts.html +0 -175
  144. package/coverage/lcov-report/src/tests/api/tenants.ts.html +0 -130
  145. package/coverage/lcov-report/src/tests/api/users.ts.html +0 -514
  146. package/coverage/lcov-report/src/tests/controllers.ts.html +0 -100
  147. package/coverage/lcov-report/src/tests/index.html +0 -146
  148. package/coverage/lcov-report/src/tests/index.ts.html +0 -103
  149. package/coverage/lcov-report/src/tests/mocks/email.ts.html +0 -115
  150. package/coverage/lcov-report/src/tests/mocks/index.html +0 -131
  151. package/coverage/lcov-report/src/tests/mocks/index.ts.html +0 -106
  152. package/coverage/lcov-report/src/tests/structures/configs.ts.html +0 -313
  153. package/coverage/lcov-report/src/tests/structures/groups.ts.html +0 -118
  154. package/coverage/lcov-report/src/tests/structures/index.html +0 -161
  155. package/coverage/lcov-report/src/tests/structures/index.ts.html +0 -151
  156. package/coverage/lcov-report/src/tests/structures/users.ts.html +0 -196
  157. package/coverage/lcov-report/src/utilities/appService.ts.html +0 -208
  158. package/coverage/lcov-report/src/utilities/email.ts.html +0 -850
  159. package/coverage/lcov-report/src/utilities/fileSystem.ts.html +0 -100
  160. package/coverage/lcov-report/src/utilities/index.html +0 -206
  161. package/coverage/lcov-report/src/utilities/index.ts.html +0 -112
  162. package/coverage/lcov-report/src/utilities/redis.ts.html +0 -424
  163. package/coverage/lcov-report/src/utilities/templates.ts.html +0 -232
  164. package/coverage/lcov-report/src/utilities/users.ts.html +0 -133
  165. package/coverage/lcov.info +0 -4187
  166. package/src/tests/structures/users.ts +0 -37
@@ -1,1348 +0,0 @@
1
-
2
- <!doctype html>
3
- <html lang="en">
4
-
5
- <head>
6
- <title>Code coverage report for src/api/controllers/global/configs.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> configs.ts</h1>
23
- <div class='clearfix'>
24
-
25
- <div class='fl pad1y space-right2'>
26
- <span class="strong">67.97% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>121/178</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">68.47% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>63/92</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">77.41% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>24/31</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">66.86% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>111/166</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>
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>
322
- <a name='L257'></a><a href='#L257'>257</a>
323
- <a name='L258'></a><a href='#L258'>258</a>
324
- <a name='L259'></a><a href='#L259'>259</a>
325
- <a name='L260'></a><a href='#L260'>260</a>
326
- <a name='L261'></a><a href='#L261'>261</a>
327
- <a name='L262'></a><a href='#L262'>262</a>
328
- <a name='L263'></a><a href='#L263'>263</a>
329
- <a name='L264'></a><a href='#L264'>264</a>
330
- <a name='L265'></a><a href='#L265'>265</a>
331
- <a name='L266'></a><a href='#L266'>266</a>
332
- <a name='L267'></a><a href='#L267'>267</a>
333
- <a name='L268'></a><a href='#L268'>268</a>
334
- <a name='L269'></a><a href='#L269'>269</a>
335
- <a name='L270'></a><a href='#L270'>270</a>
336
- <a name='L271'></a><a href='#L271'>271</a>
337
- <a name='L272'></a><a href='#L272'>272</a>
338
- <a name='L273'></a><a href='#L273'>273</a>
339
- <a name='L274'></a><a href='#L274'>274</a>
340
- <a name='L275'></a><a href='#L275'>275</a>
341
- <a name='L276'></a><a href='#L276'>276</a>
342
- <a name='L277'></a><a href='#L277'>277</a>
343
- <a name='L278'></a><a href='#L278'>278</a>
344
- <a name='L279'></a><a href='#L279'>279</a>
345
- <a name='L280'></a><a href='#L280'>280</a>
346
- <a name='L281'></a><a href='#L281'>281</a>
347
- <a name='L282'></a><a href='#L282'>282</a>
348
- <a name='L283'></a><a href='#L283'>283</a>
349
- <a name='L284'></a><a href='#L284'>284</a>
350
- <a name='L285'></a><a href='#L285'>285</a>
351
- <a name='L286'></a><a href='#L286'>286</a>
352
- <a name='L287'></a><a href='#L287'>287</a>
353
- <a name='L288'></a><a href='#L288'>288</a>
354
- <a name='L289'></a><a href='#L289'>289</a>
355
- <a name='L290'></a><a href='#L290'>290</a>
356
- <a name='L291'></a><a href='#L291'>291</a>
357
- <a name='L292'></a><a href='#L292'>292</a>
358
- <a name='L293'></a><a href='#L293'>293</a>
359
- <a name='L294'></a><a href='#L294'>294</a>
360
- <a name='L295'></a><a href='#L295'>295</a>
361
- <a name='L296'></a><a href='#L296'>296</a>
362
- <a name='L297'></a><a href='#L297'>297</a>
363
- <a name='L298'></a><a href='#L298'>298</a>
364
- <a name='L299'></a><a href='#L299'>299</a>
365
- <a name='L300'></a><a href='#L300'>300</a>
366
- <a name='L301'></a><a href='#L301'>301</a>
367
- <a name='L302'></a><a href='#L302'>302</a>
368
- <a name='L303'></a><a href='#L303'>303</a>
369
- <a name='L304'></a><a href='#L304'>304</a>
370
- <a name='L305'></a><a href='#L305'>305</a>
371
- <a name='L306'></a><a href='#L306'>306</a>
372
- <a name='L307'></a><a href='#L307'>307</a>
373
- <a name='L308'></a><a href='#L308'>308</a>
374
- <a name='L309'></a><a href='#L309'>309</a>
375
- <a name='L310'></a><a href='#L310'>310</a>
376
- <a name='L311'></a><a href='#L311'>311</a>
377
- <a name='L312'></a><a href='#L312'>312</a>
378
- <a name='L313'></a><a href='#L313'>313</a>
379
- <a name='L314'></a><a href='#L314'>314</a>
380
- <a name='L315'></a><a href='#L315'>315</a>
381
- <a name='L316'></a><a href='#L316'>316</a>
382
- <a name='L317'></a><a href='#L317'>317</a>
383
- <a name='L318'></a><a href='#L318'>318</a>
384
- <a name='L319'></a><a href='#L319'>319</a>
385
- <a name='L320'></a><a href='#L320'>320</a>
386
- <a name='L321'></a><a href='#L321'>321</a>
387
- <a name='L322'></a><a href='#L322'>322</a>
388
- <a name='L323'></a><a href='#L323'>323</a>
389
- <a name='L324'></a><a href='#L324'>324</a>
390
- <a name='L325'></a><a href='#L325'>325</a>
391
- <a name='L326'></a><a href='#L326'>326</a>
392
- <a name='L327'></a><a href='#L327'>327</a>
393
- <a name='L328'></a><a href='#L328'>328</a>
394
- <a name='L329'></a><a href='#L329'>329</a>
395
- <a name='L330'></a><a href='#L330'>330</a>
396
- <a name='L331'></a><a href='#L331'>331</a>
397
- <a name='L332'></a><a href='#L332'>332</a>
398
- <a name='L333'></a><a href='#L333'>333</a>
399
- <a name='L334'></a><a href='#L334'>334</a>
400
- <a name='L335'></a><a href='#L335'>335</a>
401
- <a name='L336'></a><a href='#L336'>336</a>
402
- <a name='L337'></a><a href='#L337'>337</a>
403
- <a name='L338'></a><a href='#L338'>338</a>
404
- <a name='L339'></a><a href='#L339'>339</a>
405
- <a name='L340'></a><a href='#L340'>340</a>
406
- <a name='L341'></a><a href='#L341'>341</a>
407
- <a name='L342'></a><a href='#L342'>342</a>
408
- <a name='L343'></a><a href='#L343'>343</a>
409
- <a name='L344'></a><a href='#L344'>344</a>
410
- <a name='L345'></a><a href='#L345'>345</a>
411
- <a name='L346'></a><a href='#L346'>346</a>
412
- <a name='L347'></a><a href='#L347'>347</a>
413
- <a name='L348'></a><a href='#L348'>348</a>
414
- <a name='L349'></a><a href='#L349'>349</a>
415
- <a name='L350'></a><a href='#L350'>350</a>
416
- <a name='L351'></a><a href='#L351'>351</a>
417
- <a name='L352'></a><a href='#L352'>352</a>
418
- <a name='L353'></a><a href='#L353'>353</a>
419
- <a name='L354'></a><a href='#L354'>354</a>
420
- <a name='L355'></a><a href='#L355'>355</a>
421
- <a name='L356'></a><a href='#L356'>356</a>
422
- <a name='L357'></a><a href='#L357'>357</a>
423
- <a name='L358'></a><a href='#L358'>358</a>
424
- <a name='L359'></a><a href='#L359'>359</a>
425
- <a name='L360'></a><a href='#L360'>360</a>
426
- <a name='L361'></a><a href='#L361'>361</a>
427
- <a name='L362'></a><a href='#L362'>362</a>
428
- <a name='L363'></a><a href='#L363'>363</a>
429
- <a name='L364'></a><a href='#L364'>364</a>
430
- <a name='L365'></a><a href='#L365'>365</a>
431
- <a name='L366'></a><a href='#L366'>366</a>
432
- <a name='L367'></a><a href='#L367'>367</a>
433
- <a name='L368'></a><a href='#L368'>368</a>
434
- <a name='L369'></a><a href='#L369'>369</a>
435
- <a name='L370'></a><a href='#L370'>370</a>
436
- <a name='L371'></a><a href='#L371'>371</a>
437
- <a name='L372'></a><a href='#L372'>372</a>
438
- <a name='L373'></a><a href='#L373'>373</a>
439
- <a name='L374'></a><a href='#L374'>374</a>
440
- <a name='L375'></a><a href='#L375'>375</a>
441
- <a name='L376'></a><a href='#L376'>376</a>
442
- <a name='L377'></a><a href='#L377'>377</a>
443
- <a name='L378'></a><a href='#L378'>378</a>
444
- <a name='L379'></a><a href='#L379'>379</a>
445
- <a name='L380'></a><a href='#L380'>380</a>
446
- <a name='L381'></a><a href='#L381'>381</a>
447
- <a name='L382'></a><a href='#L382'>382</a>
448
- <a name='L383'></a><a href='#L383'>383</a>
449
- <a name='L384'></a><a href='#L384'>384</a>
450
- <a name='L385'></a><a href='#L385'>385</a>
451
- <a name='L386'></a><a href='#L386'>386</a>
452
- <a name='L387'></a><a href='#L387'>387</a>
453
- <a name='L388'></a><a href='#L388'>388</a>
454
- <a name='L389'></a><a href='#L389'>389</a>
455
- <a name='L390'></a><a href='#L390'>390</a>
456
- <a name='L391'></a><a href='#L391'>391</a>
457
- <a name='L392'></a><a href='#L392'>392</a>
458
- <a name='L393'></a><a href='#L393'>393</a>
459
- <a name='L394'></a><a href='#L394'>394</a>
460
- <a name='L395'></a><a href='#L395'>395</a>
461
- <a name='L396'></a><a href='#L396'>396</a>
462
- <a name='L397'></a><a href='#L397'>397</a>
463
- <a name='L398'></a><a href='#L398'>398</a>
464
- <a name='L399'></a><a href='#L399'>399</a>
465
- <a name='L400'></a><a href='#L400'>400</a>
466
- <a name='L401'></a><a href='#L401'>401</a>
467
- <a name='L402'></a><a href='#L402'>402</a>
468
- <a name='L403'></a><a href='#L403'>403</a>
469
- <a name='L404'></a><a href='#L404'>404</a>
470
- <a name='L405'></a><a href='#L405'>405</a>
471
- <a name='L406'></a><a href='#L406'>406</a>
472
- <a name='L407'></a><a href='#L407'>407</a>
473
- <a name='L408'></a><a href='#L408'>408</a>
474
- <a name='L409'></a><a href='#L409'>409</a>
475
- <a name='L410'></a><a href='#L410'>410</a>
476
- <a name='L411'></a><a href='#L411'>411</a>
477
- <a name='L412'></a><a href='#L412'>412</a>
478
- <a name='L413'></a><a href='#L413'>413</a>
479
- <a name='L414'></a><a href='#L414'>414</a>
480
- <a name='L415'></a><a href='#L415'>415</a>
481
- <a name='L416'></a><a href='#L416'>416</a>
482
- <a name='L417'></a><a href='#L417'>417</a>
483
- <a name='L418'></a><a href='#L418'>418</a>
484
- <a name='L419'></a><a href='#L419'>419</a>
485
- <a name='L420'></a><a href='#L420'>420</a>
486
- <a name='L421'></a><a href='#L421'>421</a>
487
- <a name='L422'></a><a href='#L422'>422</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">18x</span>
488
- <span class="cline-any cline-yes">18x</span>
489
- <span class="cline-any cline-yes">18x</span>
490
- <span class="cline-any cline-neutral">&nbsp;</span>
491
- <span class="cline-any cline-neutral">&nbsp;</span>
492
- <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
496
- <span class="cline-any cline-neutral">&nbsp;</span>
497
- <span class="cline-any cline-yes">18x</span>
498
- <span class="cline-any cline-yes">18x</span>
499
- <span class="cline-any cline-neutral">&nbsp;</span>
500
- <span class="cline-any cline-neutral">&nbsp;</span>
501
- <span class="cline-any cline-neutral">&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-neutral">&nbsp;</span>
506
- <span class="cline-any cline-neutral">&nbsp;</span>
507
- <span class="cline-any cline-neutral">&nbsp;</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-neutral">&nbsp;</span>
511
- <span class="cline-any cline-neutral">&nbsp;</span>
512
- <span class="cline-any cline-neutral">&nbsp;</span>
513
- <span class="cline-any cline-yes">18x</span>
514
- <span class="cline-any cline-neutral">&nbsp;</span>
515
- <span class="cline-any cline-yes">18x</span>
516
- <span class="cline-any cline-yes">41x</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">41x</span>
520
- <span class="cline-any cline-yes">6x</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-yes">41x</span>
524
- <span class="cline-any cline-yes">35x</span>
525
- <span class="cline-any cline-yes">14x</span>
526
- <span class="cline-any cline-yes">21x</span>
527
- <span class="cline-any cline-yes">4x</span>
528
- <span class="cline-any cline-yes">4x</span>
529
- <span class="cline-any cline-yes">2x</span>
530
- <span class="cline-any cline-neutral">&nbsp;</span>
531
- <span class="cline-any cline-yes">17x</span>
532
- <span class="cline-any cline-yes">6x</span>
533
- <span class="cline-any cline-yes">6x</span>
534
- <span class="cline-any cline-yes">4x</span>
535
- <span class="cline-any cline-neutral">&nbsp;</span>
536
- <span class="cline-any cline-yes">11x</span>
537
- <span class="cline-any cline-neutral">&nbsp;</span>
538
- <span class="cline-any cline-yes">11x</span>
539
- <span class="cline-any cline-yes">11x</span>
540
- <span class="cline-any cline-yes">1x</span>
541
- <span class="cline-any cline-neutral">&nbsp;</span>
542
- <span class="cline-any cline-neutral">&nbsp;</span>
543
- <span class="cline-any cline-neutral">&nbsp;</span>
544
- <span class="cline-any cline-yes">11x</span>
545
- <span class="cline-any cline-yes">11x</span>
546
- <span class="cline-any cline-yes">1x</span>
547
- <span class="cline-any cline-neutral">&nbsp;</span>
548
- <span class="cline-any cline-neutral">&nbsp;</span>
549
- <span class="cline-any cline-neutral">&nbsp;</span>
550
- <span class="cline-any cline-yes">11x</span>
551
- <span class="cline-any cline-yes">11x</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-neutral">&nbsp;</span>
556
- <span class="cline-any cline-yes">1x</span>
557
- <span class="cline-any cline-neutral">&nbsp;</span>
558
- <span class="cline-any cline-neutral">&nbsp;</span>
559
- <span class="cline-any cline-neutral">&nbsp;</span>
560
- <span class="cline-any cline-yes">6x</span>
561
- <span class="cline-any cline-yes">1x</span>
562
- <span class="cline-any cline-yes">5x</span>
563
- <span class="cline-any cline-yes">2x</span>
564
- <span class="cline-any cline-yes">2x</span>
565
- <span class="cline-any cline-yes">1x</span>
566
- <span class="cline-any cline-yes">1x</span>
567
- <span class="cline-any cline-yes">1x</span>
568
- <span class="cline-any cline-neutral">&nbsp;</span>
569
- <span class="cline-any cline-yes">3x</span>
570
- <span class="cline-any cline-yes">2x</span>
571
- <span class="cline-any cline-yes">2x</span>
572
- <span class="cline-any cline-neutral">&nbsp;</span>
573
- <span class="cline-any cline-neutral">&nbsp;</span>
574
- <span class="cline-any cline-neutral">&nbsp;</span>
575
- <span class="cline-any cline-yes">1x</span>
576
- <span class="cline-any cline-yes">1x</span>
577
- <span class="cline-any cline-neutral">&nbsp;</span>
578
- <span class="cline-any cline-neutral">&nbsp;</span>
579
- <span class="cline-any cline-neutral">&nbsp;</span>
580
- <span class="cline-any cline-yes">1x</span>
581
- <span class="cline-any cline-neutral">&nbsp;</span>
582
- <span class="cline-any cline-yes">1x</span>
583
- <span class="cline-any cline-neutral">&nbsp;</span>
584
- <span class="cline-any cline-yes">1x</span>
585
- <span class="cline-any cline-yes">1x</span>
586
- <span class="cline-any cline-yes">1x</span>
587
- <span class="cline-any cline-yes">1x</span>
588
- <span class="cline-any cline-neutral">&nbsp;</span>
589
- <span class="cline-any cline-neutral">&nbsp;</span>
590
- <span class="cline-any cline-neutral">&nbsp;</span>
591
- <span class="cline-any cline-yes">1x</span>
592
- <span class="cline-any cline-yes">1x</span>
593
- <span class="cline-any cline-yes">1x</span>
594
- <span class="cline-any cline-yes">1x</span>
595
- <span class="cline-any cline-neutral">&nbsp;</span>
596
- <span class="cline-any cline-neutral">&nbsp;</span>
597
- <span class="cline-any cline-neutral">&nbsp;</span>
598
- <span class="cline-any cline-yes">1x</span>
599
- <span class="cline-any cline-yes">1x</span>
600
- <span class="cline-any cline-yes">1x</span>
601
- <span class="cline-any cline-neutral">&nbsp;</span>
602
- <span class="cline-any cline-neutral">&nbsp;</span>
603
- <span class="cline-any cline-neutral">&nbsp;</span>
604
- <span class="cline-any cline-neutral">&nbsp;</span>
605
- <span class="cline-any cline-neutral">&nbsp;</span>
606
- <span class="cline-any cline-yes">1x</span>
607
- <span class="cline-any cline-neutral">&nbsp;</span>
608
- <span class="cline-any cline-neutral">&nbsp;</span>
609
- <span class="cline-any cline-neutral">&nbsp;</span>
610
- <span class="cline-any cline-neutral">&nbsp;</span>
611
- <span class="cline-any cline-yes">41x</span>
612
- <span class="cline-any cline-neutral">&nbsp;</span>
613
- <span class="cline-any cline-neutral">&nbsp;</span>
614
- <span class="cline-any cline-yes">40x</span>
615
- <span class="cline-any cline-yes">41x</span>
616
- <span class="cline-any cline-yes">41x</span>
617
- <span class="cline-any cline-yes">41x</span>
618
- <span class="cline-any cline-neutral">&nbsp;</span>
619
- <span class="cline-any cline-yes">41x</span>
620
- <span class="cline-any cline-yes">35x</span>
621
- <span class="cline-any cline-neutral">&nbsp;</span>
622
- <span class="cline-any cline-neutral">&nbsp;</span>
623
- <span class="cline-any cline-neutral">&nbsp;</span>
624
- <span class="cline-any cline-neutral">&nbsp;</span>
625
- <span class="cline-any cline-neutral">&nbsp;</span>
626
- <span class="cline-any cline-yes">41x</span>
627
- <span class="cline-any cline-neutral">&nbsp;</span>
628
- <span class="cline-any cline-yes">41x</span>
629
- <span class="cline-any cline-neutral">&nbsp;</span>
630
- <span class="cline-any cline-yes">15x</span>
631
- <span class="cline-any cline-yes">12x</span>
632
- <span class="cline-any cline-neutral">&nbsp;</span>
633
- <span class="cline-any cline-neutral">&nbsp;</span>
634
- <span class="cline-any cline-yes">3x</span>
635
- <span class="cline-any cline-neutral">&nbsp;</span>
636
- <span class="cline-any cline-neutral">&nbsp;</span>
637
- <span class="cline-any cline-yes">38x</span>
638
- <span class="cline-any cline-yes">38x</span>
639
- <span class="cline-any cline-yes">38x</span>
640
- <span class="cline-any cline-yes">38x</span>
641
- <span class="cline-any cline-neutral">&nbsp;</span>
642
- <span class="cline-any cline-yes">38x</span>
643
- <span class="cline-any cline-yes">42x</span>
644
- <span class="cline-any cline-neutral">&nbsp;</span>
645
- <span class="cline-any cline-neutral">&nbsp;</span>
646
- <span class="cline-any cline-yes">38x</span>
647
- <span class="cline-any cline-neutral">&nbsp;</span>
648
- <span class="cline-any cline-neutral">&nbsp;</span>
649
- <span class="cline-any cline-neutral">&nbsp;</span>
650
- <span class="cline-any cline-neutral">&nbsp;</span>
651
- <span class="cline-any cline-neutral">&nbsp;</span>
652
- <span class="cline-any cline-no">&nbsp;</span>
653
- <span class="cline-any cline-neutral">&nbsp;</span>
654
- <span class="cline-any cline-neutral">&nbsp;</span>
655
- <span class="cline-any cline-neutral">&nbsp;</span>
656
- <span class="cline-any cline-yes">36x</span>
657
- <span class="cline-any cline-no">&nbsp;</span>
658
- <span class="cline-any cline-no">&nbsp;</span>
659
- <span class="cline-any cline-neutral">&nbsp;</span>
660
- <span class="cline-any cline-neutral">&nbsp;</span>
661
- <span class="cline-any cline-neutral">&nbsp;</span>
662
- <span class="cline-any cline-neutral">&nbsp;</span>
663
- <span class="cline-any cline-neutral">&nbsp;</span>
664
- <span class="cline-any cline-neutral">&nbsp;</span>
665
- <span class="cline-any cline-neutral">&nbsp;</span>
666
- <span class="cline-any cline-no">&nbsp;</span>
667
- <span class="cline-any cline-neutral">&nbsp;</span>
668
- <span class="cline-any cline-neutral">&nbsp;</span>
669
- <span class="cline-any cline-neutral">&nbsp;</span>
670
- <span class="cline-any cline-neutral">&nbsp;</span>
671
- <span class="cline-any cline-neutral">&nbsp;</span>
672
- <span class="cline-any cline-neutral">&nbsp;</span>
673
- <span class="cline-any cline-yes">54x</span>
674
- <span class="cline-any cline-yes">36x</span>
675
- <span class="cline-any cline-neutral">&nbsp;</span>
676
- <span class="cline-any cline-yes">36x</span>
677
- <span class="cline-any cline-yes">36x</span>
678
- <span class="cline-any cline-no">&nbsp;</span>
679
- <span class="cline-any cline-no">&nbsp;</span>
680
- <span class="cline-any cline-no">&nbsp;</span>
681
- <span class="cline-any cline-neutral">&nbsp;</span>
682
- <span class="cline-any cline-no">&nbsp;</span>
683
- <span class="cline-any cline-no">&nbsp;</span>
684
- <span class="cline-any cline-neutral">&nbsp;</span>
685
- <span class="cline-any cline-neutral">&nbsp;</span>
686
- <span class="cline-any cline-neutral">&nbsp;</span>
687
- <span class="cline-any cline-yes">36x</span>
688
- <span class="cline-any cline-neutral">&nbsp;</span>
689
- <span class="cline-any cline-yes">36x</span>
690
- <span class="cline-any cline-neutral">&nbsp;</span>
691
- <span class="cline-any cline-neutral">&nbsp;</span>
692
- <span class="cline-any cline-neutral">&nbsp;</span>
693
- <span class="cline-any cline-neutral">&nbsp;</span>
694
- <span class="cline-any cline-neutral">&nbsp;</span>
695
- <span class="cline-any cline-yes">36x</span>
696
- <span class="cline-any cline-yes">27x</span>
697
- <span class="cline-any cline-neutral">&nbsp;</span>
698
- <span class="cline-any cline-neutral">&nbsp;</span>
699
- <span class="cline-any cline-yes">9x</span>
700
- <span class="cline-any cline-neutral">&nbsp;</span>
701
- <span class="cline-any cline-neutral">&nbsp;</span>
702
- <span class="cline-any cline-no">&nbsp;</span>
703
- <span class="cline-any cline-neutral">&nbsp;</span>
704
- <span class="cline-any cline-neutral">&nbsp;</span>
705
- <span class="cline-any cline-neutral">&nbsp;</span>
706
- <span class="cline-any cline-yes">18x</span>
707
- <span class="cline-any cline-no">&nbsp;</span>
708
- <span class="cline-any cline-no">&nbsp;</span>
709
- <span class="cline-any cline-neutral">&nbsp;</span>
710
- <span class="cline-any cline-no">&nbsp;</span>
711
- <span class="cline-any cline-neutral">&nbsp;</span>
712
- <span class="cline-any cline-neutral">&nbsp;</span>
713
- <span class="cline-any cline-neutral">&nbsp;</span>
714
- <span class="cline-any cline-no">&nbsp;</span>
715
- <span class="cline-any cline-no">&nbsp;</span>
716
- <span class="cline-any cline-neutral">&nbsp;</span>
717
- <span class="cline-any cline-no">&nbsp;</span>
718
- <span class="cline-any cline-neutral">&nbsp;</span>
719
- <span class="cline-any cline-neutral">&nbsp;</span>
720
- <span class="cline-any cline-neutral">&nbsp;</span>
721
- <span class="cline-any cline-neutral">&nbsp;</span>
722
- <span class="cline-any cline-neutral">&nbsp;</span>
723
- <span class="cline-any cline-neutral">&nbsp;</span>
724
- <span class="cline-any cline-no">&nbsp;</span>
725
- <span class="cline-any cline-neutral">&nbsp;</span>
726
- <span class="cline-any cline-neutral">&nbsp;</span>
727
- <span class="cline-any cline-neutral">&nbsp;</span>
728
- <span class="cline-any cline-yes">18x</span>
729
- <span class="cline-any cline-no">&nbsp;</span>
730
- <span class="cline-any cline-neutral">&nbsp;</span>
731
- <span class="cline-any cline-no">&nbsp;</span>
732
- <span class="cline-any cline-neutral">&nbsp;</span>
733
- <span class="cline-any cline-no">&nbsp;</span>
734
- <span class="cline-any cline-neutral">&nbsp;</span>
735
- <span class="cline-any cline-neutral">&nbsp;</span>
736
- <span class="cline-any cline-neutral">&nbsp;</span>
737
- <span class="cline-any cline-no">&nbsp;</span>
738
- <span class="cline-any cline-neutral">&nbsp;</span>
739
- <span class="cline-any cline-neutral">&nbsp;</span>
740
- <span class="cline-any cline-neutral">&nbsp;</span>
741
- <span class="cline-any cline-no">&nbsp;</span>
742
- <span class="cline-any cline-neutral">&nbsp;</span>
743
- <span class="cline-any cline-neutral">&nbsp;</span>
744
- <span class="cline-any cline-neutral">&nbsp;</span>
745
- <span class="cline-any cline-neutral">&nbsp;</span>
746
- <span class="cline-any cline-no">&nbsp;</span>
747
- <span class="cline-any cline-no">&nbsp;</span>
748
- <span class="cline-any cline-neutral">&nbsp;</span>
749
- <span class="cline-any cline-neutral">&nbsp;</span>
750
- <span class="cline-any cline-neutral">&nbsp;</span>
751
- <span class="cline-any cline-no">&nbsp;</span>
752
- <span class="cline-any cline-neutral">&nbsp;</span>
753
- <span class="cline-any cline-neutral">&nbsp;</span>
754
- <span class="cline-any cline-neutral">&nbsp;</span>
755
- <span class="cline-any cline-neutral">&nbsp;</span>
756
- <span class="cline-any cline-no">&nbsp;</span>
757
- <span class="cline-any cline-no">&nbsp;</span>
758
- <span class="cline-any cline-neutral">&nbsp;</span>
759
- <span class="cline-any cline-neutral">&nbsp;</span>
760
- <span class="cline-any cline-neutral">&nbsp;</span>
761
- <span class="cline-any cline-neutral">&nbsp;</span>
762
- <span class="cline-any cline-neutral">&nbsp;</span>
763
- <span class="cline-any cline-neutral">&nbsp;</span>
764
- <span class="cline-any cline-neutral">&nbsp;</span>
765
- <span class="cline-any cline-no">&nbsp;</span>
766
- <span class="cline-any cline-neutral">&nbsp;</span>
767
- <span class="cline-any cline-no">&nbsp;</span>
768
- <span class="cline-any cline-neutral">&nbsp;</span>
769
- <span class="cline-any cline-neutral">&nbsp;</span>
770
- <span class="cline-any cline-no">&nbsp;</span>
771
- <span class="cline-any cline-neutral">&nbsp;</span>
772
- <span class="cline-any cline-neutral">&nbsp;</span>
773
- <span class="cline-any cline-neutral">&nbsp;</span>
774
- <span class="cline-any cline-no">&nbsp;</span>
775
- <span class="cline-any cline-no">&nbsp;</span>
776
- <span class="cline-any cline-neutral">&nbsp;</span>
777
- <span class="cline-any cline-neutral">&nbsp;</span>
778
- <span class="cline-any cline-no">&nbsp;</span>
779
- <span class="cline-any cline-no">&nbsp;</span>
780
- <span class="cline-any cline-neutral">&nbsp;</span>
781
- <span class="cline-any cline-no">&nbsp;</span>
782
- <span class="cline-any cline-neutral">&nbsp;</span>
783
- <span class="cline-any cline-neutral">&nbsp;</span>
784
- <span class="cline-any cline-no">&nbsp;</span>
785
- <span class="cline-any cline-neutral">&nbsp;</span>
786
- <span class="cline-any cline-no">&nbsp;</span>
787
- <span class="cline-any cline-neutral">&nbsp;</span>
788
- <span class="cline-any cline-neutral">&nbsp;</span>
789
- <span class="cline-any cline-neutral">&nbsp;</span>
790
- <span class="cline-any cline-yes">18x</span>
791
- <span class="cline-any cline-no">&nbsp;</span>
792
- <span class="cline-any cline-no">&nbsp;</span>
793
- <span class="cline-any cline-neutral">&nbsp;</span>
794
- <span class="cline-any cline-no">&nbsp;</span>
795
- <span class="cline-any cline-no">&nbsp;</span>
796
- <span class="cline-any cline-neutral">&nbsp;</span>
797
- <span class="cline-any cline-no">&nbsp;</span>
798
- <span class="cline-any cline-no">&nbsp;</span>
799
- <span class="cline-any cline-neutral">&nbsp;</span>
800
- <span class="cline-any cline-no">&nbsp;</span>
801
- <span class="cline-any cline-neutral">&nbsp;</span>
802
- <span class="cline-any cline-neutral">&nbsp;</span>
803
- <span class="cline-any cline-neutral">&nbsp;</span>
804
- <span class="cline-any cline-neutral">&nbsp;</span>
805
- <span class="cline-any cline-neutral">&nbsp;</span>
806
- <span class="cline-any cline-neutral">&nbsp;</span>
807
- <span class="cline-any cline-neutral">&nbsp;</span>
808
- <span class="cline-any cline-neutral">&nbsp;</span>
809
- <span class="cline-any cline-no">&nbsp;</span>
810
- <span class="cline-any cline-no">&nbsp;</span>
811
- <span class="cline-any cline-no">&nbsp;</span>
812
- <span class="cline-any cline-no">&nbsp;</span>
813
- <span class="cline-any cline-neutral">&nbsp;</span>
814
- <span class="cline-any cline-neutral">&nbsp;</span>
815
- <span class="cline-any cline-neutral">&nbsp;</span>
816
- <span class="cline-any cline-neutral">&nbsp;</span>
817
- <span class="cline-any cline-neutral">&nbsp;</span>
818
- <span class="cline-any cline-neutral">&nbsp;</span>
819
- <span class="cline-any cline-no">&nbsp;</span>
820
- <span class="cline-any cline-no">&nbsp;</span>
821
- <span class="cline-any cline-no">&nbsp;</span>
822
- <span class="cline-any cline-neutral">&nbsp;</span>
823
- <span class="cline-any cline-neutral">&nbsp;</span>
824
- <span class="cline-any cline-neutral">&nbsp;</span>
825
- <span class="cline-any cline-no">&nbsp;</span>
826
- <span class="cline-any cline-neutral">&nbsp;</span>
827
- <span class="cline-any cline-neutral">&nbsp;</span>
828
- <span class="cline-any cline-no">&nbsp;</span>
829
- <span class="cline-any cline-neutral">&nbsp;</span>
830
- <span class="cline-any cline-no">&nbsp;</span>
831
- <span class="cline-any cline-neutral">&nbsp;</span>
832
- <span class="cline-any cline-neutral">&nbsp;</span>
833
- <span class="cline-any cline-neutral">&nbsp;</span>
834
- <span class="cline-any cline-neutral">&nbsp;</span>
835
- <span class="cline-any cline-neutral">&nbsp;</span>
836
- <span class="cline-any cline-yes">54x</span>
837
- <span class="cline-any cline-yes">36x</span>
838
- <span class="cline-any cline-yes">36x</span>
839
- <span class="cline-any cline-yes">36x</span>
840
- <span class="cline-any cline-yes">36x</span>
841
- <span class="cline-any cline-yes">23x</span>
842
- <span class="cline-any cline-yes">23x</span>
843
- <span class="cline-any cline-neutral">&nbsp;</span>
844
- <span class="cline-any cline-yes">13x</span>
845
- <span class="cline-any cline-neutral">&nbsp;</span>
846
- <span class="cline-any cline-neutral">&nbsp;</span>
847
- <span class="cline-any cline-neutral">&nbsp;</span>
848
- <span class="cline-any cline-yes">18x</span>
849
- <span class="cline-any cline-yes">4x</span>
850
- <span class="cline-any cline-yes">4x</span>
851
- <span class="cline-any cline-neutral">&nbsp;</span>
852
- <span class="cline-any cline-yes">4x</span>
853
- <span class="cline-any cline-yes">4x</span>
854
- <span class="cline-any cline-neutral">&nbsp;</span>
855
- <span class="cline-any cline-neutral">&nbsp;</span>
856
- <span class="cline-any cline-neutral">&nbsp;</span>
857
- <span class="cline-any cline-yes">4x</span>
858
- <span class="cline-any cline-yes">4x</span>
859
- <span class="cline-any cline-neutral">&nbsp;</span>
860
- <span class="cline-any cline-yes">4x</span>
861
- <span class="cline-any cline-neutral">&nbsp;</span>
862
- <span class="cline-any cline-neutral">&nbsp;</span>
863
- <span class="cline-any cline-neutral">&nbsp;</span>
864
- <span class="cline-any cline-yes">4x</span>
865
- <span class="cline-any cline-neutral">&nbsp;</span>
866
- <span class="cline-any cline-neutral">&nbsp;</span>
867
- <span class="cline-any cline-neutral">&nbsp;</span>
868
- <span class="cline-any cline-neutral">&nbsp;</span>
869
- <span class="cline-any cline-yes">4x</span>
870
- <span class="cline-any cline-neutral">&nbsp;</span>
871
- <span class="cline-any cline-neutral">&nbsp;</span>
872
- <span class="cline-any cline-neutral">&nbsp;</span>
873
- <span class="cline-any cline-neutral">&nbsp;</span>
874
- <span class="cline-any cline-yes">4x</span>
875
- <span class="cline-any cline-neutral">&nbsp;</span>
876
- <span class="cline-any cline-neutral">&nbsp;</span>
877
- <span class="cline-any cline-neutral">&nbsp;</span>
878
- <span class="cline-any cline-neutral">&nbsp;</span>
879
- <span class="cline-any cline-yes">4x</span>
880
- <span class="cline-any cline-yes">4x</span>
881
- <span class="cline-any cline-neutral">&nbsp;</span>
882
- <span class="cline-any cline-neutral">&nbsp;</span>
883
- <span class="cline-any cline-neutral">&nbsp;</span>
884
- <span class="cline-any cline-neutral">&nbsp;</span>
885
- <span class="cline-any cline-neutral">&nbsp;</span>
886
- <span class="cline-any cline-neutral">&nbsp;</span>
887
- <span class="cline-any cline-neutral">&nbsp;</span>
888
- <span class="cline-any cline-neutral">&nbsp;</span>
889
- <span class="cline-any cline-neutral">&nbsp;</span>
890
- <span class="cline-any cline-neutral">&nbsp;</span>
891
- <span class="cline-any cline-neutral">&nbsp;</span>
892
- <span class="cline-any cline-neutral">&nbsp;</span>
893
- <span class="cline-any cline-neutral">&nbsp;</span>
894
- <span class="cline-any cline-neutral">&nbsp;</span>
895
- <span class="cline-any cline-neutral">&nbsp;</span>
896
- <span class="cline-any cline-neutral">&nbsp;</span>
897
- <span class="cline-any cline-neutral">&nbsp;</span>
898
- <span class="cline-any cline-neutral">&nbsp;</span>
899
- <span class="cline-any cline-neutral">&nbsp;</span>
900
- <span class="cline-any cline-neutral">&nbsp;</span>
901
- <span class="cline-any cline-neutral">&nbsp;</span>
902
- <span class="cline-any cline-neutral">&nbsp;</span>
903
- <span class="cline-any cline-neutral">&nbsp;</span>
904
- <span class="cline-any cline-neutral">&nbsp;</span>
905
- <span class="cline-any cline-no">&nbsp;</span>
906
- <span class="cline-any cline-neutral">&nbsp;</span>
907
- <span class="cline-any cline-neutral">&nbsp;</span>
908
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import * as email from "../../../utilities/email"
909
- import env from "../../../environment"
910
- import { googleCallbackUrl, oidcCallbackUrl } from "./auth"
911
- import {
912
- events,
913
- cache,
914
- objectStore,
915
- tenancy,
916
- db as dbCore,
917
- env as coreEnv,
918
- } from "@budibase/backend-core"
919
- import { checkAnyUserExists } from "../../../utilities/users"
920
- import {
921
- Database,
922
- Config as ConfigDoc,
923
- ConfigType,
924
- SSOType,
925
- GoogleConfig,
926
- OIDCConfig,
927
- SettingsConfig,
928
- isGoogleConfig,
929
- isOIDCConfig,
930
- isSettingsConfig,
931
- isSMTPConfig,
932
- Ctx,
933
- UserCtx,
934
- } from "@budibase/types"
935
- &nbsp;
936
- const getEventFns = async (db: Database, config: ConfigDoc) =&gt; {
937
- const fns = []
938
- &nbsp;
939
- let existing
940
- if (config._id) {
941
- existing = await db.get(config._id)
942
- }
943
- &nbsp;
944
- if (!existing) {
945
- if (isSMTPConfig(config)) {
946
- fns.push(events.email.SMTPCreated)
947
- } else if (isGoogleConfig(config)) {
948
- fns.push(() =&gt; events.auth.SSOCreated(ConfigType.GOOGLE))
949
- if (config.config.activated) {
950
- fns.push(() =&gt; events.auth.SSOActivated(ConfigType.GOOGLE))
951
- }
952
- } else if (isOIDCConfig(config)) {
953
- fns.push(() =&gt; events.auth.SSOCreated(ConfigType.OIDC))
954
- if (config.config.configs[0].activated) {
955
- fns.push(() =&gt; events.auth.SSOActivated(ConfigType.OIDC))
956
- }
957
- } else if (isSettingsConfig(config)) {
958
- // company
959
- const company = config.config.company
960
- if (company &amp;&amp; company !== "Budibase") {
961
- fns.push(events.org.nameUpdated)
962
- }
963
- &nbsp;
964
- // logo
965
- const logoUrl = config.config.logoUrl
966
- if (logoUrl) {
967
- fns.push(events.org.logoUpdated)
968
- }
969
- &nbsp;
970
- // platform url
971
- const platformUrl = config.config.platformUrl
972
- if (
973
- platformUrl &amp;&amp;
974
- platformUrl !== "http://localhost:10000" &amp;&amp;
975
- env.SELF_HOSTED
976
- ) {
977
- fns.push(events.org.platformURLUpdated)
978
- }
979
- }
980
- } else {
981
- if (isSMTPConfig(config)) {
982
- fns.push(events.email.SMTPUpdated)
983
- } else if (isGoogleConfig(config)) {
984
- fns.push(() =&gt; events.auth.SSOUpdated(ConfigType.GOOGLE))
985
- if (!existing.config.activated &amp;&amp; config.config.activated) {
986
- fns.push(() =&gt; events.auth.SSOActivated(ConfigType.GOOGLE))
987
- } else if (existing.config.activated &amp;&amp; !config.config.activated) {
988
- fns.push(() =&gt; events.auth.SSODeactivated(ConfigType.GOOGLE))
989
- }
990
- } else if (isOIDCConfig(config)) {
991
- fns.push(() =&gt; events.auth.SSOUpdated(ConfigType.OIDC))
992
- if (
993
- !existing.config.configs[0].activated &amp;&amp;
994
- config.config.configs[0].activated
995
- ) {
996
- fns.push(() =&gt; events.auth.SSOActivated(ConfigType.OIDC))
997
- } else if (
998
- existing.config.configs[0].activated &amp;&amp;
999
- !config.config.configs[0].activated
1000
- ) {
1001
- fns.push(() =&gt; events.auth.SSODeactivated(ConfigType.OIDC))
1002
- }
1003
- } else if (isSettingsConfig(config)) {
1004
- // company
1005
- const existingCompany = existing.config.company
1006
- const company = config.config.company
1007
- if (company &amp;&amp; company !== "Budibase" &amp;&amp; existingCompany !== company) {
1008
- fns.push(events.org.nameUpdated)
1009
- }
1010
- &nbsp;
1011
- // logo
1012
- const existingLogoUrl = existing.config.logoUrl
1013
- const logoUrl = config.config.logoUrl
1014
- if (logoUrl &amp;&amp; existingLogoUrl !== logoUrl) {
1015
- fns.push(events.org.logoUpdated)
1016
- }
1017
- &nbsp;
1018
- // platform url
1019
- const existingPlatformUrl = existing.config.platformUrl
1020
- const platformUrl = config.config.platformUrl
1021
- if (
1022
- platformUrl &amp;&amp;
1023
- platformUrl !== "http://localhost:10000" &amp;&amp;
1024
- existingPlatformUrl !== platformUrl &amp;&amp;
1025
- env.SELF_HOSTED
1026
- ) {
1027
- fns.push(events.org.platformURLUpdated)
1028
- }
1029
- }
1030
- }
1031
- &nbsp;
1032
- return fns
1033
- }
1034
- &nbsp;
1035
- export async function save(ctx: UserCtx) {
1036
- const db = tenancy.getGlobalDB()
1037
- const { type, workspace, user, config } = ctx.request.body
1038
- let eventFns = await getEventFns(db, ctx.request.body)
1039
- // Config does not exist yet
1040
- if (!ctx.request.body._id) {
1041
- ctx.request.body._id = dbCore.generateConfigID({
1042
- type,
1043
- workspace,
1044
- user,
1045
- })
1046
- }
1047
- try {
1048
- // verify the configuration
1049
- switch (type) {
1050
- case ConfigType.SMTP:
1051
- await email.verifyConfig(config)
1052
- break
1053
- }
1054
- } catch (err: any) {
1055
- ctx.throw(400, err)
1056
- }
1057
- &nbsp;
1058
- try {
1059
- const response = await db.put(ctx.request.body)
1060
- await cache.bustCache(cache.CacheKey.CHECKLIST)
1061
- await cache.bustCache(cache.CacheKey.ANALYTICS_ENABLED)
1062
- &nbsp;
1063
- for (const fn of eventFns) {
1064
- await fn()
1065
- }
1066
- &nbsp;
1067
- ctx.body = {
1068
- type,
1069
- _id: response.id,
1070
- _rev: response.rev,
1071
- }
1072
- } catch (err: any) {
1073
- <span class="cstat-no" title="statement not covered" > ctx.throw(400, err)</span>
1074
- }
1075
- }
1076
- &nbsp;
1077
- export async function <span class="fstat-no" title="function not covered" >fetch(</span>ctx: UserCtx) {
1078
- const db = <span class="cstat-no" title="statement not covered" >tenancy.getGlobalDB()</span>
1079
- const response = <span class="cstat-no" title="statement not covered" >await db.allDocs(</span>
1080
- dbCore.getConfigParams(
1081
- { type: ctx.params.type },
1082
- {
1083
- include_docs: true,
1084
- }
1085
- )
1086
- )
1087
- <span class="cstat-no" title="statement not covered" > ctx.body = response.rows.map(<span class="fstat-no" title="function not covered" >row =&gt; <span class="cstat-no" title="statement not covered" >r</span>ow.doc)</span></span>
1088
- }
1089
- &nbsp;
1090
- /**
1091
- * Gets the most granular config for a particular configuration type.
1092
- * The hierarchy is type -&gt; workspace -&gt; user.
1093
- */
1094
- export async function find(ctx: UserCtx) {
1095
- const db = tenancy.getGlobalDB()
1096
- &nbsp;
1097
- const { userId, workspaceId } = ctx.query
1098
- <span class="missing-if-branch" title="if path not taken" >I</span>if (workspaceId &amp;&amp; <span class="branch-1 cbranch-no" title="branch not covered" >userId) {</span>
1099
- const workspace = <span class="cstat-no" title="statement not covered" >await db.get(workspaceId as string)</span>
1100
- const userInWorkspace = <span class="cstat-no" title="statement not covered" >workspace.users.some(</span>
1101
- <span class="fstat-no" title="function not covered" > (w</span>orkspaceUser: any) =&gt; <span class="cstat-no" title="statement not covered" >workspaceUser === userId</span>
1102
- )
1103
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!ctx.user!.admin &amp;&amp; !userInWorkspace) {</span>
1104
- <span class="cstat-no" title="statement not covered" > ctx.throw(400, `User is not in specified workspace: ${workspace}.`)</span>
1105
- }
1106
- }
1107
- &nbsp;
1108
- try {
1109
- // Find the config with the most granular scope based on context
1110
- const scopedConfig = await dbCore.getScopedFullConfig(db, {
1111
- type: ctx.params.type,
1112
- user: userId,
1113
- workspace: workspaceId,
1114
- })
1115
- &nbsp;
1116
- if (scopedConfig) {
1117
- ctx.body = scopedConfig
1118
- } else {
1119
- // don't throw an error, there simply is nothing to return
1120
- ctx.body = {}
1121
- }
1122
- } catch (err: any) {
1123
- <span class="cstat-no" title="statement not covered" > ctx.throw(err?.status || 400, err)</span>
1124
- }
1125
- }
1126
- &nbsp;
1127
- export async function <span class="fstat-no" title="function not covered" >publicOidc(</span>ctx: Ctx) {
1128
- const db = <span class="cstat-no" title="statement not covered" >tenancy.getGlobalDB()</span>
1129
- <span class="cstat-no" title="statement not covered" > try {</span>
1130
- // Find the config with the most granular scope based on context
1131
- const oidcConfig: OIDCConfig = <span class="cstat-no" title="statement not covered" >await dbCore.getScopedFullConfig(db, {</span>
1132
- type: ConfigType.OIDC,
1133
- })
1134
- &nbsp;
1135
- <span class="cstat-no" title="statement not covered" > if (!oidcConfig) {</span>
1136
- <span class="cstat-no" title="statement not covered" > ctx.body = {}</span>
1137
- } else {
1138
- <span class="cstat-no" title="statement not covered" > ctx.body = oidcConfig.config.configs.map(<span class="fstat-no" title="function not covered" >config =&gt; (<span class="cstat-no" title="statement not covered" >{</span></span></span>
1139
- logo: config.logo,
1140
- name: config.name,
1141
- uuid: config.uuid,
1142
- }))
1143
- }
1144
- } catch (err: any) {
1145
- <span class="cstat-no" title="statement not covered" > ctx.throw(err.status, err)</span>
1146
- }
1147
- }
1148
- &nbsp;
1149
- export async function <span class="fstat-no" title="function not covered" >publicSettings(</span>ctx: Ctx) {
1150
- const db = <span class="cstat-no" title="statement not covered" >tenancy.getGlobalDB()</span>
1151
- &nbsp;
1152
- <span class="cstat-no" title="statement not covered" > try {</span>
1153
- // Find the config with the most granular scope based on context
1154
- const publicConfig = <span class="cstat-no" title="statement not covered" >await dbCore.getScopedFullConfig(db, {</span>
1155
- type: ConfigType.SETTINGS,
1156
- })
1157
- &nbsp;
1158
- const googleConfig = <span class="cstat-no" title="statement not covered" >await dbCore.getScopedFullConfig(db, {</span>
1159
- type: ConfigType.GOOGLE,
1160
- })
1161
- &nbsp;
1162
- const oidcConfig = <span class="cstat-no" title="statement not covered" >await dbCore.getScopedFullConfig(db, {</span>
1163
- type: ConfigType.OIDC,
1164
- })
1165
- &nbsp;
1166
- let config
1167
- <span class="cstat-no" title="statement not covered" > if (!publicConfig) {</span>
1168
- <span class="cstat-no" title="statement not covered" > config = {</span>
1169
- config: {},
1170
- }
1171
- } else {
1172
- <span class="cstat-no" title="statement not covered" > config = publicConfig</span>
1173
- }
1174
- &nbsp;
1175
- // enrich the logo url
1176
- // empty url means deleted
1177
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (config.config.logoUrl &amp;&amp; config.config.logoUrl !== "") {</span>
1178
- <span class="cstat-no" title="statement not covered" > config.config.logoUrl = objectStore.getGlobalFileUrl(</span>
1179
- "settings",
1180
- "logoUrl",
1181
- config.config.logoUrlEtag
1182
- )
1183
- }
1184
- &nbsp;
1185
- // google button flag
1186
- <span class="cstat-no" title="statement not covered" > if (googleConfig &amp;&amp; googleConfig.config) {</span>
1187
- // activated by default for configs pre-activated flag
1188
- <span class="cstat-no" title="statement not covered" > config.config.google =</span>
1189
- googleConfig.config.activated == null || googleConfig.config.activated
1190
- } else {
1191
- <span class="cstat-no" title="statement not covered" > config.config.google = false</span>
1192
- }
1193
- &nbsp;
1194
- // callback urls
1195
- <span class="cstat-no" title="statement not covered" > config.config.oidcCallbackUrl = await oidcCallbackUrl()</span>
1196
- <span class="cstat-no" title="statement not covered" > config.config.googleCallbackUrl = await googleCallbackUrl()</span>
1197
- &nbsp;
1198
- // oidc button flag
1199
- <span class="cstat-no" title="statement not covered" > if (oidcConfig &amp;&amp; oidcConfig.config) {</span>
1200
- <span class="cstat-no" title="statement not covered" > config.config.oidc = oidcConfig.config.configs[0].activated</span>
1201
- } else {
1202
- <span class="cstat-no" title="statement not covered" > config.config.oidc = false</span>
1203
- }
1204
- &nbsp;
1205
- <span class="cstat-no" title="statement not covered" > ctx.body = config</span>
1206
- } catch (err: any) {
1207
- <span class="cstat-no" title="statement not covered" > ctx.throw(err.status, err)</span>
1208
- }
1209
- }
1210
- &nbsp;
1211
- export async function <span class="fstat-no" title="function not covered" >upload(</span>ctx: UserCtx) {
1212
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (ctx.request.files == null || Array.isArray(ctx.request.files.file)) {</span>
1213
- <span class="cstat-no" title="statement not covered" > ctx.throw(400, "One file must be uploaded.")</span>
1214
- }
1215
- const file = <span class="cstat-no" title="statement not covered" >ctx.request.files.file </span>as any
1216
- const { type, name } = <span class="cstat-no" title="statement not covered" >ctx.params</span>
1217
- &nbsp;
1218
- let bucket = <span class="cstat-no" title="statement not covered" >coreEnv.GLOBAL_BUCKET_NAME</span>
1219
- const key = <span class="cstat-no" title="statement not covered" >objectStore.getGlobalFileS3Key(type, name)</span>
1220
- &nbsp;
1221
- const result = <span class="cstat-no" title="statement not covered" >await objectStore.upload({</span>
1222
- bucket,
1223
- filename: key,
1224
- path: file.path,
1225
- type: file.type,
1226
- })
1227
- &nbsp;
1228
- // add to configuration structure
1229
- // TODO: right now this only does a global level
1230
- const db = <span class="cstat-no" title="statement not covered" >tenancy.getGlobalDB()</span>
1231
- let cfgStructure = <span class="cstat-no" title="statement not covered" >await dbCore.getScopedFullConfig(db, { type })</span>
1232
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (!cfgStructure) {</span>
1233
- <span class="cstat-no" title="statement not covered" > cfgStructure = {</span>
1234
- _id: dbCore.generateConfigID({ type }),
1235
- config: {},
1236
- }
1237
- }
1238
- &nbsp;
1239
- // save the Etag for cache bursting
1240
- const etag = <span class="cstat-no" title="statement not covered" >result.ETag</span>
1241
- <span class="cstat-no" title="statement not covered" > <span class="missing-if-branch" title="if path not taken" >I</span>if (etag) {</span>
1242
- <span class="cstat-no" title="statement not covered" > cfgStructure.config[`${name}Etag`] = etag.replace(/"/g, "")</span>
1243
- }
1244
- &nbsp;
1245
- // save the file key
1246
- <span class="cstat-no" title="statement not covered" > cfgStructure.config[`${name}`] = key</span>
1247
- &nbsp;
1248
- // write back to db
1249
- <span class="cstat-no" title="statement not covered" > await db.put(cfgStructure)</span>
1250
- &nbsp;
1251
- <span class="cstat-no" title="statement not covered" > ctx.body = {</span>
1252
- message: "File has been uploaded and url stored to config.",
1253
- url: objectStore.getGlobalFileUrl(type, name, etag),
1254
- }
1255
- }
1256
- &nbsp;
1257
- export async function destroy(ctx: UserCtx) {
1258
- const db = tenancy.getGlobalDB()
1259
- const { id, rev } = ctx.params
1260
- try {
1261
- await db.remove(id, rev)
1262
- await cache.destroy(cache.CacheKey.CHECKLIST)
1263
- ctx.body = { message: "Config deleted successfully" }
1264
- } catch (err: any) {
1265
- ctx.throw(err.status, err)
1266
- }
1267
- }
1268
- &nbsp;
1269
- export async function configChecklist(ctx: Ctx) {
1270
- const db = tenancy.getGlobalDB()
1271
- const tenantId = tenancy.getTenantId()
1272
- &nbsp;
1273
- try {
1274
- ctx.body = await cache.withCache(
1275
- cache.CacheKey.CHECKLIST,
1276
- env.CHECKLIST_CACHE_TTL,
1277
- async () =&gt; {
1278
- let apps = []
1279
- if (!env.MULTI_TENANCY || tenantId) {
1280
- // Apps exist
1281
- apps = await dbCore.getAllApps({ idsOnly: true, efficient: true })
1282
- }
1283
- &nbsp;
1284
- // They have set up SMTP
1285
- const smtpConfig = await dbCore.getScopedFullConfig(db, {
1286
- type: ConfigType.SMTP,
1287
- })
1288
- &nbsp;
1289
- // They have set up Google Auth
1290
- const googleConfig = await dbCore.getScopedFullConfig(db, {
1291
- type: ConfigType.GOOGLE,
1292
- })
1293
- &nbsp;
1294
- // They have set up OIDC
1295
- const oidcConfig = await dbCore.getScopedFullConfig(db, {
1296
- type: ConfigType.OIDC,
1297
- })
1298
- &nbsp;
1299
- // They have set up a global user
1300
- const userExists = await checkAnyUserExists()
1301
- return {
1302
- apps: {
1303
- checked: apps.length &gt; 0,
1304
- label: "Create your first app",
1305
- link: "/builder/portal/apps",
1306
- },
1307
- smtp: {
1308
- checked: !!smtpConfig,
1309
- label: "Set up email",
1310
- link: "/builder/portal/manage/email",
1311
- },
1312
- adminUser: {
1313
- checked: userExists,
1314
- label: "Create your first user",
1315
- link: "/builder/portal/manage/users",
1316
- },
1317
- sso: {
1318
- checked: !!googleConfig || !!oidcConfig,
1319
- label: "Set up single sign-on",
1320
- link: "/builder/portal/manage/auth",
1321
- },
1322
- }
1323
- }
1324
- )
1325
- } catch (err: any) {
1326
- <span class="cstat-no" title="statement not covered" > ctx.throw(err.status, err)</span>
1327
- }
1328
- }
1329
- &nbsp;</pre></td></tr></table></pre>
1330
-
1331
- <div class='push'></div><!-- for sticky footer -->
1332
- </div><!-- /wrapper -->
1333
- <div class='footer quiet pad2 space-top1 center small'>
1334
- Code coverage generated by
1335
- <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1336
- at Thu Feb 16 2023 16:34:19 GMT+0000 (Coordinated Universal Time)
1337
- </div>
1338
- <script src="../../../../prettify.js"></script>
1339
- <script>
1340
- window.onload = function () {
1341
- prettyPrint();
1342
- };
1343
- </script>
1344
- <script src="../../../../sorter.js"></script>
1345
- <script src="../../../../block-navigation.js"></script>
1346
- </body>
1347
- </html>
1348
-