@spinajs/rbac 2.0.38 → 2.0.44

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 (131) hide show
  1. package/lib/auth.d.ts +10 -3
  2. package/lib/auth.js +64 -8
  3. package/lib/auth.js.map +1 -1
  4. package/lib/cli/ActivateUser.d.ts +8 -0
  5. package/lib/cli/ActivateUser.js +48 -0
  6. package/lib/cli/ActivateUser.js.map +1 -0
  7. package/lib/cli/BanUser.d.ts +8 -0
  8. package/lib/cli/BanUser.js +64 -0
  9. package/lib/cli/BanUser.js.map +1 -0
  10. package/lib/cli/ChangePassword.d.ts +0 -0
  11. package/lib/cli/ChangePassword.js +1 -0
  12. package/lib/cli/ChangePassword.js.map +1 -0
  13. package/lib/cli/ChangeUserPassword.d.ts +11 -0
  14. package/lib/cli/ChangeUserPassword.js +59 -0
  15. package/lib/cli/ChangeUserPassword.js.map +1 -0
  16. package/lib/cli/ClearUserTimelineSchedule.d.ts +8 -0
  17. package/lib/cli/ClearUserTimelineSchedule.js +55 -0
  18. package/lib/cli/ClearUserTimelineSchedule.js.map +1 -0
  19. package/lib/cli/CreateUser.d.ts +17 -0
  20. package/lib/cli/CreateUser.js +72 -0
  21. package/lib/cli/CreateUser.js.map +1 -0
  22. package/lib/cli/DeleteUser.d.ts +8 -0
  23. package/lib/cli/DeleteUser.js +41 -0
  24. package/lib/cli/DeleteUser.js.map +1 -0
  25. package/lib/cli/Find.d.ts +12 -0
  26. package/lib/cli/Find.js +45 -0
  27. package/lib/cli/Find.js.map +1 -0
  28. package/lib/cli/FindUser.d.ts +12 -0
  29. package/lib/cli/FindUser.js +45 -0
  30. package/lib/cli/FindUser.js.map +1 -0
  31. package/lib/cli/GrantUserRole.d.ts +8 -0
  32. package/lib/cli/GrantUserRole.js +48 -0
  33. package/lib/cli/GrantUserRole.js.map +1 -0
  34. package/lib/cli/LatestUserEvents.d.ts +6 -0
  35. package/lib/cli/LatestUserEvents.js +38 -0
  36. package/lib/cli/LatestUserEvents.js.map +1 -0
  37. package/lib/cli/RevokeUserRole.d.ts +8 -0
  38. package/lib/cli/RevokeUserRole.js +47 -0
  39. package/lib/cli/RevokeUserRole.js.map +1 -0
  40. package/lib/cli/UnbanUserSchedule.d.ts +8 -0
  41. package/lib/cli/UnbanUserSchedule.js +55 -0
  42. package/lib/cli/UnbanUserSchedule.js.map +1 -0
  43. package/lib/config/rbac.js +67 -2
  44. package/lib/config/rbac.js.map +1 -1
  45. package/lib/events/NewUser.d.ts +12 -0
  46. package/lib/events/NewUser.js +17 -0
  47. package/lib/events/NewUser.js.map +1 -0
  48. package/lib/events/UserActivated.d.ts +5 -0
  49. package/lib/events/UserActivated.js +25 -0
  50. package/lib/events/UserActivated.js.map +1 -0
  51. package/lib/events/UserBanned.d.ts +6 -0
  52. package/lib/events/UserBanned.js +26 -0
  53. package/lib/events/UserBanned.js.map +1 -0
  54. package/lib/events/UserDeactivated.d.ts +5 -0
  55. package/lib/events/UserDeactivated.js +25 -0
  56. package/lib/events/UserDeactivated.js.map +1 -0
  57. package/lib/events/UserDeleted.d.ts +5 -0
  58. package/lib/events/UserDeleted.js +25 -0
  59. package/lib/events/UserDeleted.js.map +1 -0
  60. package/lib/events/UserMetadataAdded.d.ts +5 -0
  61. package/lib/events/UserMetadataAdded.js +25 -0
  62. package/lib/events/UserMetadataAdded.js.map +1 -0
  63. package/lib/events/UserMetadataChanged.d.ts +5 -0
  64. package/lib/events/UserMetadataChanged.js +25 -0
  65. package/lib/events/UserMetadataChanged.js.map +1 -0
  66. package/lib/events/UserMetadataDeleted.d.ts +5 -0
  67. package/lib/events/UserMetadataDeleted.js +25 -0
  68. package/lib/events/UserMetadataDeleted.js.map +1 -0
  69. package/lib/events/UserPasswordChanged.d.ts +5 -0
  70. package/lib/events/UserPasswordChanged.js +25 -0
  71. package/lib/events/UserPasswordChanged.js.map +1 -0
  72. package/lib/events/UserPropertyChange.d.ts +7 -0
  73. package/lib/events/UserPropertyChange.js +17 -0
  74. package/lib/events/UserPropertyChange.js.map +1 -0
  75. package/lib/events/UserPropertyChanged.d.ts +7 -0
  76. package/lib/events/UserPropertyChanged.js +17 -0
  77. package/lib/events/UserPropertyChanged.js.map +1 -0
  78. package/lib/events/UserRoleGranted.d.ts +6 -0
  79. package/lib/events/UserRoleGranted.js +26 -0
  80. package/lib/events/UserRoleGranted.js.map +1 -0
  81. package/lib/events/UserRoleRevoked.d.ts +6 -0
  82. package/lib/events/UserRoleRevoked.js +26 -0
  83. package/lib/events/UserRoleRevoked.js.map +1 -0
  84. package/lib/events/UserUnbanned.d.ts +5 -0
  85. package/lib/events/UserUnbanned.js +25 -0
  86. package/lib/events/UserUnbanned.js.map +1 -0
  87. package/lib/events/index.d.ts +13 -0
  88. package/lib/events/index.js +30 -0
  89. package/lib/events/index.js.map +1 -0
  90. package/lib/index.d.ts +3 -0
  91. package/lib/index.js +3 -0
  92. package/lib/index.js.map +1 -1
  93. package/lib/interfaces.d.ts +151 -6
  94. package/lib/interfaces.js +31 -2
  95. package/lib/interfaces.js.map +1 -1
  96. package/lib/jobs/UnbanUser.d.ts +9 -0
  97. package/lib/jobs/UnbanUser.js +44 -0
  98. package/lib/jobs/UnbanUser.js.map +1 -0
  99. package/lib/messages/ChangedProperties.d.ts +6 -0
  100. package/lib/messages/ChangedProperties.js +8 -0
  101. package/lib/messages/ChangedProperties.js.map +1 -0
  102. package/lib/messages/NewUser.d.ts +14 -0
  103. package/lib/messages/NewUser.js +21 -0
  104. package/lib/messages/NewUser.js.map +1 -0
  105. package/lib/messages/UserActivated.d.ts +7 -0
  106. package/lib/messages/UserActivated.js +13 -0
  107. package/lib/messages/UserActivated.js.map +1 -0
  108. package/lib/messages/UserBanned.d.ts +7 -0
  109. package/lib/messages/UserBanned.js +13 -0
  110. package/lib/messages/UserBanned.js.map +1 -0
  111. package/lib/middleware.d.ts +4 -0
  112. package/lib/middleware.js +23 -0
  113. package/lib/middleware.js.map +1 -0
  114. package/lib/migrations/RBACInitial_2022_06_28_01_13_00.js +17 -1
  115. package/lib/migrations/RBACInitial_2022_06_28_01_13_00.js.map +1 -1
  116. package/lib/models/User.d.ts +40 -2
  117. package/lib/models/User.js +139 -4
  118. package/lib/models/User.js.map +1 -1
  119. package/lib/models/UserMetadata.d.ts +3 -6
  120. package/lib/models/UserMetadata.js +4 -12
  121. package/lib/models/UserMetadata.js.map +1 -1
  122. package/lib/models/UserTimeline.d.ts +28 -0
  123. package/lib/models/UserTimeline.js +47 -0
  124. package/lib/models/UserTimeline.js.map +1 -0
  125. package/lib/password.d.ts +10 -1
  126. package/lib/password.js +27 -1
  127. package/lib/password.js.map +1 -1
  128. package/lib/session.d.ts +3 -3
  129. package/lib/session.js +20 -6
  130. package/lib/session.js.map +1 -1
  131. package/package.json +12 -10
package/lib/auth.d.ts CHANGED
@@ -1,8 +1,15 @@
1
- import { AuthProvider } from './interfaces';
1
+ import { AuthProvider, IAuthenticationResult, PasswordProvider } from './interfaces';
2
2
  import { User } from './models/User';
3
3
  import { IContainer } from '@spinajs/di';
4
4
  export declare class SimpleDbAuthProvider implements AuthProvider<User> {
5
5
  protected Container: IContainer;
6
- exists(user: User | string): Promise<boolean>;
7
- authenticate(email: string, password: string): Promise<User>;
6
+ protected PasswordProvider: PasswordProvider;
7
+ exists(userOrEmail: User | string): Promise<boolean>;
8
+ getByLogin(login: string): Promise<User>;
9
+ getByEmail(email: string): Promise<User>;
10
+ getByUUID(uuid: string): Promise<User>;
11
+ authenticate(email: string, password: string): Promise<IAuthenticationResult<User>>;
12
+ isBanned(email: string): Promise<boolean>;
13
+ isActive(email: string): Promise<boolean>;
14
+ isDeleted(email: string): Promise<boolean>;
8
15
  }
package/lib/auth.js CHANGED
@@ -13,31 +13,87 @@ exports.SimpleDbAuthProvider = void 0;
13
13
  const interfaces_1 = require("./interfaces");
14
14
  const User_1 = require("./models/User");
15
15
  const di_1 = require("@spinajs/di");
16
+ const configuration_1 = require("@spinajs/configuration");
16
17
  let SimpleDbAuthProvider = class SimpleDbAuthProvider {
17
- async exists(user) {
18
- const result = await User_1.User.where('Email', user instanceof User_1.User ? user.Email : user).first();
18
+ async exists(userOrEmail) {
19
+ const result = await User_1.User.where('Email', userOrEmail instanceof User_1.User ? userOrEmail.Email : userOrEmail).first();
19
20
  if (result) {
20
21
  return true;
21
22
  }
22
23
  return false;
23
24
  }
25
+ async getByLogin(login) {
26
+ const result = await User_1.User.where('Login', login).first();
27
+ return result;
28
+ }
29
+ async getByEmail(email) {
30
+ const result = await User_1.User.where('Email', email).first();
31
+ return result;
32
+ }
33
+ async getByUUID(uuid) {
34
+ const result = await User_1.User.where('Uuid', uuid).first();
35
+ return result;
36
+ }
24
37
  async authenticate(email, password) {
25
- const pwd = this.Container.resolve(interfaces_1.PasswordProvider);
26
38
  const result = await User_1.User.where({ Email: email, DeletedAt: null }).first();
39
+ const eInvalidCredentials = {
40
+ Error: {
41
+ Code: interfaces_1.AthenticationErrorCodes.E_INVALID_CREDENTIALS,
42
+ Message: 'Invalid user credentials, or user not exist.',
43
+ },
44
+ };
45
+ /**
46
+ * If user not exists, is deleted, or password dont match
47
+ * return E_INVALID_CREDENTIALS for security reasons ( so attaker wont now if email is valid, or password don match)
48
+ */
27
49
  if (!result) {
28
- return null;
50
+ return eInvalidCredentials;
51
+ }
52
+ const valid = await this.PasswordProvider.verify(result.Password, password);
53
+ if (!valid) {
54
+ return Object.assign({ User: undefined }, eInvalidCredentials);
55
+ }
56
+ if (result.IsBanned) {
57
+ return {
58
+ User: result,
59
+ Error: {
60
+ Code: interfaces_1.AthenticationErrorCodes.E_USER_BANNED,
61
+ },
62
+ };
29
63
  }
30
- const valid = await pwd.verify(result.Password, password);
31
- if (valid) {
32
- return result;
64
+ if (result.IsActive) {
65
+ return {
66
+ User: result,
67
+ Error: {
68
+ Code: interfaces_1.AthenticationErrorCodes.E_USER_NOT_ACTIVE,
69
+ },
70
+ };
33
71
  }
34
- return null;
72
+ return {
73
+ User: result,
74
+ };
75
+ }
76
+ async isBanned(email) {
77
+ const result = await User_1.User.where({ Email: email, IsBanned: true }).first();
78
+ return result !== null;
79
+ }
80
+ async isActive(email) {
81
+ const result = await User_1.User.where({ Email: email, IsActive: true }).first();
82
+ return result !== null;
83
+ }
84
+ async isDeleted(email) {
85
+ const result = await User_1.User.where('Email', email).whereNotNull('DeletedAt').first();
86
+ return result !== null;
35
87
  }
36
88
  };
37
89
  __decorate([
38
90
  (0, di_1.Autoinject)(di_1.Container),
39
91
  __metadata("design:type", Object)
40
92
  ], SimpleDbAuthProvider.prototype, "Container", void 0);
93
+ __decorate([
94
+ (0, configuration_1.AutoinjectService)('rbac.password'),
95
+ __metadata("design:type", interfaces_1.PasswordProvider)
96
+ ], SimpleDbAuthProvider.prototype, "PasswordProvider", void 0);
41
97
  SimpleDbAuthProvider = __decorate([
42
98
  (0, di_1.Injectable)(interfaces_1.AuthProvider)
43
99
  ], SimpleDbAuthProvider);
package/lib/auth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,6CAA8D;AAC9D,wCAAqC;AACrC,oCAA4E;AAG5E,IAAa,oBAAoB,GAAjC,MAAa,oBAAoB;IAIxB,KAAK,CAAC,MAAM,CAAC,IAAmB;QACrC,MAAM,MAAM,GAAG,MAAM,WAAI,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,YAAY,WAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QAC3F,IAAI,MAAM,EAAE;YACV,OAAO,IAAI,CAAC;SACb;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,QAAgB;QACvD,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,6BAAgB,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,MAAM,WAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAE3E,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,IAAI,CAAC;SACb;QAED,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC1D,IAAI,KAAK,EAAE;YACT,OAAO,MAAM,CAAC;SACf;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AA1BC;IADC,IAAA,eAAU,EAAC,cAAS,CAAC;;uDACU;AAFrB,oBAAoB;IADhC,IAAA,eAAU,EAAC,yBAAY,CAAC;GACZ,oBAAoB,CA4BhC;AA5BY,oDAAoB"}
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { QueueClient } from '@spinajs/Queue';
2
+ import { Log } from '@spinajs/log';
3
+ import { CliCommand } from '@spinajs/cli';
4
+ export declare class ActivateUser extends CliCommand {
5
+ protected Log: Log;
6
+ protected Queue: QueueClient;
7
+ execute(idOrUuid: string, active: boolean): Promise<void>;
8
+ }
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ActivateUser = void 0;
13
+ const UserDeactivated_1 = require("./../events/UserDeactivated");
14
+ //import { UserBannedMessage } from './../messages/UserBanned';
15
+ const Queue_1 = require("@spinajs/Queue");
16
+ const log_1 = require("@spinajs/log");
17
+ const cli_1 = require("@spinajs/cli");
18
+ const di_1 = require("@spinajs/di");
19
+ const User_1 = require("../models/User");
20
+ const UserActivated_1 = require("../events/UserActivated");
21
+ let ActivateUser = class ActivateUser extends cli_1.CliCommand {
22
+ async execute(idOrUuid, active) {
23
+ const result = await User_1.User.update({ IsActive: active }).where('Id', idOrUuid).orWhere('Uuid', idOrUuid);
24
+ if (result.RowsAffected > 0) {
25
+ const event = active ? new UserActivated_1.UserActivated(idOrUuid) : new UserDeactivated_1.UserDeactivated(idOrUuid);
26
+ this.Queue.emit(event);
27
+ this.Log.success(`User activation status changed to ${active}`);
28
+ }
29
+ else {
30
+ this.Log.warn(`No user with id: ${idOrUuid} found`);
31
+ }
32
+ }
33
+ };
34
+ __decorate([
35
+ (0, log_1.Logger)('rbac'),
36
+ __metadata("design:type", log_1.Log)
37
+ ], ActivateUser.prototype, "Log", void 0);
38
+ __decorate([
39
+ (0, di_1.Autoinject)(Queue_1.QueueClient),
40
+ __metadata("design:type", Queue_1.QueueClient)
41
+ ], ActivateUser.prototype, "Queue", void 0);
42
+ ActivateUser = __decorate([
43
+ (0, cli_1.Command)('rbac:user-activate', 'Sets active or inactive user'),
44
+ (0, cli_1.Argument)('idOrUuid', 'numeric id or uuid'),
45
+ (0, cli_1.Argument)('active', ' true / false', false, (opt) => (opt.toLowerCase() === 'true' ? true : false))
46
+ ], ActivateUser);
47
+ exports.ActivateUser = ActivateUser;
48
+ //# sourceMappingURL=ActivateUser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActivateUser.js","sourceRoot":"","sources":["../../src/cli/ActivateUser.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iEAA8D;AAC9D,+DAA+D;AAC/D,0CAA6C;AAC7C,sCAA2C;AAC3C,sCAA6D;AAC7D,oCAAyC;AACzC,yCAAsC;AACtC,2DAAwD;AAKxD,IAAa,YAAY,GAAzB,MAAa,YAAa,SAAQ,gBAAU;IAOnC,KAAK,CAAC,OAAO,CAAC,QAAgB,EAAE,MAAe;QACpD,MAAM,MAAM,GAAG,MAAM,WAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAEvG,IAAI,MAAM,CAAC,YAAY,GAAG,CAAC,EAAE;YAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,6BAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,iCAAe,CAAC,QAAQ,CAAC,CAAC;YAEnF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEvB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,qCAAqC,MAAM,EAAE,CAAC,CAAC;SACjE;aAAM;YACL,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,QAAQ,QAAQ,CAAC,CAAC;SACrD;IACH,CAAC;CACF,CAAA;AAlBC;IADC,IAAA,YAAM,EAAC,MAAM,CAAC;8BACA,SAAG;yCAAC;AAGnB;IADC,IAAA,eAAU,EAAC,mBAAW,CAAC;8BACP,mBAAW;2CAAC;AALlB,YAAY;IAHxB,IAAA,aAAO,EAAC,oBAAoB,EAAE,8BAA8B,CAAC;IAC7D,IAAA,cAAQ,EAAC,UAAU,EAAE,oBAAoB,CAAC;IAC1C,IAAA,cAAQ,EAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;GAC9F,YAAY,CAoBxB;AApBY,oCAAY"}
@@ -0,0 +1,8 @@
1
+ import { QueueClient } from '@spinajs/Queue';
2
+ import { Log } from '@spinajs/log';
3
+ import { CliCommand } from '@spinajs/cli';
4
+ export declare class BanUser extends CliCommand {
5
+ protected Log: Log;
6
+ protected Queue: QueueClient;
7
+ execute(idOrUuid: string, ban: boolean, duration: number): Promise<void>;
8
+ }
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.BanUser = void 0;
13
+ const UserUnbanned_1 = require("./../events/UserUnbanned");
14
+ const Queue_1 = require("@spinajs/Queue");
15
+ const log_1 = require("@spinajs/log");
16
+ const cli_1 = require("@spinajs/cli");
17
+ const di_1 = require("@spinajs/di");
18
+ const User_1 = require("../models/User");
19
+ const UserBanned_1 = require("../events/UserBanned");
20
+ const UserMetadata_1 = require("../models/UserMetadata");
21
+ const UnbanUser_1 = require("../jobs/UnbanUser");
22
+ const luxon_1 = require("luxon");
23
+ let BanUser = class BanUser extends cli_1.CliCommand {
24
+ async execute(idOrUuid, ban, duration) {
25
+ const user = await User_1.User.where('Id', idOrUuid).orWhere('Uuid', idOrUuid).firstOrThrow(new Error('User not found'));
26
+ user.IsBanned = ban;
27
+ await user.update();
28
+ if (ban) {
29
+ await (user.Metadata['ban:duration'] = duration);
30
+ await (user.Metadata['ban:issued'] = luxon_1.DateTime.now().toISO());
31
+ this.Queue.emit(new UserBanned_1.UserBanned(idOrUuid, duration));
32
+ if (duration !== 0) {
33
+ // schedule job with delay equals ban duration
34
+ // to automattically unban user after this time
35
+ const job = new UnbanUser_1.UnbanUser(idOrUuid);
36
+ job.ScheduleDelay = duration * 60 * 1000;
37
+ this.Queue.emit(job);
38
+ }
39
+ this.Log.success(`User ban status changed to ${ban}`);
40
+ }
41
+ else {
42
+ // cleanup meta
43
+ await UserMetadata_1.UserMetadata.destroy().where('Key', 'like', 'user:ban:%').andWhere('User', user);
44
+ this.Queue.emit(new UserUnbanned_1.UserUnbanned(idOrUuid));
45
+ this.Log.warn(`No user with id: ${idOrUuid} found`);
46
+ }
47
+ }
48
+ };
49
+ __decorate([
50
+ (0, log_1.Logger)('rbac'),
51
+ __metadata("design:type", log_1.Log)
52
+ ], BanUser.prototype, "Log", void 0);
53
+ __decorate([
54
+ (0, di_1.Autoinject)(Queue_1.QueueClient),
55
+ __metadata("design:type", Queue_1.QueueClient)
56
+ ], BanUser.prototype, "Queue", void 0);
57
+ BanUser = __decorate([
58
+ (0, cli_1.Command)('rbac:user-ban', 'Sets active or inactive user'),
59
+ (0, cli_1.Argument)('idOrUuid', 'numeric id or uuid'),
60
+ (0, cli_1.Argument)('ban', ' true / false', false, (opt) => (opt.toLowerCase() === 'true' ? true : false)),
61
+ (0, cli_1.Argument)('duration', 'how long should ban last ( in minutes )', 24 * 60, (opt) => parseInt(opt))
62
+ ], BanUser);
63
+ exports.BanUser = BanUser;
64
+ //# sourceMappingURL=BanUser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BanUser.js","sourceRoot":"","sources":["../../src/cli/BanUser.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2DAAwD;AACxD,0CAA6C;AAC7C,sCAA2C;AAC3C,sCAA6D;AAC7D,oCAAyC;AACzC,yCAAsC;AACtC,qDAAkD;AAClD,yDAAsD;AACtD,iDAA8C;AAC9C,iCAAiC;AAMjC,IAAa,OAAO,GAApB,MAAa,OAAQ,SAAQ,gBAAU;IAO9B,KAAK,CAAC,OAAO,CAAC,QAAgB,EAAE,GAAY,EAAE,QAAgB;QACnE,MAAM,IAAI,GAAG,MAAM,WAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAClH,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;QAEpB,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAEpB,IAAI,GAAG,EAAE;YACP,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,QAAQ,CAAC,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,GAAG,gBAAQ,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;YAE7D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,uBAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;YAEpD,IAAI,QAAQ,KAAK,CAAC,EAAE;gBAClB,8CAA8C;gBAC9C,+CAA+C;gBAC/C,MAAM,GAAG,GAAG,IAAI,qBAAS,CAAC,QAAQ,CAAC,CAAC;gBACpC,GAAG,CAAC,aAAa,GAAG,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC;gBAEzC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;aACtB;YAED,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;SACvD;aAAM;YACL,eAAe;YACf,MAAM,2BAAY,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAEvF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,2BAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC5C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,QAAQ,QAAQ,CAAC,CAAC;SACrD;IACH,CAAC;CACF,CAAA;AAnCC;IADC,IAAA,YAAM,EAAC,MAAM,CAAC;8BACA,SAAG;oCAAC;AAGnB;IADC,IAAA,eAAU,EAAC,mBAAW,CAAC;8BACP,mBAAW;sCAAC;AALlB,OAAO;IAJnB,IAAA,aAAO,EAAC,eAAe,EAAE,8BAA8B,CAAC;IACxD,IAAA,cAAQ,EAAC,UAAU,EAAE,oBAAoB,CAAC;IAC1C,IAAA,cAAQ,EAAC,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACvG,IAAA,cAAQ,EAAC,UAAU,EAAE,yCAAyC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;GAC5F,OAAO,CAqCnB;AArCY,0BAAO"}
File without changes
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=ChangePassword.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChangePassword.js","sourceRoot":"","sources":["../../src/cli/ChangePassword.ts"],"names":[],"mappings":""}
@@ -0,0 +1,11 @@
1
+ import { QueueClient } from '@spinajs/Queue';
2
+ import { Log } from '@spinajs/log';
3
+ import { CliCommand } from '@spinajs/cli';
4
+ import { PasswordProvider, PasswordValidationProvider } from '../interfaces';
5
+ export declare class ChangeUserPassword extends CliCommand {
6
+ protected Log: Log;
7
+ protected Queue: QueueClient;
8
+ protected PasswordProvider: PasswordProvider;
9
+ protected PasswordValidation: PasswordValidationProvider;
10
+ execute(idOrUuid: string, newPassword: string): Promise<void>;
11
+ }
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ChangeUserPassword = void 0;
13
+ const exceptions_1 = require("@spinajs/exceptions");
14
+ const Queue_1 = require("@spinajs/Queue");
15
+ const log_1 = require("@spinajs/log");
16
+ const cli_1 = require("@spinajs/cli");
17
+ const di_1 = require("@spinajs/di");
18
+ const User_1 = require("../models/User");
19
+ const interfaces_1 = require("../interfaces");
20
+ const UserPasswordChanged_1 = require("../events/UserPasswordChanged");
21
+ const configuration_1 = require("@spinajs/configuration");
22
+ let ChangeUserPassword = class ChangeUserPassword extends cli_1.CliCommand {
23
+ async execute(idOrUuid, newPassword) {
24
+ const user = await User_1.User.where('Id', idOrUuid)
25
+ .orWhere('Uuid', idOrUuid)
26
+ .firstOrThrow(new exceptions_1.ResourceNotFound(`No user with id ${idOrUuid} found`));
27
+ if (!this.PasswordValidation.check(newPassword)) {
28
+ throw new exceptions_1.InvalidArgument(`New password does not match password rules, change passowrd or check rbac.password.validation config entry for password rules`);
29
+ }
30
+ const hashedPassword = await this.PasswordProvider.hash(newPassword);
31
+ user.Password = hashedPassword;
32
+ await user.update();
33
+ await this.Queue.emit(new UserPasswordChanged_1.UserPasswordChanged(idOrUuid));
34
+ this.Log.success(`User password changed !`);
35
+ }
36
+ };
37
+ __decorate([
38
+ (0, log_1.Logger)('rbac'),
39
+ __metadata("design:type", log_1.Log)
40
+ ], ChangeUserPassword.prototype, "Log", void 0);
41
+ __decorate([
42
+ (0, di_1.Autoinject)(Queue_1.QueueClient),
43
+ __metadata("design:type", Queue_1.QueueClient)
44
+ ], ChangeUserPassword.prototype, "Queue", void 0);
45
+ __decorate([
46
+ (0, configuration_1.AutoinjectService)('rbac.password'),
47
+ __metadata("design:type", interfaces_1.PasswordProvider)
48
+ ], ChangeUserPassword.prototype, "PasswordProvider", void 0);
49
+ __decorate([
50
+ (0, configuration_1.AutoinjectService)('rbac.validation'),
51
+ __metadata("design:type", interfaces_1.PasswordValidationProvider)
52
+ ], ChangeUserPassword.prototype, "PasswordValidation", void 0);
53
+ ChangeUserPassword = __decorate([
54
+ (0, cli_1.Command)('rbac:user-change-password', 'Sets active or inactive user'),
55
+ (0, cli_1.Argument)('idOrUuid', 'numeric id or uuid'),
56
+ (0, cli_1.Argument)('newPassword', 'new password')
57
+ ], ChangeUserPassword);
58
+ exports.ChangeUserPassword = ChangeUserPassword;
59
+ //# sourceMappingURL=ChangeUserPassword.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChangeUserPassword.js","sourceRoot":"","sources":["../../src/cli/ChangeUserPassword.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAAwE;AACxE,0CAA6C;AAC7C,sCAA2C;AAC3C,sCAA6D;AAC7D,oCAAyC;AACzC,yCAAsC;AACtC,8CAA6E;AAC7E,uEAAoE;AACpE,0DAA2D;AAK3D,IAAa,kBAAkB,GAA/B,MAAa,kBAAmB,SAAQ,gBAAU;IAazC,KAAK,CAAC,OAAO,CAAC,QAAgB,EAAE,WAAmB;QACxD,MAAM,IAAI,GAAG,MAAM,WAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC;aAC1C,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC;aACzB,YAAY,CAAC,IAAI,6BAAgB,CAAC,mBAAmB,QAAQ,QAAQ,CAAC,CAAC,CAAC;QAE3E,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;YAC/C,MAAM,IAAI,4BAAe,CAAC,+HAA+H,CAAC,CAAC;SAC5J;QAED,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACrE,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC;QAC/B,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAEpB,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,yCAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEzD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAC9C,CAAC;CACF,CAAA;AA5BC;IADC,IAAA,YAAM,EAAC,MAAM,CAAC;8BACA,SAAG;+CAAC;AAGnB;IADC,IAAA,eAAU,EAAC,mBAAW,CAAC;8BACP,mBAAW;iDAAC;AAG7B;IADC,IAAA,iCAAiB,EAAC,eAAe,CAAC;8BACP,6BAAgB;4DAAC;AAG7C;IADC,IAAA,iCAAiB,EAAC,iBAAiB,CAAC;8BACP,uCAA0B;8DAAC;AAX9C,kBAAkB;IAH9B,IAAA,aAAO,EAAC,2BAA2B,EAAE,8BAA8B,CAAC;IACpE,IAAA,cAAQ,EAAC,UAAU,EAAE,oBAAoB,CAAC;IAC1C,IAAA,cAAQ,EAAC,aAAa,EAAE,cAAc,CAAC;GAC3B,kBAAkB,CA8B9B;AA9BY,gDAAkB"}
@@ -0,0 +1,8 @@
1
+ import { Log } from '@spinajs/log';
2
+ import { CliCommand } from '@spinajs/cli';
3
+ export declare class ChangeUserPassword extends CliCommand {
4
+ protected Log: Log;
5
+ protected CronSchedule: string;
6
+ protected TimelineTTL: number;
7
+ execute(): Promise<void>;
8
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ChangeUserPassword = void 0;
13
+ const log_1 = require("@spinajs/log");
14
+ const cli_1 = require("@spinajs/cli");
15
+ const configuration_1 = require("@spinajs/configuration");
16
+ const cron_1 = require("cron");
17
+ const UserTimeline_1 = require("../models/UserTimeline");
18
+ const luxon_1 = require("luxon");
19
+ let ChangeUserPassword = class ChangeUserPassword extends cli_1.CliCommand {
20
+ async execute() {
21
+ new cron_1.CronJob(this.CronSchedule, async () => {
22
+ const result = await UserTimeline_1.UserAction.destroy()
23
+ .where('Persistent', false)
24
+ .andWhere('CreatedAt', '<=', luxon_1.DateTime.now().plus({
25
+ minutes: -this.TimelineTTL,
26
+ }));
27
+ if (result && result.RowsAffected > 0) {
28
+ this.Log.info(`Deleted ${result.RowsAffected} user timeline events`);
29
+ }
30
+ else {
31
+ this.Log.info(`No user timeline events do delete this time`);
32
+ }
33
+ }, () => {
34
+ this.Log.info('rbac:cleanup-schedule stopped');
35
+ }, true);
36
+ this.Log.success(`User password changed !`);
37
+ }
38
+ };
39
+ __decorate([
40
+ (0, log_1.Logger)('rbac'),
41
+ __metadata("design:type", log_1.Log)
42
+ ], ChangeUserPassword.prototype, "Log", void 0);
43
+ __decorate([
44
+ (0, configuration_1.Config)('rbac.timeline.schedule'),
45
+ __metadata("design:type", String)
46
+ ], ChangeUserPassword.prototype, "CronSchedule", void 0);
47
+ __decorate([
48
+ (0, configuration_1.Config)('rbac.timeline.ttl'),
49
+ __metadata("design:type", Number)
50
+ ], ChangeUserPassword.prototype, "TimelineTTL", void 0);
51
+ ChangeUserPassword = __decorate([
52
+ (0, cli_1.Command)('rbac:cleanup-schedule', 'Starts a schedule with cleanup tasks')
53
+ ], ChangeUserPassword);
54
+ exports.ChangeUserPassword = ChangeUserPassword;
55
+ //# sourceMappingURL=ClearUserTimelineSchedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClearUserTimelineSchedule.js","sourceRoot":"","sources":["../../src/cli/ClearUserTimelineSchedule.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,sCAA2C;AAC3C,sCAAmD;AACnD,0DAAgD;AAChD,+BAA+B;AAC/B,yDAAoD;AACpD,iCAAiC;AAGjC,IAAa,kBAAkB,GAA/B,MAAa,kBAAmB,SAAQ,gBAAU;IAUzC,KAAK,CAAC,OAAO;QAClB,IAAI,cAAO,CACT,IAAI,CAAC,YAAY,EACjB,KAAK,IAAI,EAAE;YACT,MAAM,MAAM,GAAG,MAAM,yBAAU,CAAC,OAAO,EAAE;iBACtC,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC;iBAC1B,QAAQ,CACP,WAAW,EACX,IAAI,EACJ,gBAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;gBAClB,OAAO,EAAE,CAAC,IAAI,CAAC,WAAW;aAC3B,CAAC,CACH,CAAC;YAEJ,IAAI,MAAM,IAAI,MAAM,CAAC,YAAY,GAAG,CAAC,EAAE;gBACrC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,YAAY,uBAAuB,CAAC,CAAC;aACtE;iBAAM;gBACL,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;aAC9D;QACH,CAAC,EACD,GAAG,EAAE;YACH,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACjD,CAAC,EACD,IAAI,CACL,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAC9C,CAAC;CACF,CAAA;AApCC;IADC,IAAA,YAAM,EAAC,MAAM,CAAC;8BACA,SAAG;+CAAC;AAGnB;IADC,IAAA,sBAAM,EAAC,wBAAwB,CAAC;;wDACF;AAG/B;IADC,IAAA,sBAAM,EAAC,mBAAmB,CAAC;;uDACE;AARnB,kBAAkB;IAD9B,IAAA,aAAO,EAAC,uBAAuB,EAAE,sCAAsC,CAAC;GAC5D,kBAAkB,CAsC9B;AAtCY,gDAAkB"}
@@ -0,0 +1,17 @@
1
+ import { QueueClient } from '@spinajs/queue';
2
+ import { Log } from '@spinajs/log';
3
+ import { CliCommand } from '@spinajs/cli';
4
+ import { PasswordProvider } from '../interfaces';
5
+ interface UserCreationOptions {
6
+ email: string;
7
+ roles: string;
8
+ login: string;
9
+ password: string;
10
+ }
11
+ export declare class CreateUser extends CliCommand {
12
+ protected Log: Log;
13
+ protected PasswordProvider: PasswordProvider;
14
+ protected Queue: QueueClient;
15
+ execute(options: UserCreationOptions): Promise<void>;
16
+ }
17
+ export {};
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.CreateUser = void 0;
13
+ const queue_1 = require("@spinajs/queue");
14
+ const log_1 = require("@spinajs/log");
15
+ const cli_1 = require("@spinajs/cli");
16
+ const configuration_1 = require("@spinajs/configuration");
17
+ const luxon_1 = require("luxon");
18
+ const di_1 = require("@spinajs/di");
19
+ const uuid_1 = require("uuid");
20
+ const interfaces_1 = require("../interfaces");
21
+ const User_1 = require("../models/User");
22
+ const NewUser_1 = require("../events/NewUser");
23
+ let CreateUser = class CreateUser extends cli_1.CliCommand {
24
+ async execute(options) {
25
+ const user = new User_1.User({
26
+ Email: options.email,
27
+ Login: options.login,
28
+ Role: options.roles.split(','),
29
+ IsBanned: false,
30
+ IsActive: false,
31
+ });
32
+ if (options.password) {
33
+ user.Password = await this.PasswordProvider.hash(options.password);
34
+ }
35
+ else {
36
+ const pwd = await this.PasswordProvider.generate();
37
+ user.Password = await this.PasswordProvider.hash(pwd);
38
+ this.Log.warn(`USER PASSWORD: ${pwd}`);
39
+ }
40
+ user.IsBanned = false;
41
+ user.IsActive = false;
42
+ user.RegisteredAt = luxon_1.DateTime.now();
43
+ user.Uuid = (0, uuid_1.v4)();
44
+ await user.insert();
45
+ const qMessage = new NewUser_1.UserRegisteredMessage();
46
+ qMessage.hydrate(user.toJSON());
47
+ // notify others about user creation
48
+ this.Queue.emit(qMessage);
49
+ this.Log.success('User creation SUCCESS');
50
+ }
51
+ };
52
+ __decorate([
53
+ (0, log_1.Logger)('rbac'),
54
+ __metadata("design:type", log_1.Log)
55
+ ], CreateUser.prototype, "Log", void 0);
56
+ __decorate([
57
+ (0, configuration_1.AutoinjectService)('rbac.password'),
58
+ __metadata("design:type", interfaces_1.PasswordProvider)
59
+ ], CreateUser.prototype, "PasswordProvider", void 0);
60
+ __decorate([
61
+ (0, di_1.Autoinject)(queue_1.QueueClient),
62
+ __metadata("design:type", queue_1.QueueClient)
63
+ ], CreateUser.prototype, "Queue", void 0);
64
+ CreateUser = __decorate([
65
+ (0, cli_1.Command)('rbas:user-create', 'Creates user with given credentials'),
66
+ (0, cli_1.Option)('-e, --email <email>', true, 'user email'),
67
+ (0, cli_1.Option)('-r, --roles <roles>', true, 'user roles, comma separated'),
68
+ (0, cli_1.Option)('-l, --login <login>', true, 'user login'),
69
+ (0, cli_1.Option)('-p, --password <password>', false, 'user password, if not set will be generated and printed out to console')
70
+ ], CreateUser);
71
+ exports.CreateUser = CreateUser;
72
+ //# sourceMappingURL=CreateUser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateUser.js","sourceRoot":"","sources":["../../src/cli/CreateUser.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,0CAA6C;AAC7C,sCAA2C;AAC3C,sCAA2D;AAC3D,0DAA2D;AAC3D,iCAAiC;AACjC,oCAAyC;AACzC,+BAAoC;AACpC,8CAAiD;AACjD,yCAAsC;AACtC,+CAA0D;AAc1D,IAAa,UAAU,GAAvB,MAAa,UAAW,SAAQ,gBAAU;IAUjC,KAAK,CAAC,OAAO,CAAC,OAA4B;QAC/C,MAAM,IAAI,GAAG,IAAI,WAAI,CAAC;YACpB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;YAC9B,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,KAAK;SAChB,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,QAAQ,EAAE;YACpB,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;SACpE;aAAM;YACL,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC;YACnD,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC,CAAC;SACxC;QAED,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,gBAAQ,CAAC,GAAG,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,IAAA,SAAM,GAAE,CAAC;QAErB,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAEpB,MAAM,QAAQ,GAAG,IAAI,+BAAqB,EAAE,CAAC;QAC7C,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAEhC,oCAAoC;QACpC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE1B,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC5C,CAAC;CACF,CAAA;AAxCC;IADC,IAAA,YAAM,EAAC,MAAM,CAAC;8BACA,SAAG;uCAAC;AAGnB;IADC,IAAA,iCAAiB,EAAC,eAAe,CAAC;8BACP,6BAAgB;oDAAC;AAG7C;IADC,IAAA,eAAU,EAAC,mBAAW,CAAC;8BACP,mBAAW;yCAAC;AARlB,UAAU;IALtB,IAAA,aAAO,EAAC,kBAAkB,EAAE,qCAAqC,CAAC;IAClE,IAAA,YAAM,EAAC,qBAAqB,EAAE,IAAI,EAAE,YAAY,CAAC;IACjD,IAAA,YAAM,EAAC,qBAAqB,EAAE,IAAI,EAAE,6BAA6B,CAAC;IAClE,IAAA,YAAM,EAAC,qBAAqB,EAAE,IAAI,EAAE,YAAY,CAAC;IACjD,IAAA,YAAM,EAAC,2BAA2B,EAAE,KAAK,EAAE,wEAAwE,CAAC;GACxG,UAAU,CA0CtB;AA1CY,gCAAU"}
@@ -0,0 +1,8 @@
1
+ import { QueueClient } from '@spinajs/Queue';
2
+ import { Log } from '@spinajs/log';
3
+ import { CliCommand } from '@spinajs/cli';
4
+ export declare class DeleteUser extends CliCommand {
5
+ protected Log: Log;
6
+ protected Queue: QueueClient;
7
+ execute(idOrUuid: string): Promise<void>;
8
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.DeleteUser = void 0;
13
+ const exceptions_1 = require("@spinajs/exceptions");
14
+ const Queue_1 = require("@spinajs/Queue");
15
+ const log_1 = require("@spinajs/log");
16
+ const cli_1 = require("@spinajs/cli");
17
+ const di_1 = require("@spinajs/di");
18
+ const User_1 = require("../models/User");
19
+ const UserDeleted_1 = require("../events/UserDeleted");
20
+ let DeleteUser = class DeleteUser extends cli_1.CliCommand {
21
+ async execute(idOrUuid) {
22
+ const result = await User_1.User.where('Id', idOrUuid).orWhere('Uuid', idOrUuid).firstOrThrow(new exceptions_1.ResourceNotFound('User with given id or uuid not found in db'));
23
+ await result.destroy();
24
+ this.Queue.emit(new UserDeleted_1.UserDeleted(idOrUuid));
25
+ this.Log.success(`User deleted sucessyfully`);
26
+ }
27
+ };
28
+ __decorate([
29
+ (0, log_1.Logger)('rbac'),
30
+ __metadata("design:type", log_1.Log)
31
+ ], DeleteUser.prototype, "Log", void 0);
32
+ __decorate([
33
+ (0, di_1.Autoinject)(Queue_1.QueueClient),
34
+ __metadata("design:type", Queue_1.QueueClient)
35
+ ], DeleteUser.prototype, "Queue", void 0);
36
+ DeleteUser = __decorate([
37
+ (0, cli_1.Command)('rbac:user-delete', 'Deletes user from database permanently'),
38
+ (0, cli_1.Argument)('idOrUuid', 'numeric id or uuid')
39
+ ], DeleteUser);
40
+ exports.DeleteUser = DeleteUser;
41
+ //# sourceMappingURL=DeleteUser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeleteUser.js","sourceRoot":"","sources":["../../src/cli/DeleteUser.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAAuD;AACvD,0CAA6C;AAC7C,sCAA2C;AAC3C,sCAA6D;AAC7D,oCAAyC;AACzC,yCAAsC;AACtC,uDAAoD;AAIpD,IAAa,UAAU,GAAvB,MAAa,UAAW,SAAQ,gBAAU;IAOjC,KAAK,CAAC,OAAO,CAAC,QAAgB;QACnC,MAAM,MAAM,GAAG,MAAM,WAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,YAAY,CAAC,IAAI,6BAAgB,CAAC,4CAA4C,CAAC,CAAC,CAAC;QAE3J,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QAEvB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,yBAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;QAE3C,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAChD,CAAC;CACF,CAAA;AAdC;IADC,IAAA,YAAM,EAAC,MAAM,CAAC;8BACA,SAAG;uCAAC;AAGnB;IADC,IAAA,eAAU,EAAC,mBAAW,CAAC;8BACP,mBAAW;yCAAC;AALlB,UAAU;IAFtB,IAAA,aAAO,EAAC,kBAAkB,EAAE,wCAAwC,CAAC;IACrE,IAAA,cAAQ,EAAC,UAAU,EAAE,oBAAoB,CAAC;GAC9B,UAAU,CAgBtB;AAhBY,gCAAU"}
@@ -0,0 +1,12 @@
1
+ import { Log } from '@spinajs/log';
2
+ import { CliCommand } from '@spinajs/cli';
3
+ interface UserOption {
4
+ idOrUuid?: string;
5
+ login?: string;
6
+ email?: string;
7
+ }
8
+ export declare class CreateUser extends CliCommand {
9
+ protected Log: Log;
10
+ execute(options: UserOption): Promise<void>;
11
+ }
12
+ export {};