@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,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,57 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.UserModel = void 0;
13
+ const database_1 = require("@nocobase/database");
14
+ class UserModel extends database_1.Model {
15
+ setDefaultRole(roleName, options = {}) {
16
+ return __awaiter(this, void 0, void 0, function* () {
17
+ if (roleName == 'anonymous') {
18
+ return false;
19
+ }
20
+ const db = this.constructor.database;
21
+ const repository = db.getRepository('rolesUsers');
22
+ if (!repository) {
23
+ return false;
24
+ }
25
+ const transaction = options.transaction || (yield db.sequelize.transaction());
26
+ try {
27
+ yield repository.update({
28
+ filter: {
29
+ userId: this.get('id'),
30
+ },
31
+ values: {
32
+ default: false,
33
+ },
34
+ transaction,
35
+ });
36
+ yield repository.update({
37
+ filter: {
38
+ userId: this.get('id'),
39
+ roleName,
40
+ },
41
+ values: {
42
+ default: true,
43
+ },
44
+ transaction,
45
+ });
46
+ yield transaction.commit();
47
+ }
48
+ catch (error) {
49
+ yield transaction.rollback();
50
+ throw error;
51
+ }
52
+ return true;
53
+ });
54
+ }
55
+ }
56
+ exports.UserModel = UserModel;
57
+ //# sourceMappingURL=UserModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserModel.js","sourceRoot":"","sources":["../../src/models/UserModel.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iDAAsE;AAEtE,MAAa,SAAU,SAAQ,gBAAK;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;AAzCD,8BAyCC","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"]}
package/lib/server.d.ts CHANGED
@@ -1,3 +1,23 @@
1
- import { PluginOptions } from '@nocobase/server';
2
- declare const _default: PluginOptions;
3
- export default _default;
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/lib/server.js CHANGED
@@ -1,167 +1,155 @@
1
1
  "use strict";
2
-
3
- function _react() {
4
- const data = _interopRequireDefault(require("react"));
5
-
6
- _react = function _react() {
7
- return data;
8
- };
9
-
10
- return data;
11
- }
12
-
13
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
-
15
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
16
-
17
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
18
-
19
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
20
-
21
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
22
-
23
- function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
24
-
25
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
26
-
27
- var __createBinding = void 0 && (void 0).__createBinding || (Object.create ? function (o, m, k, k2) {
28
- if (k2 === undefined) k2 = k;
29
- Object.defineProperty(o, k2, {
30
- enumerable: true,
31
- get: function get() {
32
- return m[k];
33
- }
34
- });
35
- } : function (o, m, k, k2) {
36
- if (k2 === undefined) k2 = k;
37
- o[k2] = m[k];
38
- });
39
-
40
- var __setModuleDefault = void 0 && (void 0).__setModuleDefault || (Object.create ? function (o, v) {
41
- Object.defineProperty(o, "default", {
42
- enumerable: true,
43
- value: v
44
- });
45
- } : function (o, v) {
46
- o["default"] = v;
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
47
13
  });
48
-
49
- var __importStar = void 0 && (void 0).__importStar || function (mod) {
50
- if (mod && mod.__esModule) return mod;
51
- var result = {};
52
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
53
-
54
- __setModuleDefault(result, mod);
55
-
56
- return result;
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
57
20
  };
58
-
59
- var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) {
60
- function adopt(value) {
61
- return value instanceof P ? value : new P(function (resolve) {
62
- resolve(value);
21
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
22
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
23
+ return new (P || (P = Promise))(function (resolve, reject) {
24
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
25
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
26
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
27
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
63
28
  });
64
- }
65
-
66
- return new (P || (P = Promise))(function (resolve, reject) {
67
- function fulfilled(value) {
68
- try {
69
- step(generator.next(value));
70
- } catch (e) {
71
- reject(e);
72
- }
73
- }
74
-
75
- function rejected(value) {
76
- try {
77
- step(generator["throw"](value));
78
- } catch (e) {
79
- reject(e);
80
- }
81
- }
82
-
83
- function step(result) {
84
- result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
85
- }
86
-
87
- step((generator = generator.apply(thisArg, _arguments || [])).next());
88
- });
89
- };
90
-
91
- var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
92
- return mod && mod.__esModule ? mod : {
93
- "default": mod
94
- };
95
29
  };
96
-
97
- Object.defineProperty(exports, "__esModule", {
98
- value: true
99
- });
100
-
101
- const path_1 = __importDefault(require("path"));
102
-
30
+ Object.defineProperty(exports, "__esModule", { value: true });
103
31
  const database_1 = require("@nocobase/database");
104
-
105
- const fields = __importStar(require("./fields"));
106
-
107
- const usersActions = __importStar(require("./actions/users"));
108
-
32
+ const server_1 = require("@nocobase/server");
33
+ const path_1 = require("path");
34
+ const actions = __importStar(require("./actions/users"));
35
+ const jwt_service_1 = require("./jwt-service");
109
36
  const middlewares = __importStar(require("./middlewares"));
110
-
111
- exports.default = {
112
- name: 'users',
113
-
114
- load() {
115
- return __awaiter(this, void 0, void 0, function* () {
116
- const database = this.app.db;
117
- const resourcer = this.app.resourcer;
118
- (0, database_1.registerFields)(fields);
119
- this.app.on('db.init', () => __awaiter(this, void 0, void 0, function* () {
120
- const User = database.getModel('users');
121
- yield User.create({
122
- nickname: 'Super Admin',
123
- email: process.env.ADMIN_EMAIL || 'admin@nocobase.com',
124
- password: process.env.ADMIN_PASSWORD || 'admin123'
37
+ const UserModel_1 = require("./models/UserModel");
38
+ class UsersPlugin extends server_1.Plugin {
39
+ constructor(app, options) {
40
+ super(app, options);
41
+ this.jwtService = new jwt_service_1.JwtService(options === null || options === void 0 ? void 0 : options.jwt);
42
+ }
43
+ beforeLoad() {
44
+ return __awaiter(this, void 0, void 0, function* () {
45
+ this.db.registerOperators({
46
+ $isCurrentUser(_, ctx) {
47
+ var _a, _b, _c, _d;
48
+ return {
49
+ [database_1.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,
50
+ };
51
+ },
52
+ });
53
+ this.db.registerModels({ UserModel: UserModel_1.UserModel });
54
+ this.db.on('users.afterCreateWithAssociations', (model, options) => __awaiter(this, void 0, void 0, function* () {
55
+ const { transaction } = options;
56
+ const repository = this.app.db.getRepository('roles');
57
+ if (!repository) {
58
+ return;
59
+ }
60
+ const defaultRole = yield repository.findOne({
61
+ filter: {
62
+ default: true,
63
+ },
64
+ transaction,
65
+ });
66
+ if (defaultRole && (yield model.countRoles({ transaction })) == 0) {
67
+ yield model.addRoles(defaultRole, { transaction });
68
+ }
69
+ }));
70
+ this.db.on('afterDefineCollection', (collection) => {
71
+ let { createdBy, updatedBy } = collection.options;
72
+ if (createdBy === true) {
73
+ collection.setField('createdById', {
74
+ type: 'context',
75
+ dataType: 'integer',
76
+ dataIndex: 'state.currentUser.id',
77
+ createOnly: true,
78
+ visible: true,
79
+ onDelete: 'SET NULL',
80
+ onUpdate: 'CASCADE',
81
+ });
82
+ collection.setField('createdBy', {
83
+ type: 'belongsTo',
84
+ target: 'users',
85
+ foreignKey: 'createdById',
86
+ targetKey: 'id',
87
+ });
88
+ }
89
+ if (updatedBy === true) {
90
+ collection.setField('updatedById', {
91
+ type: 'context',
92
+ dataType: 'integer',
93
+ dataIndex: 'state.currentUser.id',
94
+ visible: true,
95
+ onDelete: 'SET NULL',
96
+ onUpdate: 'CASCADE',
97
+ });
98
+ collection.setField('updatedBy', {
99
+ type: 'belongsTo',
100
+ target: 'users',
101
+ foreignKey: 'updatedById',
102
+ targetKey: 'id',
103
+ });
104
+ }
105
+ });
106
+ for (const [key, action] of Object.entries(actions)) {
107
+ this.app.resourcer.registerActionHandler(`users:${key}`, action);
108
+ }
109
+ this.app.resourcer.use(middlewares.parseToken({ plugin: this }));
110
+ const publicActions = ['check', 'signin', 'signup', 'lostpassword', 'resetpassword', 'getUserByResetToken'];
111
+ const loggedInActions = ['signout', 'updateProfile', 'changePassword', 'setDefaultRole'];
112
+ publicActions.forEach((action) => this.app.acl.allow('users', action));
113
+ loggedInActions.forEach((action) => this.app.acl.allow('users', action, 'loggedIn'));
125
114
  });
126
- }));
127
- database.on('afterTableInit', table => {
128
- let _table$getOptions = table.getOptions(),
129
- createdBy = _table$getOptions.createdBy,
130
- updatedBy = _table$getOptions.updatedBy;
131
-
132
- if (createdBy !== false) {
133
- table.addField({
134
- type: 'createdBy',
135
- name: typeof createdBy === 'string' ? createdBy : 'createdBy',
136
- target: 'users',
137
- state: 0
138
- });
139
- }
140
-
141
- if (updatedBy !== false) {
142
- table.addField({
143
- type: 'updatedBy',
144
- name: typeof updatedBy === 'string' ? updatedBy : 'updatedBy',
145
- target: 'users',
146
- state: 0
147
- });
148
- }
149
- });
150
- database.import({
151
- directory: path_1.default.resolve(__dirname, 'collections')
152
- });
153
-
154
- for (var _i = 0, _Object$entries = Object.entries(usersActions); _i < _Object$entries.length; _i++) {
155
- const _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
156
- key = _Object$entries$_i[0],
157
- action = _Object$entries$_i[1];
158
-
159
- resourcer.registerActionHandler(`users:${key}`, action);
160
- }
161
-
162
- resourcer.use(middlewares.parseToken({}));
163
- });
164
- }
165
-
166
- };
167
- //# sourceMappingURL=server.js.map
115
+ }
116
+ load() {
117
+ return __awaiter(this, void 0, void 0, function* () {
118
+ yield this.db.import({
119
+ directory: (0, path_1.resolve)(__dirname, 'collections'),
120
+ });
121
+ });
122
+ }
123
+ getRootUserInfo() {
124
+ const { adminNickname = 'Super Admin', adminEmail = 'admin@nocobase.com', adminPassword = 'admin123', } = this.options.installing || {};
125
+ return {
126
+ adminNickname,
127
+ adminEmail,
128
+ adminPassword,
129
+ };
130
+ }
131
+ install() {
132
+ return __awaiter(this, void 0, void 0, function* () {
133
+ const { adminNickname, adminPassword, adminEmail } = this.getRootUserInfo();
134
+ const User = this.db.getCollection('users');
135
+ const user = yield User.repository.create({
136
+ values: {
137
+ nickname: adminNickname,
138
+ email: adminEmail,
139
+ password: adminPassword,
140
+ roles: ['root', 'admin'],
141
+ },
142
+ });
143
+ yield user.setDefaultRole('root');
144
+ const repo = this.db.getRepository('collections');
145
+ if (repo) {
146
+ yield repo.db2cm('users');
147
+ }
148
+ });
149
+ }
150
+ getName() {
151
+ return this.getPackageName(__dirname);
152
+ }
153
+ }
154
+ exports.default = UsersPlugin;
155
+ //# sourceMappingURL=server.js.map
package/lib/server.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["server.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAwB;AACxB,iDAA2D;AAC3D,iDAAmC;AACnC,8DAAgD;AAChD,2DAA6C;AAG7C,kBAAe;IACb,IAAI,EAAE,OAAO;IACP,IAAI;;YACR,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;YAErC,IAAA,yBAAc,EAAC,MAAM,CAAC,CAAC;YAEvB,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,GAAS,EAAE;gBAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACxC,MAAM,IAAI,CAAC,MAAM,CAAC;oBAChB,QAAQ,EAAE,aAAa;oBACvB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,oBAAoB;oBACtD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,UAAU;iBACnD,CAAC,CAAC;YACL,CAAC,CAAA,CAAC,CAAC;YAEH,QAAQ,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC,KAAY,EAAE,EAAE;gBAC7C,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;gBAClD,IAAI,SAAS,KAAK,KAAK,EAAE;oBACvB,KAAK,CAAC,QAAQ,CAAC;wBACb,IAAI,EAAE,WAAW;wBACjB,IAAI,EAAE,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;wBAC7D,MAAM,EAAE,OAAO;wBACf,KAAK,EAAE,CAAC;qBACT,CAAC,CAAC;iBACJ;gBACD,IAAI,SAAS,KAAK,KAAK,EAAE;oBACvB,KAAK,CAAC,QAAQ,CAAC;wBACb,IAAI,EAAE,WAAW;wBACjB,IAAI,EAAE,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;wBAC7D,MAAM,EAAE,OAAO;wBACf,KAAK,EAAE,CAAC;qBACT,CAAC,CAAC;iBACJ;YACH,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,MAAM,CAAC;gBACd,SAAS,EAAE,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,aAAa,CAAC;aAClD,CAAC,CAAC;YAEH,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;gBACxD,SAAS,CAAC,qBAAqB,CAAC,SAAS,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;aACzD;YAED,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;KAAA;CACe,CAAC","file":"server.js","sourcesContent":["import path from 'path';\nimport { registerFields, Table } from '@nocobase/database';\nimport * as fields from './fields';\nimport * as usersActions from './actions/users';\nimport * as middlewares from './middlewares';\nimport { PluginOptions } from '@nocobase/server';\n\nexport default {\n name: 'users',\n async load() {\n const database = this.app.db;\n const resourcer = this.app.resourcer;\n\n registerFields(fields);\n\n this.app.on('db.init', async () => {\n const User = database.getModel('users');\n await User.create({\n nickname: 'Super Admin',\n email: process.env.ADMIN_EMAIL || 'admin@nocobase.com',\n password: process.env.ADMIN_PASSWORD || 'admin123',\n });\n });\n\n database.on('afterTableInit', (table: Table) => {\n let { createdBy, updatedBy } = table.getOptions();\n if (createdBy !== false) {\n table.addField({\n type: 'createdBy',\n name: typeof createdBy === 'string' ? createdBy : 'createdBy',\n target: 'users',\n state: 0,\n });\n }\n if (updatedBy !== false) {\n table.addField({\n type: 'updatedBy',\n name: typeof updatedBy === 'string' ? updatedBy : 'updatedBy',\n target: 'users',\n state: 0,\n });\n }\n });\n\n database.import({\n directory: path.resolve(__dirname, 'collections'),\n });\n\n for (const [key, action] of Object.entries(usersActions)) {\n resourcer.registerActionHandler(`users:${key}`, action);\n }\n\n resourcer.use(middlewares.parseToken({}));\n },\n} as PluginOptions;\n"]}
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"]}
package/package.json CHANGED
@@ -1,14 +1,25 @@
1
1
  {
2
2
  "name": "@nocobase/plugin-users",
3
- "version": "0.5.0-alpha.38",
3
+ "version": "0.7.0-alpha.2",
4
4
  "main": "lib/index.js",
5
- "license": "MIT",
5
+ "license": "Apache-2.0",
6
+ "licenses": [
7
+ {
8
+ "type": "Apache-2.0",
9
+ "url": "http://www.apache.org/licenses/LICENSE-2.0"
10
+ }
11
+ ],
12
+ "scripts": {
13
+ "build": "rimraf -rf lib esm dist && npm run build:cjs && npm run build:esm",
14
+ "build:cjs": "tsc --project tsconfig.build.json",
15
+ "build:esm": "tsc --project tsconfig.build.json --module es2015 --outDir esm"
16
+ },
6
17
  "dependencies": {
7
- "@nocobase/server": "^0.5.0-alpha.38",
8
- "crypto-random-string": "^3.3.0"
18
+ "jsonwebtoken": "^8.5.1"
9
19
  },
10
20
  "devDependencies": {
11
- "@nocobase/test": "^0.5.0-alpha.38"
21
+ "@nocobase/test": "0.7.0-alpha.2",
22
+ "@types/jsonwebtoken": "^8.5.8"
12
23
  },
13
- "gitHead": "ac34f5b49e78963b9d8f03159f02cf15b450c0b5"
24
+ "gitHead": "0e0e99ef79c0b25bb0b45ecaa477c049cb16afee"
14
25
  }
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../../../tsconfig.build.json",
3
+ "compilerOptions": {
4
+ "outDir": "./lib",
5
+ "declaration": true
6
+ },
7
+ "include": ["./src/**/*.ts", "./src/**/*.tsx"],
8
+ "exclude": ["./src/__tests__/*", "./esm/*", "./lib/*"]
9
+ }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["actions/users.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAIlD,wBAAsB,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,iBAQnD;AAED,wBAAsB,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,iBA0BpD;AAED,wBAAsB,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,iBAGrD;AAED,wBAAsB,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,iBAcpD;AAED,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,iBAoB1D;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,iBAoB3D;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,iBAajE;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,iBAQ3D;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,iBAqB5D","file":"users.d.ts","sourcesContent":["import { Context, Next } from '@nocobase/actions';\nimport { PASSWORD } from '@nocobase/database';\nimport cryptoRandomString from 'crypto-random-string';\n\nexport async function check(ctx: Context, next: Next) {\n if (ctx.state.currentUser) {\n const user = ctx.state.currentUser.toJSON();\n ctx.body = user;\n await next();\n } else {\n ctx.throw(401, 'Unauthorized');\n }\n}\n\nexport async function signin(ctx: Context, next: Next) {\n const { uniqueField = 'email', values } = ctx.action.params;\n console.log('signin.values', values);\n if (!values[uniqueField]) {\n ctx.throw(401, '请填写邮箱账号');\n }\n const User = ctx.db.getModel('users');\n const user = await User.scope('withPassword').findOne({\n where: {\n [uniqueField]: values[uniqueField],\n },\n });\n if (!user) {\n ctx.throw(401, '邮箱账号未注册');\n }\n const isValid = await PASSWORD.verify(values.password, user.password);\n if (!isValid) {\n ctx.throw(401, '密码错误,请您重新输入');\n }\n if (!user.token) {\n user.token = cryptoRandomString({ length: 20 });\n await user.save();\n }\n ctx.body = user.toJSON();\n delete ctx.body.password;\n await next();\n}\n\nexport async function signout(ctx: Context, next: Next) {\n ctx.body = {};\n await next();\n}\n\nexport async function signup(ctx: Context, next: Next) {\n const User = ctx.db.getModel('users');\n const { values } = ctx.action.params;\n try {\n const user = await User.create(values);\n ctx.body = user;\n } catch (error) {\n if (error.errors) {\n ctx.throw(401, error.errors.map((data) => data.message).join(', '));\n } else {\n ctx.throw(401, '注册失败');\n }\n }\n await next();\n}\n\nexport async function lostpassword(ctx: Context, next: Next) {\n const {\n values: { email },\n } = ctx.action.params;\n if (!email) {\n ctx.throw(401, '请填写邮箱账号');\n }\n const User = ctx.db.getModel('users');\n const user = await User.findOne({\n where: {\n email,\n },\n });\n if (!user) {\n ctx.throw(401, '邮箱账号未注册');\n }\n user.reset_token = cryptoRandomString({ length: 20 });\n await user.save();\n ctx.body = user;\n await next();\n}\n\nexport async function resetpassword(ctx: Context, next: Next) {\n const {\n values: { email, password, reset_token },\n } = ctx.action.params;\n const User = ctx.db.getModel('users');\n const user = await User.findOne({\n where: {\n email,\n reset_token,\n },\n });\n if (!user) {\n ctx.throw(401, 'Unauthorized');\n }\n user.token = null;\n user.reset_token = null;\n user.password = password;\n await user.save();\n ctx.body = user;\n await next();\n}\n\nexport async function getUserByResetToken(ctx: Context, next: Next) {\n const { token } = ctx.action.params;\n const User = ctx.db.getModel('users');\n const user = await User.findOne({\n where: {\n reset_token: token,\n },\n });\n if (!user) {\n ctx.throw(401, 'Unauthorized');\n }\n ctx.body = user;\n await next();\n}\n\nexport async function updateProfile(ctx: Context, next: Next) {\n const { values } = ctx.action.params;\n if (!ctx.state.currentUser) {\n ctx.throw(401, 'Unauthorized');\n }\n await ctx.state.currentUser.update(values);\n ctx.body = ctx.state.currentUser;\n await next();\n}\n\nexport async function changePassword(ctx: Context, next: Next) {\n const {\n values: { oldPassword, newPassword },\n } = ctx.action.params;\n if (!ctx.state.currentUser) {\n ctx.throw(401, 'Unauthorized');\n }\n const User = ctx.db.getModel('users');\n const user = await User.scope('withPassword').findOne({\n where: {\n email: ctx.state.currentUser.email,\n },\n });\n const isValid = await PASSWORD.verify(oldPassword, user.password);\n if (!isValid) {\n ctx.throw(401, '密码错误,请您重新输入');\n }\n user.password = newPassword;\n user.save();\n ctx.body = ctx.state.currentUser.toJSON();\n await next();\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["collections/users.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;;AAElD,wBAsGkB","file":"users.d.ts","sourcesContent":["import { TableOptions } from '@nocobase/database';\n\nexport default {\n name: 'users',\n title: '{{t(\"Users\")}}',\n sortable: 'sort',\n // developerMode: true,\n // internal: true,\n createdBy: false,\n updatedBy: false,\n privilege: 'undelete',\n scopes: {\n withPassword: {\n attributes: { include: ['password'] },\n },\n },\n defaultScope: {\n attributes: { exclude: ['password'] },\n },\n fields: [\n {\n interface: 'string',\n type: 'string',\n name: 'nickname',\n uiSchema: {\n type: 'string',\n title: '{{t(\"Nickname\")}}',\n 'x-component': 'Input',\n },\n },\n {\n interface: 'email',\n type: 'string',\n name: 'email',\n unique: true,\n privilege: 'undelete',\n uiSchema: {\n type: 'string',\n title: '{{t(\"Email\")}}',\n 'x-component': 'Input',\n require: true,\n },\n },\n {\n interface: 'password',\n type: 'password',\n name: 'password',\n privilege: 'undelete',\n uiSchema: {\n type: 'string',\n title: '{{t(\"Password\")}}',\n 'x-component': 'Password',\n },\n },\n {\n interface: 'linkTo',\n type: 'belongsToMany',\n name: 'roles',\n target: 'roles',\n foreignKey: 'user_id',\n otherKey: 'role_name',\n sourceKey: 'id',\n targetKey: 'name',\n uiSchema: {\n type: 'array',\n title: '{{t(\"Roles\")}}',\n 'x-component': 'Select.Drawer',\n 'x-component-props': {\n multiple: true,\n fieldNames: {\n label: 'title',\n value: 'name',\n },\n },\n 'x-decorator': 'FormItem',\n 'x-designable-bar': 'Select.Drawer.DesignableBar',\n },\n },\n {\n interface: 'select',\n type: 'string',\n name: 'appLang',\n privilege: 'undelete',\n state: 0,\n },\n {\n interface: 'password',\n type: 'string',\n name: 'token',\n unique: true,\n hidden: true,\n privilege: 'undelete',\n state: 0,\n },\n {\n interface: 'password',\n type: 'string',\n name: 'reset_token',\n unique: true,\n hidden: true,\n privilege: 'undelete',\n state: 0,\n },\n ],\n} as TableOptions;\n"]}
@@ -1,11 +0,0 @@
1
- import { BelongsToOptions, BELONGSTO, FieldContext } from '@nocobase/database';
2
- export interface CreatedByOptions extends Omit<BelongsToOptions, 'type'> {
3
- type: 'createdBy' | 'createdby';
4
- }
5
- export default class CreatedBy extends BELONGSTO {
6
- static beforeBulkCreateHook(this: CreatedBy, models: any, { context }: {
7
- context: any;
8
- }): void;
9
- constructor({ type, ...options }: CreatedByOptions, context: FieldContext);
10
- getDataType(): Function;
11
- }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["fields/CreatedBy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG/E,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC;IACtE,IAAI,EAAE,WAAW,GAAG,WAAW,CAAC;CACjC;AAED,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,SAAS;IAC9C,MAAM,CAAC,oBAAoB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,KAAA,EAAE,EAAE,OAAO,EAAE;;KAAA;gBAMpD,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,EAAE,gBAAgB,EAAE,OAAO,EAAE,YAAY;IAelE,WAAW,IAAI,QAAQ;CAG/B","file":"CreatedBy.d.ts","sourcesContent":["import { BelongsToOptions, BELONGSTO, FieldContext } from '@nocobase/database';\nimport { setUserValue } from './utils';\n\nexport interface CreatedByOptions extends Omit<BelongsToOptions, 'type'> {\n type: 'createdBy' | 'createdby';\n}\n\nexport default class CreatedBy extends BELONGSTO {\n static beforeBulkCreateHook(this: CreatedBy, models, { context }) {\n models.forEach((model) => {\n setUserValue.call(this, model, { context });\n });\n }\n\n constructor({ type, ...options }: CreatedByOptions, context: FieldContext) {\n super({ ...options, type: 'belongsTo' } as BelongsToOptions, context);\n // const Model = context.sourceTable.getModel();\n // TODO(feature): 可考虑策略模式,以在需要时对外提供接口\n // Model.addHook('beforeCreate', setUserValue.bind(this));\n // Model.addHook('beforeBulkCreate', CreatedBy.beforeBulkCreateHook.bind(this));\n const { sourceTable, database } = context;\n const name = sourceTable.getName();\n database.on(`${name}.beforeCreate`, setUserValue.bind(this));\n database.on(\n `${name}.beforeBulkCreate`,\n CreatedBy.beforeBulkCreateHook.bind(this),\n );\n }\n\n public getDataType(): Function {\n return BELONGSTO;\n }\n}\n"]}
@@ -1,66 +0,0 @@
1
- "use strict";
2
-
3
- function _react() {
4
- const data = _interopRequireDefault(require("react"));
5
-
6
- _react = function _react() {
7
- return data;
8
- };
9
-
10
- return data;
11
- }
12
-
13
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
-
15
- var __rest = void 0 && (void 0).__rest || function (s, e) {
16
- var t = {};
17
-
18
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];
19
-
20
- if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
21
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];
22
- }
23
- return t;
24
- };
25
-
26
- Object.defineProperty(exports, "__esModule", {
27
- value: true
28
- });
29
-
30
- const database_1 = require("@nocobase/database");
31
-
32
- const utils_1 = require("./utils");
33
-
34
- class CreatedBy extends database_1.BELONGSTO {
35
- static beforeBulkCreateHook(models, {
36
- context
37
- }) {
38
- models.forEach(model => {
39
- utils_1.setUserValue.call(this, model, {
40
- context
41
- });
42
- });
43
- }
44
-
45
- constructor(_a, context) {
46
- var type = _a.type,
47
- options = __rest(_a, ["type"]);
48
-
49
- super(Object.assign(Object.assign({}, options), {
50
- type: 'belongsTo'
51
- }), context);
52
- const sourceTable = context.sourceTable,
53
- database = context.database;
54
- const name = sourceTable.getName();
55
- database.on(`${name}.beforeCreate`, utils_1.setUserValue.bind(this));
56
- database.on(`${name}.beforeBulkCreate`, CreatedBy.beforeBulkCreateHook.bind(this));
57
- }
58
-
59
- getDataType() {
60
- return database_1.BELONGSTO;
61
- }
62
-
63
- }
64
-
65
- exports.default = CreatedBy;
66
- //# sourceMappingURL=CreatedBy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["fields/CreatedBy.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,iDAA+E;AAC/E,mCAAuC;AAMvC,MAAqB,SAAU,SAAQ,oBAAS;IAC9C,MAAM,CAAC,oBAAoB,CAAkB,MAAM,EAAE,EAAE,OAAO,EAAE;QAC9D,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACvB,oBAAY,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,YAAY,EAAsC,EAAE,OAAqB;YAA7D,EAAE,IAAI,OAAgC,EAA3B,OAAO,cAAlB,QAAoB,CAAF;QAC5B,KAAK,CAAC,gCAAK,OAAO,KAAE,IAAI,EAAE,WAAW,GAAsB,EAAE,OAAO,CAAC,CAAC;QAKtE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;QAC1C,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC;QACnC,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAI,eAAe,EAAE,oBAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,QAAQ,CAAC,EAAE,CACT,GAAG,IAAI,mBAAmB,EAC1B,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAC1C,CAAC;IACJ,CAAC;IAEM,WAAW;QAChB,OAAO,oBAAS,CAAC;IACnB,CAAC;CACF;AAzBD,4BAyBC","file":"CreatedBy.js","sourcesContent":["import { BelongsToOptions, BELONGSTO, FieldContext } from '@nocobase/database';\nimport { setUserValue } from './utils';\n\nexport interface CreatedByOptions extends Omit<BelongsToOptions, 'type'> {\n type: 'createdBy' | 'createdby';\n}\n\nexport default class CreatedBy extends BELONGSTO {\n static beforeBulkCreateHook(this: CreatedBy, models, { context }) {\n models.forEach((model) => {\n setUserValue.call(this, model, { context });\n });\n }\n\n constructor({ type, ...options }: CreatedByOptions, context: FieldContext) {\n super({ ...options, type: 'belongsTo' } as BelongsToOptions, context);\n // const Model = context.sourceTable.getModel();\n // TODO(feature): 可考虑策略模式,以在需要时对外提供接口\n // Model.addHook('beforeCreate', setUserValue.bind(this));\n // Model.addHook('beforeBulkCreate', CreatedBy.beforeBulkCreateHook.bind(this));\n const { sourceTable, database } = context;\n const name = sourceTable.getName();\n database.on(`${name}.beforeCreate`, setUserValue.bind(this));\n database.on(\n `${name}.beforeBulkCreate`,\n CreatedBy.beforeBulkCreateHook.bind(this),\n );\n }\n\n public getDataType(): Function {\n return BELONGSTO;\n }\n}\n"]}
@@ -1,16 +0,0 @@
1
- import { BelongsToOptions, BELONGSTO, FieldContext } from '@nocobase/database';
2
- export interface UpdatedByOptions extends Omit<BelongsToOptions, 'type'> {
3
- type: 'updatedBy' | 'updatedby';
4
- }
5
- export default class UpdatedBy extends BELONGSTO {
6
- static beforeBulkCreateHook(this: UpdatedBy, models: any, { context }: {
7
- context: any;
8
- }): void;
9
- static beforeBulkUpdateHook(this: UpdatedBy, { attributes, fields, context }: {
10
- attributes: any;
11
- fields: any;
12
- context: any;
13
- }): void;
14
- constructor({ type, ...options }: UpdatedByOptions, context: FieldContext);
15
- getDataType(): Function;
16
- }