@strapi/plugin-users-permissions 4.0.0-next.1 → 4.0.0-next.13

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 (74) hide show
  1. package/admin/src/index.js +31 -28
  2. package/admin/src/pages/AdvancedSettings/index.js +14 -2
  3. package/admin/src/pages/AdvancedSettings/utils/form.js +2 -2
  4. package/admin/src/pages/EmailTemplates/index.js +8 -1
  5. package/admin/src/pages/Providers/index.js +8 -1
  6. package/admin/src/pages/Roles/CreatePage/index.js +1 -1
  7. package/admin/src/pages/Roles/EditPage/index.js +2 -2
  8. package/admin/src/pages/Roles/ListPage/index.js +1 -1
  9. package/admin/src/pages/Roles/index.js +14 -8
  10. package/admin/src/permissions.js +12 -14
  11. package/admin/src/translations/en.json +4 -0
  12. package/admin/src/translations/zh-Hans.json +26 -7
  13. package/documentation/1.0.0/overrides/users-permissions-Role.json +6 -6
  14. package/package.json +8 -6
  15. package/{config/functions/bootstrap.js → server/bootstrap/index.js} +9 -18
  16. package/{config → server/bootstrap}/users-permissions-actions.js +0 -0
  17. package/server/config.js +23 -0
  18. package/server/content-types/index.js +11 -0
  19. package/server/content-types/permission/index.js +31 -0
  20. package/server/content-types/role/index.js +48 -0
  21. package/server/content-types/user/index.js +72 -0
  22. package/{models/User.config.js → server/content-types/user/schema-config.js} +0 -0
  23. package/{controllers → server/controllers}/auth.js +63 -77
  24. package/server/controllers/index.js +15 -0
  25. package/server/controllers/permissions.js +26 -0
  26. package/server/controllers/role.js +77 -0
  27. package/server/controllers/settings.js +84 -0
  28. package/{controllers → server/controllers}/user/admin.js +26 -42
  29. package/{controllers → server/controllers}/user/api.js +11 -27
  30. package/{controllers → server/controllers}/user.js +2 -18
  31. package/{controllers → server/controllers}/validation/email-template.js +0 -0
  32. package/server/index.js +21 -0
  33. package/server/policies/index.js +7 -0
  34. package/{config → server}/policies/rateLimit.js +4 -8
  35. package/server/register.js +7 -0
  36. package/server/routes/admin/index.js +10 -0
  37. package/server/routes/admin/permissions.js +20 -0
  38. package/server/routes/admin/role.js +79 -0
  39. package/server/routes/admin/settings.js +95 -0
  40. package/server/routes/content-api/auth.js +73 -0
  41. package/server/routes/content-api/index.js +11 -0
  42. package/server/routes/content-api/permissions.js +9 -0
  43. package/server/routes/content-api/role.js +29 -0
  44. package/server/routes/content-api/user.js +61 -0
  45. package/server/routes/index.js +6 -0
  46. package/{config → server}/schema.graphql.js +96 -63
  47. package/server/services/index.js +15 -0
  48. package/{services → server/services}/jwt.js +12 -14
  49. package/server/services/providers.js +592 -0
  50. package/server/services/role.js +182 -0
  51. package/{services → server/services}/user.js +31 -34
  52. package/server/services/users-permissions.js +222 -0
  53. package/server/strategies/users-permissions.js +122 -0
  54. package/{utils → server/utils}/index.d.ts +6 -1
  55. package/server/utils/index.js +9 -0
  56. package/strapi-server.js +3 -0
  57. package/config/layout.js +0 -10
  58. package/config/policies/isAuthenticated.js +0 -9
  59. package/config/policies/permissions.js +0 -94
  60. package/config/request.json +0 -6
  61. package/config/routes.json +0 -381
  62. package/config/security.json +0 -5
  63. package/controllers/users-permissions.js +0 -271
  64. package/middlewares/users-permissions/defaults.json +0 -5
  65. package/middlewares/users-permissions/index.js +0 -40
  66. package/models/Permission.js +0 -7
  67. package/models/Permission.settings.json +0 -45
  68. package/models/Role.js +0 -7
  69. package/models/Role.settings.json +0 -43
  70. package/models/User.js +0 -7
  71. package/models/User.settings.json +0 -63
  72. package/services/providers.js +0 -598
  73. package/services/users-permissions.js +0 -430
  74. package/utils/index.js +0 -11
@@ -0,0 +1,48 @@
1
+ 'use strict';
2
+
3
+ module.exports = {
4
+ collectionName: 'up_roles',
5
+ info: {
6
+ name: 'role',
7
+ description: '',
8
+ singularName: 'role',
9
+ pluralName: 'roles',
10
+ displayName: 'Role',
11
+ },
12
+ pluginOptions: {
13
+ 'content-manager': {
14
+ visible: false,
15
+ },
16
+ },
17
+ attributes: {
18
+ name: {
19
+ type: 'string',
20
+ minLength: 3,
21
+ required: true,
22
+ configurable: false,
23
+ },
24
+ description: {
25
+ type: 'string',
26
+ configurable: false,
27
+ },
28
+ type: {
29
+ type: 'string',
30
+ unique: true,
31
+ configurable: false,
32
+ },
33
+ permissions: {
34
+ type: 'relation',
35
+ relation: 'oneToMany',
36
+ target: 'plugin::users-permissions.permission',
37
+ mappedBy: 'role',
38
+ configurable: false,
39
+ },
40
+ users: {
41
+ type: 'relation',
42
+ relation: 'oneToMany',
43
+ target: 'plugin::users-permissions.user',
44
+ mappedBy: 'role',
45
+ configurable: false,
46
+ },
47
+ },
48
+ };
@@ -0,0 +1,72 @@
1
+ 'use strict';
2
+
3
+ const schemaConfig = require('./schema-config');
4
+
5
+ module.exports = {
6
+ collectionName: 'up_users',
7
+ info: {
8
+ name: 'user',
9
+ description: '',
10
+ singularName: 'user',
11
+ pluralName: 'users',
12
+ displayName: 'User',
13
+ },
14
+ options: {
15
+ draftAndPublish: false,
16
+ timestamps: true,
17
+ },
18
+ attributes: {
19
+ username: {
20
+ type: 'string',
21
+ minLength: 3,
22
+ unique: true,
23
+ configurable: false,
24
+ required: true,
25
+ },
26
+ email: {
27
+ type: 'email',
28
+ minLength: 6,
29
+ configurable: false,
30
+ required: true,
31
+ },
32
+ provider: {
33
+ type: 'string',
34
+ configurable: false,
35
+ },
36
+ password: {
37
+ type: 'password',
38
+ minLength: 6,
39
+ configurable: false,
40
+ private: true,
41
+ },
42
+ resetPasswordToken: {
43
+ type: 'string',
44
+ configurable: false,
45
+ private: true,
46
+ },
47
+ confirmationToken: {
48
+ type: 'string',
49
+ configurable: false,
50
+ private: true,
51
+ },
52
+ confirmed: {
53
+ type: 'boolean',
54
+ default: false,
55
+ configurable: false,
56
+ },
57
+ blocked: {
58
+ type: 'boolean',
59
+ default: false,
60
+ configurable: false,
61
+ },
62
+ role: {
63
+ type: 'relation',
64
+ relation: 'manyToOne',
65
+ target: 'plugin::users-permissions.role',
66
+ inversedBy: 'users',
67
+ configurable: false,
68
+ },
69
+ },
70
+
71
+ config: schemaConfig, // TODO: to move to content-manager options
72
+ };
@@ -9,7 +9,6 @@
9
9
  /* eslint-disable no-useless-escape */
10
10
  const crypto = require('crypto');
11
11
  const _ = require('lodash');
12
- const grant = require('grant-koa');
13
12
  const { sanitizeEntity } = require('@strapi/utils');
14
13
  const { getService } = require('../utils');
15
14
 
@@ -23,11 +22,7 @@ module.exports = {
23
22
  const provider = ctx.params.provider || 'local';
24
23
  const params = ctx.request.body;
25
24
 
26
- const store = await strapi.store({
27
- environment: '',
28
- type: 'plugin',
29
- name: 'users-permissions',
30
- });
25
+ const store = await strapi.store({ type: 'plugin', name: 'users-permissions' });
31
26
 
32
27
  if (provider === 'local') {
33
28
  if (!_.get(await store.get({ key: 'grant' }), 'email.enabled')) {
@@ -69,7 +64,7 @@ module.exports = {
69
64
  }
70
65
 
71
66
  // Check if the user exists.
72
- const user = await strapi.query('plugins::users-permissions.user').findOne({ where: query });
67
+ const user = await strapi.query('plugin::users-permissions.user').findOne({ where: query });
73
68
 
74
69
  if (!user) {
75
70
  return ctx.badRequest(
@@ -116,9 +111,10 @@ module.exports = {
116
111
  );
117
112
  }
118
113
 
119
- const validPassword = await strapi.plugins[
120
- 'users-permissions'
121
- ].services.user.validatePassword(params.password, user.password);
114
+ const validPassword = await getService('user').validatePassword(
115
+ params.password,
116
+ user.password
117
+ );
122
118
 
123
119
  if (!validPassword) {
124
120
  return ctx.badRequest(
@@ -130,11 +126,11 @@ module.exports = {
130
126
  );
131
127
  } else {
132
128
  ctx.send({
133
- jwt: strapi.plugins['users-permissions'].services.jwt.issue({
129
+ jwt: getService('jwt').issue({
134
130
  id: user.id,
135
131
  }),
136
- user: sanitizeEntity(user.toJSON ? user.toJSON() : user, {
137
- model: strapi.getModel('plugins::users-permissions.user'),
132
+ user: sanitizeEntity(user, {
133
+ model: strapi.getModel('plugin::users-permissions.user'),
138
134
  }),
139
135
  });
140
136
  }
@@ -153,10 +149,7 @@ module.exports = {
153
149
  let user;
154
150
  let error;
155
151
  try {
156
- [user, error] = await strapi.plugins['users-permissions'].services.providers.connect(
157
- provider,
158
- ctx.query
159
- );
152
+ [user, error] = await getService('providers').connect(provider, ctx.query);
160
153
  } catch ([user, error]) {
161
154
  return ctx.badRequest(null, error === 'array' ? error[0] : error);
162
155
  }
@@ -166,11 +159,9 @@ module.exports = {
166
159
  }
167
160
 
168
161
  ctx.send({
169
- jwt: strapi.plugins['users-permissions'].services.jwt.issue({
170
- id: user.id,
171
- }),
172
- user: sanitizeEntity(user.toJSON ? user.toJSON() : user, {
173
- model: strapi.getModel('plugins::users-permissions.user'),
162
+ jwt: getService('jwt').issue({ id: user.id }),
163
+ user: sanitizeEntity(user, {
164
+ model: strapi.getModel('plugin::users-permissions.user'),
174
165
  }),
175
166
  });
176
167
  }
@@ -186,7 +177,7 @@ module.exports = {
186
177
  params.code
187
178
  ) {
188
179
  const user = await strapi
189
- .query('plugins::users-permissions.user')
180
+ .query('plugin::users-permissions.user')
190
181
  .findOne({ where: { resetPasswordToken: `${params.code}` } });
191
182
 
192
183
  if (!user) {
@@ -203,15 +194,13 @@ module.exports = {
203
194
 
204
195
  // Update the user.
205
196
  await strapi
206
- .query('plugins::users-permissions.user')
197
+ .query('plugin::users-permissions.user')
207
198
  .update({ where: { id: user.id }, data: { resetPasswordToken: null, password } });
208
199
 
209
200
  ctx.send({
210
- jwt: strapi.plugins['users-permissions'].services.jwt.issue({
211
- id: user.id,
212
- }),
213
- user: sanitizeEntity(user.toJSON ? user.toJSON() : user, {
214
- model: strapi.getModel('plugins::users-permissions.user'),
201
+ jwt: getService('jwt').issue({ id: user.id }),
202
+ user: sanitizeEntity(user, {
203
+ model: strapi.getModel('plugin::users-permissions.user'),
215
204
  }),
216
205
  });
217
206
  } else if (
@@ -238,13 +227,10 @@ module.exports = {
238
227
  },
239
228
 
240
229
  async connect(ctx, next) {
230
+ const grant = require('grant-koa');
231
+
241
232
  const grantConfig = await strapi
242
- .store({
243
- environment: '',
244
- type: 'plugin',
245
- name: 'users-permissions',
246
- key: 'grant',
247
- })
233
+ .store({ type: 'plugin', name: 'users-permissions', key: 'grant' })
248
234
  .get();
249
235
 
250
236
  const [requestPath] = ctx.request.url.split('?');
@@ -262,9 +248,7 @@ module.exports = {
262
248
 
263
249
  // Ability to pass OAuth callback dynamically
264
250
  grantConfig[provider].callback = _.get(ctx, 'query.callback') || grantConfig[provider].callback;
265
- grantConfig[provider].redirect_uri = strapi.plugins[
266
- 'users-permissions'
267
- ].services.providers.buildRedirectUri(provider);
251
+ grantConfig[provider].redirect_uri = getService('providers').buildRedirectUri(provider);
268
252
 
269
253
  return grant(grantConfig)(ctx, next);
270
254
  },
@@ -282,20 +266,16 @@ module.exports = {
282
266
  null,
283
267
  formatError({
284
268
  id: 'Auth.form.error.email.format',
285
- message: 'Please provide valid email address.',
269
+ message: 'Please provide a valid email address.',
286
270
  })
287
271
  );
288
272
  }
289
273
 
290
- const pluginStore = await strapi.store({
291
- environment: '',
292
- type: 'plugin',
293
- name: 'users-permissions',
294
- });
274
+ const pluginStore = await strapi.store({ type: 'plugin', name: 'users-permissions' });
295
275
 
296
276
  // Find the user by email.
297
277
  const user = await strapi
298
- .query('plugins::users-permissions.user')
278
+ .query('plugin::users-permissions.user')
299
279
  .findOne({ where: { email: email.toLowerCase() } });
300
280
 
301
281
  // User not found.
@@ -309,6 +289,17 @@ module.exports = {
309
289
  );
310
290
  }
311
291
 
292
+ // User blocked
293
+ if (user.blocked) {
294
+ return ctx.badRequest(
295
+ null,
296
+ formatError({
297
+ id: 'Auth.form.error.user.blocked',
298
+ message: 'This user is disabled.',
299
+ })
300
+ );
301
+ }
302
+
312
303
  // Generate random token.
313
304
  const resetPasswordToken = crypto.randomBytes(64).toString('hex');
314
305
 
@@ -325,7 +316,7 @@ module.exports = {
325
316
  });
326
317
 
327
318
  const userInfo = sanitizeEntity(user, {
328
- model: strapi.getModel('plugins::users-permissions.user'),
319
+ model: strapi.getModel('plugin::users-permissions.user'),
329
320
  });
330
321
 
331
322
  settings.message = await getService('users-permissions').template(settings.message, {
@@ -340,35 +331,34 @@ module.exports = {
340
331
 
341
332
  try {
342
333
  // Send an email to the user.
343
- await strapi.plugins['email'].services.email.send({
344
- to: user.email,
345
- from:
346
- settings.from.email || settings.from.name
347
- ? `${settings.from.name} <${settings.from.email}>`
348
- : undefined,
349
- replyTo: settings.response_email,
350
- subject: settings.object,
351
- text: settings.message,
352
- html: settings.message,
353
- });
334
+ await strapi
335
+ .plugin('email')
336
+ .service('email')
337
+ .send({
338
+ to: user.email,
339
+ from:
340
+ settings.from.email || settings.from.name
341
+ ? `${settings.from.name} <${settings.from.email}>`
342
+ : undefined,
343
+ replyTo: settings.response_email,
344
+ subject: settings.object,
345
+ text: settings.message,
346
+ html: settings.message,
347
+ });
354
348
  } catch (err) {
355
349
  return ctx.badRequest(null, err);
356
350
  }
357
351
 
358
352
  // Update the user.
359
353
  await strapi
360
- .query('plugins::users-permissions.user')
354
+ .query('plugin::users-permissions.user')
361
355
  .update({ where: { id: user.id }, data: { resetPasswordToken } });
362
356
 
363
357
  ctx.send({ ok: true });
364
358
  },
365
359
 
366
360
  async register(ctx) {
367
- const pluginStore = await strapi.store({
368
- environment: '',
369
- type: 'plugin',
370
- name: 'users-permissions',
371
- });
361
+ const pluginStore = await strapi.store({ type: 'plugin', name: 'users-permissions' });
372
362
 
373
363
  const settings = await pluginStore.get({
374
364
  key: 'advanced',
@@ -424,7 +414,7 @@ module.exports = {
424
414
  }
425
415
 
426
416
  const role = await strapi
427
- .query('plugins::users-permissions.role')
417
+ .query('plugin::users-permissions.role')
428
418
  .findOne({ where: { type: settings.default_role } });
429
419
 
430
420
  if (!role) {
@@ -455,7 +445,7 @@ module.exports = {
455
445
  params.role = role.id;
456
446
  params.password = await getService('user').hashPassword(params);
457
447
 
458
- const user = await strapi.query('plugins::users-permissions.user').findOne({
448
+ const user = await strapi.query('plugin::users-permissions.user').findOne({
459
449
  where: { email: params.email },
460
450
  });
461
451
 
@@ -484,10 +474,10 @@ module.exports = {
484
474
  params.confirmed = true;
485
475
  }
486
476
 
487
- const user = await strapi.query('plugins::users-permissions.user').create({ data: params });
477
+ const user = await strapi.query('plugin::users-permissions.user').create({ data: params });
488
478
 
489
479
  const sanitizedUser = sanitizeEntity(user, {
490
- model: strapi.getModel('plugins::users-permissions.user'),
480
+ model: strapi.getModel('plugin::users-permissions.user'),
491
481
  });
492
482
 
493
483
  if (settings.email_confirmation) {
@@ -500,7 +490,7 @@ module.exports = {
500
490
  return ctx.send({ user: sanitizedUser });
501
491
  }
502
492
 
503
- const jwt = strapi.plugins['users-permissions'].services.jwt.issue(_.pick(user, ['id']));
493
+ const jwt = getService('jwt').issue(_.pick(user, ['id']));
504
494
 
505
495
  return ctx.send({
506
496
  jwt,
@@ -521,7 +511,8 @@ module.exports = {
521
511
  async emailConfirmation(ctx, next, returnUser) {
522
512
  const { confirmation: confirmationToken } = ctx.query;
523
513
 
524
- const { user: userService, jwt: jwtService } = strapi.plugins['users-permissions'].services;
514
+ const userService = getService('user');
515
+ const jwtService = getService('jwt');
525
516
 
526
517
  if (_.isEmpty(confirmationToken)) {
527
518
  return ctx.badRequest('token.invalid');
@@ -539,17 +530,12 @@ module.exports = {
539
530
  ctx.send({
540
531
  jwt: jwtService.issue({ id: user.id }),
541
532
  user: sanitizeEntity(user, {
542
- model: strapi.getModel('plugins::users-permissions.user'),
533
+ model: strapi.getModel('plugin::users-permissions.user'),
543
534
  }),
544
535
  });
545
536
  } else {
546
537
  const settings = await strapi
547
- .store({
548
- environment: '',
549
- type: 'plugin',
550
- name: 'users-permissions',
551
- key: 'advanced',
552
- })
538
+ .store({ type: 'plugin', name: 'users-permissions', key: 'advanced' })
553
539
  .get();
554
540
 
555
541
  ctx.redirect(settings.email_confirmation_redirection || '/');
@@ -571,7 +557,7 @@ module.exports = {
571
557
  return ctx.badRequest('wrong.email');
572
558
  }
573
559
 
574
- const user = await strapi.query('plugins::users-permissions.user').findOne({
560
+ const user = await strapi.query('plugin::users-permissions.user').findOne({
575
561
  where: { email: params.email },
576
562
  });
577
563
 
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ const auth = require('./auth');
4
+ const user = require('./user');
5
+ const role = require('./role');
6
+ const permissions = require('./permissions');
7
+ const settings = require('./settings');
8
+
9
+ module.exports = {
10
+ auth,
11
+ user,
12
+ role,
13
+ permissions,
14
+ settings,
15
+ };
@@ -0,0 +1,26 @@
1
+ 'use strict';
2
+
3
+ const _ = require('lodash');
4
+ const { getService } = require('../utils');
5
+
6
+ module.exports = {
7
+ async getPermissions(ctx) {
8
+ const permissions = await getService('users-permissions').getActions();
9
+
10
+ ctx.send({ permissions });
11
+ },
12
+
13
+ async getPolicies(ctx) {
14
+ const policies = _.keys(strapi.plugin('users-permissions').policies);
15
+
16
+ ctx.send({
17
+ policies: _.without(policies, 'permissions'),
18
+ });
19
+ },
20
+
21
+ async getRoutes(ctx) {
22
+ const routes = await getService('users-permissions').getRoutes();
23
+
24
+ ctx.send({ routes });
25
+ },
26
+ };
@@ -0,0 +1,77 @@
1
+ 'use strict';
2
+
3
+ const _ = require('lodash');
4
+ const { getService } = require('../utils');
5
+
6
+ module.exports = {
7
+ /**
8
+ * Default action.
9
+ *
10
+ * @return {Object}
11
+ */
12
+ async createRole(ctx) {
13
+ if (_.isEmpty(ctx.request.body)) {
14
+ return ctx.badRequest('Request body cannot be empty');
15
+ }
16
+
17
+ await getService('role').createRole(ctx.request.body);
18
+
19
+ ctx.send({ ok: true });
20
+ },
21
+
22
+ async getRole(ctx) {
23
+ const { id } = ctx.params;
24
+ const { lang } = ctx.query;
25
+
26
+ const plugins = await getService('users-permissions').getPlugins(lang);
27
+ const role = await getService('role').getRole(id, plugins);
28
+
29
+ if (!role) {
30
+ return ctx.notFound();
31
+ }
32
+
33
+ ctx.send({ role });
34
+ },
35
+
36
+ async getRoles(ctx) {
37
+ const roles = await getService('role').getRoles();
38
+
39
+ ctx.send({ roles });
40
+ },
41
+
42
+ async updateRole(ctx) {
43
+ const roleID = ctx.params.role;
44
+
45
+ if (_.isEmpty(ctx.request.body)) {
46
+ return ctx.badRequest('Request body cannot be empty');
47
+ }
48
+
49
+ await getService('role').updateRole(roleID, ctx.request.body);
50
+
51
+ ctx.send({ ok: true });
52
+ },
53
+
54
+ async deleteRole(ctx) {
55
+ const roleID = ctx.params.role;
56
+
57
+ if (!roleID) {
58
+ return ctx.badRequest();
59
+ }
60
+
61
+ // Fetch public role.
62
+ const publicRole = await strapi
63
+ .query('plugin::users-permissions.role')
64
+ .findOne({ where: { type: 'public' } });
65
+
66
+ const publicRoleID = publicRole.id;
67
+
68
+ // Prevent from removing the public role.
69
+ if (roleID.toString() === publicRoleID.toString()) {
70
+ return ctx.badRequest('Cannot delete public role');
71
+ }
72
+
73
+ await getService('role').deleteRole(roleID, publicRoleID);
74
+
75
+ ctx.send({ ok: true });
76
+ },
77
+ };
@@ -0,0 +1,84 @@
1
+ 'use strict';
2
+
3
+ const _ = require('lodash');
4
+ const { getService } = require('../utils');
5
+ const { isValidEmailTemplate } = require('./validation/email-template');
6
+
7
+ module.exports = {
8
+ async getEmailTemplate(ctx) {
9
+ ctx.send(await strapi.store({ type: 'plugin', name: 'users-permissions', key: 'email' }).get());
10
+ },
11
+
12
+ async updateEmailTemplate(ctx) {
13
+ if (_.isEmpty(ctx.request.body)) {
14
+ return ctx.badRequest('Request body cannot be empty');
15
+ }
16
+
17
+ const emailTemplates = ctx.request.body['email-templates'];
18
+
19
+ for (let key in emailTemplates) {
20
+ const template = emailTemplates[key].options.message;
21
+
22
+ if (!isValidEmailTemplate(template)) {
23
+ return ctx.badRequest('Invalid template');
24
+ }
25
+ }
26
+
27
+ await strapi
28
+ .store({ type: 'plugin', name: 'users-permissions', key: 'email' })
29
+ .set({ value: emailTemplates });
30
+
31
+ ctx.send({ ok: true });
32
+ },
33
+
34
+ async getAdvancedSettings(ctx) {
35
+ const settings = await strapi
36
+ .store({ type: 'plugin', name: 'users-permissions', key: 'advanced' })
37
+ .get();
38
+
39
+ const roles = await getService('role').getRoles();
40
+
41
+ ctx.send({ settings, roles });
42
+ },
43
+
44
+ async updateAdvancedSettings(ctx) {
45
+ if (_.isEmpty(ctx.request.body)) {
46
+ return ctx.badRequest('Request body cannot be empty');
47
+ }
48
+
49
+ await strapi
50
+ .store({ type: 'plugin', name: 'users-permissions', key: 'advanced' })
51
+ .set({ value: ctx.request.body });
52
+
53
+ ctx.send({ ok: true });
54
+ },
55
+
56
+ async getProviders(ctx) {
57
+ const providers = await strapi
58
+ .store({ type: 'plugin', name: 'users-permissions', key: 'grant' })
59
+ .get();
60
+
61
+ for (const provider in providers) {
62
+ if (provider !== 'email') {
63
+ providers[provider].redirectUri = strapi
64
+ .plugin('users-permissions')
65
+ .service('providers')
66
+ .buildRedirectUri(provider);
67
+ }
68
+ }
69
+
70
+ ctx.send(providers);
71
+ },
72
+
73
+ async updateProviders(ctx) {
74
+ if (_.isEmpty(ctx.request.body)) {
75
+ return ctx.badRequest('Request body cannot be empty');
76
+ }
77
+
78
+ await strapi
79
+ .store({ type: 'plugin', name: 'users-permissions', key: 'grant' })
80
+ .set({ value: ctx.request.body.providers });
81
+
82
+ ctx.send({ ok: true });
83
+ },
84
+ };