expressa 2.0.16 → 2.0.18

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 (208) hide show
  1. package/.circleci/config.yml +21 -21
  2. package/.eslintrc.json +29 -29
  3. package/LICENSE +21 -21
  4. package/README.md +137 -137
  5. package/auth/index.js +76 -76
  6. package/auth/jwt.js +31 -31
  7. package/controllers/collections.js +260 -258
  8. package/controllers/install.js +105 -105
  9. package/controllers/status.js +43 -43
  10. package/controllers/users.js +52 -52
  11. package/cypress/fixtures/example.json +4 -4
  12. package/cypress/integration/0_install_spec.js +8 -8
  13. package/cypress/integration/custom_collections.js +28 -28
  14. package/cypress/integration/home.js +9 -9
  15. package/cypress/integration/settings.js +34 -34
  16. package/cypress/integration/users.js +61 -61
  17. package/cypress/plugins/index.js +17 -17
  18. package/cypress/screenshots/users.js/User Management -- Can log in as non-admin, but cannot create users (failed).png +0 -0
  19. package/cypress/support/commands.js +54 -54
  20. package/cypress/support/index.js +20 -20
  21. package/cypress/support/util.js +10 -10
  22. package/cypress.json +4 -4
  23. package/db/cached.js +40 -40
  24. package/db/file.js +112 -112
  25. package/db/memory.js +79 -79
  26. package/db/mongo.js +86 -86
  27. package/db/postgres.js +93 -93
  28. package/doc/authentication.md +38 -38
  29. package/doc/automatic-fields.md +12 -12
  30. package/doc/blogexample.md +16 -16
  31. package/doc/custom-endpoints.md +20 -20
  32. package/doc/database.md +23 -23
  33. package/doc/development.md +33 -33
  34. package/doc/listeners.md +103 -103
  35. package/doc/modules.md +8 -8
  36. package/doc/permissions.md +14 -14
  37. package/doc/relationships.md +65 -65
  38. package/doc/testing.md +47 -47
  39. package/doc/uploading-files.md +53 -53
  40. package/index.js +297 -297
  41. package/listeners.js +65 -65
  42. package/listeners_collection_permissions.js +29 -29
  43. package/listeners_users.js +96 -96
  44. package/listeners_validation.js +43 -43
  45. package/middleware/logging.js +30 -30
  46. package/middleware/permissions.js +41 -41
  47. package/modules/access_keys/access_keys.js +32 -32
  48. package/modules/admin/.babelrc +20 -12
  49. package/modules/admin/.editorconfig +14 -14
  50. package/modules/admin/.eslintignore +5 -5
  51. package/modules/admin/.eslintrc.js +197 -197
  52. package/modules/admin/.postcssrc.js +10 -10
  53. package/modules/admin/.travis.yml +5 -5
  54. package/modules/admin/LICENSE +21 -21
  55. package/modules/admin/README.md +88 -88
  56. package/modules/admin/build/build.js +45 -45
  57. package/modules/admin/build/check-versions.js +64 -64
  58. package/modules/admin/build/utils.js +108 -108
  59. package/modules/admin/build/vue-loader.conf.js +5 -5
  60. package/modules/admin/build/webpack.base.conf.js +112 -108
  61. package/modules/admin/build/webpack.dev.conf.js +95 -95
  62. package/modules/admin/build/webpack.prod.conf.js +112 -171
  63. package/modules/admin/config/dev.env.js +8 -8
  64. package/modules/admin/config/index.js +86 -86
  65. package/modules/admin/config/prod.env.js +5 -5
  66. package/modules/admin/dist/favicon.ico +0 -0
  67. package/modules/admin/dist/index.html +1 -0
  68. package/modules/admin/dist/index.html.gz +0 -0
  69. package/modules/admin/dist/static/css/app.9dd57eea.css +1 -0
  70. package/modules/admin/dist/static/css/app.9dd57eea.css.gz +0 -0
  71. package/modules/admin/dist/static/css/chunk-5061.ce0e4bdb.css +1 -0
  72. package/modules/admin/dist/static/css/chunk-5061.ce0e4bdb.css.gz +0 -0
  73. package/modules/admin/dist/static/css/chunk-5b97.7f9cb53e.css +1 -0
  74. package/modules/admin/dist/static/css/chunk-5b97.7f9cb53e.css.gz +0 -0
  75. package/modules/admin/dist/static/css/chunk-621e.b826be8d.css +1 -0
  76. package/modules/admin/dist/static/css/chunk-621e.b826be8d.css.gz +0 -0
  77. package/modules/admin/dist/static/css/chunk-656b.9c828b00.css +1 -0
  78. package/modules/admin/dist/static/css/chunk-656b.9c828b00.css.gz +0 -0
  79. package/modules/admin/dist/static/css/chunk-7291.13514e45.css +0 -0
  80. package/modules/admin/dist/static/css/chunk-7291.13514e45.css.gz +0 -0
  81. package/modules/admin/dist/static/css/chunk-7f29.9c828b00.css +1 -0
  82. package/modules/admin/dist/static/css/chunk-7f29.9c828b00.css.gz +0 -0
  83. package/modules/admin/dist/static/css/chunk-9a95.c647a2ef.css +1 -0
  84. package/modules/admin/dist/static/css/chunk-9a95.c647a2ef.css.gz +0 -0
  85. package/modules/admin/dist/static/css/chunk-b423.5f239333.css +0 -0
  86. package/modules/admin/dist/static/css/chunk-b423.5f239333.css.gz +0 -0
  87. package/modules/admin/dist/static/css/chunk-bd5f.aefa49d7.css +1 -0
  88. package/modules/admin/dist/static/css/chunk-bd5f.aefa49d7.css.gz +0 -0
  89. package/modules/admin/dist/static/css/chunk-e374.025d58bb.css +1 -0
  90. package/modules/admin/dist/static/css/chunk-e374.025d58bb.css.gz +0 -0
  91. package/modules/admin/dist/static/css/chunk-elementUI.3d004d9f.css +1 -0
  92. package/modules/admin/dist/static/css/chunk-elementUI.3d004d9f.css.gz +0 -0
  93. package/modules/admin/dist/static/css/chunk-f075.3a895a1e.css +1 -0
  94. package/modules/admin/dist/static/css/chunk-f075.3a895a1e.css.gz +0 -0
  95. package/modules/admin/dist/static/css/chunk-libs.327ad89e.css +14 -0
  96. package/modules/admin/dist/static/css/chunk-libs.327ad89e.css.gz +0 -0
  97. package/modules/admin/dist/static/fonts/element-icons.6f0a763.ttf +0 -0
  98. package/modules/admin/dist/static/img/404.a57b6f3.png +0 -0
  99. package/modules/admin/dist/static/js/app.e9461593.js +1 -0
  100. package/modules/admin/dist/static/js/app.e9461593.js.gz +0 -0
  101. package/modules/admin/dist/static/js/chunk-09d8.561880e0.js +2 -0
  102. package/modules/admin/dist/static/js/chunk-09d8.561880e0.js.LICENSE.txt +13 -0
  103. package/modules/admin/dist/static/js/chunk-09d8.561880e0.js.LICENSE.txt.gz +0 -0
  104. package/modules/admin/dist/static/js/chunk-09d8.561880e0.js.gz +0 -0
  105. package/modules/admin/dist/static/js/chunk-5061.83e6ccfa.js +1 -0
  106. package/modules/admin/dist/static/js/chunk-5061.83e6ccfa.js.gz +0 -0
  107. package/modules/admin/dist/static/js/chunk-5b97.ac360086.js +1 -0
  108. package/modules/admin/dist/static/js/chunk-5b97.ac360086.js.gz +0 -0
  109. package/modules/admin/dist/static/js/chunk-5e17.a2b69611.js +1 -0
  110. package/modules/admin/dist/static/js/chunk-5e17.a2b69611.js.gz +0 -0
  111. package/modules/admin/dist/static/js/chunk-621e.ccf42393.js +1 -0
  112. package/modules/admin/dist/static/js/chunk-621e.ccf42393.js.gz +0 -0
  113. package/modules/admin/dist/static/js/chunk-656b.9d5b03c0.js +1 -0
  114. package/modules/admin/dist/static/js/chunk-656b.9d5b03c0.js.gz +0 -0
  115. package/modules/admin/dist/static/js/chunk-7291.590524e9.js +1 -0
  116. package/modules/admin/dist/static/js/chunk-7291.590524e9.js.gz +0 -0
  117. package/modules/admin/dist/static/js/chunk-7f29.6ffc142e.js +1 -0
  118. package/modules/admin/dist/static/js/chunk-7f29.6ffc142e.js.gz +0 -0
  119. package/modules/admin/dist/static/js/chunk-9a95.bdd76583.js +1 -0
  120. package/modules/admin/dist/static/js/chunk-9a95.bdd76583.js.gz +0 -0
  121. package/modules/admin/dist/static/js/chunk-b423.387c504c.js +1 -0
  122. package/modules/admin/dist/static/js/chunk-b423.387c504c.js.gz +0 -0
  123. package/modules/admin/dist/static/js/chunk-bd5f.e9509f10.js +1 -0
  124. package/modules/admin/dist/static/js/chunk-bd5f.e9509f10.js.gz +0 -0
  125. package/modules/admin/dist/static/js/chunk-e374.7c87a0dd.js +1 -0
  126. package/modules/admin/dist/static/js/chunk-e374.7c87a0dd.js.gz +0 -0
  127. package/modules/admin/dist/static/js/chunk-e7c3.e5df8ceb.js +1 -0
  128. package/modules/admin/dist/static/js/chunk-e7c3.e5df8ceb.js.gz +0 -0
  129. package/modules/admin/dist/static/js/chunk-elementUI.b0c99c08.js +1 -0
  130. package/modules/admin/dist/static/js/chunk-elementUI.b0c99c08.js.gz +0 -0
  131. package/modules/admin/dist/static/js/chunk-f075.315ceec1.js +1 -0
  132. package/modules/admin/dist/static/js/chunk-f075.315ceec1.js.gz +0 -0
  133. package/modules/admin/dist/static/js/chunk-libs.06c38828.js +2 -0
  134. package/modules/admin/dist/static/js/chunk-libs.06c38828.js.LICENSE.txt +126 -0
  135. package/modules/admin/dist/static/js/chunk-libs.06c38828.js.LICENSE.txt.gz +0 -0
  136. package/modules/admin/dist/static/js/chunk-libs.06c38828.js.gz +0 -0
  137. package/modules/admin/index.html +16 -16
  138. package/modules/admin/package.json +101 -98
  139. package/modules/admin/src/App.vue +11 -11
  140. package/modules/admin/src/api/login.js +26 -26
  141. package/modules/admin/src/api/table.js +9 -9
  142. package/modules/admin/src/components/Breadcrumb/index.vue +79 -79
  143. package/modules/admin/src/components/Hamburger/index.vue +62 -62
  144. package/modules/admin/src/components/JSONEditor.vue +180 -180
  145. package/modules/admin/src/components/SvgIcon/index.vue +43 -43
  146. package/modules/admin/src/icons/index.js +9 -9
  147. package/modules/admin/src/icons/svgo.yml +22 -22
  148. package/modules/admin/src/main.js +42 -41
  149. package/modules/admin/src/permission.js +49 -49
  150. package/modules/admin/src/router/index.js +200 -200
  151. package/modules/admin/src/store/getters.js +11 -11
  152. package/modules/admin/src/store/index.js +17 -17
  153. package/modules/admin/src/store/modules/app.js +43 -43
  154. package/modules/admin/src/store/modules/user.js +104 -104
  155. package/modules/admin/src/styles/element-ui.scss +29 -29
  156. package/modules/admin/src/styles/index.scss +78 -78
  157. package/modules/admin/src/styles/mixin.scss +27 -27
  158. package/modules/admin/src/styles/sidebar.scss +133 -133
  159. package/modules/admin/src/styles/transition.scss +46 -46
  160. package/modules/admin/src/styles/variables.scss +4 -4
  161. package/modules/admin/src/utils/auth.js +15 -15
  162. package/modules/admin/src/utils/index.js +74 -74
  163. package/modules/admin/src/utils/request.js +48 -48
  164. package/modules/admin/src/utils/validate.js +31 -31
  165. package/modules/admin/src/views/404.vue +235 -235
  166. package/modules/admin/src/views/Dev.vue +33 -33
  167. package/modules/admin/src/views/EditDocument.vue +116 -116
  168. package/modules/admin/src/views/Endpoints.vue +279 -279
  169. package/modules/admin/src/views/Home.vue +84 -84
  170. package/modules/admin/src/views/Install.vue +79 -79
  171. package/modules/admin/src/views/ListDocuments.vue +72 -72
  172. package/modules/admin/src/views/ListDocuments2.vue +462 -462
  173. package/modules/admin/src/views/ManageListeners.vue +67 -67
  174. package/modules/admin/src/views/ManageMiddleware.vue +43 -43
  175. package/modules/admin/src/views/ManagePermissions.vue +75 -75
  176. package/modules/admin/src/views/ViewRequest.vue +77 -77
  177. package/modules/admin/src/views/form/index.vue +91 -91
  178. package/modules/admin/src/views/layout/Layout.vue +69 -69
  179. package/modules/admin/src/views/layout/components/AppMain.vue +41 -41
  180. package/modules/admin/src/views/layout/components/Navbar.vue +97 -97
  181. package/modules/admin/src/views/layout/components/Sidebar/Item.vue +29 -29
  182. package/modules/admin/src/views/layout/components/Sidebar/Link.vue +39 -39
  183. package/modules/admin/src/views/layout/components/Sidebar/SidebarItem.vue +103 -103
  184. package/modules/admin/src/views/layout/components/Sidebar/index.vue +62 -62
  185. package/modules/admin/src/views/layout/components/index.js +3 -3
  186. package/modules/admin/src/views/layout/mixin/ResizeHandler.js +41 -41
  187. package/modules/admin/src/views/login/index.vue +195 -195
  188. package/modules/admin/src/views/tree/index.vue +77 -77
  189. package/modules/collections/collections.js +39 -39
  190. package/modules/core/core.js +197 -197
  191. package/modules/logging/logging.js +88 -88
  192. package/modules/permissions/permissions.js +106 -106
  193. package/package.json +59 -59
  194. package/scripts/expressa +12 -12
  195. package/scripts/run_cypress_tests.sh +5 -5
  196. package/scripts/run_db_tests.sh +8 -8
  197. package/test/0-install.js +96 -96
  198. package/test/collections.js +431 -431
  199. package/test/collections.querying.js +288 -289
  200. package/test/db.js +258 -258
  201. package/test/db.strings.js +73 -73
  202. package/test/db.updating.js +144 -144
  203. package/test/logging.js +29 -29
  204. package/test/test.js +93 -94
  205. package/test/testserver.js +17 -17
  206. package/test/testutils.js +136 -136
  207. package/test/users.js +425 -425
  208. package/util.js +522 -522
@@ -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>