@nocobase/plugin-users 0.7.0-alpha.7 → 0.7.0-alpha.72

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 (61) hide show
  1. package/lib/actions/users.js +279 -163
  2. package/lib/collections/roles-users.js +12 -5
  3. package/lib/collections/users.js +87 -86
  4. package/lib/index.d.ts +1 -0
  5. package/lib/index.js +19 -8
  6. package/lib/jwt-service.js +50 -29
  7. package/lib/locale/en-US.d.ts +5 -0
  8. package/lib/locale/en-US.js +11 -0
  9. package/lib/locale/index.d.ts +2 -0
  10. package/lib/locale/index.js +23 -0
  11. package/lib/locale/zh-CN.d.ts +6 -0
  12. package/lib/locale/zh-CN.js +12 -0
  13. package/lib/middlewares/check.js +28 -23
  14. package/lib/middlewares/index.js +20 -7
  15. package/lib/middlewares/parseToken.js +86 -62
  16. package/lib/models/UserModel.d.ts +2 -2
  17. package/lib/models/UserModel.js +68 -53
  18. package/lib/server.d.ts +5 -10
  19. package/lib/server.js +261 -149
  20. package/package.json +3 -8
  21. package/esm/actions/users.d.ts +0 -11
  22. package/esm/actions/users.js +0 -165
  23. package/esm/actions/users.js.map +0 -1
  24. package/esm/collections/roles-users.d.ts +0 -3
  25. package/esm/collections/roles-users.js +0 -5
  26. package/esm/collections/roles-users.js.map +0 -1
  27. package/esm/collections/users.d.ts +0 -3
  28. package/esm/collections/users.js +0 -86
  29. package/esm/collections/users.js.map +0 -1
  30. package/esm/index.d.ts +0 -1
  31. package/esm/index.js +0 -2
  32. package/esm/index.js.map +0 -1
  33. package/esm/jwt-service.d.ts +0 -12
  34. package/esm/jwt-service.js +0 -26
  35. package/esm/jwt-service.js.map +0 -1
  36. package/esm/middlewares/check.d.ts +0 -1
  37. package/esm/middlewares/check.js +0 -22
  38. package/esm/middlewares/check.js.map +0 -1
  39. package/esm/middlewares/index.d.ts +0 -2
  40. package/esm/middlewares/index.js +0 -3
  41. package/esm/middlewares/index.js.map +0 -1
  42. package/esm/middlewares/parseToken.d.ts +0 -6
  43. package/esm/middlewares/parseToken.js +0 -64
  44. package/esm/middlewares/parseToken.js.map +0 -1
  45. package/esm/models/UserModel.d.ts +0 -4
  46. package/esm/models/UserModel.js +0 -53
  47. package/esm/models/UserModel.js.map +0 -1
  48. package/esm/server.d.ts +0 -23
  49. package/esm/server.js +0 -133
  50. package/esm/server.js.map +0 -1
  51. package/lib/actions/users.js.map +0 -1
  52. package/lib/collections/roles-users.js.map +0 -1
  53. package/lib/collections/users.js.map +0 -1
  54. package/lib/index.js.map +0 -1
  55. package/lib/jwt-service.js.map +0 -1
  56. package/lib/middlewares/check.js.map +0 -1
  57. package/lib/middlewares/index.js.map +0 -1
  58. package/lib/middlewares/parseToken.js.map +0 -1
  59. package/lib/models/UserModel.js.map +0 -1
  60. package/lib/server.js.map +0 -1
  61. package/tsconfig.build.json +0 -9
@@ -1,5 +0,0 @@
1
- export default {
2
- name: 'rolesUsers',
3
- fields: [{ type: 'boolean', name: 'default' }],
4
- };
5
- //# sourceMappingURL=roles-users.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"roles-users.js","sourceRoot":"","sources":["../../src/collections/roles-users.ts"],"names":[],"mappings":"AAEA,eAAe;IACb,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;CAC1B,CAAC","sourcesContent":["import { CollectionOptions } from '@nocobase/database';\n\nexport default {\n name: 'rolesUsers',\n fields: [{ type: 'boolean', name: 'default' }],\n} as CollectionOptions;\n"]}
@@ -1,3 +0,0 @@
1
- import { CollectionOptions } from '@nocobase/database';
2
- declare const _default: CollectionOptions;
3
- export default _default;
@@ -1,86 +0,0 @@
1
- export default {
2
- name: 'users',
3
- title: '{{t("Users")}}',
4
- sortable: 'sort',
5
- model: 'UserModel',
6
- createdBy: true,
7
- updatedBy: true,
8
- fields: [
9
- {
10
- name: 'id',
11
- type: 'integer',
12
- autoIncrement: true,
13
- primaryKey: true,
14
- allowNull: false,
15
- uiSchema: { type: 'number', title: '{{t("ID")}}', 'x-component': 'InputNumber', 'x-read-pretty': true },
16
- interface: 'id',
17
- },
18
- {
19
- interface: 'input',
20
- type: 'string',
21
- name: 'nickname',
22
- uiSchema: {
23
- type: 'string',
24
- title: '{{t("Nickname")}}',
25
- 'x-component': 'Input',
26
- },
27
- },
28
- {
29
- interface: 'email',
30
- type: 'string',
31
- name: 'email',
32
- unique: true,
33
- uiSchema: {
34
- type: 'string',
35
- title: '{{t("Email")}}',
36
- 'x-component': 'Input',
37
- require: true,
38
- },
39
- },
40
- {
41
- interface: 'password',
42
- type: 'password',
43
- name: 'password',
44
- hidden: true,
45
- uiSchema: {
46
- type: 'string',
47
- title: '{{t("Password")}}',
48
- 'x-component': 'Password',
49
- },
50
- },
51
- {
52
- interface: 'linkTo',
53
- type: 'belongsToMany',
54
- name: 'roles',
55
- target: 'roles',
56
- foreignKey: 'userId',
57
- otherKey: 'roleName',
58
- sourceKey: 'id',
59
- targetKey: 'name',
60
- through: 'rolesUsers',
61
- uiSchema: {
62
- type: 'array',
63
- title: '{{t("Roles")}}',
64
- 'x-component': 'RecordPicker',
65
- 'x-component-props': {
66
- multiple: true,
67
- fieldNames: {
68
- label: 'title',
69
- value: 'name',
70
- },
71
- },
72
- },
73
- },
74
- {
75
- type: 'string',
76
- name: 'appLang',
77
- },
78
- {
79
- type: 'string',
80
- name: 'resetToken',
81
- unique: true,
82
- hidden: true,
83
- },
84
- ],
85
- };
86
- //# sourceMappingURL=users.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/collections/users.ts"],"names":[],"mappings":"AAEA,eAAe;IACb,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,gBAAgB;IACvB,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,WAAW;IAClB,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,MAAM,EAAE;QACN;YACE,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,SAAS;YACf,aAAa,EAAE,IAAI;YACnB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,IAAI,EAAE;YACvG,SAAS,EAAE,IAAI;SAChB;QACD;YACE,SAAS,EAAE,OAAO;YAClB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,mBAAmB;gBAC1B,aAAa,EAAE,OAAO;aACvB;SACF;QACD;YACE,SAAS,EAAE,OAAO;YAClB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,gBAAgB;gBACvB,aAAa,EAAE,OAAO;gBACtB,OAAO,EAAE,IAAI;aACd;SACF;QACD;YACE,SAAS,EAAE,UAAU;YACrB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,mBAAmB;gBAC1B,aAAa,EAAE,UAAU;aAC1B;SACF;QACD;YACE,SAAS,EAAE,QAAQ;YACnB,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,OAAO;YACf,UAAU,EAAE,QAAQ;YACpB,QAAQ,EAAE,UAAU;YACpB,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,MAAM;YACjB,OAAO,EAAE,YAAY;YACrB,QAAQ,EAAE;gBACR,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,gBAAgB;gBACvB,aAAa,EAAE,cAAc;gBAC7B,mBAAmB,EAAE;oBACnB,QAAQ,EAAE,IAAI;oBACd,UAAU,EAAE;wBACV,KAAK,EAAE,OAAO;wBACd,KAAK,EAAE,MAAM;qBACd;iBACF;aACF;SACF;QACD;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,SAAS;SAChB;QACD;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;SACb;KACF;CACmB,CAAC","sourcesContent":["import { CollectionOptions } from '@nocobase/database';\n\nexport default {\n name: 'users',\n title: '{{t(\"Users\")}}',\n sortable: 'sort',\n model: 'UserModel',\n createdBy: true,\n updatedBy: true,\n fields: [\n {\n name: 'id',\n type: 'integer',\n autoIncrement: true,\n primaryKey: true,\n allowNull: false,\n uiSchema: { type: 'number', title: '{{t(\"ID\")}}', 'x-component': 'InputNumber', 'x-read-pretty': true },\n interface: 'id',\n },\n {\n interface: 'input',\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 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 hidden: true,\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: 'userId',\n otherKey: 'roleName',\n sourceKey: 'id',\n targetKey: 'name',\n through: 'rolesUsers',\n uiSchema: {\n type: 'array',\n title: '{{t(\"Roles\")}}',\n 'x-component': 'RecordPicker',\n 'x-component-props': {\n multiple: true,\n fieldNames: {\n label: 'title',\n value: 'name',\n },\n },\n },\n },\n {\n type: 'string',\n name: 'appLang',\n },\n {\n type: 'string',\n name: 'resetToken',\n unique: true,\n hidden: true,\n },\n ],\n} as CollectionOptions;\n"]}
package/esm/index.d.ts DELETED
@@ -1 +0,0 @@
1
- export { default } from './server';
package/esm/index.js DELETED
@@ -1,2 +0,0 @@
1
- export { default } from './server';
2
- //# sourceMappingURL=index.js.map
package/esm/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC","sourcesContent":["export { default } from './server';\n"]}
@@ -1,12 +0,0 @@
1
- export interface JwtOptions {
2
- secret: string;
3
- expiresIn?: string;
4
- }
5
- export declare class JwtService {
6
- protected options: JwtOptions;
7
- constructor(options: JwtOptions);
8
- private expiresIn;
9
- private secret;
10
- sign(payload: any): string;
11
- decode(token: string): Promise<any>;
12
- }
@@ -1,26 +0,0 @@
1
- import jwt from 'jsonwebtoken';
2
- export class JwtService {
3
- constructor(options) {
4
- this.options = options;
5
- }
6
- expiresIn() {
7
- return this.options.expiresIn || '7d';
8
- }
9
- secret() {
10
- return this.options.secret;
11
- }
12
- sign(payload) {
13
- return jwt.sign(payload, this.secret(), { expiresIn: this.expiresIn() });
14
- }
15
- decode(token) {
16
- return new Promise((resolve, reject) => {
17
- jwt.verify(token, this.secret(), (err, decoded) => {
18
- if (err) {
19
- return reject(err);
20
- }
21
- resolve(decoded);
22
- });
23
- });
24
- }
25
- }
26
- //# sourceMappingURL=jwt-service.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jwt-service.js","sourceRoot":"","sources":["../src/jwt-service.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,cAAc,CAAC;AAO/B,MAAM,OAAO,UAAU;IACrB,YAAsB,OAAmB;QAAnB,YAAO,GAAP,OAAO,CAAY;IAAG,CAAC;IAErC,SAAS;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IACxC,CAAC;IAEO,MAAM;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC,OAAY;QACf,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,GAAQ,EAAE,OAAY,EAAE,EAAE;gBAC1D,IAAI,GAAG,EAAE;oBACP,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;iBACpB;gBAED,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import jwt from 'jsonwebtoken';\n\nexport interface JwtOptions {\n secret: string;\n expiresIn?: string;\n}\n\nexport class JwtService {\n constructor(protected options: JwtOptions) {}\n\n private expiresIn() {\n return this.options.expiresIn || '7d';\n }\n\n private secret() {\n return this.options.secret;\n }\n\n sign(payload: any) {\n return jwt.sign(payload, this.secret(), { expiresIn: this.expiresIn() });\n }\n\n decode(token: string): Promise<any> {\n return new Promise((resolve, reject) => {\n jwt.verify(token, this.secret(), (err: any, decoded: any) => {\n if (err) {\n return reject(err);\n }\n\n resolve(decoded);\n });\n });\n }\n}\n"]}
@@ -1 +0,0 @@
1
- export declare function check(options: any): (ctx: any, next: any) => Promise<any>;
@@ -1,22 +0,0 @@
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
- // TODO(usage): 拦截用户的处理暂时作为一个中间件导出,应用需要的时候可以直接使用这个中间件
11
- export function check(options) {
12
- return function check(ctx, next) {
13
- return __awaiter(this, void 0, void 0, function* () {
14
- const { currentUser } = ctx.state;
15
- if (!currentUser) {
16
- return ctx.throw(401, 'Unauthorized');
17
- }
18
- return next();
19
- });
20
- };
21
- }
22
- //# sourceMappingURL=check.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/middlewares/check.ts"],"names":[],"mappings":";;;;;;;;;AAAA,qDAAqD;AACrD,MAAM,UAAU,KAAK,CAAC,OAAO;IAC3B,OAAO,SAAe,KAAK,CAAC,GAAG,EAAE,IAAI;;YACnC,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;YAClC,IAAI,CAAC,WAAW,EAAE;gBAChB,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;aACvC;YACD,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;KAAA,CAAC;AACJ,CAAC","sourcesContent":["// TODO(usage): 拦截用户的处理暂时作为一个中间件导出,应用需要的时候可以直接使用这个中间件\nexport function check(options) {\n return async function check(ctx, next) {\n const { currentUser } = ctx.state;\n if (!currentUser) {\n return ctx.throw(401, 'Unauthorized');\n }\n return next();\n };\n}\n"]}
@@ -1,2 +0,0 @@
1
- export { check } from './check';
2
- export { parseToken } from './parseToken';
@@ -1,3 +0,0 @@
1
- export { check } from './check';
2
- export { parseToken } from './parseToken';
3
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middlewares/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC","sourcesContent":["export { check } from './check';\nexport { parseToken } from './parseToken';\n"]}
@@ -1,6 +0,0 @@
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;
@@ -1,64 +0,0 @@
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
@@ -1 +0,0 @@
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"]}
@@ -1,4 +0,0 @@
1
- import { Model, TransactionAble } from '@nocobase/database';
2
- export declare class UserModel extends Model {
3
- setDefaultRole(roleName: string, options?: TransactionAble): Promise<boolean>;
4
- }
@@ -1,53 +0,0 @@
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
@@ -1 +0,0 @@
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"]}
package/esm/server.d.ts DELETED
@@ -1,23 +0,0 @@
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 DELETED
@@ -1,133 +0,0 @@
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
package/esm/server.js.map DELETED
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/actions/users.ts"],"names":[],"mappings":"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","sourcesContent":["import { Context, Next } from '@nocobase/actions';\nimport { PasswordField } from '@nocobase/database';\nimport crypto from 'crypto';\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 } else {\n ctx.body = {};\n }\n await next();\n}\n\nexport async function signin(ctx: Context, next: Next) {\n const { uniqueField = 'email', values } = ctx.action.params;\n\n if (!values[uniqueField]) {\n ctx.throw(401, '请填写邮箱账号');\n }\n const User = ctx.db.getCollection('users');\n const user = await User.model.findOne<any>({\n where: {\n [uniqueField]: values[uniqueField],\n },\n });\n if (!user) {\n ctx.throw(401, '邮箱账号未注册');\n }\n const pwd = User.getField<PasswordField>('password');\n const isValid = await pwd.verify(values.password, user.password);\n if (!isValid) {\n ctx.throw(401, '密码错误,请您重新输入');\n }\n\n const pluginUser = ctx.app.getPlugin('@nocobase/plugin-users');\n\n ctx.body = {\n ...user.toJSON(),\n token: pluginUser.jwtService.sign({\n userId: user.get('id'),\n }),\n };\n await next();\n}\n\nexport async function signout(ctx: Context, next: Next) {\n ctx.body = ctx.state.currentUser;\n await next();\n}\n\nexport async function signup(ctx: Context, next: Next) {\n const User = ctx.db.getRepository('users');\n const { values } = ctx.action.params;\n const user = await User.create({ values });\n ctx.body = user;\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.getCollection('users');\n const user = await User.model.findOne<any>({\n where: {\n email,\n },\n });\n if (!user) {\n ctx.throw(401, '邮箱账号未注册');\n }\n user.resetToken = crypto.randomBytes(20).toString('hex');\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, resetToken },\n } = ctx.action.params;\n const User = ctx.db.getCollection('users');\n const user = await User.model.findOne<any>({\n where: {\n email,\n resetToken,\n },\n });\n if (!user) {\n ctx.throw(401, 'Unauthorized');\n }\n user.token = null;\n user.resetToken = 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.getCollection('users');\n const user = await User.model.findOne({\n where: {\n resetToken: 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.getCollection('users');\n const user = await User.model.findOne<any>({\n where: {\n email: ctx.state.currentUser.email,\n },\n });\n const pwd = User.getField<PasswordField>('password');\n const isValid = await pwd.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\nexport async function setDefaultRole(ctx: Context, next: Next) {\n const {\n values: { roleName },\n } = ctx.action.params;\n\n await ctx.state.currentUser.setDefaultRole(roleName);\n\n ctx.body = 'ok';\n\n await next();\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"roles-users.js","sourceRoot":"","sources":["../../src/collections/roles-users.ts"],"names":[],"mappings":";;AAEA,kBAAe;IACb,IAAI,EAAE,YAAY;IAClB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;CAC1B,CAAC","sourcesContent":["import { CollectionOptions } from '@nocobase/database';\n\nexport default {\n name: 'rolesUsers',\n fields: [{ type: 'boolean', name: 'default' }],\n} as CollectionOptions;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/collections/users.ts"],"names":[],"mappings":";;AAEA,kBAAe;IACb,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,gBAAgB;IACvB,QAAQ,EAAE,MAAM;IAChB,KAAK,EAAE,WAAW;IAClB,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,MAAM,EAAE;QACN;YACE,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,SAAS;YACf,aAAa,EAAE,IAAI;YACnB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,IAAI,EAAE;YACvG,SAAS,EAAE,IAAI;SAChB;QACD;YACE,SAAS,EAAE,OAAO;YAClB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,mBAAmB;gBAC1B,aAAa,EAAE,OAAO;aACvB;SACF;QACD;YACE,SAAS,EAAE,OAAO;YAClB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,gBAAgB;gBACvB,aAAa,EAAE,OAAO;gBACtB,OAAO,EAAE,IAAI;aACd;SACF;QACD;YACE,SAAS,EAAE,UAAU;YACrB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,mBAAmB;gBAC1B,aAAa,EAAE,UAAU;aAC1B;SACF;QACD;YACE,SAAS,EAAE,QAAQ;YACnB,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,OAAO;YACf,UAAU,EAAE,QAAQ;YACpB,QAAQ,EAAE,UAAU;YACpB,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,MAAM;YACjB,OAAO,EAAE,YAAY;YACrB,QAAQ,EAAE;gBACR,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,gBAAgB;gBACvB,aAAa,EAAE,cAAc;gBAC7B,mBAAmB,EAAE;oBACnB,QAAQ,EAAE,IAAI;oBACd,UAAU,EAAE;wBACV,KAAK,EAAE,OAAO;wBACd,KAAK,EAAE,MAAM;qBACd;iBACF;aACF;SACF;QACD;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,SAAS;SAChB;QACD;YACE,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,YAAY;YAClB,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,IAAI;SACb;KACF;CACmB,CAAC","sourcesContent":["import { CollectionOptions } from '@nocobase/database';\n\nexport default {\n name: 'users',\n title: '{{t(\"Users\")}}',\n sortable: 'sort',\n model: 'UserModel',\n createdBy: true,\n updatedBy: true,\n fields: [\n {\n name: 'id',\n type: 'integer',\n autoIncrement: true,\n primaryKey: true,\n allowNull: false,\n uiSchema: { type: 'number', title: '{{t(\"ID\")}}', 'x-component': 'InputNumber', 'x-read-pretty': true },\n interface: 'id',\n },\n {\n interface: 'input',\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 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 hidden: true,\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: 'userId',\n otherKey: 'roleName',\n sourceKey: 'id',\n targetKey: 'name',\n through: 'rolesUsers',\n uiSchema: {\n type: 'array',\n title: '{{t(\"Roles\")}}',\n 'x-component': 'RecordPicker',\n 'x-component-props': {\n multiple: true,\n fieldNames: {\n label: 'title',\n value: 'name',\n },\n },\n },\n },\n {\n type: 'string',\n name: 'appLang',\n },\n {\n type: 'string',\n name: 'resetToken',\n unique: true,\n hidden: true,\n },\n ],\n} as CollectionOptions;\n"]}
package/lib/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,mCAAmC;AAA1B,kHAAA,OAAO,OAAA","sourcesContent":["export { default } from './server';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"jwt-service.js","sourceRoot":"","sources":["../src/jwt-service.ts"],"names":[],"mappings":";;;;;;AAAA,gEAA+B;AAO/B,MAAa,UAAU;IACrB,YAAsB,OAAmB;QAAnB,YAAO,GAAP,OAAO,CAAY;IAAG,CAAC;IAErC,SAAS;QACf,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IACxC,CAAC;IAEO,MAAM;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC,OAAY;QACf,OAAO,sBAAG,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,CAAC,KAAa;QAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,sBAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,GAAQ,EAAE,OAAY,EAAE,EAAE;gBAC1D,IAAI,GAAG,EAAE;oBACP,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;iBACpB;gBAED,OAAO,CAAC,OAAO,CAAC,CAAC;YACnB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AA1BD,gCA0BC","sourcesContent":["import jwt from 'jsonwebtoken';\n\nexport interface JwtOptions {\n secret: string;\n expiresIn?: string;\n}\n\nexport class JwtService {\n constructor(protected options: JwtOptions) {}\n\n private expiresIn() {\n return this.options.expiresIn || '7d';\n }\n\n private secret() {\n return this.options.secret;\n }\n\n sign(payload: any) {\n return jwt.sign(payload, this.secret(), { expiresIn: this.expiresIn() });\n }\n\n decode(token: string): Promise<any> {\n return new Promise((resolve, reject) => {\n jwt.verify(token, this.secret(), (err: any, decoded: any) => {\n if (err) {\n return reject(err);\n }\n\n resolve(decoded);\n });\n });\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"check.js","sourceRoot":"","sources":["../../src/middlewares/check.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAqD;AACrD,SAAgB,KAAK,CAAC,OAAO;IAC3B,OAAO,SAAe,KAAK,CAAC,GAAG,EAAE,IAAI;;YACnC,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;YAClC,IAAI,CAAC,WAAW,EAAE;gBAChB,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;aACvC;YACD,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;KAAA,CAAC;AACJ,CAAC;AARD,sBAQC","sourcesContent":["// TODO(usage): 拦截用户的处理暂时作为一个中间件导出,应用需要的时候可以直接使用这个中间件\nexport function check(options) {\n return async function check(ctx, next) {\n const { currentUser } = ctx.state;\n if (!currentUser) {\n return ctx.throw(401, 'Unauthorized');\n }\n return next();\n };\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/middlewares/index.ts"],"names":[],"mappings":";;;AAAA,iCAAgC;AAAvB,8FAAA,KAAK,OAAA;AACd,2CAA0C;AAAjC,wGAAA,UAAU,OAAA","sourcesContent":["export { check } from './check';\nexport { parseToken } from './parseToken';\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"parseToken.js","sourceRoot":"","sources":["../../src/middlewares/parseToken.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,SAAgB,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;AATD,gCASC;AAED,SAAgB,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;AAvBD,wCAuBC;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"]}
@@ -1 +0,0 @@
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"]}