@strapi/plugin-users-permissions 4.0.0-next.9 → 4.0.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 (177) hide show
  1. package/admin/src/components/BoundRoute/getMethodColor.js +41 -0
  2. package/admin/src/components/BoundRoute/index.js +40 -24
  3. package/admin/src/components/FormModal/Input/index.js +121 -0
  4. package/admin/src/components/FormModal/index.js +123 -0
  5. package/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.js +19 -26
  6. package/admin/src/components/Permissions/PermissionRow/SubCategory.js +118 -0
  7. package/admin/src/components/Permissions/PermissionRow/index.js +9 -48
  8. package/admin/src/components/Permissions/index.js +36 -24
  9. package/admin/src/components/Permissions/init.js +1 -6
  10. package/admin/src/components/Policies/index.js +46 -47
  11. package/admin/src/components/UsersPermissions/index.js +29 -26
  12. package/admin/src/components/UsersPermissions/init.js +1 -2
  13. package/admin/src/hooks/useFetchRole/index.js +17 -7
  14. package/admin/src/hooks/useForm/index.js +3 -29
  15. package/admin/src/hooks/useForm/reducer.js +2 -21
  16. package/admin/src/hooks/usePlugins/index.js +12 -21
  17. package/admin/src/hooks/usePlugins/reducer.js +0 -3
  18. package/admin/src/index.js +0 -8
  19. package/admin/src/pages/AdvancedSettings/index.js +203 -193
  20. package/admin/src/pages/AdvancedSettings/utils/api.js +13 -0
  21. package/admin/src/pages/AdvancedSettings/utils/layout.js +96 -0
  22. package/admin/src/pages/AdvancedSettings/utils/schema.js +22 -0
  23. package/admin/src/pages/EmailTemplates/components/EmailForm.js +173 -0
  24. package/admin/src/pages/EmailTemplates/components/EmailTable.js +116 -0
  25. package/admin/src/pages/EmailTemplates/index.js +117 -197
  26. package/admin/src/pages/EmailTemplates/utils/api.js +13 -0
  27. package/admin/src/pages/Providers/index.js +206 -221
  28. package/admin/src/pages/Providers/utils/api.js +21 -0
  29. package/admin/src/pages/Providers/utils/forms.js +168 -126
  30. package/admin/src/pages/Roles/CreatePage/index.js +155 -147
  31. package/admin/src/pages/Roles/EditPage/index.js +162 -134
  32. package/admin/src/pages/Roles/ListPage/components/TableBody.js +96 -0
  33. package/admin/src/pages/Roles/ListPage/index.js +176 -156
  34. package/admin/src/pages/Roles/ListPage/utils/api.js +28 -0
  35. package/admin/src/translations/ar.json +0 -8
  36. package/admin/src/translations/cs.json +0 -8
  37. package/admin/src/translations/de.json +0 -8
  38. package/admin/src/translations/dk.json +0 -8
  39. package/admin/src/translations/en.json +33 -12
  40. package/admin/src/translations/es.json +0 -8
  41. package/admin/src/translations/fr.json +0 -8
  42. package/admin/src/translations/id.json +0 -8
  43. package/admin/src/translations/it.json +0 -8
  44. package/admin/src/translations/ja.json +0 -8
  45. package/admin/src/translations/ko.json +0 -8
  46. package/admin/src/translations/ms.json +0 -8
  47. package/admin/src/translations/nl.json +0 -8
  48. package/admin/src/translations/pl.json +0 -8
  49. package/admin/src/translations/pt-BR.json +0 -8
  50. package/admin/src/translations/pt.json +0 -8
  51. package/admin/src/translations/ru.json +0 -8
  52. package/admin/src/translations/sk.json +0 -8
  53. package/admin/src/translations/sv.json +0 -8
  54. package/admin/src/translations/th.json +0 -8
  55. package/admin/src/translations/tr.json +0 -8
  56. package/admin/src/translations/uk.json +0 -8
  57. package/admin/src/translations/vi.json +0 -8
  58. package/admin/src/translations/zh-Hans.json +5 -14
  59. package/admin/src/translations/zh.json +0 -8
  60. package/admin/src/utils/axiosInstance.js +36 -0
  61. package/admin/src/utils/formatPluginName.js +26 -0
  62. package/admin/src/utils/index.js +1 -0
  63. package/documentation/1.0.0/overrides/users-permissions-Role.json +6 -6
  64. package/documentation/1.0.0/overrides/users-permissions-User.json +7 -7
  65. package/package.json +30 -31
  66. package/server/bootstrap/index.js +19 -21
  67. package/server/config.js +3 -3
  68. package/server/content-types/index.js +3 -3
  69. package/server/content-types/permission/index.js +30 -3
  70. package/server/content-types/role/index.js +47 -3
  71. package/server/content-types/user/index.js +65 -4
  72. package/server/controllers/auth.js +81 -244
  73. package/server/controllers/content-manager-user.js +183 -0
  74. package/server/controllers/index.js +12 -6
  75. package/server/controllers/permissions.js +26 -0
  76. package/server/controllers/role.js +77 -0
  77. package/server/controllers/settings.js +85 -0
  78. package/server/controllers/user.js +118 -44
  79. package/server/controllers/validation/auth.js +29 -0
  80. package/server/controllers/validation/user.js +38 -0
  81. package/server/graphql/index.js +44 -0
  82. package/server/graphql/mutations/auth/email-confirmation.js +39 -0
  83. package/server/graphql/mutations/auth/forgot-password.js +38 -0
  84. package/server/graphql/mutations/auth/login.js +38 -0
  85. package/server/graphql/mutations/auth/register.js +39 -0
  86. package/server/graphql/mutations/auth/reset-password.js +41 -0
  87. package/server/graphql/mutations/crud/role/create-role.js +37 -0
  88. package/server/graphql/mutations/crud/role/delete-role.js +28 -0
  89. package/server/graphql/mutations/crud/role/update-role.js +38 -0
  90. package/server/graphql/mutations/crud/user/create-user.js +48 -0
  91. package/server/graphql/mutations/crud/user/delete-user.js +42 -0
  92. package/server/graphql/mutations/crud/user/update-user.js +49 -0
  93. package/server/graphql/mutations/index.js +42 -0
  94. package/server/graphql/queries/index.js +13 -0
  95. package/server/graphql/queries/me.js +17 -0
  96. package/server/graphql/resolvers-configs.js +37 -0
  97. package/server/graphql/types/create-role-payload.js +11 -0
  98. package/server/graphql/types/delete-role-payload.js +11 -0
  99. package/server/graphql/types/index.js +21 -0
  100. package/server/graphql/types/login-input.js +13 -0
  101. package/server/graphql/types/login-payload.js +12 -0
  102. package/server/graphql/types/me-role.js +14 -0
  103. package/server/graphql/types/me.js +16 -0
  104. package/server/graphql/types/password-payload.js +11 -0
  105. package/server/graphql/types/register-input.js +13 -0
  106. package/server/graphql/types/update-role-payload.js +11 -0
  107. package/server/graphql/utils.js +27 -0
  108. package/server/index.js +21 -0
  109. package/server/middlewares/index.js +2 -2
  110. package/server/{policies → middlewares}/rateLimit.js +3 -7
  111. package/server/register.js +11 -0
  112. package/server/routes/admin/index.js +10 -0
  113. package/server/routes/admin/permissions.js +20 -0
  114. package/server/routes/admin/role.js +79 -0
  115. package/server/routes/admin/settings.js +95 -0
  116. package/server/routes/content-api/auth.js +73 -0
  117. package/server/routes/content-api/index.js +11 -0
  118. package/server/routes/content-api/permissions.js +9 -0
  119. package/server/routes/content-api/role.js +29 -0
  120. package/server/routes/content-api/user.js +61 -0
  121. package/server/routes/index.js +4 -428
  122. package/server/services/index.js +10 -8
  123. package/server/services/jwt.js +9 -17
  124. package/server/services/providers.js +32 -33
  125. package/server/services/role.js +177 -0
  126. package/server/services/user.js +9 -15
  127. package/server/services/users-permissions.js +140 -338
  128. package/server/strategies/users-permissions.js +123 -0
  129. package/server/utils/index.d.ts +2 -0
  130. package/strapi-admin.js +3 -0
  131. package/strapi-server.js +1 -19
  132. package/admin/src/assets/images/logo.svg +0 -1
  133. package/admin/src/components/BaselineAlignement/index.js +0 -33
  134. package/admin/src/components/Bloc/index.js +0 -10
  135. package/admin/src/components/BoundRoute/Components.js +0 -78
  136. package/admin/src/components/ContainerFluid/index.js +0 -13
  137. package/admin/src/components/FormBloc/index.js +0 -61
  138. package/admin/src/components/IntlInput/index.js +0 -38
  139. package/admin/src/components/ListBaselineAlignment/index.js +0 -8
  140. package/admin/src/components/ListRow/Components.js +0 -74
  141. package/admin/src/components/ListRow/index.js +0 -35
  142. package/admin/src/components/ModalForm/Wrapper.js +0 -12
  143. package/admin/src/components/ModalForm/index.js +0 -59
  144. package/admin/src/components/Permissions/ListWrapper.js +0 -9
  145. package/admin/src/components/Permissions/PermissionRow/BaselineAlignment.js +0 -7
  146. package/admin/src/components/Permissions/PermissionRow/RowStyle.js +0 -28
  147. package/admin/src/components/Permissions/PermissionRow/SubCategory/ConditionsButtonWrapper.js +0 -13
  148. package/admin/src/components/Permissions/PermissionRow/SubCategory/PolicyWrapper.js +0 -8
  149. package/admin/src/components/Permissions/PermissionRow/SubCategory/SubCategoryWrapper.js +0 -26
  150. package/admin/src/components/Permissions/PermissionRow/SubCategory/index.js +0 -116
  151. package/admin/src/components/Policies/Components.js +0 -26
  152. package/admin/src/components/PrefixedIcon/index.js +0 -27
  153. package/admin/src/components/Roles/EmptyRole/BaselineAlignment.js +0 -7
  154. package/admin/src/components/Roles/EmptyRole/index.js +0 -27
  155. package/admin/src/components/Roles/RoleListWrapper/index.js +0 -17
  156. package/admin/src/components/Roles/RoleRow/RoleDescription.js +0 -9
  157. package/admin/src/components/Roles/RoleRow/index.js +0 -45
  158. package/admin/src/components/Roles/index.js +0 -3
  159. package/admin/src/components/SizedInput/index.js +0 -24
  160. package/admin/src/pages/AdvancedSettings/reducer.js +0 -65
  161. package/admin/src/pages/AdvancedSettings/utils/form.js +0 -52
  162. package/admin/src/pages/EmailTemplates/CustomTextInput.js +0 -105
  163. package/admin/src/pages/EmailTemplates/Wrapper.js +0 -36
  164. package/admin/src/pages/EmailTemplates/reducer.js +0 -58
  165. package/admin/src/pages/EmailTemplates/utils/forms.js +0 -81
  166. package/admin/src/pages/Roles/ListPage/BaselineAlignment.js +0 -8
  167. package/server/content-types/permission/schema.json +0 -48
  168. package/server/content-types/role/schema.json +0 -46
  169. package/server/content-types/user/schema.json +0 -66
  170. package/server/controllers/user/admin.js +0 -230
  171. package/server/controllers/user/api.js +0 -174
  172. package/server/controllers/users-permissions.js +0 -271
  173. package/server/middlewares/users-permissions.js +0 -44
  174. package/server/policies/index.js +0 -11
  175. package/server/policies/isAuthenticated.js +0 -9
  176. package/server/policies/permissions.js +0 -94
  177. package/server/schema.graphql.js +0 -317
@@ -1,46 +0,0 @@
1
- {
2
- "collectionName": "up_roles",
3
- "info": {
4
- "name": "role",
5
- "description": "",
6
- "singularName": "role",
7
- "pluralName": "roles",
8
- "displayName": "Role"
9
- },
10
- "pluginOptions": {
11
- "content-manager": {
12
- "visible": false
13
- }
14
- },
15
- "attributes": {
16
- "name": {
17
- "type": "string",
18
- "minLength": 3,
19
- "required": true,
20
- "configurable": false
21
- },
22
- "description": {
23
- "type": "string",
24
- "configurable": false
25
- },
26
- "type": {
27
- "type": "string",
28
- "unique": true,
29
- "configurable": false
30
- },
31
- "permissions": {
32
- "type": "relation",
33
- "relation": "oneToMany",
34
- "target": "plugin::users-permissions.permission",
35
- "mappedBy": "role",
36
- "configurable": false
37
- },
38
- "users": {
39
- "type": "relation",
40
- "relation": "oneToMany",
41
- "target": "plugin::users-permissions.user",
42
- "mappedBy": "role",
43
- "configurable": false
44
- }
45
- }
46
- }
@@ -1,66 +0,0 @@
1
- {
2
- "collectionName": "up_users",
3
- "info": {
4
- "name": "user",
5
- "description": "",
6
- "singularName": "user",
7
- "pluralName": "users",
8
- "displayName": "User"
9
- },
10
- "options": {
11
- "draftAndPublish": false,
12
- "timestamps": true
13
- },
14
- "attributes": {
15
- "username": {
16
- "type": "string",
17
- "minLength": 3,
18
- "unique": true,
19
- "configurable": false,
20
- "required": true
21
- },
22
- "email": {
23
- "type": "email",
24
- "minLength": 6,
25
- "configurable": false,
26
- "required": true
27
- },
28
- "provider": {
29
- "type": "string",
30
- "configurable": false
31
- },
32
- "password": {
33
- "type": "password",
34
- "minLength": 6,
35
- "configurable": false,
36
- "private": true
37
- },
38
- "resetPasswordToken": {
39
- "type": "string",
40
- "configurable": false,
41
- "private": true
42
- },
43
- "confirmationToken": {
44
- "type": "string",
45
- "configurable": false,
46
- "private": true
47
- },
48
- "confirmed": {
49
- "type": "boolean",
50
- "default": false,
51
- "configurable": false
52
- },
53
- "blocked": {
54
- "type": "boolean",
55
- "default": false,
56
- "configurable": false
57
- },
58
- "role": {
59
- "type": "relation",
60
- "relation": "manyToOne",
61
- "target": "plugin::users-permissions.role",
62
- "inversedBy": "users",
63
- "configurable": false
64
- }
65
- }
66
- }
@@ -1,230 +0,0 @@
1
- 'use strict';
2
-
3
- const _ = require('lodash');
4
- const { contentTypes: contentTypesUtils } = require('@strapi/utils');
5
-
6
- const { getService } = require('../../utils');
7
-
8
- const { UPDATED_BY_ATTRIBUTE, CREATED_BY_ATTRIBUTE } = contentTypesUtils.constants;
9
-
10
- const formatError = error => [
11
- { messages: [{ id: error.id, message: error.message, field: error.field }] },
12
- ];
13
-
14
- const userModel = 'plugin::users-permissions.user';
15
- const ACTIONS = {
16
- read: 'plugin::content-manager.explorer.read',
17
- create: 'plugin::content-manager.explorer.create',
18
- edit: 'plugin::content-manager.explorer.update',
19
- delete: 'plugin::content-manager.explorer.delete',
20
- };
21
-
22
- const findEntityAndCheckPermissions = async (ability, action, model, id) => {
23
- const entity = await strapi.query('plugin::users-permissions.user').findOne({ where: { id } });
24
-
25
- if (_.isNil(entity)) {
26
- throw strapi.errors.notFound();
27
- }
28
-
29
- const pm = strapi.admin.services.permission.createPermissionsManager({ ability, action, model });
30
-
31
- const roles = _.has(entity, `${CREATED_BY_ATTRIBUTE}.id`)
32
- ? await strapi.query('admin::role').findMany({
33
- where: {
34
- users: { id: entity[CREATED_BY_ATTRIBUTE].id },
35
- },
36
- })
37
- : [];
38
-
39
- const entityWithRoles = _.set(_.cloneDeep(entity), `${CREATED_BY_ATTRIBUTE}.roles`, roles);
40
-
41
- if (pm.ability.cannot(pm.action, pm.toSubject(entityWithRoles))) {
42
- throw strapi.errors.forbidden();
43
- }
44
-
45
- return { pm, entity };
46
- };
47
-
48
- module.exports = {
49
- /**
50
- * Create a/an user record.
51
- * @return {Object}
52
- */
53
- async create(ctx) {
54
- const {
55
- request: { body },
56
- state: { userAbility, admin },
57
- } = ctx;
58
- const { email, username, password } = body;
59
-
60
- const pm = strapi.admin.services.permission.createPermissionsManager({
61
- ability: userAbility,
62
- action: ACTIONS.create,
63
- model: userModel,
64
- });
65
-
66
- if (!pm.isAllowed) {
67
- throw strapi.errors.forbidden();
68
- }
69
-
70
- const sanitizedBody = pm.pickPermittedFieldsOf(body, { subject: userModel });
71
-
72
- const advanced = await strapi
73
- .store({
74
- environment: '',
75
- type: 'plugin',
76
- name: 'users-permissions',
77
- key: 'advanced',
78
- })
79
- .get();
80
-
81
- if (!email) return ctx.badRequest('missing.email');
82
- if (!username) return ctx.badRequest('missing.username');
83
- if (!password) return ctx.badRequest('missing.password');
84
-
85
- const userWithSameUsername = await strapi
86
- .query('plugin::users-permissions.user')
87
- .findOne({ where: { username } });
88
-
89
- if (userWithSameUsername) {
90
- return ctx.badRequest(
91
- null,
92
- formatError({
93
- id: 'Auth.form.error.username.taken',
94
- message: 'Username already taken.',
95
- field: ['username'],
96
- })
97
- );
98
- }
99
-
100
- if (advanced.unique_email) {
101
- const userWithSameEmail = await strapi
102
- .query('plugin::users-permissions.user')
103
- .findOne({ where: { email: email.toLowerCase() } });
104
-
105
- if (userWithSameEmail) {
106
- return ctx.badRequest(
107
- null,
108
-
109
- formatError({
110
- id: 'Auth.form.error.email.taken',
111
- message: 'Email already taken.',
112
- field: ['email'],
113
- })
114
- );
115
- }
116
- }
117
-
118
- const user = {
119
- ...sanitizedBody,
120
- provider: 'local',
121
- [CREATED_BY_ATTRIBUTE]: admin.id,
122
- [UPDATED_BY_ATTRIBUTE]: admin.id,
123
- };
124
-
125
- user.email = user.email.toLowerCase();
126
-
127
- if (!user.role) {
128
- const defaultRole = await strapi
129
- .query('plugin::users-permissions.role')
130
- .findOne({ where: { type: advanced.default_role } });
131
-
132
- user.role = defaultRole.id;
133
- }
134
-
135
- try {
136
- const data = await getService('user').add(user);
137
-
138
- ctx.created(pm.sanitize(data, { action: ACTIONS.read }));
139
- } catch (error) {
140
- ctx.badRequest(null, formatError(error));
141
- }
142
- },
143
- /**
144
- * Update a/an user record.
145
- * @return {Object}
146
- */
147
-
148
- async update(ctx) {
149
- const advancedConfigs = await strapi
150
- .store({
151
- environment: '',
152
- type: 'plugin',
153
- name: 'users-permissions',
154
- key: 'advanced',
155
- })
156
- .get();
157
-
158
- const {
159
- params: { id },
160
- request: { body },
161
- state: { userAbility, admin },
162
- } = ctx;
163
- const { email, username, password } = body;
164
-
165
- const { pm, entity: user } = await findEntityAndCheckPermissions(
166
- userAbility,
167
- ACTIONS.edit,
168
- userModel,
169
- id
170
- );
171
-
172
- if (_.has(body, 'email') && !email) {
173
- return ctx.badRequest('email.notNull');
174
- }
175
-
176
- if (_.has(body, 'username') && !username) {
177
- return ctx.badRequest('username.notNull');
178
- }
179
-
180
- if (_.has(body, 'password') && !password && user.provider === 'local') {
181
- return ctx.badRequest('password.notNull');
182
- }
183
-
184
- if (_.has(body, 'username')) {
185
- const userWithSameUsername = await strapi
186
- .query('plugin::users-permissions.user')
187
- .findOne({ where: { username } });
188
-
189
- if (userWithSameUsername && userWithSameUsername.id != id) {
190
- return ctx.badRequest(
191
- null,
192
- formatError({
193
- id: 'Auth.form.error.username.taken',
194
- message: 'username.alreadyTaken.',
195
- field: ['username'],
196
- })
197
- );
198
- }
199
- }
200
-
201
- if (_.has(body, 'email') && advancedConfigs.unique_email) {
202
- const userWithSameEmail = await strapi
203
- .query('plugin::users-permissions.user')
204
- .findOne({ where: { email: email.toLowerCase() } });
205
-
206
- if (userWithSameEmail && userWithSameEmail.id != id) {
207
- return ctx.badRequest(
208
- null,
209
- formatError({
210
- id: 'Auth.form.error.email.taken',
211
- message: 'Email already taken',
212
- field: ['email'],
213
- })
214
- );
215
- }
216
- body.email = body.email.toLowerCase();
217
- }
218
-
219
- const sanitizedData = pm.pickPermittedFieldsOf(body, { subject: pm.toSubject(user) });
220
- const updateData = _.omit({ ...sanitizedData, updated_by: admin.id }, 'created_by');
221
-
222
- if (_.has(body, 'password') && password === user.password) {
223
- delete updateData.password;
224
- }
225
-
226
- const data = await getService('user').edit({ id }, updateData);
227
-
228
- ctx.body = pm.sanitize(data, { action: ACTIONS.read });
229
- },
230
- };
@@ -1,174 +0,0 @@
1
- 'use strict';
2
-
3
- const _ = require('lodash');
4
- const { sanitizeEntity } = require('@strapi/utils');
5
- const { getService } = require('../../utils');
6
-
7
- const sanitizeUser = user =>
8
- sanitizeEntity(user, {
9
- model: strapi.getModel('plugin::users-permissions.user'),
10
- });
11
-
12
- const formatError = error => [
13
- { messages: [{ id: error.id, message: error.message, field: error.field }] },
14
- ];
15
-
16
- module.exports = {
17
- /**
18
- * Create a/an user record.
19
- * @return {Object}
20
- */
21
- async create(ctx) {
22
- const advanced = await strapi
23
- .store({
24
- environment: '',
25
- type: 'plugin',
26
- name: 'users-permissions',
27
- key: 'advanced',
28
- })
29
- .get();
30
-
31
- const { email, username, password, role } = ctx.request.body;
32
-
33
- if (!email) return ctx.badRequest('missing.email');
34
- if (!username) return ctx.badRequest('missing.username');
35
- if (!password) return ctx.badRequest('missing.password');
36
-
37
- const userWithSameUsername = await strapi
38
- .query('plugin::users-permissions.user')
39
- .findOne({ where: { username } });
40
-
41
- if (userWithSameUsername) {
42
- return ctx.badRequest(
43
- null,
44
- formatError({
45
- id: 'Auth.form.error.username.taken',
46
- message: 'Username already taken.',
47
- field: ['username'],
48
- })
49
- );
50
- }
51
-
52
- if (advanced.unique_email) {
53
- const userWithSameEmail = await strapi
54
- .query('plugin::users-permissions.user')
55
- .findOne({ where: { email: email.toLowerCase() } });
56
-
57
- if (userWithSameEmail) {
58
- return ctx.badRequest(
59
- null,
60
-
61
- formatError({
62
- id: 'Auth.form.error.email.taken',
63
- message: 'Email already taken.',
64
- field: ['email'],
65
- })
66
- );
67
- }
68
- }
69
-
70
- const user = {
71
- ...ctx.request.body,
72
- provider: 'local',
73
- };
74
-
75
- user.email = user.email.toLowerCase();
76
-
77
- if (!role) {
78
- const defaultRole = await strapi
79
- .query('plugin::users-permissions.role')
80
- .findOne({ where: { type: advanced.default_role } });
81
-
82
- user.role = defaultRole.id;
83
- }
84
-
85
- try {
86
- const data = await getService('user').add(user);
87
-
88
- ctx.created(sanitizeUser(data));
89
- } catch (error) {
90
- ctx.badRequest(null, formatError(error));
91
- }
92
- },
93
- /**
94
- * Update a/an user record.
95
- * @return {Object}
96
- */
97
-
98
- async update(ctx) {
99
- const advancedConfigs = await strapi
100
- .store({
101
- environment: '',
102
- type: 'plugin',
103
- name: 'users-permissions',
104
- key: 'advanced',
105
- })
106
- .get();
107
-
108
- const { id } = ctx.params;
109
- const { email, username, password } = ctx.request.body;
110
-
111
- const user = await getService('user').fetch({
112
- id,
113
- });
114
-
115
- if (_.has(ctx.request.body, 'email') && !email) {
116
- return ctx.badRequest('email.notNull');
117
- }
118
-
119
- if (_.has(ctx.request.body, 'username') && !username) {
120
- return ctx.badRequest('username.notNull');
121
- }
122
-
123
- if (_.has(ctx.request.body, 'password') && !password && user.provider === 'local') {
124
- return ctx.badRequest('password.notNull');
125
- }
126
-
127
- if (_.has(ctx.request.body, 'username')) {
128
- const userWithSameUsername = await strapi
129
- .query('plugin::users-permissions.user')
130
- .findOne({ where: { username } });
131
-
132
- if (userWithSameUsername && userWithSameUsername.id != id) {
133
- return ctx.badRequest(
134
- null,
135
- formatError({
136
- id: 'Auth.form.error.username.taken',
137
- message: 'username.alreadyTaken.',
138
- field: ['username'],
139
- })
140
- );
141
- }
142
- }
143
-
144
- if (_.has(ctx.request.body, 'email') && advancedConfigs.unique_email) {
145
- const userWithSameEmail = await strapi
146
- .query('plugin::users-permissions.user')
147
- .findOne({ where: { email: email.toLowerCase() } });
148
-
149
- if (userWithSameEmail && userWithSameEmail.id != id) {
150
- return ctx.badRequest(
151
- null,
152
- formatError({
153
- id: 'Auth.form.error.email.taken',
154
- message: 'Email already taken',
155
- field: ['email'],
156
- })
157
- );
158
- }
159
- ctx.request.body.email = ctx.request.body.email.toLowerCase();
160
- }
161
-
162
- let updateData = {
163
- ...ctx.request.body,
164
- };
165
-
166
- if (_.has(ctx.request.body, 'password') && password === user.password) {
167
- delete updateData.password;
168
- }
169
-
170
- const data = await getService('user').edit({ id }, updateData);
171
-
172
- ctx.send(sanitizeUser(data));
173
- },
174
- };