@nocobase/plugin-users 0.5.0-alpha.38 → 0.7.0-alpha.2

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 (85) hide show
  1. package/LICENSE +201 -21
  2. package/esm/actions/users.d.ts +11 -0
  3. package/esm/actions/users.js +165 -0
  4. package/esm/actions/users.js.map +1 -0
  5. package/esm/collections/roles-users.d.ts +3 -0
  6. package/esm/collections/roles-users.js +5 -0
  7. package/esm/collections/roles-users.js.map +1 -0
  8. package/esm/collections/users.d.ts +3 -0
  9. package/esm/collections/users.js +86 -0
  10. package/esm/collections/users.js.map +1 -0
  11. package/esm/index.d.ts +1 -0
  12. package/esm/index.js +2 -0
  13. package/esm/index.js.map +1 -0
  14. package/esm/jwt-service.d.ts +12 -0
  15. package/esm/jwt-service.js +26 -0
  16. package/esm/jwt-service.js.map +1 -0
  17. package/esm/middlewares/check.d.ts +1 -0
  18. package/esm/middlewares/check.js +22 -0
  19. package/esm/middlewares/check.js.map +1 -0
  20. package/esm/middlewares/index.d.ts +2 -0
  21. package/esm/middlewares/index.js +3 -0
  22. package/esm/middlewares/index.js.map +1 -0
  23. package/esm/middlewares/parseToken.d.ts +6 -0
  24. package/esm/middlewares/parseToken.js +64 -0
  25. package/esm/middlewares/parseToken.js.map +1 -0
  26. package/esm/models/UserModel.d.ts +4 -0
  27. package/esm/models/UserModel.js +53 -0
  28. package/esm/models/UserModel.js.map +1 -0
  29. package/esm/server.d.ts +23 -0
  30. package/esm/server.js +133 -0
  31. package/esm/server.js.map +1 -0
  32. package/lib/actions/users.d.ts +1 -0
  33. package/lib/actions/users.js +145 -241
  34. package/lib/actions/users.js.map +1 -1
  35. package/lib/collections/roles-users.d.ts +3 -0
  36. package/lib/collections/roles-users.js +7 -0
  37. package/lib/collections/roles-users.js.map +1 -0
  38. package/lib/collections/users.d.ts +2 -2
  39. package/lib/collections/users.js +85 -112
  40. package/lib/collections/users.js.map +1 -1
  41. package/lib/index.js +5 -30
  42. package/lib/index.js.map +1 -1
  43. package/lib/jwt-service.d.ts +12 -0
  44. package/lib/jwt-service.js +33 -0
  45. package/lib/jwt-service.js.map +1 -0
  46. package/lib/middlewares/check.d.ts +1 -1
  47. package/lib/middlewares/check.js +22 -60
  48. package/lib/middlewares/check.js.map +1 -1
  49. package/lib/middlewares/index.d.ts +2 -2
  50. package/lib/middlewares/index.js +6 -41
  51. package/lib/middlewares/index.js.map +1 -1
  52. package/lib/middlewares/parseToken.d.ts +6 -1
  53. package/lib/middlewares/parseToken.js +62 -63
  54. package/lib/middlewares/parseToken.js.map +1 -1
  55. package/lib/models/UserModel.d.ts +4 -0
  56. package/lib/models/UserModel.js +57 -0
  57. package/lib/models/UserModel.js.map +1 -0
  58. package/lib/server.d.ts +23 -3
  59. package/lib/server.js +147 -159
  60. package/lib/server.js.map +1 -1
  61. package/package.json +17 -6
  62. package/tsconfig.build.json +9 -0
  63. package/lib/actions/users.d.ts.map +0 -1
  64. package/lib/collections/users.d.ts.map +0 -1
  65. package/lib/fields/CreatedBy.d.ts +0 -11
  66. package/lib/fields/CreatedBy.d.ts.map +0 -1
  67. package/lib/fields/CreatedBy.js +0 -66
  68. package/lib/fields/CreatedBy.js.map +0 -1
  69. package/lib/fields/UpdatedBy.d.ts +0 -16
  70. package/lib/fields/UpdatedBy.d.ts.map +0 -1
  71. package/lib/fields/UpdatedBy.js +0 -87
  72. package/lib/fields/UpdatedBy.js.map +0 -1
  73. package/lib/fields/index.d.ts +0 -2
  74. package/lib/fields/index.d.ts.map +0 -1
  75. package/lib/fields/index.js +0 -43
  76. package/lib/fields/index.js.map +0 -1
  77. package/lib/fields/utils.d.ts +0 -4
  78. package/lib/fields/utils.d.ts.map +0 -1
  79. package/lib/fields/utils.js +0 -51
  80. package/lib/fields/utils.js.map +0 -1
  81. package/lib/index.d.ts.map +0 -1
  82. package/lib/middlewares/check.d.ts.map +0 -1
  83. package/lib/middlewares/index.d.ts.map +0 -1
  84. package/lib/middlewares/parseToken.d.ts.map +0 -1
  85. package/lib/server.d.ts.map +0 -1
@@ -0,0 +1,6 @@
1
+ import { Context, Next } from '@nocobase/actions';
2
+ import UsersPlugin from '../server';
3
+ export declare function parseToken(options?: {
4
+ plugin: UsersPlugin;
5
+ }): (ctx: Context, next: Next) => Promise<any>;
6
+ export declare function setCurrentRole(ctx: any): void;
@@ -0,0 +1,64 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ export function parseToken(options) {
11
+ return function parseToken(ctx, next) {
12
+ return __awaiter(this, void 0, void 0, function* () {
13
+ const user = yield findUserByToken(ctx, options.plugin);
14
+ if (user) {
15
+ ctx.state.currentUser = user;
16
+ setCurrentRole(ctx);
17
+ }
18
+ return next();
19
+ });
20
+ };
21
+ }
22
+ export function setCurrentRole(ctx) {
23
+ var _a;
24
+ let currentRole = ctx.get('X-Role');
25
+ if (currentRole === 'anonymous') {
26
+ ctx.state.currentRole = currentRole;
27
+ return;
28
+ }
29
+ const userRoles = ctx.state.currentUser.roles;
30
+ if (userRoles.length == 1) {
31
+ currentRole = userRoles[0].name;
32
+ }
33
+ else if (userRoles.length > 1) {
34
+ const role = userRoles.find((role) => role.name === currentRole);
35
+ if (!role) {
36
+ const defaultRole = userRoles.find((role) => { var _a; return (_a = role === null || role === void 0 ? void 0 : role.rolesUsers) === null || _a === void 0 ? void 0 : _a.default; });
37
+ currentRole = (_a = (defaultRole || userRoles[0])) === null || _a === void 0 ? void 0 : _a.name;
38
+ }
39
+ }
40
+ if (currentRole) {
41
+ ctx.state.currentRole = currentRole;
42
+ }
43
+ }
44
+ function findUserByToken(ctx, plugin) {
45
+ return __awaiter(this, void 0, void 0, function* () {
46
+ const token = ctx.getBearerToken();
47
+ if (!token) {
48
+ return null;
49
+ }
50
+ try {
51
+ const { userId } = yield plugin.jwtService.decode(token);
52
+ return yield ctx.db.getRepository('users').findOne({
53
+ filter: {
54
+ id: userId,
55
+ },
56
+ appends: ['roles'],
57
+ });
58
+ }
59
+ catch (error) {
60
+ console.warn(error);
61
+ }
62
+ });
63
+ }
64
+ //# sourceMappingURL=parseToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseToken.js","sourceRoot":"","sources":["../../src/middlewares/parseToken.ts"],"names":[],"mappings":";;;;;;;;;AAGA,MAAM,UAAU,UAAU,CAAC,OAAiC;IAC1D,OAAO,SAAe,UAAU,CAAC,GAAY,EAAE,IAAU;;YACvD,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACxD,IAAI,IAAI,EAAE;gBACR,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC;gBAC7B,cAAc,CAAC,GAAG,CAAC,CAAC;aACrB;YACD,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;KAAA,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAG;;IAChC,IAAI,WAAW,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEpC,IAAI,WAAW,KAAK,WAAW,EAAE;QAC/B,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;QACpC,OAAO;KACR;IAED,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC;IAE9C,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,EAAE;QACzB,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;KACjC;SAAM,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;QAC/B,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,EAAE;YACT,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,WAAC,OAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,0CAAE,OAAO,CAAA,EAAA,CAAC,CAAC;YACxE,WAAW,GAAG,MAAA,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,0CAAE,IAAI,CAAC;SACnD;KACF;IAED,IAAI,WAAW,EAAE;QACf,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;KACrC;AACH,CAAC;AAED,SAAe,eAAe,CAAC,GAAY,EAAE,MAAmB;;QAC9D,MAAM,KAAK,GAAG,GAAG,CAAC,cAAc,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,IAAI,CAAC;SACb;QACD,IAAI;YACF,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAEzD,OAAO,MAAM,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;gBACjD,MAAM,EAAE;oBACN,EAAE,EAAE,MAAM;iBACX;gBACD,OAAO,EAAE,CAAC,OAAO,CAAC;aACnB,CAAC,CAAC;SACJ;QAAC,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACrB;IACH,CAAC;CAAA","sourcesContent":["import { Context, Next } from '@nocobase/actions';\nimport UsersPlugin from '../server';\n\nexport function parseToken(options?: { plugin: UsersPlugin }) {\n return async function parseToken(ctx: Context, next: Next) {\n const user = await findUserByToken(ctx, options.plugin);\n if (user) {\n ctx.state.currentUser = user;\n setCurrentRole(ctx);\n }\n return next();\n };\n}\n\nexport function setCurrentRole(ctx) {\n let currentRole = ctx.get('X-Role');\n\n if (currentRole === 'anonymous') {\n ctx.state.currentRole = currentRole;\n return;\n }\n\n const userRoles = ctx.state.currentUser.roles;\n\n if (userRoles.length == 1) {\n currentRole = userRoles[0].name;\n } else if (userRoles.length > 1) {\n const role = userRoles.find((role) => role.name === currentRole);\n if (!role) {\n const defaultRole = userRoles.find((role) => role?.rolesUsers?.default);\n currentRole = (defaultRole || userRoles[0])?.name;\n }\n }\n\n if (currentRole) {\n ctx.state.currentRole = currentRole;\n }\n}\n\nasync function findUserByToken(ctx: Context, plugin: UsersPlugin) {\n const token = ctx.getBearerToken();\n if (!token) {\n return null;\n }\n try {\n const { userId } = await plugin.jwtService.decode(token);\n\n return await ctx.db.getRepository('users').findOne({\n filter: {\n id: userId,\n },\n appends: ['roles'],\n });\n } catch (error) {\n console.warn(error);\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import { Model, TransactionAble } from '@nocobase/database';
2
+ export declare class UserModel extends Model {
3
+ setDefaultRole(roleName: string, options?: TransactionAble): Promise<boolean>;
4
+ }
@@ -0,0 +1,53 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { Model } from '@nocobase/database';
11
+ export class UserModel extends Model {
12
+ setDefaultRole(roleName, options = {}) {
13
+ return __awaiter(this, void 0, void 0, function* () {
14
+ if (roleName == 'anonymous') {
15
+ return false;
16
+ }
17
+ const db = this.constructor.database;
18
+ const repository = db.getRepository('rolesUsers');
19
+ if (!repository) {
20
+ return false;
21
+ }
22
+ const transaction = options.transaction || (yield db.sequelize.transaction());
23
+ try {
24
+ yield repository.update({
25
+ filter: {
26
+ userId: this.get('id'),
27
+ },
28
+ values: {
29
+ default: false,
30
+ },
31
+ transaction,
32
+ });
33
+ yield repository.update({
34
+ filter: {
35
+ userId: this.get('id'),
36
+ roleName,
37
+ },
38
+ values: {
39
+ default: true,
40
+ },
41
+ transaction,
42
+ });
43
+ yield transaction.commit();
44
+ }
45
+ catch (error) {
46
+ yield transaction.rollback();
47
+ throw error;
48
+ }
49
+ return true;
50
+ });
51
+ }
52
+ }
53
+ //# sourceMappingURL=UserModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserModel.js","sourceRoot":"","sources":["../../src/models/UserModel.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAiB,EAAE,KAAK,EAAmB,MAAM,oBAAoB,CAAC;AAEtE,MAAM,OAAO,SAAU,SAAQ,KAAK;IAC5B,cAAc,CAAC,QAAgB,EAAE,UAA2B,EAAE;;YAClE,IAAI,QAAQ,IAAI,WAAW,EAAE;gBAC3B,OAAO,KAAK,CAAC;aACd;YAED,MAAM,EAAE,GAAI,IAAI,CAAC,WAAmB,CAAC,QAAoB,CAAC;YAC1D,MAAM,UAAU,GAAG,EAAE,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YAClD,IAAI,CAAC,UAAU,EAAE;gBACf,OAAO,KAAK,CAAC;aACd;YACD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;YAE9E,IAAI;gBACF,MAAM,UAAU,CAAC,MAAM,CAAC;oBACtB,MAAM,EAAE;wBACN,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;qBACvB;oBACD,MAAM,EAAE;wBACN,OAAO,EAAE,KAAK;qBACf;oBACD,WAAW;iBACZ,CAAC,CAAC;gBACH,MAAM,UAAU,CAAC,MAAM,CAAC;oBACtB,MAAM,EAAE;wBACN,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;wBACtB,QAAQ;qBACT;oBACD,MAAM,EAAE;wBACN,OAAO,EAAE,IAAI;qBACd;oBACD,WAAW;iBACZ,CAAC,CAAC;gBACH,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;aAC5B;YAAC,OAAO,KAAK,EAAE;gBACd,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAC;gBAC7B,MAAM,KAAK,CAAC;aACb;YAED,OAAO,IAAI,CAAC;QACd,CAAC;KAAA;CACF","sourcesContent":["import Database, { Model, TransactionAble } from '@nocobase/database';\n\nexport class UserModel extends Model {\n async setDefaultRole(roleName: string, options: TransactionAble = {}) {\n if (roleName == 'anonymous') {\n return false;\n }\n\n const db = (this.constructor as any).database as Database;\n const repository = db.getRepository('rolesUsers');\n if (!repository) {\n return false;\n }\n const transaction = options.transaction || (await db.sequelize.transaction());\n\n try {\n await repository.update({\n filter: {\n userId: this.get('id'),\n },\n values: {\n default: false,\n },\n transaction,\n });\n await repository.update({\n filter: {\n userId: this.get('id'),\n roleName,\n },\n values: {\n default: true,\n },\n transaction,\n });\n await transaction.commit();\n } catch (error) {\n await transaction.rollback();\n throw error;\n }\n\n return true;\n }\n}\n"]}
@@ -0,0 +1,23 @@
1
+ import { Plugin } from '@nocobase/server';
2
+ import { JwtOptions, JwtService } from './jwt-service';
3
+ export interface UserPluginConfig {
4
+ jwt: JwtOptions;
5
+ installing?: {
6
+ adminNickname: string;
7
+ adminEmail: string;
8
+ adminPassword: string;
9
+ };
10
+ }
11
+ export default class UsersPlugin extends Plugin<UserPluginConfig> {
12
+ jwtService: JwtService;
13
+ constructor(app: any, options: any);
14
+ beforeLoad(): Promise<void>;
15
+ load(): Promise<void>;
16
+ getRootUserInfo(): {
17
+ adminNickname: string;
18
+ adminEmail: string;
19
+ adminPassword: string;
20
+ };
21
+ install(): Promise<void>;
22
+ getName(): string;
23
+ }
package/esm/server.js ADDED
@@ -0,0 +1,133 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { Op } from '@nocobase/database';
11
+ import { Plugin } from '@nocobase/server';
12
+ import { resolve } from 'path';
13
+ import * as actions from './actions/users';
14
+ import { JwtService } from './jwt-service';
15
+ import * as middlewares from './middlewares';
16
+ import { UserModel } from './models/UserModel';
17
+ export default class UsersPlugin extends Plugin {
18
+ constructor(app, options) {
19
+ super(app, options);
20
+ this.jwtService = new JwtService(options === null || options === void 0 ? void 0 : options.jwt);
21
+ }
22
+ beforeLoad() {
23
+ return __awaiter(this, void 0, void 0, function* () {
24
+ this.db.registerOperators({
25
+ $isCurrentUser(_, ctx) {
26
+ var _a, _b, _c, _d;
27
+ return {
28
+ [Op.eq]: ((_d = (_c = (_b = (_a = ctx === null || ctx === void 0 ? void 0 : ctx.app) === null || _a === void 0 ? void 0 : _a.ctx) === null || _b === void 0 ? void 0 : _b.state) === null || _c === void 0 ? void 0 : _c.currentUser) === null || _d === void 0 ? void 0 : _d.id) || -1,
29
+ };
30
+ },
31
+ });
32
+ this.db.registerModels({ UserModel });
33
+ this.db.on('users.afterCreateWithAssociations', (model, options) => __awaiter(this, void 0, void 0, function* () {
34
+ const { transaction } = options;
35
+ const repository = this.app.db.getRepository('roles');
36
+ if (!repository) {
37
+ return;
38
+ }
39
+ const defaultRole = yield repository.findOne({
40
+ filter: {
41
+ default: true,
42
+ },
43
+ transaction,
44
+ });
45
+ if (defaultRole && (yield model.countRoles({ transaction })) == 0) {
46
+ yield model.addRoles(defaultRole, { transaction });
47
+ }
48
+ }));
49
+ this.db.on('afterDefineCollection', (collection) => {
50
+ let { createdBy, updatedBy } = collection.options;
51
+ if (createdBy === true) {
52
+ collection.setField('createdById', {
53
+ type: 'context',
54
+ dataType: 'integer',
55
+ dataIndex: 'state.currentUser.id',
56
+ createOnly: true,
57
+ visible: true,
58
+ onDelete: 'SET NULL',
59
+ onUpdate: 'CASCADE',
60
+ });
61
+ collection.setField('createdBy', {
62
+ type: 'belongsTo',
63
+ target: 'users',
64
+ foreignKey: 'createdById',
65
+ targetKey: 'id',
66
+ });
67
+ }
68
+ if (updatedBy === true) {
69
+ collection.setField('updatedById', {
70
+ type: 'context',
71
+ dataType: 'integer',
72
+ dataIndex: 'state.currentUser.id',
73
+ visible: true,
74
+ onDelete: 'SET NULL',
75
+ onUpdate: 'CASCADE',
76
+ });
77
+ collection.setField('updatedBy', {
78
+ type: 'belongsTo',
79
+ target: 'users',
80
+ foreignKey: 'updatedById',
81
+ targetKey: 'id',
82
+ });
83
+ }
84
+ });
85
+ for (const [key, action] of Object.entries(actions)) {
86
+ this.app.resourcer.registerActionHandler(`users:${key}`, action);
87
+ }
88
+ this.app.resourcer.use(middlewares.parseToken({ plugin: this }));
89
+ const publicActions = ['check', 'signin', 'signup', 'lostpassword', 'resetpassword', 'getUserByResetToken'];
90
+ const loggedInActions = ['signout', 'updateProfile', 'changePassword', 'setDefaultRole'];
91
+ publicActions.forEach((action) => this.app.acl.allow('users', action));
92
+ loggedInActions.forEach((action) => this.app.acl.allow('users', action, 'loggedIn'));
93
+ });
94
+ }
95
+ load() {
96
+ return __awaiter(this, void 0, void 0, function* () {
97
+ yield this.db.import({
98
+ directory: resolve(__dirname, 'collections'),
99
+ });
100
+ });
101
+ }
102
+ getRootUserInfo() {
103
+ const { adminNickname = 'Super Admin', adminEmail = 'admin@nocobase.com', adminPassword = 'admin123', } = this.options.installing || {};
104
+ return {
105
+ adminNickname,
106
+ adminEmail,
107
+ adminPassword,
108
+ };
109
+ }
110
+ install() {
111
+ return __awaiter(this, void 0, void 0, function* () {
112
+ const { adminNickname, adminPassword, adminEmail } = this.getRootUserInfo();
113
+ const User = this.db.getCollection('users');
114
+ const user = yield User.repository.create({
115
+ values: {
116
+ nickname: adminNickname,
117
+ email: adminEmail,
118
+ password: adminPassword,
119
+ roles: ['root', 'admin'],
120
+ },
121
+ });
122
+ yield user.setDefaultRole('root');
123
+ const repo = this.db.getRepository('collections');
124
+ if (repo) {
125
+ yield repo.db2cm('users');
126
+ }
127
+ });
128
+ }
129
+ getName() {
130
+ return this.getPackageName(__dirname);
131
+ }
132
+ }
133
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { Collection, Op } from '@nocobase/database';\nimport { Plugin } from '@nocobase/server';\nimport { resolve } from 'path';\nimport * as actions from './actions/users';\nimport { JwtOptions, JwtService } from './jwt-service';\nimport * as middlewares from './middlewares';\nimport { UserModel } from './models/UserModel';\n\nexport interface UserPluginConfig {\n jwt: JwtOptions;\n\n installing?: {\n adminNickname: string;\n adminEmail: string;\n adminPassword: string;\n };\n}\n\nexport default class UsersPlugin extends Plugin<UserPluginConfig> {\n public jwtService: JwtService;\n\n constructor(app, options) {\n super(app, options);\n this.jwtService = new JwtService(options?.jwt);\n }\n\n async beforeLoad() {\n this.db.registerOperators({\n $isCurrentUser(_, ctx) {\n return {\n [Op.eq]: ctx?.app?.ctx?.state?.currentUser?.id || -1,\n };\n },\n });\n this.db.registerModels({ UserModel });\n this.db.on('users.afterCreateWithAssociations', async (model, options) => {\n const { transaction } = options;\n const repository = this.app.db.getRepository('roles');\n if (!repository) {\n return;\n }\n const defaultRole = await repository.findOne({\n filter: {\n default: true,\n },\n transaction,\n });\n if (defaultRole && (await model.countRoles({ transaction })) == 0) {\n await model.addRoles(defaultRole, { transaction });\n }\n });\n\n this.db.on('afterDefineCollection', (collection: Collection) => {\n let { createdBy, updatedBy } = collection.options;\n if (createdBy === true) {\n collection.setField('createdById', {\n type: 'context',\n dataType: 'integer',\n dataIndex: 'state.currentUser.id',\n createOnly: true,\n visible: true,\n onDelete: 'SET NULL',\n onUpdate: 'CASCADE',\n });\n collection.setField('createdBy', {\n type: 'belongsTo',\n target: 'users',\n foreignKey: 'createdById',\n targetKey: 'id',\n });\n }\n if (updatedBy === true) {\n collection.setField('updatedById', {\n type: 'context',\n dataType: 'integer',\n dataIndex: 'state.currentUser.id',\n visible: true,\n onDelete: 'SET NULL',\n onUpdate: 'CASCADE',\n });\n collection.setField('updatedBy', {\n type: 'belongsTo',\n target: 'users',\n foreignKey: 'updatedById',\n targetKey: 'id',\n });\n }\n });\n\n for (const [key, action] of Object.entries(actions)) {\n this.app.resourcer.registerActionHandler(`users:${key}`, action);\n }\n\n this.app.resourcer.use(middlewares.parseToken({ plugin: this }));\n\n const publicActions = ['check', 'signin', 'signup', 'lostpassword', 'resetpassword', 'getUserByResetToken'];\n const loggedInActions = ['signout', 'updateProfile', 'changePassword', 'setDefaultRole'];\n\n publicActions.forEach((action) => this.app.acl.allow('users', action));\n loggedInActions.forEach((action) => this.app.acl.allow('users', action, 'loggedIn'));\n }\n\n async load() {\n await this.db.import({\n directory: resolve(__dirname, 'collections'),\n });\n }\n\n getRootUserInfo() {\n const {\n adminNickname = 'Super Admin',\n adminEmail = 'admin@nocobase.com',\n adminPassword = 'admin123',\n } = this.options.installing || {};\n\n return {\n adminNickname,\n adminEmail,\n adminPassword,\n };\n }\n\n async install() {\n const { adminNickname, adminPassword, adminEmail } = this.getRootUserInfo();\n\n const User = this.db.getCollection('users');\n const user = await User.repository.create<UserModel>({\n values: {\n nickname: adminNickname,\n email: adminEmail,\n password: adminPassword,\n roles: ['root', 'admin'],\n },\n });\n\n await user.setDefaultRole('root');\n\n const repo = this.db.getRepository<any>('collections');\n if (repo) {\n await repo.db2cm('users');\n }\n }\n\n getName(): string {\n return this.getPackageName(__dirname);\n }\n}\n"]}
@@ -8,3 +8,4 @@ export declare function resetpassword(ctx: Context, next: Next): Promise<void>;
8
8
  export declare function getUserByResetToken(ctx: Context, next: Next): Promise<void>;
9
9
  export declare function updateProfile(ctx: Context, next: Next): Promise<void>;
10
10
  export declare function changePassword(ctx: Context, next: Next): Promise<void>;
11
+ export declare function setDefaultRole(ctx: Context, next: Next): Promise<void>;