@nocobase/plugin-users 0.11.1-alpha.4 → 0.12.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/index.js +11 -0
- package/{lib → dist}/index.d.ts +1 -0
- package/dist/index.js +18 -0
- package/dist/locale/en-US.js +12 -0
- package/dist/locale/es-ES.js +12 -0
- package/dist/locale/fr-FR.js +12 -0
- package/dist/locale/ja-JP.js +8 -0
- package/dist/locale/pt-BR.js +12 -0
- package/dist/locale/zh-CN.js +12 -0
- package/dist/server/actions/users.js +152 -0
- package/dist/server/authenticators/index.js +23 -0
- package/dist/server/authenticators/password.js +31 -0
- package/dist/server/collections/users.js +91 -0
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.js +18 -0
- package/dist/server/jwt-service.js +34 -0
- package/dist/server/locale/en-US.js +12 -0
- package/dist/server/locale/es-ES.js +12 -0
- package/dist/server/locale/fr-FR.js +12 -0
- package/dist/server/locale/index.js +26 -0
- package/dist/server/locale/ja-JP.js +8 -0
- package/dist/server/locale/pt-BR.js +12 -0
- package/dist/server/locale/zh-CN.js +12 -0
- package/dist/server/middlewares/check.js +13 -0
- package/dist/server/middlewares/index.js +15 -0
- package/{src/server/middlewares/parseToken.ts → dist/server/middlewares/parseToken.js} +11 -12
- package/dist/server/migrations/20220818072639-add-users-phone.js +43 -0
- package/dist/server/server.js +249 -0
- package/package.json +17 -28
- package/lib/client/index.js +0 -22
- package/lib/index.js +0 -13
- package/lib/locale/en-US.js +0 -15
- package/lib/locale/es-ES.js +0 -15
- package/lib/locale/fr-FR.js +0 -15
- package/lib/locale/ja-JP.js +0 -11
- package/lib/locale/pt-BR.js +0 -15
- package/lib/locale/zh-CN.js +0 -15
- package/lib/server/actions/users.js +0 -253
- package/lib/server/authenticators/index.js +0 -44
- package/lib/server/authenticators/password.js +0 -49
- package/lib/server/collections/users.js +0 -90
- package/lib/server/index.d.ts +0 -2
- package/lib/server/index.js +0 -16
- package/lib/server/jwt-service.js +0 -42
- package/lib/server/locale/en-US.js +0 -15
- package/lib/server/locale/es-ES.js +0 -15
- package/lib/server/locale/fr-FR.js +0 -15
- package/lib/server/locale/index.js +0 -27
- package/lib/server/locale/ja-JP.js +0 -11
- package/lib/server/locale/pt-BR.js +0 -15
- package/lib/server/locale/zh-CN.js +0 -15
- package/lib/server/middlewares/check.js +0 -24
- package/lib/server/middlewares/index.js +0 -19
- package/lib/server/middlewares/parseToken.js +0 -75
- package/lib/server/migrations/20220818072639-add-users-phone.js +0 -57
- package/lib/server/server.js +0 -312
- package/src/client/index.ts +0 -7
- package/src/index.ts +0 -1
- package/src/locale/en-US.ts +0 -10
- package/src/locale/es-ES.ts +0 -8
- package/src/locale/fr-FR.ts +0 -11
- package/src/locale/ja-JP.ts +0 -4
- package/src/locale/pt-BR.ts +0 -10
- package/src/locale/zh-CN.ts +0 -8
- package/src/server/__tests__/actions.test.ts +0 -79
- package/src/server/__tests__/fields.test.ts +0 -90
- package/src/server/__tests__/utils.ts +0 -8
- package/src/server/actions/users.ts +0 -148
- package/src/server/authenticators/index.ts +0 -26
- package/src/server/authenticators/password.ts +0 -34
- package/src/server/collections/users.ts +0 -89
- package/src/server/index.ts +0 -3
- package/src/server/jwt-service.ts +0 -34
- package/src/server/locale/en-US.ts +0 -10
- package/src/server/locale/es-ES.ts +0 -8
- package/src/server/locale/fr-FR.ts +0 -11
- package/src/server/locale/index.ts +0 -3
- package/src/server/locale/ja-JP.ts +0 -4
- package/src/server/locale/pt-BR.ts +0 -10
- package/src/server/locale/zh-CN.ts +0 -8
- package/src/server/middlewares/check.ts +0 -11
- package/src/server/middlewares/index.ts +0 -2
- package/src/server/migrations/20220818072639-add-users-phone.ts +0 -39
- package/src/server/server.ts +0 -253
- /package/{lib → dist}/client/index.d.ts +0 -0
- /package/{lib → dist}/locale/en-US.d.ts +0 -0
- /package/{lib → dist}/locale/es-ES.d.ts +0 -0
- /package/{lib → dist}/locale/fr-FR.d.ts +0 -0
- /package/{lib → dist}/locale/ja-JP.d.ts +0 -0
- /package/{lib → dist}/locale/pt-BR.d.ts +0 -0
- /package/{lib → dist}/locale/zh-CN.d.ts +0 -0
- /package/{lib → dist}/server/actions/users.d.ts +0 -0
- /package/{lib → dist}/server/authenticators/index.d.ts +0 -0
- /package/{lib → dist}/server/authenticators/password.d.ts +0 -0
- /package/{lib → dist}/server/collections/users.d.ts +0 -0
- /package/{lib → dist}/server/jwt-service.d.ts +0 -0
- /package/{lib → dist}/server/locale/en-US.d.ts +0 -0
- /package/{lib → dist}/server/locale/es-ES.d.ts +0 -0
- /package/{lib → dist}/server/locale/fr-FR.d.ts +0 -0
- /package/{lib → dist}/server/locale/index.d.ts +0 -0
- /package/{lib → dist}/server/locale/ja-JP.d.ts +0 -0
- /package/{lib → dist}/server/locale/pt-BR.d.ts +0 -0
- /package/{lib → dist}/server/locale/zh-CN.d.ts +0 -0
- /package/{lib → dist}/server/middlewares/check.d.ts +0 -0
- /package/{lib → dist}/server/middlewares/index.d.ts +0 -0
- /package/{lib → dist}/server/middlewares/parseToken.d.ts +0 -0
- /package/{lib → dist}/server/migrations/20220818072639-add-users-phone.d.ts +0 -0
- /package/{lib → dist}/server/server.d.ts +0 -0
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.parseToken = parseToken;
|
|
7
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
8
|
-
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."); }
|
|
9
|
-
function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
|
|
10
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
11
|
-
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
12
|
-
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); }
|
|
13
|
-
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; }
|
|
14
|
-
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
15
|
-
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
16
|
-
function parseToken(_x, _x2) {
|
|
17
|
-
return _parseToken.apply(this, arguments);
|
|
18
|
-
}
|
|
19
|
-
function _parseToken() {
|
|
20
|
-
_parseToken = _asyncToGenerator(function* (ctx, next) {
|
|
21
|
-
const user = yield findUserByToken(ctx);
|
|
22
|
-
if (user) {
|
|
23
|
-
ctx.state.currentUser = user;
|
|
24
|
-
}
|
|
25
|
-
return next();
|
|
26
|
-
});
|
|
27
|
-
return _parseToken.apply(this, arguments);
|
|
28
|
-
}
|
|
29
|
-
function findUserByToken(_x3) {
|
|
30
|
-
return _findUserByToken.apply(this, arguments);
|
|
31
|
-
}
|
|
32
|
-
function _findUserByToken() {
|
|
33
|
-
_findUserByToken = _asyncToGenerator(function* (ctx) {
|
|
34
|
-
const token = ctx.getBearerToken();
|
|
35
|
-
if (!token) {
|
|
36
|
-
return null;
|
|
37
|
-
}
|
|
38
|
-
const _ctx$app$getPlugin = ctx.app.getPlugin('users'),
|
|
39
|
-
jwtService = _ctx$app$getPlugin.jwtService;
|
|
40
|
-
try {
|
|
41
|
-
const _yield$jwtService$dec = yield jwtService.decode(token),
|
|
42
|
-
userId = _yield$jwtService$dec.userId;
|
|
43
|
-
const collection = ctx.db.getCollection('users');
|
|
44
|
-
ctx.state.currentUserAppends = ctx.state.currentUserAppends || [];
|
|
45
|
-
var _iterator = _createForOfIteratorHelper(collection.fields),
|
|
46
|
-
_step;
|
|
47
|
-
try {
|
|
48
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
49
|
-
const _step$value = _slicedToArray(_step.value, 2),
|
|
50
|
-
field = _step$value[1];
|
|
51
|
-
if (field.type === 'belongsTo') {
|
|
52
|
-
ctx.state.currentUserAppends.push(field.name);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
} catch (err) {
|
|
56
|
-
_iterator.e(err);
|
|
57
|
-
} finally {
|
|
58
|
-
_iterator.f();
|
|
59
|
-
}
|
|
60
|
-
const user = yield ctx.db.getRepository('users').findOne({
|
|
61
|
-
appends: ctx.state.currentUserAppends,
|
|
62
|
-
filter: {
|
|
63
|
-
id: userId
|
|
64
|
-
}
|
|
65
|
-
});
|
|
66
|
-
ctx.logger.info(`Current user id: ${userId}`);
|
|
67
|
-
return user;
|
|
68
|
-
} catch (error) {
|
|
69
|
-
console.log(error);
|
|
70
|
-
ctx.logger.error(error);
|
|
71
|
-
return null;
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
return _findUserByToken.apply(this, arguments);
|
|
75
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
function _server() {
|
|
8
|
-
const data = require("@nocobase/server");
|
|
9
|
-
_server = function _server() {
|
|
10
|
-
return data;
|
|
11
|
-
};
|
|
12
|
-
return data;
|
|
13
|
-
}
|
|
14
|
-
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
15
|
-
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
16
|
-
class AddUsersPhoneMigration extends _server().Migration {
|
|
17
|
-
up() {
|
|
18
|
-
var _this = this;
|
|
19
|
-
return _asyncToGenerator(function* () {
|
|
20
|
-
const match = yield _this.app.version.satisfies('<=0.7.4-alpha.7');
|
|
21
|
-
if (!match) {
|
|
22
|
-
return;
|
|
23
|
-
}
|
|
24
|
-
const Field = _this.context.db.getRepository('fields');
|
|
25
|
-
const existed = yield Field.count({
|
|
26
|
-
filter: {
|
|
27
|
-
name: 'phone',
|
|
28
|
-
collectionName: 'users'
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
if (!existed) {
|
|
32
|
-
yield Field.create({
|
|
33
|
-
values: {
|
|
34
|
-
name: 'phone',
|
|
35
|
-
collectionName: 'users',
|
|
36
|
-
type: 'string',
|
|
37
|
-
unique: true,
|
|
38
|
-
interface: 'phone',
|
|
39
|
-
uiSchema: {
|
|
40
|
-
type: 'string',
|
|
41
|
-
title: '{{t("Phone")}}',
|
|
42
|
-
'x-component': 'Input',
|
|
43
|
-
'x-validator': 'phone',
|
|
44
|
-
require: true
|
|
45
|
-
}
|
|
46
|
-
},
|
|
47
|
-
// NOTE: to trigger hook
|
|
48
|
-
context: {}
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
})();
|
|
52
|
-
}
|
|
53
|
-
down() {
|
|
54
|
-
return _asyncToGenerator(function* () {})();
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
exports.default = AddUsersPhoneMigration;
|
package/lib/server/server.js
DELETED
|
@@ -1,312 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.default = void 0;
|
|
7
|
-
function _database() {
|
|
8
|
-
const data = require("@nocobase/database");
|
|
9
|
-
_database = function _database() {
|
|
10
|
-
return data;
|
|
11
|
-
};
|
|
12
|
-
return data;
|
|
13
|
-
}
|
|
14
|
-
function _server() {
|
|
15
|
-
const data = require("@nocobase/server");
|
|
16
|
-
_server = function _server() {
|
|
17
|
-
return data;
|
|
18
|
-
};
|
|
19
|
-
return data;
|
|
20
|
-
}
|
|
21
|
-
function _utils() {
|
|
22
|
-
const data = require("@nocobase/utils");
|
|
23
|
-
_utils = function _utils() {
|
|
24
|
-
return data;
|
|
25
|
-
};
|
|
26
|
-
return data;
|
|
27
|
-
}
|
|
28
|
-
function _path() {
|
|
29
|
-
const data = require("path");
|
|
30
|
-
_path = function _path() {
|
|
31
|
-
return data;
|
|
32
|
-
};
|
|
33
|
-
return data;
|
|
34
|
-
}
|
|
35
|
-
var _2 = require("./");
|
|
36
|
-
var actions = _interopRequireWildcard(require("./actions/users"));
|
|
37
|
-
var _authenticators = _interopRequireDefault(require("./authenticators"));
|
|
38
|
-
var _jwtService = require("./jwt-service");
|
|
39
|
-
var _locale = require("./locale");
|
|
40
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
41
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
42
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
43
|
-
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
44
|
-
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."); }
|
|
45
|
-
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); }
|
|
46
|
-
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; }
|
|
47
|
-
function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
|
|
48
|
-
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
49
|
-
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
50
|
-
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
51
|
-
class UsersPlugin extends _server().Plugin {
|
|
52
|
-
constructor(app, options) {
|
|
53
|
-
super(app, options);
|
|
54
|
-
this.jwtService = void 0;
|
|
55
|
-
this.authenticators = new (_utils().Registry)();
|
|
56
|
-
this.jwtService = new _jwtService.JwtService((options === null || options === void 0 ? void 0 : options.jwt) || {});
|
|
57
|
-
}
|
|
58
|
-
beforeLoad() {
|
|
59
|
-
var _this = this;
|
|
60
|
-
return _asyncToGenerator(function* () {
|
|
61
|
-
_this.app.i18n.addResources('zh-CN', _2.namespace, _locale.zhCN);
|
|
62
|
-
_this.app.i18n.addResources('en-US', _2.namespace, _locale.enUS);
|
|
63
|
-
const cmd = _this.app.findCommand('install');
|
|
64
|
-
if (cmd) {
|
|
65
|
-
cmd.requiredOption('-e, --root-email <rootEmail>', '', process.env.INIT_ROOT_EMAIL);
|
|
66
|
-
cmd.requiredOption('-p, --root-password <rootPassword>', '', process.env.INIT_ROOT_PASSWORD);
|
|
67
|
-
cmd.option('-n, --root-nickname <rootNickname>');
|
|
68
|
-
}
|
|
69
|
-
_this.db.registerOperators({
|
|
70
|
-
$isCurrentUser(_, ctx) {
|
|
71
|
-
var _ctx$app, _ctx$app$ctx, _ctx$app$ctx$state, _ctx$app$ctx$state$cu;
|
|
72
|
-
return {
|
|
73
|
-
[_database().Op.eq]: (ctx === null || ctx === void 0 ? void 0 : (_ctx$app = ctx.app) === null || _ctx$app === void 0 ? void 0 : (_ctx$app$ctx = _ctx$app.ctx) === null || _ctx$app$ctx === void 0 ? void 0 : (_ctx$app$ctx$state = _ctx$app$ctx.state) === null || _ctx$app$ctx$state === void 0 ? void 0 : (_ctx$app$ctx$state$cu = _ctx$app$ctx$state.currentUser) === null || _ctx$app$ctx$state$cu === void 0 ? void 0 : _ctx$app$ctx$state$cu.id) || -1
|
|
74
|
-
};
|
|
75
|
-
},
|
|
76
|
-
$isNotCurrentUser(_, ctx) {
|
|
77
|
-
var _ctx$app2, _ctx$app2$ctx, _ctx$app2$ctx$state, _ctx$app2$ctx$state$c;
|
|
78
|
-
return {
|
|
79
|
-
[_database().Op.ne]: (ctx === null || ctx === void 0 ? void 0 : (_ctx$app2 = ctx.app) === null || _ctx$app2 === void 0 ? void 0 : (_ctx$app2$ctx = _ctx$app2.ctx) === null || _ctx$app2$ctx === void 0 ? void 0 : (_ctx$app2$ctx$state = _ctx$app2$ctx.state) === null || _ctx$app2$ctx$state === void 0 ? void 0 : (_ctx$app2$ctx$state$c = _ctx$app2$ctx$state.currentUser) === null || _ctx$app2$ctx$state$c === void 0 ? void 0 : _ctx$app2$ctx$state$c.id) || -1
|
|
80
|
-
};
|
|
81
|
-
},
|
|
82
|
-
$isVar(val, ctx) {
|
|
83
|
-
var _ctx$app3, _ctx$app3$ctx;
|
|
84
|
-
const obj = (0, _utils().parse)({
|
|
85
|
-
val: `{{${val}}}`
|
|
86
|
-
})(JSON.parse(JSON.stringify(ctx === null || ctx === void 0 ? void 0 : (_ctx$app3 = ctx.app) === null || _ctx$app3 === void 0 ? void 0 : (_ctx$app3$ctx = _ctx$app3.ctx) === null || _ctx$app3$ctx === void 0 ? void 0 : _ctx$app3$ctx.state)));
|
|
87
|
-
return {
|
|
88
|
-
[_database().Op.eq]: obj.val
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
_this.db.on('afterDefineCollection', collection => {
|
|
93
|
-
const _collection$options = collection.options,
|
|
94
|
-
createdBy = _collection$options.createdBy,
|
|
95
|
-
updatedBy = _collection$options.updatedBy;
|
|
96
|
-
if (createdBy === true) {
|
|
97
|
-
collection.setField('createdById', {
|
|
98
|
-
type: 'context',
|
|
99
|
-
dataType: 'bigInt',
|
|
100
|
-
dataIndex: 'state.currentUser.id',
|
|
101
|
-
createOnly: true,
|
|
102
|
-
visible: true,
|
|
103
|
-
index: true
|
|
104
|
-
});
|
|
105
|
-
collection.setField('createdBy', {
|
|
106
|
-
type: 'belongsTo',
|
|
107
|
-
target: 'users',
|
|
108
|
-
foreignKey: 'createdById',
|
|
109
|
-
targetKey: 'id'
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
if (updatedBy === true) {
|
|
113
|
-
collection.setField('updatedById', {
|
|
114
|
-
type: 'context',
|
|
115
|
-
dataType: 'bigInt',
|
|
116
|
-
dataIndex: 'state.currentUser.id',
|
|
117
|
-
visible: true,
|
|
118
|
-
index: true
|
|
119
|
-
});
|
|
120
|
-
collection.setField('updatedBy', {
|
|
121
|
-
type: 'belongsTo',
|
|
122
|
-
target: 'users',
|
|
123
|
-
foreignKey: 'updatedById',
|
|
124
|
-
targetKey: 'id'
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
for (var _i = 0, _Object$entries = Object.entries(actions); _i < _Object$entries.length; _i++) {
|
|
129
|
-
const _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
|
|
130
|
-
key = _Object$entries$_i[0],
|
|
131
|
-
action = _Object$entries$_i[1];
|
|
132
|
-
_this.app.resourcer.registerActionHandler(`users:${key}`, action);
|
|
133
|
-
}
|
|
134
|
-
// this.app.resourcer.use(parseToken, { tag: 'parseToken' });
|
|
135
|
-
_this.app.acl.addFixedParams('users', 'destroy', () => {
|
|
136
|
-
return {
|
|
137
|
-
filter: {
|
|
138
|
-
'id.$ne': 1
|
|
139
|
-
}
|
|
140
|
-
};
|
|
141
|
-
});
|
|
142
|
-
_this.app.acl.addFixedParams('collections', 'destroy', () => {
|
|
143
|
-
return {
|
|
144
|
-
filter: {
|
|
145
|
-
'name.$ne': 'users'
|
|
146
|
-
}
|
|
147
|
-
};
|
|
148
|
-
});
|
|
149
|
-
const publicActions = ['check', 'signin', 'signup', 'lostpassword', 'resetpassword', 'getUserByResetToken'];
|
|
150
|
-
const loggedInActions = ['signout', 'updateProfile', 'changePassword'];
|
|
151
|
-
publicActions.forEach(action => _this.app.acl.allow('users', action));
|
|
152
|
-
loggedInActions.forEach(action => _this.app.acl.allow('users', action, 'loggedIn'));
|
|
153
|
-
_this.app.on('beforeStart', () => _this.initVerification());
|
|
154
|
-
})();
|
|
155
|
-
}
|
|
156
|
-
load() {
|
|
157
|
-
var _this2 = this;
|
|
158
|
-
return _asyncToGenerator(function* () {
|
|
159
|
-
yield _this2.db.import({
|
|
160
|
-
directory: (0, _path().resolve)(__dirname, 'collections')
|
|
161
|
-
});
|
|
162
|
-
_this2.db.addMigrations({
|
|
163
|
-
namespace: 'users',
|
|
164
|
-
directory: (0, _path().resolve)(__dirname, 'migrations'),
|
|
165
|
-
context: {
|
|
166
|
-
plugin: _this2
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
(0, _authenticators.default)(_this2);
|
|
170
|
-
})();
|
|
171
|
-
}
|
|
172
|
-
getInstallingData(options = {}) {
|
|
173
|
-
var _options$cliArgs;
|
|
174
|
-
const _process$env = process.env,
|
|
175
|
-
INIT_ROOT_NICKNAME = _process$env.INIT_ROOT_NICKNAME,
|
|
176
|
-
INIT_ROOT_PASSWORD = _process$env.INIT_ROOT_PASSWORD,
|
|
177
|
-
INIT_ROOT_EMAIL = _process$env.INIT_ROOT_EMAIL;
|
|
178
|
-
const _ref = options.users || (options === null || options === void 0 ? void 0 : (_options$cliArgs = options.cliArgs) === null || _options$cliArgs === void 0 ? void 0 : _options$cliArgs[0]) || {},
|
|
179
|
-
_ref$rootEmail = _ref.rootEmail,
|
|
180
|
-
rootEmail = _ref$rootEmail === void 0 ? INIT_ROOT_EMAIL : _ref$rootEmail,
|
|
181
|
-
_ref$rootPassword = _ref.rootPassword,
|
|
182
|
-
rootPassword = _ref$rootPassword === void 0 ? INIT_ROOT_PASSWORD : _ref$rootPassword,
|
|
183
|
-
_ref$rootNickname = _ref.rootNickname,
|
|
184
|
-
rootNickname = _ref$rootNickname === void 0 ? INIT_ROOT_NICKNAME || 'Super Admin' : _ref$rootNickname;
|
|
185
|
-
return {
|
|
186
|
-
rootEmail,
|
|
187
|
-
rootPassword,
|
|
188
|
-
rootNickname
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
install(options) {
|
|
192
|
-
var _this3 = this;
|
|
193
|
-
return _asyncToGenerator(function* () {
|
|
194
|
-
const _this3$getInstallingD = _this3.getInstallingData(options),
|
|
195
|
-
rootNickname = _this3$getInstallingD.rootNickname,
|
|
196
|
-
rootPassword = _this3$getInstallingD.rootPassword,
|
|
197
|
-
rootEmail = _this3$getInstallingD.rootEmail;
|
|
198
|
-
const User = _this3.db.getCollection('users');
|
|
199
|
-
if (yield User.repository.findOne({
|
|
200
|
-
filter: {
|
|
201
|
-
email: rootEmail
|
|
202
|
-
}
|
|
203
|
-
})) {
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
const user = yield User.repository.create({
|
|
207
|
-
values: {
|
|
208
|
-
email: rootEmail,
|
|
209
|
-
password: rootPassword,
|
|
210
|
-
nickname: rootNickname
|
|
211
|
-
}
|
|
212
|
-
});
|
|
213
|
-
const repo = _this3.db.getRepository('collections');
|
|
214
|
-
if (repo) {
|
|
215
|
-
yield repo.db2cm('users');
|
|
216
|
-
}
|
|
217
|
-
})();
|
|
218
|
-
}
|
|
219
|
-
// TODO(module): should move to preset or dynamic configuration panel
|
|
220
|
-
initVerification() {
|
|
221
|
-
var _this4 = this;
|
|
222
|
-
return _asyncToGenerator(function* () {
|
|
223
|
-
const verificationPlugin = _this4.app.getPlugin('verification');
|
|
224
|
-
if (!verificationPlugin) {
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
const systemSettingsRepo = _this4.db.getRepository('systemSettings');
|
|
228
|
-
const settings = yield systemSettingsRepo.findOne();
|
|
229
|
-
if (!settings.smsAuthEnabled) {
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
|
-
verificationPlugin.interceptors.register('users:signin', {
|
|
233
|
-
manual: true,
|
|
234
|
-
getReceiver(ctx) {
|
|
235
|
-
return ctx.action.params.values.phone;
|
|
236
|
-
},
|
|
237
|
-
expiresIn: 120,
|
|
238
|
-
validate: function () {
|
|
239
|
-
var _validate = _asyncToGenerator(function* (ctx, phone) {
|
|
240
|
-
if (!phone) {
|
|
241
|
-
throw new Error(ctx.t('Not a valid cellphone number, please re-enter'));
|
|
242
|
-
}
|
|
243
|
-
const User = _this4.db.getCollection('users');
|
|
244
|
-
const exists = yield User.model.count({
|
|
245
|
-
where: {
|
|
246
|
-
phone
|
|
247
|
-
}
|
|
248
|
-
});
|
|
249
|
-
if (!exists) {
|
|
250
|
-
throw new Error(ctx.t('The phone number is not registered, please register first', {
|
|
251
|
-
ns: _2.namespace
|
|
252
|
-
}));
|
|
253
|
-
}
|
|
254
|
-
return true;
|
|
255
|
-
});
|
|
256
|
-
function validate(_x2, _x3) {
|
|
257
|
-
return _validate.apply(this, arguments);
|
|
258
|
-
}
|
|
259
|
-
return validate;
|
|
260
|
-
}()
|
|
261
|
-
});
|
|
262
|
-
verificationPlugin.interceptors.register('users:signup', {
|
|
263
|
-
getReceiver(ctx) {
|
|
264
|
-
return ctx.action.params.values.phone;
|
|
265
|
-
},
|
|
266
|
-
expiresIn: 120,
|
|
267
|
-
validate: function () {
|
|
268
|
-
var _validate2 = _asyncToGenerator(function* (ctx, phone) {
|
|
269
|
-
if (!phone) {
|
|
270
|
-
throw new Error(ctx.t('Not a valid cellphone number, please re-enter', {
|
|
271
|
-
ns: _2.namespace
|
|
272
|
-
}));
|
|
273
|
-
}
|
|
274
|
-
const User = _this4.db.getCollection('users');
|
|
275
|
-
const exists = yield User.model.count({
|
|
276
|
-
where: {
|
|
277
|
-
phone
|
|
278
|
-
}
|
|
279
|
-
});
|
|
280
|
-
if (exists) {
|
|
281
|
-
throw new Error(ctx.t('The phone number has been registered, please login directly', {
|
|
282
|
-
ns: _2.namespace
|
|
283
|
-
}));
|
|
284
|
-
}
|
|
285
|
-
return true;
|
|
286
|
-
});
|
|
287
|
-
function validate(_x4, _x5) {
|
|
288
|
-
return _validate2.apply(this, arguments);
|
|
289
|
-
}
|
|
290
|
-
return validate;
|
|
291
|
-
}()
|
|
292
|
-
});
|
|
293
|
-
_this4.authenticators.register('sms', (ctx, next) => verificationPlugin.intercept(ctx, /*#__PURE__*/_asyncToGenerator(function* () {
|
|
294
|
-
const values = ctx.action.params.values;
|
|
295
|
-
const User = ctx.db.getCollection('users');
|
|
296
|
-
const user = yield User.model.findOne({
|
|
297
|
-
where: {
|
|
298
|
-
phone: values.phone
|
|
299
|
-
}
|
|
300
|
-
});
|
|
301
|
-
if (!user) {
|
|
302
|
-
return ctx.throw(404, ctx.t('The phone number is incorrect, please re-enter', {
|
|
303
|
-
ns: _2.namespace
|
|
304
|
-
}));
|
|
305
|
-
}
|
|
306
|
-
ctx.state.currentUser = user;
|
|
307
|
-
return next();
|
|
308
|
-
})));
|
|
309
|
-
})();
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
exports.default = UsersPlugin;
|
package/src/client/index.ts
DELETED
package/src/index.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export { default } from './server';
|
package/src/locale/en-US.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
'The email is incorrect, please re-enter': 'The email is incorrect, please re-enter',
|
|
3
|
-
'Please fill in your email address': 'Please fill in your email address',
|
|
4
|
-
'The password is incorrect, please re-enter': 'The password is incorrect, please re-enter',
|
|
5
|
-
'Not a valid cellphone number, please re-enter': 'Not a valid cellphone number, please re-enter',
|
|
6
|
-
'The phone number has been registered, please login directly':
|
|
7
|
-
'The phone number has been registered, please login directly',
|
|
8
|
-
'The phone number is not registered, please register first':
|
|
9
|
-
'The phone number is not registered, please register first',
|
|
10
|
-
};
|
package/src/locale/es-ES.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
"The email is incorrect, please re-enter": "El correo electrónico es incorrecto, por favor vuelva a introducirlo",
|
|
3
|
-
"Please fill in your email address": "Por favor, introduzca su dirección de correo electrónico",
|
|
4
|
-
"The password is incorrect, please re-enter": "La contraseña es incorrecta, por favor, vuelva a introducirla",
|
|
5
|
-
"Not a valid cellphone number, please re-enter": "No es un número de móvil válido, por favor, vuelva a introducirlo",
|
|
6
|
-
"The phone number has been registered, please login directly": "El número de teléfono ha sido registrado, por favor, inicie sesión directamente",
|
|
7
|
-
"The phone number is not registered, please register first": "El número de teléfono no está registrado, por favor regístrese primero"
|
|
8
|
-
};
|
package/src/locale/fr-FR.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
'The email is incorrect, please re-enter': "L'adresse e-mail est incorrecte, veuillez la saisir à nouveau",
|
|
3
|
-
'Please fill in your email address': 'Veuillez remplir votre adresse e-mail',
|
|
4
|
-
'The password is incorrect, please re-enter': 'Le mot de passe est incorrect, veuillez le saisir à nouveau',
|
|
5
|
-
'Not a valid cellphone number, please re-enter':
|
|
6
|
-
'Numéro de téléphone portable invalide, veuillez le saisir à nouveau',
|
|
7
|
-
'The phone number has been registered, please login directly':
|
|
8
|
-
'Le numéro de téléphone a été enregistré, veuillez vous connecter directement',
|
|
9
|
-
'The phone number is not registered, please register first':
|
|
10
|
-
"Le numéro de téléphone n'est pas enregistré, veuillez vous inscrire d'abord",
|
|
11
|
-
};
|
package/src/locale/ja-JP.ts
DELETED
package/src/locale/pt-BR.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
'The email is incorrect, please re-enter': 'O e-mail está incorreto, por favor, digite novamente',
|
|
3
|
-
'Please fill in your email address': 'Por favor, preencha o seu endereço de e-mail',
|
|
4
|
-
'The password is incorrect, please re-enter': 'A senha está incorreta, por favor, digite novamente',
|
|
5
|
-
'Not a valid cellphone number, please re-enter': 'Número de celular inválido, por favor, digite novamente',
|
|
6
|
-
'The phone number has been registered, please login directly':
|
|
7
|
-
'O número de celular já está registrado, por favor, faça login diretamente',
|
|
8
|
-
'The phone number is not registered, please register first':
|
|
9
|
-
'O número de celular não está registrado, por favor, registre-se primeiro',
|
|
10
|
-
};
|
package/src/locale/zh-CN.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
'The email is incorrect, please re-enter': '邮箱有误,请重新输入',
|
|
3
|
-
'Please fill in your email address': '请填写邮箱',
|
|
4
|
-
'The password is incorrect, please re-enter': '密码有误,请重新输入',
|
|
5
|
-
'Not a valid cellphone number, please re-enter': '不是有效的手机号,请重新输入',
|
|
6
|
-
'The phone number has been registered, please login directly': '手机号已注册,请直接登录',
|
|
7
|
-
'The phone number is not registered, please register first': '手机号未注册,请先注册',
|
|
8
|
-
};
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import Database from '@nocobase/database';
|
|
2
|
-
import AuthPlugin from '@nocobase/plugin-auth';
|
|
3
|
-
import { mockServer, MockServer } from '@nocobase/test';
|
|
4
|
-
import PluginUsers from '..';
|
|
5
|
-
import { userPluginConfig } from './utils';
|
|
6
|
-
|
|
7
|
-
describe('actions', () => {
|
|
8
|
-
let app: MockServer;
|
|
9
|
-
let db: Database;
|
|
10
|
-
let adminUser;
|
|
11
|
-
let agent;
|
|
12
|
-
let adminAgent;
|
|
13
|
-
let pluginUser;
|
|
14
|
-
|
|
15
|
-
beforeEach(async () => {
|
|
16
|
-
app = mockServer();
|
|
17
|
-
await app.cleanDb();
|
|
18
|
-
process.env.INIT_ROOT_EMAIL = 'test@nocobase.com';
|
|
19
|
-
process.env.INIT_ROOT_PASSWORD = '123456';
|
|
20
|
-
process.env.INIT_ROOT_NICKNAME = 'Test';
|
|
21
|
-
app.plugin(PluginUsers, userPluginConfig);
|
|
22
|
-
app.plugin(AuthPlugin);
|
|
23
|
-
await app.loadAndInstall();
|
|
24
|
-
db = app.db;
|
|
25
|
-
|
|
26
|
-
pluginUser = app.getPlugin('users');
|
|
27
|
-
adminUser = await db.getRepository('users').findOne({
|
|
28
|
-
filter: {
|
|
29
|
-
email: process.env.INIT_ROOT_EMAIL,
|
|
30
|
-
},
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
agent = app.agent();
|
|
34
|
-
adminAgent = app.agent().login(adminUser);
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
afterEach(async () => {
|
|
38
|
-
await db.close();
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
// it('should login user with password', async () => {
|
|
42
|
-
// const { INIT_ROOT_EMAIL, INIT_ROOT_PASSWORD } = process.env;
|
|
43
|
-
|
|
44
|
-
// let response = await agent.resource('users').check();
|
|
45
|
-
// expect(response.body.data.id).toBeUndefined();
|
|
46
|
-
|
|
47
|
-
// response = await agent.post('/users:signin').send({
|
|
48
|
-
// email: INIT_ROOT_EMAIL,
|
|
49
|
-
// password: INIT_ROOT_PASSWORD,
|
|
50
|
-
// });
|
|
51
|
-
|
|
52
|
-
// expect(response.statusCode).toEqual(200);
|
|
53
|
-
|
|
54
|
-
// const data = response.body.data;
|
|
55
|
-
// const token = data.token;
|
|
56
|
-
// expect(token).toBeDefined();
|
|
57
|
-
|
|
58
|
-
// response = await agent.get('/users:check').set({ Authorization: 'Bearer ' + token });
|
|
59
|
-
// expect(response.body.data.id).toBeDefined();
|
|
60
|
-
// });
|
|
61
|
-
|
|
62
|
-
it('update profile', async () => {
|
|
63
|
-
const res1 = await agent.resource('users').updateProfile({
|
|
64
|
-
filterByTk: adminUser.id,
|
|
65
|
-
values: {
|
|
66
|
-
nickname: 'a',
|
|
67
|
-
},
|
|
68
|
-
});
|
|
69
|
-
expect(res1.status).toBe(401);
|
|
70
|
-
|
|
71
|
-
const res2 = await adminAgent.resource('users').updateProfile({
|
|
72
|
-
filterByTk: adminUser.id,
|
|
73
|
-
values: {
|
|
74
|
-
nickname: 'a',
|
|
75
|
-
},
|
|
76
|
-
});
|
|
77
|
-
expect(res2.status).toBe(200);
|
|
78
|
-
});
|
|
79
|
-
});
|