expressa 2.0.21 → 2.0.23

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 (222) hide show
  1. package/.circleci/config.yml +21 -21
  2. package/.eslintrc.json +29 -29
  3. package/.vscode/launch.json +19 -0
  4. package/LICENSE +21 -21
  5. package/README.md +137 -137
  6. package/auth/index.js +76 -76
  7. package/auth/jwt.js +31 -31
  8. package/controllers/collections.js +260 -260
  9. package/controllers/install.js +105 -105
  10. package/controllers/status.js +43 -43
  11. package/controllers/users.js +52 -52
  12. package/cypress/fixtures/example.json +4 -4
  13. package/cypress/integration/0_install_spec.js +8 -8
  14. package/cypress/integration/custom_collections.js +30 -30
  15. package/cypress/integration/home.js +9 -9
  16. package/cypress/integration/settings.js +34 -34
  17. package/cypress/integration/users.js +61 -61
  18. package/cypress/plugins/index.js +17 -17
  19. package/cypress/support/commands.js +69 -69
  20. package/cypress/support/index.js +20 -20
  21. package/cypress/support/util.js +10 -10
  22. package/cypress.config.js +18 -18
  23. package/cypress.json +4 -4
  24. package/db/cached.js +44 -40
  25. package/db/file.js +131 -112
  26. package/db/memory.js +92 -79
  27. package/db/mongo.js +93 -86
  28. package/db/postgres.js +100 -93
  29. package/doc/authentication.md +38 -38
  30. package/doc/automatic-fields.md +12 -12
  31. package/doc/blogexample.md +16 -16
  32. package/doc/custom-endpoints.md +20 -20
  33. package/doc/database.md +23 -23
  34. package/doc/development.md +33 -33
  35. package/doc/listeners.md +103 -103
  36. package/doc/modules.md +8 -8
  37. package/doc/permissions.md +14 -14
  38. package/doc/relationships.md +65 -65
  39. package/doc/testing.md +47 -47
  40. package/doc/uploading-files.md +53 -53
  41. package/index.js +297 -297
  42. package/listeners.js +65 -65
  43. package/listeners_collection_permissions.js +29 -29
  44. package/listeners_users.js +96 -96
  45. package/listeners_validation.js +43 -43
  46. package/middleware/logging.js +30 -30
  47. package/middleware/permissions.js +41 -41
  48. package/modules/access_keys/access_keys.js +32 -32
  49. package/modules/admin/.babelrc +8 -19
  50. package/modules/admin/.editorconfig +14 -14
  51. package/modules/admin/.eslintignore +5 -5
  52. package/modules/admin/.eslintrc.js +197 -197
  53. package/modules/admin/.postcssrc.js +10 -10
  54. package/modules/admin/.travis.yml +5 -5
  55. package/modules/admin/LICENSE +21 -21
  56. package/modules/admin/README.md +88 -88
  57. package/modules/admin/build/build.js +46 -46
  58. package/modules/admin/build/check-versions.js +64 -64
  59. package/modules/admin/build/utils.js +109 -109
  60. package/modules/admin/build/vue-loader.conf.js +5 -5
  61. package/modules/admin/build/webpack.base.conf.js +112 -112
  62. package/modules/admin/build/webpack.dev.conf.js +95 -95
  63. package/modules/admin/build/webpack.prod.conf.js +112 -112
  64. package/modules/admin/config/dev.env.js +8 -8
  65. package/modules/admin/config/index.js +86 -86
  66. package/modules/admin/config/prod.env.js +5 -5
  67. package/modules/admin/dist/css/{197.7a90435e.css → 197.e66ce8d8.css} +4 -4
  68. package/modules/admin/dist/css/197.e66ce8d8.css.gz +0 -0
  69. package/modules/admin/dist/css/{430.8c9b0482.css → 430.e83d8cfe.css} +4 -4
  70. package/modules/admin/dist/css/430.e83d8cfe.css.gz +0 -0
  71. package/modules/admin/dist/css/451.c6646d20.css.gz +0 -0
  72. package/modules/admin/dist/css/{566.7a90435e.css → 566.e66ce8d8.css} +4 -4
  73. package/modules/admin/dist/css/566.e66ce8d8.css.gz +0 -0
  74. package/modules/admin/dist/css/569.db9a10c2.css +213 -0
  75. package/modules/admin/dist/css/569.db9a10c2.css.gz +0 -0
  76. package/modules/admin/dist/css/572.513a323e.css +210 -0
  77. package/modules/admin/dist/css/572.513a323e.css.gz +0 -0
  78. package/modules/admin/dist/css/651.e946bda7.css.gz +0 -0
  79. package/modules/admin/dist/css/750.4086915d.css.gz +0 -0
  80. package/modules/admin/dist/css/950.1fd9d57c.css.gz +0 -0
  81. package/modules/admin/dist/css/{app.eba5f5e2.css → app.1c3232a3.css} +25 -25
  82. package/modules/admin/dist/css/app.1c3232a3.css.gz +0 -0
  83. package/modules/admin/dist/index.html +1 -1
  84. package/modules/admin/dist/static/js/197.36982650.js +1 -0
  85. package/modules/admin/dist/static/js/197.36982650.js.gz +0 -0
  86. package/modules/admin/dist/static/js/311.25e842dc.js +1 -0
  87. package/modules/admin/dist/static/js/311.25e842dc.js.gz +0 -0
  88. package/modules/admin/dist/static/js/430.53aea612.js +1 -0
  89. package/modules/admin/dist/static/js/430.53aea612.js.gz +0 -0
  90. package/modules/admin/dist/static/js/451.9f6dcdb1.js +1 -0
  91. package/modules/admin/dist/static/js/451.9f6dcdb1.js.gz +0 -0
  92. package/modules/admin/dist/static/js/460.351dad91.js +1 -0
  93. package/modules/admin/dist/static/js/460.351dad91.js.gz +0 -0
  94. package/modules/admin/dist/static/js/550.87e54b29.js +1 -0
  95. package/modules/admin/dist/static/js/550.87e54b29.js.gz +0 -0
  96. package/modules/admin/dist/static/js/569.52dba3a7.js +1 -0
  97. package/modules/admin/dist/static/js/569.52dba3a7.js.gz +0 -0
  98. package/modules/admin/dist/static/js/572.296cfd3b.js +1 -0
  99. package/modules/admin/dist/static/js/572.296cfd3b.js.gz +0 -0
  100. package/modules/admin/dist/static/js/603.98d5f5d9.js +1 -0
  101. package/modules/admin/dist/static/js/603.98d5f5d9.js.gz +0 -0
  102. package/modules/admin/dist/static/js/651.6dca6fbe.js +1 -0
  103. package/modules/admin/dist/static/js/651.6dca6fbe.js.gz +0 -0
  104. package/modules/admin/dist/static/js/653.0dff78dc.js +1 -0
  105. package/modules/admin/dist/static/js/653.0dff78dc.js.gz +0 -0
  106. package/modules/admin/dist/static/js/750.6877a6b8.js +1 -0
  107. package/modules/admin/dist/static/js/750.6877a6b8.js.gz +0 -0
  108. package/modules/admin/dist/static/js/950.4f40455a.js +1 -0
  109. package/modules/admin/dist/static/js/950.4f40455a.js.gz +0 -0
  110. package/modules/admin/dist/static/js/app.2dd732d9.js +2 -0
  111. package/modules/admin/dist/static/js/{app.083328f8.js.LICENSE.txt → app.2dd732d9.js.LICENSE.txt} +0 -2
  112. package/modules/admin/dist/static/js/app.2dd732d9.js.LICENSE.txt.gz +0 -0
  113. package/modules/admin/dist/static/js/app.2dd732d9.js.gz +0 -0
  114. package/modules/admin/index.html +16 -16
  115. package/modules/admin/package.json +101 -101
  116. package/modules/admin/src/App.vue +11 -11
  117. package/modules/admin/src/api/login.js +26 -26
  118. package/modules/admin/src/api/table.js +9 -9
  119. package/modules/admin/src/components/Breadcrumb/index.vue +79 -79
  120. package/modules/admin/src/components/Hamburger/index.vue +62 -62
  121. package/modules/admin/src/components/JSONEditor.vue +206 -180
  122. package/modules/admin/src/components/SvgIcon/index.vue +43 -43
  123. package/modules/admin/src/icons/index.js +9 -9
  124. package/modules/admin/src/icons/svgo.yml +22 -22
  125. package/modules/admin/src/main.js +42 -42
  126. package/modules/admin/src/permission.js +49 -49
  127. package/modules/admin/src/router/index.js +200 -200
  128. package/modules/admin/src/store/getters.js +11 -11
  129. package/modules/admin/src/store/index.js +17 -17
  130. package/modules/admin/src/store/modules/app.js +43 -43
  131. package/modules/admin/src/store/modules/user.js +104 -104
  132. package/modules/admin/src/styles/element-ui.scss +29 -29
  133. package/modules/admin/src/styles/index.scss +78 -78
  134. package/modules/admin/src/styles/mixin.scss +27 -27
  135. package/modules/admin/src/styles/sidebar.scss +133 -133
  136. package/modules/admin/src/styles/transition.scss +46 -46
  137. package/modules/admin/src/styles/variables.scss +4 -4
  138. package/modules/admin/src/utils/auth.js +15 -15
  139. package/modules/admin/src/utils/index.js +74 -74
  140. package/modules/admin/src/utils/request.js +47 -47
  141. package/modules/admin/src/utils/validate.js +31 -31
  142. package/modules/admin/src/views/404.vue +235 -235
  143. package/modules/admin/src/views/Dev.vue +33 -33
  144. package/modules/admin/src/views/EditDocument.vue +121 -121
  145. package/modules/admin/src/views/Endpoints.vue +279 -279
  146. package/modules/admin/src/views/Home.vue +84 -84
  147. package/modules/admin/src/views/Install.vue +79 -79
  148. package/modules/admin/src/views/ListDocuments.vue +72 -72
  149. package/modules/admin/src/views/ListDocuments2.vue +467 -467
  150. package/modules/admin/src/views/ManageListeners.vue +67 -67
  151. package/modules/admin/src/views/ManageMiddleware.vue +43 -43
  152. package/modules/admin/src/views/ManagePermissions.vue +75 -75
  153. package/modules/admin/src/views/ViewRequest.vue +77 -77
  154. package/modules/admin/src/views/form/index.vue +91 -91
  155. package/modules/admin/src/views/layout/Layout.vue +69 -69
  156. package/modules/admin/src/views/layout/components/AppMain.vue +41 -41
  157. package/modules/admin/src/views/layout/components/Navbar.vue +97 -97
  158. package/modules/admin/src/views/layout/components/Sidebar/Item.vue +29 -29
  159. package/modules/admin/src/views/layout/components/Sidebar/Link.vue +39 -39
  160. package/modules/admin/src/views/layout/components/Sidebar/SidebarItem.vue +103 -103
  161. package/modules/admin/src/views/layout/components/Sidebar/index.vue +62 -62
  162. package/modules/admin/src/views/layout/components/index.js +3 -3
  163. package/modules/admin/src/views/layout/mixin/ResizeHandler.js +41 -41
  164. package/modules/admin/src/views/login/index.vue +195 -195
  165. package/modules/admin/src/views/tree/index.vue +77 -77
  166. package/modules/collections/collections.js +39 -39
  167. package/modules/core/core.js +197 -197
  168. package/modules/logging/logging.js +88 -88
  169. package/modules/permissions/permissions.js +106 -106
  170. package/package.json +59 -59
  171. package/scripts/expressa +12 -12
  172. package/scripts/run_cypress_tests.sh +35 -35
  173. package/scripts/run_db_tests.sh +8 -8
  174. package/test/0-install.js +96 -96
  175. package/test/collections.js +431 -431
  176. package/test/collections.querying.js +288 -288
  177. package/test/db.js +258 -258
  178. package/test/db.strings.js +73 -73
  179. package/test/db.updating.js +186 -144
  180. package/test/logging.js +29 -29
  181. package/test/test.js +93 -93
  182. package/test/testserver.js +30 -30
  183. package/test/testutils.js +136 -136
  184. package/test/users.js +425 -425
  185. package/util.js +522 -522
  186. package/modules/admin/dist/css/197.7a90435e.css.gz +0 -0
  187. package/modules/admin/dist/css/430.8c9b0482.css.gz +0 -0
  188. package/modules/admin/dist/css/566.7a90435e.css.gz +0 -0
  189. package/modules/admin/dist/css/569.f7d5c7d5.css +0 -37
  190. package/modules/admin/dist/css/569.f7d5c7d5.css.gz +0 -0
  191. package/modules/admin/dist/css/572.74d8e965.css +0 -34
  192. package/modules/admin/dist/css/572.74d8e965.css.gz +0 -0
  193. package/modules/admin/dist/css/app.eba5f5e2.css.gz +0 -0
  194. package/modules/admin/dist/static/js/197.e511d91e.js +0 -1
  195. package/modules/admin/dist/static/js/197.e511d91e.js.gz +0 -0
  196. package/modules/admin/dist/static/js/430.b3941f30.js +0 -1
  197. package/modules/admin/dist/static/js/430.b3941f30.js.gz +0 -0
  198. package/modules/admin/dist/static/js/451.645974a8.js +0 -1
  199. package/modules/admin/dist/static/js/451.645974a8.js.gz +0 -0
  200. package/modules/admin/dist/static/js/460.962d5bc0.js +0 -1
  201. package/modules/admin/dist/static/js/460.962d5bc0.js.gz +0 -0
  202. package/modules/admin/dist/static/js/550.f27feb23.js +0 -1
  203. package/modules/admin/dist/static/js/550.f27feb23.js.gz +0 -0
  204. package/modules/admin/dist/static/js/556.1e08866a.js +0 -1
  205. package/modules/admin/dist/static/js/556.1e08866a.js.gz +0 -0
  206. package/modules/admin/dist/static/js/569.0fecfbee.js +0 -1
  207. package/modules/admin/dist/static/js/569.0fecfbee.js.gz +0 -0
  208. package/modules/admin/dist/static/js/572.13392e1d.js +0 -1
  209. package/modules/admin/dist/static/js/572.13392e1d.js.gz +0 -0
  210. package/modules/admin/dist/static/js/603.7b34a650.js +0 -1
  211. package/modules/admin/dist/static/js/603.7b34a650.js.gz +0 -0
  212. package/modules/admin/dist/static/js/651.564b24b6.js +0 -1
  213. package/modules/admin/dist/static/js/651.564b24b6.js.gz +0 -0
  214. package/modules/admin/dist/static/js/653.02ec1098.js +0 -1
  215. package/modules/admin/dist/static/js/653.02ec1098.js.gz +0 -0
  216. package/modules/admin/dist/static/js/750.50c950da.js +0 -1
  217. package/modules/admin/dist/static/js/750.50c950da.js.gz +0 -0
  218. package/modules/admin/dist/static/js/950.d4ff0a18.js +0 -1
  219. package/modules/admin/dist/static/js/950.d4ff0a18.js.gz +0 -0
  220. package/modules/admin/dist/static/js/app.083328f8.js +0 -2
  221. package/modules/admin/dist/static/js/app.083328f8.js.LICENSE.txt.gz +0 -0
  222. package/modules/admin/dist/static/js/app.083328f8.js.gz +0 -0
@@ -1,67 +1,67 @@
1
- <template>
2
- <div class="app-container">
3
- <span>Filter by Collection</span>
4
- <select v-model="selectedCollection">
5
- <option value="">
6
- Any collection
7
- </option>
8
- <option v-for="c in collections" :key="c">
9
- {{ c }}
10
- </option>
11
- </select>
12
- <el-table
13
- :data="filterListeners(listeners)"
14
- element-loading-text="Loading"
15
- border
16
- fit
17
- highlight-current-row
18
- >
19
- <el-table-column align="left" label="Listener Name" width="250">
20
- <template slot-scope="scope">
21
- {{ scope.row.name }}
22
- </template>
23
- </el-table-column>
24
- <el-table-column align="left" label="Collections" width="150">
25
- <template slot-scope="scope">
26
- {{ scope.row.collections }}
27
- </template>
28
- </el-table-column>
29
- <el-table-column v-for="column in columns" :key="column" :label="column" align="center">
30
- <template slot-scope="scope">
31
- {{ scope.row[column] === true ? '✓' : scope.row[column] }}
32
- </template>
33
- </el-table-column>
34
- </el-table>
35
- </div>
36
- </template>
37
-
38
- <script>
39
- import request from '@/utils/request'
40
-
41
- export default {
42
- name: 'ManageListeners',
43
- data: () => ({
44
- listeners: [],
45
- columns: ['get', 'post', 'put', 'delete', 'changed', 'deleted', 'priority'],
46
- collections: [],
47
- selectedCollection: '',
48
- }),
49
- mounted() {
50
- this.update()
51
- },
52
- methods: {
53
- filterListeners(data) {
54
- const filtered = data.filter((l) => !this.selectedCollection || !l.collections || l.collections.includes(this.selectedCollection))
55
- return filtered
56
- },
57
- async update() {
58
- const statusInfo = (await request({ url: `/status` })).data
59
- this.listeners = statusInfo.listeners
60
- this.collections = statusInfo.collections
61
- },
62
- }
63
- }
64
- </script>
65
-
66
- <style scoped>
67
- </style>
1
+ <template>
2
+ <div class="app-container">
3
+ <span>Filter by Collection</span>
4
+ <select v-model="selectedCollection">
5
+ <option value="">
6
+ Any collection
7
+ </option>
8
+ <option v-for="c in collections" :key="c">
9
+ {{ c }}
10
+ </option>
11
+ </select>
12
+ <el-table
13
+ :data="filterListeners(listeners)"
14
+ element-loading-text="Loading"
15
+ border
16
+ fit
17
+ highlight-current-row
18
+ >
19
+ <el-table-column align="left" label="Listener Name" width="250">
20
+ <template slot-scope="scope">
21
+ {{ scope.row.name }}
22
+ </template>
23
+ </el-table-column>
24
+ <el-table-column align="left" label="Collections" width="150">
25
+ <template slot-scope="scope">
26
+ {{ scope.row.collections }}
27
+ </template>
28
+ </el-table-column>
29
+ <el-table-column v-for="column in columns" :key="column" :label="column" align="center">
30
+ <template slot-scope="scope">
31
+ {{ scope.row[column] === true ? '✓' : scope.row[column] }}
32
+ </template>
33
+ </el-table-column>
34
+ </el-table>
35
+ </div>
36
+ </template>
37
+
38
+ <script>
39
+ import request from '@/utils/request'
40
+
41
+ export default {
42
+ name: 'ManageListeners',
43
+ data: () => ({
44
+ listeners: [],
45
+ columns: ['get', 'post', 'put', 'delete', 'changed', 'deleted', 'priority'],
46
+ collections: [],
47
+ selectedCollection: '',
48
+ }),
49
+ mounted() {
50
+ this.update()
51
+ },
52
+ methods: {
53
+ filterListeners(data) {
54
+ const filtered = data.filter((l) => !this.selectedCollection || !l.collections || l.collections.includes(this.selectedCollection))
55
+ return filtered
56
+ },
57
+ async update() {
58
+ const statusInfo = (await request({ url: `/status` })).data
59
+ this.listeners = statusInfo.listeners
60
+ this.collections = statusInfo.collections
61
+ },
62
+ }
63
+ }
64
+ </script>
65
+
66
+ <style scoped>
67
+ </style>
@@ -1,43 +1,43 @@
1
- <template>
2
- <div class="app-container">
3
- <el-table
4
- :data="middleware"
5
- element-loading-text="Loading"
6
- border
7
- fit
8
- highlight-current-row
9
- >
10
- <el-table-column align="left" label="Middlware Name" width="250">
11
- <template slot-scope="scope">
12
- {{ scope.row.name }}
13
- </template>
14
- </el-table-column>
15
- <el-table-column v-for="column in columns" :key="column" :label="column" align="center">
16
- <template slot-scope="scope">
17
- {{ scope.row[column] === true ? '✓' : scope.row[column] }}
18
- </template>
19
- </el-table-column>
20
- </el-table>
21
- </div>
22
- </template>
23
-
24
- <script>
25
- import request from '@/utils/request'
26
-
27
- export default {
28
- name: 'ManageMiddleware',
29
- data: () => ({
30
- middleware: [],
31
- columns: ['params'],
32
- }),
33
- mounted() {
34
- this.update()
35
- },
36
- methods: {
37
- async update() {
38
- const statusInfo = (await request({ url: `/status` })).data
39
- this.middleware = statusInfo.middleware
40
- },
41
- }
42
- }
43
- </script>
1
+ <template>
2
+ <div class="app-container">
3
+ <el-table
4
+ :data="middleware"
5
+ element-loading-text="Loading"
6
+ border
7
+ fit
8
+ highlight-current-row
9
+ >
10
+ <el-table-column align="left" label="Middlware Name" width="250">
11
+ <template slot-scope="scope">
12
+ {{ scope.row.name }}
13
+ </template>
14
+ </el-table-column>
15
+ <el-table-column v-for="column in columns" :key="column" :label="column" align="center">
16
+ <template slot-scope="scope">
17
+ {{ scope.row[column] === true ? '✓' : scope.row[column] }}
18
+ </template>
19
+ </el-table-column>
20
+ </el-table>
21
+ </div>
22
+ </template>
23
+
24
+ <script>
25
+ import request from '@/utils/request'
26
+
27
+ export default {
28
+ name: 'ManageMiddleware',
29
+ data: () => ({
30
+ middleware: [],
31
+ columns: ['params'],
32
+ }),
33
+ mounted() {
34
+ this.update()
35
+ },
36
+ methods: {
37
+ async update() {
38
+ const statusInfo = (await request({ url: `/status` })).data
39
+ this.middleware = statusInfo.middleware
40
+ },
41
+ }
42
+ }
43
+ </script>
@@ -1,75 +1,75 @@
1
- <template>
2
- <div class="app-container">
3
- <el-table
4
- :data="data"
5
- element-loading-text="Loading"
6
- border
7
- fit
8
- highlight-current-row
9
- >
10
- <el-table-column align="left" label="Permission Name" width="250">
11
- <template slot-scope="scope">
12
- {{ scope.row.name }}
13
- </template>
14
- </el-table-column>
15
- <el-table-column v-for="role in roles" :key="role._id" :label="role._id" align="center">
16
- <template slot-scope="scope">
17
- <input v-model="scope.row[role._id]" :name="scope.row.role" :disabled="role._id=='Admin'" type="checkbox" @change="save">
18
- </template>
19
- </el-table-column>
20
- </el-table>
21
- </div>
22
- </template>
23
-
24
- <script>
25
- import request from '@/utils/request'
26
-
27
- export default {
28
- name: 'ManagePermissions',
29
- data: () => ({
30
- roles: [],
31
- data: []
32
- }),
33
- mounted() {
34
- this.update()
35
- },
36
- methods: {
37
- async update() {
38
- this.roles = (await request({ url: '/role/' })).data
39
-
40
- const Admin = this.roles.find((r) => r._id === 'Admin')
41
- const permissions = Object.keys(Admin.permissions)
42
- const ordering = ['Admin', 'Authenticated', 'Anonymous']
43
- this.roles.sort(function(a, b) {
44
- const ai = ordering.indexOf(a._id)
45
- const bi = ordering.indexOf(b._id)
46
- return (ai !== bi) ? ai - bi : a._id.localeCompare(b._id)
47
- })
48
- const reducer = (row, role) => {
49
- row[role._id] = role.permissions[row.name]
50
- return row
51
- }
52
- const permissionData = permissions.map((permissionName) => this.roles.reduce(reducer, { name: permissionName }))
53
- this.data = permissionData.sort((a, b) => (a.name < b.name) ? -1 : 1)
54
- },
55
- async save() {
56
- // eslint-disable-next-line
57
- for (const role of this.roles) {
58
- role.permissions = {}
59
- this.data.forEach((row) => {
60
- if (row[role._id]) {
61
- role.permissions[row.name] = 1
62
- }
63
- })
64
- await request({ method: 'put', url: `/role/${role._id}`, data: role })
65
- }
66
- }
67
- }
68
- }
69
- </script>
70
-
71
- <style scoped>
72
- input[type=checkbox] {
73
- transform: scale(1.5);
74
- }
75
- </style>
1
+ <template>
2
+ <div class="app-container">
3
+ <el-table
4
+ :data="data"
5
+ element-loading-text="Loading"
6
+ border
7
+ fit
8
+ highlight-current-row
9
+ >
10
+ <el-table-column align="left" label="Permission Name" width="250">
11
+ <template slot-scope="scope">
12
+ {{ scope.row.name }}
13
+ </template>
14
+ </el-table-column>
15
+ <el-table-column v-for="role in roles" :key="role._id" :label="role._id" align="center">
16
+ <template slot-scope="scope">
17
+ <input v-model="scope.row[role._id]" :name="scope.row.role" :disabled="role._id=='Admin'" type="checkbox" @change="save">
18
+ </template>
19
+ </el-table-column>
20
+ </el-table>
21
+ </div>
22
+ </template>
23
+
24
+ <script>
25
+ import request from '@/utils/request'
26
+
27
+ export default {
28
+ name: 'ManagePermissions',
29
+ data: () => ({
30
+ roles: [],
31
+ data: []
32
+ }),
33
+ mounted() {
34
+ this.update()
35
+ },
36
+ methods: {
37
+ async update() {
38
+ this.roles = (await request({ url: '/role/' })).data
39
+
40
+ const Admin = this.roles.find((r) => r._id === 'Admin')
41
+ const permissions = Object.keys(Admin.permissions)
42
+ const ordering = ['Admin', 'Authenticated', 'Anonymous']
43
+ this.roles.sort(function(a, b) {
44
+ const ai = ordering.indexOf(a._id)
45
+ const bi = ordering.indexOf(b._id)
46
+ return (ai !== bi) ? ai - bi : a._id.localeCompare(b._id)
47
+ })
48
+ const reducer = (row, role) => {
49
+ row[role._id] = role.permissions[row.name]
50
+ return row
51
+ }
52
+ const permissionData = permissions.map((permissionName) => this.roles.reduce(reducer, { name: permissionName }))
53
+ this.data = permissionData.sort((a, b) => (a.name < b.name) ? -1 : 1)
54
+ },
55
+ async save() {
56
+ // eslint-disable-next-line
57
+ for (const role of this.roles) {
58
+ role.permissions = {}
59
+ this.data.forEach((row) => {
60
+ if (row[role._id]) {
61
+ role.permissions[row.name] = 1
62
+ }
63
+ })
64
+ await request({ method: 'put', url: `/role/${role._id}`, data: role })
65
+ }
66
+ }
67
+ }
68
+ }
69
+ </script>
70
+
71
+ <style scoped>
72
+ input[type=checkbox] {
73
+ transform: scale(1.5);
74
+ }
75
+ </style>
@@ -1,77 +1,77 @@
1
- <template>
2
- <div class="app-container" style="display: flex; width: 100%;">
3
- <div class="side-panel">
4
- <h2>Request</h2>
5
- <p>
6
- {{ log.method }} {{ log.url }}
7
- </p>
8
- <dl>
9
- <dt>Request Time</dt>
10
- <dd>{{ log.meta.created }}</dd>
11
- <dt>User</dt>
12
- <dd>{{ log.user }}</dd>
13
- <dt>User Collection</dt>
14
- <dd>{{ log.user_collection }}</dd>
15
- <dt>IP</dt>
16
- <dd>{{ req.ip }}</dd>
17
- <dt>User-Agent</dt>
18
- <dd>{{ req.headers['user-agent'] }}</dd>
19
- <dt>Referrer</dt>
20
- <dd>{{ req.headers.referer }}</dd>
21
- <dt>Origin</dt>
22
- <dd>{{ req.headers.origin }}</dd>
23
- </dl>
24
- </div>
25
-
26
- <div class="side-panel">
27
- <h2>Response</h2>
28
- <dl>
29
- <dt>ID</dt>
30
- <dd>{{ res.requestId }}</dd>
31
- <dt>Response Time</dt>
32
- <dd>{{ log.meta.created }}</dd>
33
- <dt>Status Code</dt>
34
- <dd>{{ res.statusCode }}</dd>
35
- <dt>Content-Length</dt>
36
- <dd>{{ res.headers['content-length'] }} bytes</dd>
37
- <dt>Message</dt>
38
- <dd>{{ res.message }}</dd>
39
- <dt>Token Message</dt>
40
- <dd>{{ res.tokenMessage }}</dd>
41
- </dl>
42
- </div>
43
- </div>
44
- </template>
45
-
46
- <script>
47
- import request from '@/utils/request'
48
-
49
- export default {
50
- name: 'ViewRequest',
51
- data: () => ({
52
- log: {},
53
- req: {},
54
- res: {},
55
- }),
56
- mounted() {
57
- this.update()
58
- },
59
- methods: {
60
- async update() {
61
- const id = this.$route.params.requestId
62
- console.log('id')
63
- console.log(id)
64
- const log = (await request({ url: `/requestlog/${id}` })).data
65
- this.log = log
66
- this.req = log.req
67
- this.res = log.res
68
- },
69
- }
70
- }
71
- </script>
72
-
73
- <style scoped>
74
- .side-panel {
75
- flex-grow: 1;
76
- }
77
- </style>
1
+ <template>
2
+ <div class="app-container" style="display: flex; width: 100%;">
3
+ <div class="side-panel">
4
+ <h2>Request</h2>
5
+ <p>
6
+ {{ log.method }} {{ log.url }}
7
+ </p>
8
+ <dl>
9
+ <dt>Request Time</dt>
10
+ <dd>{{ log.meta.created }}</dd>
11
+ <dt>User</dt>
12
+ <dd>{{ log.user }}</dd>
13
+ <dt>User Collection</dt>
14
+ <dd>{{ log.user_collection }}</dd>
15
+ <dt>IP</dt>
16
+ <dd>{{ req.ip }}</dd>
17
+ <dt>User-Agent</dt>
18
+ <dd>{{ req.headers['user-agent'] }}</dd>
19
+ <dt>Referrer</dt>
20
+ <dd>{{ req.headers.referer }}</dd>
21
+ <dt>Origin</dt>
22
+ <dd>{{ req.headers.origin }}</dd>
23
+ </dl>
24
+ </div>
25
+
26
+ <div class="side-panel">
27
+ <h2>Response</h2>
28
+ <dl>
29
+ <dt>ID</dt>
30
+ <dd>{{ res.requestId }}</dd>
31
+ <dt>Response Time</dt>
32
+ <dd>{{ log.meta.created }}</dd>
33
+ <dt>Status Code</dt>
34
+ <dd>{{ res.statusCode }}</dd>
35
+ <dt>Content-Length</dt>
36
+ <dd>{{ res.headers['content-length'] }} bytes</dd>
37
+ <dt>Message</dt>
38
+ <dd>{{ res.message }}</dd>
39
+ <dt>Token Message</dt>
40
+ <dd>{{ res.tokenMessage }}</dd>
41
+ </dl>
42
+ </div>
43
+ </div>
44
+ </template>
45
+
46
+ <script>
47
+ import request from '@/utils/request'
48
+
49
+ export default {
50
+ name: 'ViewRequest',
51
+ data: () => ({
52
+ log: {},
53
+ req: {},
54
+ res: {},
55
+ }),
56
+ mounted() {
57
+ this.update()
58
+ },
59
+ methods: {
60
+ async update() {
61
+ const id = this.$route.params.requestId
62
+ console.log('id')
63
+ console.log(id)
64
+ const log = (await request({ url: `/requestlog/${id}` })).data
65
+ this.log = log
66
+ this.req = log.req
67
+ this.res = log.res
68
+ },
69
+ }
70
+ }
71
+ </script>
72
+
73
+ <style scoped>
74
+ .side-panel {
75
+ flex-grow: 1;
76
+ }
77
+ </style>