@strapi/admin 5.17.0-beta.0 → 5.17.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.
- package/dist/admin/admin/src/components/Providers.js +10 -5
- package/dist/admin/admin/src/components/Providers.js.map +1 -1
- package/dist/admin/admin/src/components/Providers.mjs +10 -5
- package/dist/admin/admin/src/components/Providers.mjs.map +1 -1
- package/dist/admin/admin/src/components/UnstableGuidedTour/Context.js +67 -0
- package/dist/admin/admin/src/components/UnstableGuidedTour/Context.js.map +1 -0
- package/dist/admin/admin/src/components/UnstableGuidedTour/Context.mjs +44 -0
- package/dist/admin/admin/src/components/UnstableGuidedTour/Context.mjs.map +1 -0
- package/dist/admin/admin/src/components/UnstableGuidedTour/Step.js +137 -0
- package/dist/admin/admin/src/components/UnstableGuidedTour/Step.js.map +1 -0
- package/dist/admin/admin/src/components/UnstableGuidedTour/Step.mjs +116 -0
- package/dist/admin/admin/src/components/UnstableGuidedTour/Step.mjs.map +1 -0
- package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.js +143 -0
- package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.js.map +1 -0
- package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.mjs +121 -0
- package/dist/admin/admin/src/components/UnstableGuidedTour/Tours.mjs.map +1 -0
- package/dist/admin/admin/src/features/Tracking.js +0 -33
- package/dist/admin/admin/src/features/Tracking.js.map +1 -1
- package/dist/admin/admin/src/features/Tracking.mjs +0 -33
- package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.js +15 -8
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs +15 -8
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js +3 -3
- package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.mjs +3 -3
- package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.mjs.map +1 -1
- package/dist/admin/admin/src/services/admin.js +17 -3
- package/dist/admin/admin/src/services/admin.js.map +1 -1
- package/dist/admin/admin/src/services/admin.mjs +17 -4
- package/dist/admin/admin/src/services/admin.mjs.map +1 -1
- package/dist/admin/admin/src/services/apiTokens.js +4 -2
- package/dist/admin/admin/src/services/apiTokens.js.map +1 -1
- package/dist/admin/admin/src/services/apiTokens.mjs +4 -2
- package/dist/admin/admin/src/services/apiTokens.mjs.map +1 -1
- package/dist/admin/admin/src/translations/en.json.js +6 -1
- package/dist/admin/admin/src/translations/en.json.js.map +1 -1
- package/dist/admin/admin/src/translations/en.json.mjs +6 -1
- package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
- package/dist/admin/index.js +2 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +1 -0
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/src/components/UnstableGuidedTour/Context.d.ts +29 -0
- package/dist/admin/src/components/UnstableGuidedTour/Step.d.ts +35 -0
- package/dist/admin/src/components/UnstableGuidedTour/Tours.d.ts +27 -0
- package/dist/admin/src/features/Tracking.d.ts +9 -2
- package/dist/admin/src/index.d.ts +1 -0
- package/dist/admin/src/services/admin.d.ts +8 -8
- package/dist/admin/src/services/apiTokens.d.ts +1 -1
- package/dist/ee/server/src/index.d.ts +2 -12
- package/dist/ee/server/src/index.d.ts.map +1 -1
- package/dist/ee/server/src/routes/index.d.ts +1 -6
- package/dist/ee/server/src/routes/index.d.ts.map +1 -1
- package/dist/ee/server/src/routes/license-limit.d.ts +1 -6
- package/dist/ee/server/src/routes/license-limit.d.ts.map +1 -1
- package/dist/server/ee/server/src/routes/license-limit.js +1 -12
- package/dist/server/ee/server/src/routes/license-limit.js.map +1 -1
- package/dist/server/ee/server/src/routes/license-limit.mjs +1 -12
- package/dist/server/ee/server/src/routes/license-limit.mjs.map +1 -1
- package/dist/server/server/src/bootstrap.js +4 -12
- package/dist/server/server/src/bootstrap.js.map +1 -1
- package/dist/server/server/src/bootstrap.mjs +4 -12
- package/dist/server/server/src/bootstrap.mjs.map +1 -1
- package/dist/server/server/src/controllers/admin.js +12 -1
- package/dist/server/server/src/controllers/admin.js.map +1 -1
- package/dist/server/server/src/controllers/admin.mjs +12 -1
- package/dist/server/server/src/controllers/admin.mjs.map +1 -1
- package/dist/server/server/src/routes/admin.js +10 -0
- package/dist/server/server/src/routes/admin.js.map +1 -1
- package/dist/server/server/src/routes/admin.mjs +10 -0
- package/dist/server/server/src/routes/admin.mjs.map +1 -1
- package/dist/server/server/src/services/constants.js +14 -0
- package/dist/server/server/src/services/constants.js.map +1 -1
- package/dist/server/server/src/services/constants.mjs +14 -0
- package/dist/server/server/src/services/constants.mjs.map +1 -1
- package/dist/server/server/src/services/guided-tour.js +43 -0
- package/dist/server/server/src/services/guided-tour.js.map +1 -0
- package/dist/server/server/src/services/guided-tour.mjs +41 -0
- package/dist/server/server/src/services/guided-tour.mjs.map +1 -0
- package/dist/server/server/src/services/index.js +3 -1
- package/dist/server/server/src/services/index.js.map +1 -1
- package/dist/server/server/src/services/index.mjs +3 -1
- package/dist/server/server/src/services/index.mjs.map +1 -1
- package/dist/server/server/src/services/user.js +28 -1
- package/dist/server/server/src/services/user.js.map +1 -1
- package/dist/server/server/src/services/user.mjs +28 -1
- package/dist/server/server/src/services/user.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/admin.d.ts +6 -1
- package/dist/server/src/controllers/admin.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +6 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +12 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/routes/admin.d.ts.map +1 -1
- package/dist/server/src/services/constants.d.ts +11 -1
- package/dist/server/src/services/constants.d.ts.map +1 -1
- package/dist/server/src/services/guided-tour.d.ts +12 -0
- package/dist/server/src/services/guided-tour.d.ts.map +1 -0
- package/dist/server/src/services/index.d.ts +6 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/user.d.ts +1 -0
- package/dist/server/src/services/user.d.ts.map +1 -1
- package/dist/shared/contracts/admin.d.ts +15 -0
- package/dist/shared/contracts/admin.d.ts.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guided-tour.mjs","sources":["../../../../../server/src/services/guided-tour.ts"],"sourcesContent":["import { Core, Internal } from '@strapi/types';\nimport constants from './constants';\n\nexport type GuidedTourRequiredActions = {\n didCreateContentTypeSchema: boolean;\n didCreateContent: boolean;\n didCreateApiToken: boolean;\n};\nexport type GuidedTourCompletedActions = keyof GuidedTourRequiredActions;\n\nexport const createGuidedTourService = ({ strapi }: { strapi: Core.Strapi }) => {\n const getCompletedActions = async () => {\n // Check if any content-type schemas have been create on the api:: namespace\n const contentTypeSchemaNames = Object.keys(strapi.contentTypes).filter((contentTypeUid) =>\n contentTypeUid.startsWith('api::')\n );\n const didCreateContentTypeSchema = contentTypeSchemaNames.length > 0;\n\n // Check if any content has been created for content-types on the api:: namespace\n const hasContent = await (async () => {\n for (const name of contentTypeSchemaNames) {\n const count = await strapi.documents(name as Internal.UID.ContentType).count({});\n\n if (count > 0) return true;\n }\n\n return false;\n })();\n const didCreateContent = didCreateContentTypeSchema && hasContent;\n\n // Check if any api tokens have been created besides the default ones\n const createdApiTokens = await strapi\n .documents('admin::api-token')\n .findMany({ fields: ['name', 'description'] });\n const didCreateApiToken = createdApiTokens.some((doc) =>\n constants.DEFAULT_API_TOKENS.every(\n (token) => token.name !== doc.name && token.description !== doc.description\n )\n );\n\n // Compute an array of action names that have been completed\n const requiredActions = {\n didCreateContentTypeSchema,\n didCreateContent,\n didCreateApiToken,\n };\n const requiredActionNames = Object.keys(requiredActions) as Array<GuidedTourCompletedActions>;\n const completedActions = requiredActionNames.filter((key) => requiredActions[key]);\n\n return completedActions;\n };\n\n return {\n getCompletedActions,\n };\n};\n"],"names":["createGuidedTourService","strapi","getCompletedActions","contentTypeSchemaNames","Object","keys","contentTypes","filter","contentTypeUid","startsWith","didCreateContentTypeSchema","length","hasContent","name","count","documents","didCreateContent","createdApiTokens","findMany","fields","didCreateApiToken","some","doc","constants","DEFAULT_API_TOKENS","every","token","description","requiredActions","requiredActionNames","completedActions","key"],"mappings":";;AAUaA,MAAAA,uBAAAA,GAA0B,CAAC,EAAEC,MAAM,EAA2B,GAAA;AACzE,IAAA,MAAMC,mBAAsB,GAAA,UAAA;;AAE1B,QAAA,MAAMC,sBAAyBC,GAAAA,MAAAA,CAAOC,IAAI,CAACJ,MAAOK,CAAAA,YAAY,CAAEC,CAAAA,MAAM,CAAC,CAACC,cACtEA,GAAAA,cAAAA,CAAeC,UAAU,CAAC,OAAA,CAAA,CAAA;QAE5B,MAAMC,0BAAAA,GAA6BP,sBAAuBQ,CAAAA,MAAM,GAAG,CAAA;;QAGnE,MAAMC,UAAAA,GAAa,MAAO,CAAA,UAAA;YACxB,KAAK,MAAMC,QAAQV,sBAAwB,CAAA;gBACzC,MAAMW,KAAAA,GAAQ,MAAMb,MAAOc,CAAAA,SAAS,CAACF,IAAkCC,CAAAA,CAAAA,KAAK,CAAC,EAAC,CAAA;gBAE9E,IAAIA,KAAAA,GAAQ,GAAG,OAAO,IAAA;AACxB;YAEA,OAAO,KAAA;SACT,GAAA;AACA,QAAA,MAAME,mBAAmBN,0BAA8BE,IAAAA,UAAAA;;AAGvD,QAAA,MAAMK,mBAAmB,MAAMhB,MAAAA,CAC5Bc,SAAS,CAAC,kBAAA,CAAA,CACVG,QAAQ,CAAC;YAAEC,MAAQ,EAAA;AAAC,gBAAA,MAAA;AAAQ,gBAAA;AAAc;AAAC,SAAA,CAAA;QAC9C,MAAMC,iBAAAA,GAAoBH,iBAAiBI,IAAI,CAAC,CAACC,GAC/CC,GAAAA,SAAAA,CAAUC,kBAAkB,CAACC,KAAK,CAChC,CAACC,KAAUA,GAAAA,KAAAA,CAAMb,IAAI,KAAKS,GAAIT,CAAAA,IAAI,IAAIa,KAAMC,CAAAA,WAAW,KAAKL,GAAAA,CAAIK,WAAW,CAAA,CAAA;;AAK/E,QAAA,MAAMC,eAAkB,GAAA;AACtBlB,YAAAA,0BAAAA;AACAM,YAAAA,gBAAAA;AACAI,YAAAA;AACF,SAAA;QACA,MAAMS,mBAAAA,GAAsBzB,MAAOC,CAAAA,IAAI,CAACuB,eAAAA,CAAAA;QACxC,MAAME,gBAAAA,GAAmBD,oBAAoBtB,MAAM,CAAC,CAACwB,GAAQH,GAAAA,eAAe,CAACG,GAAI,CAAA,CAAA;QAEjF,OAAOD,gBAAAA;AACT,KAAA;IAEA,OAAO;AACL5B,QAAAA;AACF,KAAA;AACF;;;;"}
|
|
@@ -15,6 +15,7 @@ var action = require('./action.js');
|
|
|
15
15
|
var apiToken = require('./api-token.js');
|
|
16
16
|
var index = require('./transfer/index.js');
|
|
17
17
|
var projectSettings = require('./project-settings.js');
|
|
18
|
+
var guidedTour = require('./guided-tour.js');
|
|
18
19
|
|
|
19
20
|
function _interopNamespaceDefaultOnly (e) { return Object.freeze({ __proto__: null, default: e }); }
|
|
20
21
|
|
|
@@ -37,7 +38,8 @@ var services = {
|
|
|
37
38
|
'api-token': apiToken,
|
|
38
39
|
transfer: index,
|
|
39
40
|
'project-settings': projectSettings,
|
|
40
|
-
encryption
|
|
41
|
+
encryption,
|
|
42
|
+
'guided-tour': guidedTour.createGuidedTourService
|
|
41
43
|
};
|
|
42
44
|
|
|
43
45
|
module.exports = services;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../server/src/services/index.ts"],"sourcesContent":["// NOTE: Make sure to use default export for services overwritten in EE\nimport auth from './auth';\nimport user from './user';\nimport role from './role';\nimport passport from './passport';\nimport metrics from './metrics';\nimport encryption from './encryption';\nimport * as token from './token';\nimport * as permission from './permission';\nimport * as contentType from './content-type';\nimport * as constants from './constants';\nimport * as condition from './condition';\nimport * as action from './action';\nimport * as apiToken from './api-token';\nimport * as transfer from './transfer';\nimport * as projectSettings from './project-settings';\n\n// TODO: TS - Export services one by one as this export is cjs\nexport default {\n auth,\n user,\n role,\n passport,\n token,\n permission,\n metrics,\n 'content-type': contentType,\n constants,\n condition,\n action,\n 'api-token': apiToken,\n transfer,\n 'project-settings': projectSettings,\n encryption,\n};\n"],"names":["auth","user","role","passport","token","permission","metrics","contentType","constants","condition","action","apiToken","transfer","projectSettings","encryption"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../server/src/services/index.ts"],"sourcesContent":["// NOTE: Make sure to use default export for services overwritten in EE\nimport auth from './auth';\nimport user from './user';\nimport role from './role';\nimport passport from './passport';\nimport metrics from './metrics';\nimport encryption from './encryption';\nimport * as token from './token';\nimport * as permission from './permission';\nimport * as contentType from './content-type';\nimport * as constants from './constants';\nimport * as condition from './condition';\nimport * as action from './action';\nimport * as apiToken from './api-token';\nimport * as transfer from './transfer';\nimport * as projectSettings from './project-settings';\nimport { createGuidedTourService } from './guided-tour';\n\n// TODO: TS - Export services one by one as this export is cjs\nexport default {\n auth,\n user,\n role,\n passport,\n token,\n permission,\n metrics,\n 'content-type': contentType,\n constants,\n condition,\n action,\n 'api-token': apiToken,\n transfer,\n 'project-settings': projectSettings,\n encryption,\n 'guided-tour': createGuidedTourService,\n};\n"],"names":["auth","user","role","passport","token","permission","metrics","contentType","constants","condition","action","apiToken","transfer","projectSettings","encryption","createGuidedTourService"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;AAkBA;AACA,eAAe;AACbA,IAAAA,IAAAA;AACAC,IAAAA,IAAAA;AACAC,IAAAA,IAAAA;AACAC,IAAAA,QAAAA;AACAC,IAAAA,KAAAA;AACAC,IAAAA,UAAAA;AACAC,IAAAA,OAAAA;IACA,cAAgBC,EAAAA,WAAAA;AAChBC,eAAAA,oBAAAA;AACAC,IAAAA,SAAAA;AACAC,IAAAA,MAAAA;IACA,WAAaC,EAAAA,QAAAA;AACbC,cAAAA,KAAAA;IACA,kBAAoBC,EAAAA,eAAAA;AACpBC,IAAAA,UAAAA;IACA,aAAeC,EAAAA;AACjB,CAAE;;;;"}
|
|
@@ -13,6 +13,7 @@ import * as action from './action.mjs';
|
|
|
13
13
|
import * as apiToken from './api-token.mjs';
|
|
14
14
|
import * as index from './transfer/index.mjs';
|
|
15
15
|
import * as projectSettings from './project-settings.mjs';
|
|
16
|
+
import { createGuidedTourService } from './guided-tour.mjs';
|
|
16
17
|
|
|
17
18
|
// NOTE: Make sure to use default export for services overwritten in EE
|
|
18
19
|
// TODO: TS - Export services one by one as this export is cjs
|
|
@@ -31,7 +32,8 @@ var services = {
|
|
|
31
32
|
'api-token': apiToken,
|
|
32
33
|
transfer: index,
|
|
33
34
|
'project-settings': projectSettings,
|
|
34
|
-
encryption
|
|
35
|
+
encryption,
|
|
36
|
+
'guided-tour': createGuidedTourService
|
|
35
37
|
};
|
|
36
38
|
|
|
37
39
|
export { services as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../../server/src/services/index.ts"],"sourcesContent":["// NOTE: Make sure to use default export for services overwritten in EE\nimport auth from './auth';\nimport user from './user';\nimport role from './role';\nimport passport from './passport';\nimport metrics from './metrics';\nimport encryption from './encryption';\nimport * as token from './token';\nimport * as permission from './permission';\nimport * as contentType from './content-type';\nimport * as constants from './constants';\nimport * as condition from './condition';\nimport * as action from './action';\nimport * as apiToken from './api-token';\nimport * as transfer from './transfer';\nimport * as projectSettings from './project-settings';\n\n// TODO: TS - Export services one by one as this export is cjs\nexport default {\n auth,\n user,\n role,\n passport,\n token,\n permission,\n metrics,\n 'content-type': contentType,\n constants,\n condition,\n action,\n 'api-token': apiToken,\n transfer,\n 'project-settings': projectSettings,\n encryption,\n};\n"],"names":["auth","user","role","passport","token","permission","metrics","contentType","constants","condition","action","apiToken","transfer","projectSettings","encryption"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../../server/src/services/index.ts"],"sourcesContent":["// NOTE: Make sure to use default export for services overwritten in EE\nimport auth from './auth';\nimport user from './user';\nimport role from './role';\nimport passport from './passport';\nimport metrics from './metrics';\nimport encryption from './encryption';\nimport * as token from './token';\nimport * as permission from './permission';\nimport * as contentType from './content-type';\nimport * as constants from './constants';\nimport * as condition from './condition';\nimport * as action from './action';\nimport * as apiToken from './api-token';\nimport * as transfer from './transfer';\nimport * as projectSettings from './project-settings';\nimport { createGuidedTourService } from './guided-tour';\n\n// TODO: TS - Export services one by one as this export is cjs\nexport default {\n auth,\n user,\n role,\n passport,\n token,\n permission,\n metrics,\n 'content-type': contentType,\n constants,\n condition,\n action,\n 'api-token': apiToken,\n transfer,\n 'project-settings': projectSettings,\n encryption,\n 'guided-tour': createGuidedTourService,\n};\n"],"names":["auth","user","role","passport","token","permission","metrics","contentType","constants","condition","action","apiToken","transfer","projectSettings","encryption","createGuidedTourService"],"mappings":";;;;;;;;;;;;;;;;;AAAA;AAkBA;AACA,eAAe;AACbA,IAAAA,IAAAA;AACAC,IAAAA,IAAAA;AACAC,IAAAA,IAAAA;AACAC,IAAAA,QAAAA;AACAC,IAAAA,KAAAA;AACAC,IAAAA,UAAAA;AACAC,IAAAA,OAAAA;IACA,cAAgBC,EAAAA,WAAAA;AAChBC,IAAAA,SAAAA;AACAC,IAAAA,SAAAA;AACAC,IAAAA,MAAAA;IACA,WAAaC,EAAAA,QAAAA;AACbC,cAAAA,KAAAA;IACA,kBAAoBC,EAAAA,eAAAA;AACpBC,IAAAA,UAAAA;IACA,aAAeC,EAAAA;AACjB,CAAE;;;;"}
|
|
@@ -146,6 +146,32 @@ attributes)=>{
|
|
|
146
146
|
const superAdminRole = await index.getService('role').getSuperAdminWithUsersCount();
|
|
147
147
|
return superAdminRole.usersCount === 1 && user$1.hasSuperAdminRole(user);
|
|
148
148
|
};
|
|
149
|
+
/**
|
|
150
|
+
* Check if a user is the first super admin
|
|
151
|
+
* @param userId user's id to look for
|
|
152
|
+
*/ const isFirstSuperAdminUser = async (userId)=>{
|
|
153
|
+
const currentUser = await findOne(userId);
|
|
154
|
+
if (!currentUser || !user$1.hasSuperAdminRole(currentUser)) return false;
|
|
155
|
+
const [oldestUser] = await strapi.db.query('admin::user').findMany({
|
|
156
|
+
populate: {
|
|
157
|
+
roles: {
|
|
158
|
+
where: {
|
|
159
|
+
code: {
|
|
160
|
+
$eq: SUPER_ADMIN_CODE
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
orderBy: {
|
|
166
|
+
createdAt: 'asc'
|
|
167
|
+
},
|
|
168
|
+
limit: 1,
|
|
169
|
+
select: [
|
|
170
|
+
'id'
|
|
171
|
+
]
|
|
172
|
+
});
|
|
173
|
+
return oldestUser.id === currentUser.id;
|
|
174
|
+
};
|
|
149
175
|
/**
|
|
150
176
|
* Check if a user with specific attributes exists in the database
|
|
151
177
|
* @param attributes A partial user object
|
|
@@ -382,7 +408,8 @@ var user = {
|
|
|
382
408
|
assignARoleToAll,
|
|
383
409
|
displayWarningIfUsersDontHaveRole,
|
|
384
410
|
resetPasswordByEmail,
|
|
385
|
-
getLanguagesInUse
|
|
411
|
+
getLanguagesInUse,
|
|
412
|
+
isFirstSuperAdminUser
|
|
386
413
|
};
|
|
387
414
|
|
|
388
415
|
module.exports = user;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.js","sources":["../../../../../server/src/services/user.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport _ from 'lodash';\nimport { defaults } from 'lodash/fp';\nimport { arrays, errors } from '@strapi/utils';\nimport type { Data } from '@strapi/types';\nimport { createUser, hasSuperAdminRole } from '../domain/user';\nimport type {\n AdminUser,\n AdminRole,\n AdminUserCreationPayload,\n SanitizedAdminUser,\n SanitizedAdminRole,\n AdminUserUpdatePayload,\n // eslint-disable-next-line node/no-unpublished-import\n} from '../../../shared/contracts/shared';\nimport { password as passwordValidator } from '../validation/common-validators';\nimport { getService } from '../utils';\nimport constants from './constants';\n\nconst { SUPER_ADMIN_CODE } = constants;\n\nconst { ValidationError } = errors;\nconst sanitizeUserRoles = (role: AdminRole): SanitizedAdminRole =>\n _.pick(role, ['id', 'name', 'description', 'code']);\n\n/**\n * Remove private user fields\n * @param user - user to sanitize\n */\nconst sanitizeUser = (user: AdminUser): SanitizedAdminUser => {\n return {\n ..._.omit(user, ['password', 'resetPasswordToken', 'registrationToken', 'roles']),\n roles: user.roles && user.roles.map(sanitizeUserRoles),\n };\n};\n\n/**\n * Create and save a user in database\n * @param attributes A partial user object\n */\nconst create = async (\n // isActive is added in the controller, it's not sent by the API.\n attributes: Partial<AdminUserCreationPayload> & { isActive?: true }\n): Promise<AdminUser> => {\n const userInfo = {\n registrationToken: getService('token').createToken(),\n ...attributes,\n };\n\n if (_.has(attributes, 'password')) {\n userInfo.password = await getService('auth').hashPassword(attributes.password!);\n }\n\n const user = createUser(userInfo);\n\n const createdUser = await strapi.db\n .query('admin::user')\n .create({ data: user, populate: ['roles'] });\n\n getService('metrics').sendDidInviteUser();\n\n strapi.eventHub.emit('user.create', { user: sanitizeUser(createdUser) });\n\n return createdUser;\n};\n\n/**\n * Update a user in database\n * @param id query params to find the user to update\n * @param attributes A partial user object\n */\nconst updateById = async (\n id: Data.ID,\n attributes: Partial<AdminUserUpdatePayload>\n): Promise<AdminUser> => {\n // Check at least one super admin remains\n if (_.has(attributes, 'roles')) {\n const lastAdminUser = await isLastSuperAdminUser(id);\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n const willRemoveSuperAdminRole = !arrays.includesString(attributes.roles!, superAdminRole.id);\n\n if (lastAdminUser && willRemoveSuperAdminRole) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n }\n\n // cannot disable last super admin\n if (attributes.isActive === false) {\n const lastAdminUser = await isLastSuperAdminUser(id);\n if (lastAdminUser) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n }\n\n // hash password if a new one is sent\n if (_.has(attributes, 'password')) {\n const hashedPassword = await getService('auth').hashPassword(attributes.password!);\n\n const updatedUser = await strapi.db.query('admin::user').update({\n where: { id },\n data: {\n ...attributes,\n password: hashedPassword,\n },\n populate: ['roles'],\n });\n\n strapi.eventHub.emit('user.update', { user: sanitizeUser(updatedUser) });\n\n return updatedUser;\n }\n\n const updatedUser = await strapi.db.query('admin::user').update({\n where: { id },\n data: attributes,\n populate: ['roles'],\n });\n\n if (updatedUser) {\n strapi.eventHub.emit('user.update', { user: sanitizeUser(updatedUser) });\n }\n\n return updatedUser;\n};\n\n/**\n * Reset a user password by email. (Used in admin:reset CLI)\n * @param email - user email\n * @param password - new password\n */\nconst resetPasswordByEmail = async (email: string, password: string) => {\n const user = await strapi.db\n .query('admin::user')\n .findOne({ where: { email }, populate: ['roles'] });\n\n if (!user) {\n throw new Error(`User not found for email: ${email}`);\n }\n\n try {\n await passwordValidator.validate(password);\n } catch (error) {\n throw new ValidationError(\n 'Invalid password. Expected a minimum of 8 characters with at least one number and one uppercase letter'\n );\n }\n\n await updateById(user.id, { password });\n};\n\n/**\n * Check if a user is the last super admin\n * @param userId user's id to look for\n */\nconst isLastSuperAdminUser = async (userId: Data.ID): Promise<boolean> => {\n const user = (await findOne(userId)) as AdminUser | null;\n if (!user) return false;\n\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n\n return superAdminRole.usersCount === 1 && hasSuperAdminRole(user);\n};\n\n/**\n * Check if a user with specific attributes exists in the database\n * @param attributes A partial user object\n */\nconst exists = async (attributes = {} as unknown): Promise<boolean> => {\n return (await strapi.db.query('admin::user').count({ where: attributes })) > 0;\n};\n\n/**\n * Returns a user registration info\n * @param registrationToken - a user registration token\n * @returns - Returns user email, firstname and lastname\n */\nconst findRegistrationInfo = async (\n registrationToken: string\n): Promise<Pick<AdminUser, 'email' | 'firstname' | 'lastname'> | undefined> => {\n const user = await strapi.db.query('admin::user').findOne({ where: { registrationToken } });\n\n if (!user) {\n return undefined;\n }\n\n return _.pick(user, ['email', 'firstname', 'lastname']);\n};\n\n/**\n * Registers a user based on a registrationToken and some informations to update\n * @param params\n * @param params.registrationToken registration token\n * @param params.userInfo user info\n */\nconst register = async ({\n registrationToken,\n userInfo,\n}: {\n registrationToken: string;\n userInfo: Partial<AdminUser>;\n}) => {\n const matchingUser = await strapi.db\n .query('admin::user')\n .findOne({ where: { registrationToken } });\n\n if (!matchingUser) {\n throw new ValidationError('Invalid registration info');\n }\n\n return getService('user').updateById(matchingUser.id, {\n password: userInfo.password,\n firstname: userInfo.firstname,\n lastname: userInfo.lastname,\n registrationToken: null,\n isActive: true,\n });\n};\n\n/**\n * Find one user\n */\nconst findOne = async (id: Data.ID, populate = ['roles']) => {\n return strapi.db.query('admin::user').findOne({ where: { id }, populate });\n};\n\n/**\n * Find one user by its email\n * @param email\n * @param populate\n * @returns\n */\nconst findOneByEmail = async (email: string, populate = []) => {\n return strapi.db.query('admin::user').findOne({\n where: { email: { $eqi: email } },\n populate,\n });\n};\n\n/** Find many users (paginated)\n * @param params\n */\nconst findPage = async (params = {}): Promise<unknown> => {\n const query = strapi\n .get('query-params')\n .transform('admin::user', defaults({ populate: ['roles'] }, params));\n\n return strapi.db.query('admin::user').findPage(query);\n};\n\n/** Delete a user\n * @param id id of the user to delete\n */\nconst deleteById = async (id: Data.ID): Promise<AdminUser | null> => {\n // Check at least one super admin remains\n const userToDelete: AdminUser | null = await strapi.db.query('admin::user').findOne({\n where: { id },\n populate: ['roles'],\n });\n\n if (!userToDelete) {\n return null;\n }\n\n if (userToDelete) {\n if (userToDelete.roles.some((r) => r.code === SUPER_ADMIN_CODE)) {\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n if (superAdminRole.usersCount === 1) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n }\n }\n\n const deletedUser = await strapi.db\n .query('admin::user')\n .delete({ where: { id }, populate: ['roles'] });\n\n strapi.eventHub.emit('user.delete', { user: sanitizeUser(deletedUser) });\n\n return deletedUser;\n};\n\n/** Delete a user\n * @param ids ids of the users to delete\n */\nconst deleteByIds = async (ids: (string | number)[]): Promise<AdminUser[]> => {\n // Check at least one super admin remains\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n const nbOfSuperAdminToDelete = await strapi.db.query('admin::user').count({\n where: {\n id: ids,\n roles: { id: superAdminRole.id },\n },\n });\n\n if (superAdminRole.usersCount === nbOfSuperAdminToDelete) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n\n const deletedUsers = [] as AdminUser[];\n for (const id of ids) {\n const deletedUser = await strapi.db.query('admin::user').delete({\n where: { id },\n populate: ['roles'],\n });\n\n deletedUsers.push(deletedUser);\n }\n\n strapi.eventHub.emit('user.delete', {\n users: deletedUsers.map((deletedUser) => sanitizeUser(deletedUser)),\n });\n\n return deletedUsers;\n};\n\n/** Count the users that don't have any associated roles\n */\nconst countUsersWithoutRole = async (): Promise<number> => {\n return strapi.db.query('admin::user').count({\n where: {\n roles: {\n id: { $null: true },\n },\n },\n });\n};\n\n/**\n * Count the number of users based on search params\n * @param params params used for the query\n */\nconst count = async (where = {}): Promise<number> => {\n return strapi.db.query('admin::user').count({ where });\n};\n\n/**\n * Assign some roles to several users\n */\nconst assignARoleToAll = async (roleId: Data.ID): Promise<void> => {\n const users = await strapi.db.query('admin::user').findMany({\n select: ['id'],\n where: {\n roles: { id: { $null: true } },\n },\n });\n\n await Promise.all(\n users.map((user) => {\n return strapi.db.query('admin::user').update({\n where: { id: user.id },\n data: { roles: [roleId] },\n });\n })\n );\n};\n\n/** Display a warning if some users don't have at least one role\n */\nconst displayWarningIfUsersDontHaveRole = async (): Promise<void> => {\n const count = await countUsersWithoutRole();\n\n if (count > 0) {\n strapi.log.warn(`Some users (${count}) don't have any role.`);\n }\n};\n\n/** Returns an array of interface languages currently used by users\n */\nconst getLanguagesInUse = async (): Promise<string[]> => {\n const users = await strapi.db.query('admin::user').findMany({ select: ['preferedLanguage'] });\n\n return users.map((user) => user.preferedLanguage || 'en');\n};\n\nexport default {\n create,\n updateById,\n exists,\n findRegistrationInfo,\n register,\n sanitizeUser,\n findOne,\n findOneByEmail,\n findPage,\n deleteById,\n deleteByIds,\n countUsersWithoutRole,\n count,\n assignARoleToAll,\n displayWarningIfUsersDontHaveRole,\n resetPasswordByEmail,\n getLanguagesInUse,\n};\n"],"names":["SUPER_ADMIN_CODE","constants","ValidationError","errors","sanitizeUserRoles","role","_","pick","sanitizeUser","user","omit","roles","map","create","attributes","userInfo","registrationToken","getService","createToken","has","password","hashPassword","createUser","createdUser","strapi","db","query","data","populate","sendDidInviteUser","eventHub","emit","updateById","id","lastAdminUser","isLastSuperAdminUser","superAdminRole","getSuperAdminWithUsersCount","willRemoveSuperAdminRole","arrays","includesString","isActive","hashedPassword","updatedUser","update","where","resetPasswordByEmail","email","findOne","Error","passwordValidator","validate","error","userId","usersCount","hasSuperAdminRole","exists","count","findRegistrationInfo","undefined","register","matchingUser","firstname","lastname","findOneByEmail","$eqi","findPage","params","get","transform","defaults","deleteById","userToDelete","some","r","code","deletedUser","delete","deleteByIds","ids","nbOfSuperAdminToDelete","deletedUsers","push","users","countUsersWithoutRole","$null","assignARoleToAll","roleId","findMany","select","Promise","all","displayWarningIfUsersDontHaveRole","log","warn","getLanguagesInUse","preferedLanguage"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"user.js","sources":["../../../../../server/src/services/user.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport _ from 'lodash';\nimport { defaults } from 'lodash/fp';\nimport { arrays, errors } from '@strapi/utils';\nimport type { Data } from '@strapi/types';\nimport { createUser, hasSuperAdminRole } from '../domain/user';\nimport type {\n AdminUser,\n AdminRole,\n AdminUserCreationPayload,\n SanitizedAdminUser,\n SanitizedAdminRole,\n AdminUserUpdatePayload,\n // eslint-disable-next-line node/no-unpublished-import\n} from '../../../shared/contracts/shared';\nimport { password as passwordValidator } from '../validation/common-validators';\nimport { getService } from '../utils';\nimport constants from './constants';\n\nconst { SUPER_ADMIN_CODE } = constants;\n\nconst { ValidationError } = errors;\nconst sanitizeUserRoles = (role: AdminRole): SanitizedAdminRole =>\n _.pick(role, ['id', 'name', 'description', 'code']);\n\n/**\n * Remove private user fields\n * @param user - user to sanitize\n */\nconst sanitizeUser = (user: AdminUser): SanitizedAdminUser => {\n return {\n ..._.omit(user, ['password', 'resetPasswordToken', 'registrationToken', 'roles']),\n roles: user.roles && user.roles.map(sanitizeUserRoles),\n };\n};\n\n/**\n * Create and save a user in database\n * @param attributes A partial user object\n */\nconst create = async (\n // isActive is added in the controller, it's not sent by the API.\n attributes: Partial<AdminUserCreationPayload> & { isActive?: true }\n): Promise<AdminUser> => {\n const userInfo = {\n registrationToken: getService('token').createToken(),\n ...attributes,\n };\n\n if (_.has(attributes, 'password')) {\n userInfo.password = await getService('auth').hashPassword(attributes.password!);\n }\n\n const user = createUser(userInfo);\n\n const createdUser = await strapi.db\n .query('admin::user')\n .create({ data: user, populate: ['roles'] });\n\n getService('metrics').sendDidInviteUser();\n\n strapi.eventHub.emit('user.create', { user: sanitizeUser(createdUser) });\n\n return createdUser;\n};\n\n/**\n * Update a user in database\n * @param id query params to find the user to update\n * @param attributes A partial user object\n */\nconst updateById = async (\n id: Data.ID,\n attributes: Partial<AdminUserUpdatePayload>\n): Promise<AdminUser> => {\n // Check at least one super admin remains\n if (_.has(attributes, 'roles')) {\n const lastAdminUser = await isLastSuperAdminUser(id);\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n const willRemoveSuperAdminRole = !arrays.includesString(attributes.roles!, superAdminRole.id);\n\n if (lastAdminUser && willRemoveSuperAdminRole) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n }\n\n // cannot disable last super admin\n if (attributes.isActive === false) {\n const lastAdminUser = await isLastSuperAdminUser(id);\n if (lastAdminUser) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n }\n\n // hash password if a new one is sent\n if (_.has(attributes, 'password')) {\n const hashedPassword = await getService('auth').hashPassword(attributes.password!);\n\n const updatedUser = await strapi.db.query('admin::user').update({\n where: { id },\n data: {\n ...attributes,\n password: hashedPassword,\n },\n populate: ['roles'],\n });\n\n strapi.eventHub.emit('user.update', { user: sanitizeUser(updatedUser) });\n\n return updatedUser;\n }\n\n const updatedUser = await strapi.db.query('admin::user').update({\n where: { id },\n data: attributes,\n populate: ['roles'],\n });\n\n if (updatedUser) {\n strapi.eventHub.emit('user.update', { user: sanitizeUser(updatedUser) });\n }\n\n return updatedUser;\n};\n\n/**\n * Reset a user password by email. (Used in admin:reset CLI)\n * @param email - user email\n * @param password - new password\n */\nconst resetPasswordByEmail = async (email: string, password: string) => {\n const user = await strapi.db\n .query('admin::user')\n .findOne({ where: { email }, populate: ['roles'] });\n\n if (!user) {\n throw new Error(`User not found for email: ${email}`);\n }\n\n try {\n await passwordValidator.validate(password);\n } catch (error) {\n throw new ValidationError(\n 'Invalid password. Expected a minimum of 8 characters with at least one number and one uppercase letter'\n );\n }\n\n await updateById(user.id, { password });\n};\n\n/**\n * Check if a user is the last super admin\n * @param userId user's id to look for\n */\nconst isLastSuperAdminUser = async (userId: Data.ID): Promise<boolean> => {\n const user = (await findOne(userId)) as AdminUser | null;\n if (!user) return false;\n\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n\n return superAdminRole.usersCount === 1 && hasSuperAdminRole(user);\n};\n\n/**\n * Check if a user is the first super admin\n * @param userId user's id to look for\n */\nconst isFirstSuperAdminUser = async (userId: Data.ID): Promise<boolean> => {\n const currentUser = (await findOne(userId)) as AdminUser | null;\n\n if (!currentUser || !hasSuperAdminRole(currentUser)) return false;\n\n const [oldestUser] = await strapi.db.query('admin::user').findMany({\n populate: {\n roles: {\n where: {\n code: { $eq: SUPER_ADMIN_CODE },\n },\n },\n },\n orderBy: { createdAt: 'asc' },\n limit: 1,\n select: ['id'],\n });\n\n return oldestUser.id === currentUser.id;\n};\n\n/**\n * Check if a user with specific attributes exists in the database\n * @param attributes A partial user object\n */\nconst exists = async (attributes = {} as unknown): Promise<boolean> => {\n return (await strapi.db.query('admin::user').count({ where: attributes })) > 0;\n};\n\n/**\n * Returns a user registration info\n * @param registrationToken - a user registration token\n * @returns - Returns user email, firstname and lastname\n */\nconst findRegistrationInfo = async (\n registrationToken: string\n): Promise<Pick<AdminUser, 'email' | 'firstname' | 'lastname'> | undefined> => {\n const user = await strapi.db.query('admin::user').findOne({ where: { registrationToken } });\n\n if (!user) {\n return undefined;\n }\n\n return _.pick(user, ['email', 'firstname', 'lastname']);\n};\n\n/**\n * Registers a user based on a registrationToken and some informations to update\n * @param params\n * @param params.registrationToken registration token\n * @param params.userInfo user info\n */\nconst register = async ({\n registrationToken,\n userInfo,\n}: {\n registrationToken: string;\n userInfo: Partial<AdminUser>;\n}) => {\n const matchingUser = await strapi.db\n .query('admin::user')\n .findOne({ where: { registrationToken } });\n\n if (!matchingUser) {\n throw new ValidationError('Invalid registration info');\n }\n\n return getService('user').updateById(matchingUser.id, {\n password: userInfo.password,\n firstname: userInfo.firstname,\n lastname: userInfo.lastname,\n registrationToken: null,\n isActive: true,\n });\n};\n\n/**\n * Find one user\n */\nconst findOne = async (id: Data.ID, populate = ['roles']) => {\n return strapi.db.query('admin::user').findOne({ where: { id }, populate });\n};\n\n/**\n * Find one user by its email\n * @param email\n * @param populate\n * @returns\n */\nconst findOneByEmail = async (email: string, populate = []) => {\n return strapi.db.query('admin::user').findOne({\n where: { email: { $eqi: email } },\n populate,\n });\n};\n\n/** Find many users (paginated)\n * @param params\n */\nconst findPage = async (params = {}): Promise<unknown> => {\n const query = strapi\n .get('query-params')\n .transform('admin::user', defaults({ populate: ['roles'] }, params));\n\n return strapi.db.query('admin::user').findPage(query);\n};\n\n/** Delete a user\n * @param id id of the user to delete\n */\nconst deleteById = async (id: Data.ID): Promise<AdminUser | null> => {\n // Check at least one super admin remains\n const userToDelete: AdminUser | null = await strapi.db.query('admin::user').findOne({\n where: { id },\n populate: ['roles'],\n });\n\n if (!userToDelete) {\n return null;\n }\n\n if (userToDelete) {\n if (userToDelete.roles.some((r) => r.code === SUPER_ADMIN_CODE)) {\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n if (superAdminRole.usersCount === 1) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n }\n }\n\n const deletedUser = await strapi.db\n .query('admin::user')\n .delete({ where: { id }, populate: ['roles'] });\n\n strapi.eventHub.emit('user.delete', { user: sanitizeUser(deletedUser) });\n\n return deletedUser;\n};\n\n/** Delete a user\n * @param ids ids of the users to delete\n */\nconst deleteByIds = async (ids: (string | number)[]): Promise<AdminUser[]> => {\n // Check at least one super admin remains\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n const nbOfSuperAdminToDelete = await strapi.db.query('admin::user').count({\n where: {\n id: ids,\n roles: { id: superAdminRole.id },\n },\n });\n\n if (superAdminRole.usersCount === nbOfSuperAdminToDelete) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n\n const deletedUsers = [] as AdminUser[];\n for (const id of ids) {\n const deletedUser = await strapi.db.query('admin::user').delete({\n where: { id },\n populate: ['roles'],\n });\n\n deletedUsers.push(deletedUser);\n }\n\n strapi.eventHub.emit('user.delete', {\n users: deletedUsers.map((deletedUser) => sanitizeUser(deletedUser)),\n });\n\n return deletedUsers;\n};\n\n/** Count the users that don't have any associated roles\n */\nconst countUsersWithoutRole = async (): Promise<number> => {\n return strapi.db.query('admin::user').count({\n where: {\n roles: {\n id: { $null: true },\n },\n },\n });\n};\n\n/**\n * Count the number of users based on search params\n * @param params params used for the query\n */\nconst count = async (where = {}): Promise<number> => {\n return strapi.db.query('admin::user').count({ where });\n};\n\n/**\n * Assign some roles to several users\n */\nconst assignARoleToAll = async (roleId: Data.ID): Promise<void> => {\n const users = await strapi.db.query('admin::user').findMany({\n select: ['id'],\n where: {\n roles: { id: { $null: true } },\n },\n });\n\n await Promise.all(\n users.map((user) => {\n return strapi.db.query('admin::user').update({\n where: { id: user.id },\n data: { roles: [roleId] },\n });\n })\n );\n};\n\n/** Display a warning if some users don't have at least one role\n */\nconst displayWarningIfUsersDontHaveRole = async (): Promise<void> => {\n const count = await countUsersWithoutRole();\n\n if (count > 0) {\n strapi.log.warn(`Some users (${count}) don't have any role.`);\n }\n};\n\n/** Returns an array of interface languages currently used by users\n */\nconst getLanguagesInUse = async (): Promise<string[]> => {\n const users = await strapi.db.query('admin::user').findMany({ select: ['preferedLanguage'] });\n\n return users.map((user) => user.preferedLanguage || 'en');\n};\n\nexport default {\n create,\n updateById,\n exists,\n findRegistrationInfo,\n register,\n sanitizeUser,\n findOne,\n findOneByEmail,\n findPage,\n deleteById,\n deleteByIds,\n countUsersWithoutRole,\n count,\n assignARoleToAll,\n displayWarningIfUsersDontHaveRole,\n resetPasswordByEmail,\n getLanguagesInUse,\n isFirstSuperAdminUser,\n};\n"],"names":["SUPER_ADMIN_CODE","constants","ValidationError","errors","sanitizeUserRoles","role","_","pick","sanitizeUser","user","omit","roles","map","create","attributes","userInfo","registrationToken","getService","createToken","has","password","hashPassword","createUser","createdUser","strapi","db","query","data","populate","sendDidInviteUser","eventHub","emit","updateById","id","lastAdminUser","isLastSuperAdminUser","superAdminRole","getSuperAdminWithUsersCount","willRemoveSuperAdminRole","arrays","includesString","isActive","hashedPassword","updatedUser","update","where","resetPasswordByEmail","email","findOne","Error","passwordValidator","validate","error","userId","usersCount","hasSuperAdminRole","isFirstSuperAdminUser","currentUser","oldestUser","findMany","code","$eq","orderBy","createdAt","limit","select","exists","count","findRegistrationInfo","undefined","register","matchingUser","firstname","lastname","findOneByEmail","$eqi","findPage","params","get","transform","defaults","deleteById","userToDelete","some","r","deletedUser","delete","deleteByIds","ids","nbOfSuperAdminToDelete","deletedUsers","push","users","countUsersWithoutRole","$null","assignARoleToAll","roleId","Promise","all","displayWarningIfUsersDontHaveRole","log","warn","getLanguagesInUse","preferedLanguage"],"mappings":"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"}
|
|
@@ -144,6 +144,32 @@ attributes)=>{
|
|
|
144
144
|
const superAdminRole = await getService('role').getSuperAdminWithUsersCount();
|
|
145
145
|
return superAdminRole.usersCount === 1 && hasSuperAdminRole(user);
|
|
146
146
|
};
|
|
147
|
+
/**
|
|
148
|
+
* Check if a user is the first super admin
|
|
149
|
+
* @param userId user's id to look for
|
|
150
|
+
*/ const isFirstSuperAdminUser = async (userId)=>{
|
|
151
|
+
const currentUser = await findOne(userId);
|
|
152
|
+
if (!currentUser || !hasSuperAdminRole(currentUser)) return false;
|
|
153
|
+
const [oldestUser] = await strapi.db.query('admin::user').findMany({
|
|
154
|
+
populate: {
|
|
155
|
+
roles: {
|
|
156
|
+
where: {
|
|
157
|
+
code: {
|
|
158
|
+
$eq: SUPER_ADMIN_CODE
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
orderBy: {
|
|
164
|
+
createdAt: 'asc'
|
|
165
|
+
},
|
|
166
|
+
limit: 1,
|
|
167
|
+
select: [
|
|
168
|
+
'id'
|
|
169
|
+
]
|
|
170
|
+
});
|
|
171
|
+
return oldestUser.id === currentUser.id;
|
|
172
|
+
};
|
|
147
173
|
/**
|
|
148
174
|
* Check if a user with specific attributes exists in the database
|
|
149
175
|
* @param attributes A partial user object
|
|
@@ -380,7 +406,8 @@ var user = {
|
|
|
380
406
|
assignARoleToAll,
|
|
381
407
|
displayWarningIfUsersDontHaveRole,
|
|
382
408
|
resetPasswordByEmail,
|
|
383
|
-
getLanguagesInUse
|
|
409
|
+
getLanguagesInUse,
|
|
410
|
+
isFirstSuperAdminUser
|
|
384
411
|
};
|
|
385
412
|
|
|
386
413
|
export { user as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.mjs","sources":["../../../../../server/src/services/user.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport _ from 'lodash';\nimport { defaults } from 'lodash/fp';\nimport { arrays, errors } from '@strapi/utils';\nimport type { Data } from '@strapi/types';\nimport { createUser, hasSuperAdminRole } from '../domain/user';\nimport type {\n AdminUser,\n AdminRole,\n AdminUserCreationPayload,\n SanitizedAdminUser,\n SanitizedAdminRole,\n AdminUserUpdatePayload,\n // eslint-disable-next-line node/no-unpublished-import\n} from '../../../shared/contracts/shared';\nimport { password as passwordValidator } from '../validation/common-validators';\nimport { getService } from '../utils';\nimport constants from './constants';\n\nconst { SUPER_ADMIN_CODE } = constants;\n\nconst { ValidationError } = errors;\nconst sanitizeUserRoles = (role: AdminRole): SanitizedAdminRole =>\n _.pick(role, ['id', 'name', 'description', 'code']);\n\n/**\n * Remove private user fields\n * @param user - user to sanitize\n */\nconst sanitizeUser = (user: AdminUser): SanitizedAdminUser => {\n return {\n ..._.omit(user, ['password', 'resetPasswordToken', 'registrationToken', 'roles']),\n roles: user.roles && user.roles.map(sanitizeUserRoles),\n };\n};\n\n/**\n * Create and save a user in database\n * @param attributes A partial user object\n */\nconst create = async (\n // isActive is added in the controller, it's not sent by the API.\n attributes: Partial<AdminUserCreationPayload> & { isActive?: true }\n): Promise<AdminUser> => {\n const userInfo = {\n registrationToken: getService('token').createToken(),\n ...attributes,\n };\n\n if (_.has(attributes, 'password')) {\n userInfo.password = await getService('auth').hashPassword(attributes.password!);\n }\n\n const user = createUser(userInfo);\n\n const createdUser = await strapi.db\n .query('admin::user')\n .create({ data: user, populate: ['roles'] });\n\n getService('metrics').sendDidInviteUser();\n\n strapi.eventHub.emit('user.create', { user: sanitizeUser(createdUser) });\n\n return createdUser;\n};\n\n/**\n * Update a user in database\n * @param id query params to find the user to update\n * @param attributes A partial user object\n */\nconst updateById = async (\n id: Data.ID,\n attributes: Partial<AdminUserUpdatePayload>\n): Promise<AdminUser> => {\n // Check at least one super admin remains\n if (_.has(attributes, 'roles')) {\n const lastAdminUser = await isLastSuperAdminUser(id);\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n const willRemoveSuperAdminRole = !arrays.includesString(attributes.roles!, superAdminRole.id);\n\n if (lastAdminUser && willRemoveSuperAdminRole) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n }\n\n // cannot disable last super admin\n if (attributes.isActive === false) {\n const lastAdminUser = await isLastSuperAdminUser(id);\n if (lastAdminUser) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n }\n\n // hash password if a new one is sent\n if (_.has(attributes, 'password')) {\n const hashedPassword = await getService('auth').hashPassword(attributes.password!);\n\n const updatedUser = await strapi.db.query('admin::user').update({\n where: { id },\n data: {\n ...attributes,\n password: hashedPassword,\n },\n populate: ['roles'],\n });\n\n strapi.eventHub.emit('user.update', { user: sanitizeUser(updatedUser) });\n\n return updatedUser;\n }\n\n const updatedUser = await strapi.db.query('admin::user').update({\n where: { id },\n data: attributes,\n populate: ['roles'],\n });\n\n if (updatedUser) {\n strapi.eventHub.emit('user.update', { user: sanitizeUser(updatedUser) });\n }\n\n return updatedUser;\n};\n\n/**\n * Reset a user password by email. (Used in admin:reset CLI)\n * @param email - user email\n * @param password - new password\n */\nconst resetPasswordByEmail = async (email: string, password: string) => {\n const user = await strapi.db\n .query('admin::user')\n .findOne({ where: { email }, populate: ['roles'] });\n\n if (!user) {\n throw new Error(`User not found for email: ${email}`);\n }\n\n try {\n await passwordValidator.validate(password);\n } catch (error) {\n throw new ValidationError(\n 'Invalid password. Expected a minimum of 8 characters with at least one number and one uppercase letter'\n );\n }\n\n await updateById(user.id, { password });\n};\n\n/**\n * Check if a user is the last super admin\n * @param userId user's id to look for\n */\nconst isLastSuperAdminUser = async (userId: Data.ID): Promise<boolean> => {\n const user = (await findOne(userId)) as AdminUser | null;\n if (!user) return false;\n\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n\n return superAdminRole.usersCount === 1 && hasSuperAdminRole(user);\n};\n\n/**\n * Check if a user with specific attributes exists in the database\n * @param attributes A partial user object\n */\nconst exists = async (attributes = {} as unknown): Promise<boolean> => {\n return (await strapi.db.query('admin::user').count({ where: attributes })) > 0;\n};\n\n/**\n * Returns a user registration info\n * @param registrationToken - a user registration token\n * @returns - Returns user email, firstname and lastname\n */\nconst findRegistrationInfo = async (\n registrationToken: string\n): Promise<Pick<AdminUser, 'email' | 'firstname' | 'lastname'> | undefined> => {\n const user = await strapi.db.query('admin::user').findOne({ where: { registrationToken } });\n\n if (!user) {\n return undefined;\n }\n\n return _.pick(user, ['email', 'firstname', 'lastname']);\n};\n\n/**\n * Registers a user based on a registrationToken and some informations to update\n * @param params\n * @param params.registrationToken registration token\n * @param params.userInfo user info\n */\nconst register = async ({\n registrationToken,\n userInfo,\n}: {\n registrationToken: string;\n userInfo: Partial<AdminUser>;\n}) => {\n const matchingUser = await strapi.db\n .query('admin::user')\n .findOne({ where: { registrationToken } });\n\n if (!matchingUser) {\n throw new ValidationError('Invalid registration info');\n }\n\n return getService('user').updateById(matchingUser.id, {\n password: userInfo.password,\n firstname: userInfo.firstname,\n lastname: userInfo.lastname,\n registrationToken: null,\n isActive: true,\n });\n};\n\n/**\n * Find one user\n */\nconst findOne = async (id: Data.ID, populate = ['roles']) => {\n return strapi.db.query('admin::user').findOne({ where: { id }, populate });\n};\n\n/**\n * Find one user by its email\n * @param email\n * @param populate\n * @returns\n */\nconst findOneByEmail = async (email: string, populate = []) => {\n return strapi.db.query('admin::user').findOne({\n where: { email: { $eqi: email } },\n populate,\n });\n};\n\n/** Find many users (paginated)\n * @param params\n */\nconst findPage = async (params = {}): Promise<unknown> => {\n const query = strapi\n .get('query-params')\n .transform('admin::user', defaults({ populate: ['roles'] }, params));\n\n return strapi.db.query('admin::user').findPage(query);\n};\n\n/** Delete a user\n * @param id id of the user to delete\n */\nconst deleteById = async (id: Data.ID): Promise<AdminUser | null> => {\n // Check at least one super admin remains\n const userToDelete: AdminUser | null = await strapi.db.query('admin::user').findOne({\n where: { id },\n populate: ['roles'],\n });\n\n if (!userToDelete) {\n return null;\n }\n\n if (userToDelete) {\n if (userToDelete.roles.some((r) => r.code === SUPER_ADMIN_CODE)) {\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n if (superAdminRole.usersCount === 1) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n }\n }\n\n const deletedUser = await strapi.db\n .query('admin::user')\n .delete({ where: { id }, populate: ['roles'] });\n\n strapi.eventHub.emit('user.delete', { user: sanitizeUser(deletedUser) });\n\n return deletedUser;\n};\n\n/** Delete a user\n * @param ids ids of the users to delete\n */\nconst deleteByIds = async (ids: (string | number)[]): Promise<AdminUser[]> => {\n // Check at least one super admin remains\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n const nbOfSuperAdminToDelete = await strapi.db.query('admin::user').count({\n where: {\n id: ids,\n roles: { id: superAdminRole.id },\n },\n });\n\n if (superAdminRole.usersCount === nbOfSuperAdminToDelete) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n\n const deletedUsers = [] as AdminUser[];\n for (const id of ids) {\n const deletedUser = await strapi.db.query('admin::user').delete({\n where: { id },\n populate: ['roles'],\n });\n\n deletedUsers.push(deletedUser);\n }\n\n strapi.eventHub.emit('user.delete', {\n users: deletedUsers.map((deletedUser) => sanitizeUser(deletedUser)),\n });\n\n return deletedUsers;\n};\n\n/** Count the users that don't have any associated roles\n */\nconst countUsersWithoutRole = async (): Promise<number> => {\n return strapi.db.query('admin::user').count({\n where: {\n roles: {\n id: { $null: true },\n },\n },\n });\n};\n\n/**\n * Count the number of users based on search params\n * @param params params used for the query\n */\nconst count = async (where = {}): Promise<number> => {\n return strapi.db.query('admin::user').count({ where });\n};\n\n/**\n * Assign some roles to several users\n */\nconst assignARoleToAll = async (roleId: Data.ID): Promise<void> => {\n const users = await strapi.db.query('admin::user').findMany({\n select: ['id'],\n where: {\n roles: { id: { $null: true } },\n },\n });\n\n await Promise.all(\n users.map((user) => {\n return strapi.db.query('admin::user').update({\n where: { id: user.id },\n data: { roles: [roleId] },\n });\n })\n );\n};\n\n/** Display a warning if some users don't have at least one role\n */\nconst displayWarningIfUsersDontHaveRole = async (): Promise<void> => {\n const count = await countUsersWithoutRole();\n\n if (count > 0) {\n strapi.log.warn(`Some users (${count}) don't have any role.`);\n }\n};\n\n/** Returns an array of interface languages currently used by users\n */\nconst getLanguagesInUse = async (): Promise<string[]> => {\n const users = await strapi.db.query('admin::user').findMany({ select: ['preferedLanguage'] });\n\n return users.map((user) => user.preferedLanguage || 'en');\n};\n\nexport default {\n create,\n updateById,\n exists,\n findRegistrationInfo,\n register,\n sanitizeUser,\n findOne,\n findOneByEmail,\n findPage,\n deleteById,\n deleteByIds,\n countUsersWithoutRole,\n count,\n assignARoleToAll,\n displayWarningIfUsersDontHaveRole,\n resetPasswordByEmail,\n getLanguagesInUse,\n};\n"],"names":["SUPER_ADMIN_CODE","constants","ValidationError","errors","sanitizeUserRoles","role","_","pick","sanitizeUser","user","omit","roles","map","create","attributes","userInfo","registrationToken","getService","createToken","has","password","hashPassword","createUser","createdUser","strapi","db","query","data","populate","sendDidInviteUser","eventHub","emit","updateById","id","lastAdminUser","isLastSuperAdminUser","superAdminRole","getSuperAdminWithUsersCount","willRemoveSuperAdminRole","arrays","includesString","isActive","hashedPassword","updatedUser","update","where","resetPasswordByEmail","email","findOne","Error","passwordValidator","validate","error","userId","usersCount","hasSuperAdminRole","exists","count","findRegistrationInfo","undefined","register","matchingUser","firstname","lastname","findOneByEmail","$eqi","findPage","params","get","transform","defaults","deleteById","userToDelete","some","r","code","deletedUser","delete","deleteByIds","ids","nbOfSuperAdminToDelete","deletedUsers","push","users","countUsersWithoutRole","$null","assignARoleToAll","roleId","findMany","select","Promise","all","displayWarningIfUsersDontHaveRole","log","warn","getLanguagesInUse","preferedLanguage"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"user.mjs","sources":["../../../../../server/src/services/user.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport _ from 'lodash';\nimport { defaults } from 'lodash/fp';\nimport { arrays, errors } from '@strapi/utils';\nimport type { Data } from '@strapi/types';\nimport { createUser, hasSuperAdminRole } from '../domain/user';\nimport type {\n AdminUser,\n AdminRole,\n AdminUserCreationPayload,\n SanitizedAdminUser,\n SanitizedAdminRole,\n AdminUserUpdatePayload,\n // eslint-disable-next-line node/no-unpublished-import\n} from '../../../shared/contracts/shared';\nimport { password as passwordValidator } from '../validation/common-validators';\nimport { getService } from '../utils';\nimport constants from './constants';\n\nconst { SUPER_ADMIN_CODE } = constants;\n\nconst { ValidationError } = errors;\nconst sanitizeUserRoles = (role: AdminRole): SanitizedAdminRole =>\n _.pick(role, ['id', 'name', 'description', 'code']);\n\n/**\n * Remove private user fields\n * @param user - user to sanitize\n */\nconst sanitizeUser = (user: AdminUser): SanitizedAdminUser => {\n return {\n ..._.omit(user, ['password', 'resetPasswordToken', 'registrationToken', 'roles']),\n roles: user.roles && user.roles.map(sanitizeUserRoles),\n };\n};\n\n/**\n * Create and save a user in database\n * @param attributes A partial user object\n */\nconst create = async (\n // isActive is added in the controller, it's not sent by the API.\n attributes: Partial<AdminUserCreationPayload> & { isActive?: true }\n): Promise<AdminUser> => {\n const userInfo = {\n registrationToken: getService('token').createToken(),\n ...attributes,\n };\n\n if (_.has(attributes, 'password')) {\n userInfo.password = await getService('auth').hashPassword(attributes.password!);\n }\n\n const user = createUser(userInfo);\n\n const createdUser = await strapi.db\n .query('admin::user')\n .create({ data: user, populate: ['roles'] });\n\n getService('metrics').sendDidInviteUser();\n\n strapi.eventHub.emit('user.create', { user: sanitizeUser(createdUser) });\n\n return createdUser;\n};\n\n/**\n * Update a user in database\n * @param id query params to find the user to update\n * @param attributes A partial user object\n */\nconst updateById = async (\n id: Data.ID,\n attributes: Partial<AdminUserUpdatePayload>\n): Promise<AdminUser> => {\n // Check at least one super admin remains\n if (_.has(attributes, 'roles')) {\n const lastAdminUser = await isLastSuperAdminUser(id);\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n const willRemoveSuperAdminRole = !arrays.includesString(attributes.roles!, superAdminRole.id);\n\n if (lastAdminUser && willRemoveSuperAdminRole) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n }\n\n // cannot disable last super admin\n if (attributes.isActive === false) {\n const lastAdminUser = await isLastSuperAdminUser(id);\n if (lastAdminUser) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n }\n\n // hash password if a new one is sent\n if (_.has(attributes, 'password')) {\n const hashedPassword = await getService('auth').hashPassword(attributes.password!);\n\n const updatedUser = await strapi.db.query('admin::user').update({\n where: { id },\n data: {\n ...attributes,\n password: hashedPassword,\n },\n populate: ['roles'],\n });\n\n strapi.eventHub.emit('user.update', { user: sanitizeUser(updatedUser) });\n\n return updatedUser;\n }\n\n const updatedUser = await strapi.db.query('admin::user').update({\n where: { id },\n data: attributes,\n populate: ['roles'],\n });\n\n if (updatedUser) {\n strapi.eventHub.emit('user.update', { user: sanitizeUser(updatedUser) });\n }\n\n return updatedUser;\n};\n\n/**\n * Reset a user password by email. (Used in admin:reset CLI)\n * @param email - user email\n * @param password - new password\n */\nconst resetPasswordByEmail = async (email: string, password: string) => {\n const user = await strapi.db\n .query('admin::user')\n .findOne({ where: { email }, populate: ['roles'] });\n\n if (!user) {\n throw new Error(`User not found for email: ${email}`);\n }\n\n try {\n await passwordValidator.validate(password);\n } catch (error) {\n throw new ValidationError(\n 'Invalid password. Expected a minimum of 8 characters with at least one number and one uppercase letter'\n );\n }\n\n await updateById(user.id, { password });\n};\n\n/**\n * Check if a user is the last super admin\n * @param userId user's id to look for\n */\nconst isLastSuperAdminUser = async (userId: Data.ID): Promise<boolean> => {\n const user = (await findOne(userId)) as AdminUser | null;\n if (!user) return false;\n\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n\n return superAdminRole.usersCount === 1 && hasSuperAdminRole(user);\n};\n\n/**\n * Check if a user is the first super admin\n * @param userId user's id to look for\n */\nconst isFirstSuperAdminUser = async (userId: Data.ID): Promise<boolean> => {\n const currentUser = (await findOne(userId)) as AdminUser | null;\n\n if (!currentUser || !hasSuperAdminRole(currentUser)) return false;\n\n const [oldestUser] = await strapi.db.query('admin::user').findMany({\n populate: {\n roles: {\n where: {\n code: { $eq: SUPER_ADMIN_CODE },\n },\n },\n },\n orderBy: { createdAt: 'asc' },\n limit: 1,\n select: ['id'],\n });\n\n return oldestUser.id === currentUser.id;\n};\n\n/**\n * Check if a user with specific attributes exists in the database\n * @param attributes A partial user object\n */\nconst exists = async (attributes = {} as unknown): Promise<boolean> => {\n return (await strapi.db.query('admin::user').count({ where: attributes })) > 0;\n};\n\n/**\n * Returns a user registration info\n * @param registrationToken - a user registration token\n * @returns - Returns user email, firstname and lastname\n */\nconst findRegistrationInfo = async (\n registrationToken: string\n): Promise<Pick<AdminUser, 'email' | 'firstname' | 'lastname'> | undefined> => {\n const user = await strapi.db.query('admin::user').findOne({ where: { registrationToken } });\n\n if (!user) {\n return undefined;\n }\n\n return _.pick(user, ['email', 'firstname', 'lastname']);\n};\n\n/**\n * Registers a user based on a registrationToken and some informations to update\n * @param params\n * @param params.registrationToken registration token\n * @param params.userInfo user info\n */\nconst register = async ({\n registrationToken,\n userInfo,\n}: {\n registrationToken: string;\n userInfo: Partial<AdminUser>;\n}) => {\n const matchingUser = await strapi.db\n .query('admin::user')\n .findOne({ where: { registrationToken } });\n\n if (!matchingUser) {\n throw new ValidationError('Invalid registration info');\n }\n\n return getService('user').updateById(matchingUser.id, {\n password: userInfo.password,\n firstname: userInfo.firstname,\n lastname: userInfo.lastname,\n registrationToken: null,\n isActive: true,\n });\n};\n\n/**\n * Find one user\n */\nconst findOne = async (id: Data.ID, populate = ['roles']) => {\n return strapi.db.query('admin::user').findOne({ where: { id }, populate });\n};\n\n/**\n * Find one user by its email\n * @param email\n * @param populate\n * @returns\n */\nconst findOneByEmail = async (email: string, populate = []) => {\n return strapi.db.query('admin::user').findOne({\n where: { email: { $eqi: email } },\n populate,\n });\n};\n\n/** Find many users (paginated)\n * @param params\n */\nconst findPage = async (params = {}): Promise<unknown> => {\n const query = strapi\n .get('query-params')\n .transform('admin::user', defaults({ populate: ['roles'] }, params));\n\n return strapi.db.query('admin::user').findPage(query);\n};\n\n/** Delete a user\n * @param id id of the user to delete\n */\nconst deleteById = async (id: Data.ID): Promise<AdminUser | null> => {\n // Check at least one super admin remains\n const userToDelete: AdminUser | null = await strapi.db.query('admin::user').findOne({\n where: { id },\n populate: ['roles'],\n });\n\n if (!userToDelete) {\n return null;\n }\n\n if (userToDelete) {\n if (userToDelete.roles.some((r) => r.code === SUPER_ADMIN_CODE)) {\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n if (superAdminRole.usersCount === 1) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n }\n }\n\n const deletedUser = await strapi.db\n .query('admin::user')\n .delete({ where: { id }, populate: ['roles'] });\n\n strapi.eventHub.emit('user.delete', { user: sanitizeUser(deletedUser) });\n\n return deletedUser;\n};\n\n/** Delete a user\n * @param ids ids of the users to delete\n */\nconst deleteByIds = async (ids: (string | number)[]): Promise<AdminUser[]> => {\n // Check at least one super admin remains\n const superAdminRole = await getService('role').getSuperAdminWithUsersCount();\n const nbOfSuperAdminToDelete = await strapi.db.query('admin::user').count({\n where: {\n id: ids,\n roles: { id: superAdminRole.id },\n },\n });\n\n if (superAdminRole.usersCount === nbOfSuperAdminToDelete) {\n throw new ValidationError('You must have at least one user with super admin role.');\n }\n\n const deletedUsers = [] as AdminUser[];\n for (const id of ids) {\n const deletedUser = await strapi.db.query('admin::user').delete({\n where: { id },\n populate: ['roles'],\n });\n\n deletedUsers.push(deletedUser);\n }\n\n strapi.eventHub.emit('user.delete', {\n users: deletedUsers.map((deletedUser) => sanitizeUser(deletedUser)),\n });\n\n return deletedUsers;\n};\n\n/** Count the users that don't have any associated roles\n */\nconst countUsersWithoutRole = async (): Promise<number> => {\n return strapi.db.query('admin::user').count({\n where: {\n roles: {\n id: { $null: true },\n },\n },\n });\n};\n\n/**\n * Count the number of users based on search params\n * @param params params used for the query\n */\nconst count = async (where = {}): Promise<number> => {\n return strapi.db.query('admin::user').count({ where });\n};\n\n/**\n * Assign some roles to several users\n */\nconst assignARoleToAll = async (roleId: Data.ID): Promise<void> => {\n const users = await strapi.db.query('admin::user').findMany({\n select: ['id'],\n where: {\n roles: { id: { $null: true } },\n },\n });\n\n await Promise.all(\n users.map((user) => {\n return strapi.db.query('admin::user').update({\n where: { id: user.id },\n data: { roles: [roleId] },\n });\n })\n );\n};\n\n/** Display a warning if some users don't have at least one role\n */\nconst displayWarningIfUsersDontHaveRole = async (): Promise<void> => {\n const count = await countUsersWithoutRole();\n\n if (count > 0) {\n strapi.log.warn(`Some users (${count}) don't have any role.`);\n }\n};\n\n/** Returns an array of interface languages currently used by users\n */\nconst getLanguagesInUse = async (): Promise<string[]> => {\n const users = await strapi.db.query('admin::user').findMany({ select: ['preferedLanguage'] });\n\n return users.map((user) => user.preferedLanguage || 'en');\n};\n\nexport default {\n create,\n updateById,\n exists,\n findRegistrationInfo,\n register,\n sanitizeUser,\n findOne,\n findOneByEmail,\n findPage,\n deleteById,\n deleteByIds,\n countUsersWithoutRole,\n count,\n assignARoleToAll,\n displayWarningIfUsersDontHaveRole,\n resetPasswordByEmail,\n getLanguagesInUse,\n isFirstSuperAdminUser,\n};\n"],"names":["SUPER_ADMIN_CODE","constants","ValidationError","errors","sanitizeUserRoles","role","_","pick","sanitizeUser","user","omit","roles","map","create","attributes","userInfo","registrationToken","getService","createToken","has","password","hashPassword","createUser","createdUser","strapi","db","query","data","populate","sendDidInviteUser","eventHub","emit","updateById","id","lastAdminUser","isLastSuperAdminUser","superAdminRole","getSuperAdminWithUsersCount","willRemoveSuperAdminRole","arrays","includesString","isActive","hashedPassword","updatedUser","update","where","resetPasswordByEmail","email","findOne","Error","passwordValidator","validate","error","userId","usersCount","hasSuperAdminRole","isFirstSuperAdminUser","currentUser","oldestUser","findMany","code","$eq","orderBy","createdAt","limit","select","exists","count","findRegistrationInfo","undefined","register","matchingUser","firstname","lastname","findOneByEmail","$eqi","findPage","params","get","transform","defaults","deleteById","userToDelete","some","r","deletedUser","delete","deleteByIds","ids","nbOfSuperAdminToDelete","deletedUsers","push","users","countUsersWithoutRole","$null","assignARoleToAll","roleId","Promise","all","displayWarningIfUsersDontHaveRole","log","warn","getLanguagesInUse","preferedLanguage"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../server/src/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../server/src/bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;qCAgGR;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;AAAzD,wBA+BE"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { Context } from 'koa';
|
|
2
|
-
import '@strapi/types';
|
|
3
2
|
import type { GetProjectSettings } from '../../../shared/contracts/admin';
|
|
4
3
|
/**
|
|
5
4
|
* A set of functions called "actions" for `Admin`
|
|
@@ -48,6 +47,12 @@ declare const _default: {
|
|
|
48
47
|
licenseTrialTimeLeft(): Promise<{
|
|
49
48
|
trialEndsAt: string;
|
|
50
49
|
} | null>;
|
|
50
|
+
getGuidedTourMeta(ctx: Context): Promise<{
|
|
51
|
+
data: {
|
|
52
|
+
isFirstSuperAdminUser: boolean;
|
|
53
|
+
completedActions: (keyof import("../services/guided-tour").GuidedTourRequiredActions)[];
|
|
54
|
+
};
|
|
55
|
+
}>;
|
|
51
56
|
};
|
|
52
57
|
export default _default;
|
|
53
58
|
//# sourceMappingURL=admin.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/admin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/admin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAgBnC,OAAO,KAAK,EAEV,kBAAkB,EAMnB,MAAM,iCAAiC,CAAC;AAIzC;;GAEG;;;;;;;;;;;;;;;;;;+BA2CgC,OAAO;6BAmBT,OAAO;;;;;;;;;;;;;;;;;;;;;;iBA6DnB,OAAO;;;;2BAmCG,OAAO;;;;;;;AA7JtC,wBA0KE"}
|
|
@@ -44,6 +44,12 @@ declare const _default: {
|
|
|
44
44
|
licenseTrialTimeLeft(): Promise<{
|
|
45
45
|
trialEndsAt: string;
|
|
46
46
|
} | null>;
|
|
47
|
+
getGuidedTourMeta(ctx: import("koa").Context): Promise<{
|
|
48
|
+
data: {
|
|
49
|
+
isFirstSuperAdminUser: boolean;
|
|
50
|
+
completedActions: (keyof import("../services/guided-tour").GuidedTourRequiredActions)[];
|
|
51
|
+
};
|
|
52
|
+
}>;
|
|
47
53
|
};
|
|
48
54
|
'api-token': {
|
|
49
55
|
create(ctx: import("koa").Context): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,wBAWE"}
|
|
@@ -127,6 +127,7 @@ declare let admin: {
|
|
|
127
127
|
displayWarningIfUsersDontHaveRole: () => Promise<void>;
|
|
128
128
|
resetPasswordByEmail: (email: string, password: string) => Promise<void>;
|
|
129
129
|
getLanguagesInUse: () => Promise<string[]>;
|
|
130
|
+
isFirstSuperAdminUser: (userId: import("@strapi/types/dist/data").ID) => Promise<boolean>;
|
|
130
131
|
};
|
|
131
132
|
role: {
|
|
132
133
|
hooks: {
|
|
@@ -189,6 +190,11 @@ declare let admin: {
|
|
|
189
190
|
encrypt: (value: string) => string | null;
|
|
190
191
|
decrypt: (encryptedValue: string) => string | null;
|
|
191
192
|
};
|
|
193
|
+
'guided-tour': ({ strapi }: {
|
|
194
|
+
strapi: import("@strapi/types/dist/core").Strapi;
|
|
195
|
+
}) => {
|
|
196
|
+
getCompletedActions: () => Promise<(keyof import("./services/guided-tour").GuidedTourRequiredActions)[]>;
|
|
197
|
+
};
|
|
192
198
|
};
|
|
193
199
|
controllers: {
|
|
194
200
|
admin: {
|
|
@@ -235,6 +241,12 @@ declare let admin: {
|
|
|
235
241
|
licenseTrialTimeLeft(): Promise<{
|
|
236
242
|
trialEndsAt: string;
|
|
237
243
|
} | null>;
|
|
244
|
+
getGuidedTourMeta(ctx: import("koa").Context): Promise<{
|
|
245
|
+
data: {
|
|
246
|
+
isFirstSuperAdminUser: boolean;
|
|
247
|
+
completedActions: (keyof import("./services/guided-tour").GuidedTourRequiredActions)[];
|
|
248
|
+
};
|
|
249
|
+
}>;
|
|
238
250
|
};
|
|
239
251
|
'api-token': {
|
|
240
252
|
create(ctx: import("koa").Context): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":";AAeA,QAAA,IAAI,KAAK
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../server/src/index.ts"],"names":[],"mappings":";AAeA,QAAA,IAAI,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAWR,CAAC;AAUF,eAAe,KAAK,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../server/src/routes/admin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"admin.d.ts","sourceRoot":"","sources":["../../../../server/src/routes/admin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,wBAoFE"}
|
|
@@ -19,6 +19,17 @@ declare const constants: {
|
|
|
19
19
|
DAYS_30: number;
|
|
20
20
|
DAYS_90: number;
|
|
21
21
|
};
|
|
22
|
+
DEFAULT_API_TOKENS: readonly [{
|
|
23
|
+
readonly name: "Read Only";
|
|
24
|
+
readonly description: "A default API token with read-only permissions, only used for accessing resources";
|
|
25
|
+
readonly type: "read-only";
|
|
26
|
+
readonly lifespan: null;
|
|
27
|
+
}, {
|
|
28
|
+
readonly name: "Full Access";
|
|
29
|
+
readonly description: "A default API token with full access permissions, used for accessing or modifying resources";
|
|
30
|
+
readonly type: "full-access";
|
|
31
|
+
readonly lifespan: null;
|
|
32
|
+
}];
|
|
22
33
|
TRANSFER_TOKEN_TYPE: {
|
|
23
34
|
PUSH: string;
|
|
24
35
|
PULL: string;
|
|
@@ -31,4 +42,3 @@ declare const constants: {
|
|
|
31
42
|
};
|
|
32
43
|
};
|
|
33
44
|
export default constants;
|
|
34
|
-
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../server/src/services/constants.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,SAAS
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../server/src/services/constants.ts"],"names":[],"mappings":"AAEA,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDd,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Core } from '@strapi/types';
|
|
2
|
+
export type GuidedTourRequiredActions = {
|
|
3
|
+
didCreateContentTypeSchema: boolean;
|
|
4
|
+
didCreateContent: boolean;
|
|
5
|
+
didCreateApiToken: boolean;
|
|
6
|
+
};
|
|
7
|
+
export type GuidedTourCompletedActions = keyof GuidedTourRequiredActions;
|
|
8
|
+
export declare const createGuidedTourService: ({ strapi }: {
|
|
9
|
+
strapi: Core.Strapi;
|
|
10
|
+
}) => {
|
|
11
|
+
getCompletedActions: () => Promise<(keyof GuidedTourRequiredActions)[]>;
|
|
12
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guided-tour.d.ts","sourceRoot":"","sources":["../../../../server/src/services/guided-tour.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAG/C,MAAM,MAAM,yBAAyB,GAAG;IACtC,0BAA0B,EAAE,OAAO,CAAC;IACpC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;CAC5B,CAAC;AACF,MAAM,MAAM,0BAA0B,GAAG,MAAM,yBAAyB,CAAC;AAEzE,eAAO,MAAM,uBAAuB,eAAgB;IAAE,MAAM,EAAE,KAAK,MAAM,CAAA;CAAE;;CA6C1E,CAAC"}
|
|
@@ -49,6 +49,7 @@ declare const _default: {
|
|
|
49
49
|
displayWarningIfUsersDontHaveRole: () => Promise<void>;
|
|
50
50
|
resetPasswordByEmail: (email: string, password: string) => Promise<void>;
|
|
51
51
|
getLanguagesInUse: () => Promise<string[]>;
|
|
52
|
+
isFirstSuperAdminUser: (userId: import("@strapi/types/dist/data").ID) => Promise<boolean>;
|
|
52
53
|
};
|
|
53
54
|
role: {
|
|
54
55
|
hooks: {
|
|
@@ -111,6 +112,11 @@ declare const _default: {
|
|
|
111
112
|
encrypt: (value: string) => string | null;
|
|
112
113
|
decrypt: (encryptedValue: string) => string | null;
|
|
113
114
|
};
|
|
115
|
+
'guided-tour': ({ strapi }: {
|
|
116
|
+
strapi: import("@strapi/types/dist/core").Strapi;
|
|
117
|
+
}) => {
|
|
118
|
+
getCompletedActions: () => Promise<(keyof import("./guided-tour").GuidedTourRequiredActions)[]>;
|
|
119
|
+
};
|
|
114
120
|
};
|
|
115
121
|
export default _default;
|
|
116
122
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/services/index.ts"],"names":[],"mappings":";AAOA,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,WAAW,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,QAAQ,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,eAAe,MAAM,oBAAoB,CAAC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/services/index.ts"],"names":[],"mappings":";AAOA,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,WAAW,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,MAAM,MAAM,UAAU,CAAC;AACnC,OAAO,KAAK,QAAQ,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,eAAe,MAAM,oBAAoB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAItD,wBAiBE"}
|
|
@@ -23,6 +23,7 @@ declare const _default: {
|
|
|
23
23
|
displayWarningIfUsersDontHaveRole: () => Promise<void>;
|
|
24
24
|
resetPasswordByEmail: (email: string, password: string) => Promise<void>;
|
|
25
25
|
getLanguagesInUse: () => Promise<string[]>;
|
|
26
|
+
isFirstSuperAdminUser: (userId: Data.ID) => Promise<boolean>;
|
|
26
27
|
};
|
|
27
28
|
export default _default;
|
|
28
29
|
//# sourceMappingURL=user.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../../server/src/services/user.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,KAAK,EACV,SAAS,EAET,wBAAwB,EACxB,kBAAkB,EAElB,sBAAsB,EAEvB,MAAM,kCAAkC,CAAC
|
|
1
|
+
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../../server/src/services/user.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,KAAK,EACV,SAAS,EAET,wBAAwB,EACxB,kBAAkB,EAElB,sBAAsB,EAEvB,MAAM,kCAAkC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;AAiY1C,wBAmBE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { errors } from '@strapi/utils';
|
|
2
2
|
import type { File } from 'formidable';
|
|
3
|
+
import type { GuidedTourCompletedActions } from '../../server/src/services/guided-tour';
|
|
3
4
|
export interface Logo {
|
|
4
5
|
name: string;
|
|
5
6
|
url: string;
|
|
@@ -196,3 +197,17 @@ export declare namespace GetLicenseLimitInformation {
|
|
|
196
197
|
error?: errors.ApplicationError;
|
|
197
198
|
}
|
|
198
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* Meta data for the guided tour
|
|
202
|
+
*/
|
|
203
|
+
export declare namespace GetGuidedTourMeta {
|
|
204
|
+
interface Request {
|
|
205
|
+
}
|
|
206
|
+
interface Response {
|
|
207
|
+
data: {
|
|
208
|
+
isFirstSuperAdminUser: boolean;
|
|
209
|
+
completedActions: GuidedTourCompletedActions[];
|
|
210
|
+
};
|
|
211
|
+
error?: errors.ApplicationError;
|
|
212
|
+
}
|
|
213
|
+
}
|