@spinajs/rbac 2.0.28 → 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 +41 -3
  117. package/lib/models/User.js +140 -5
  118. package/lib/models/User.js.map +1 -1
  119. package/lib/models/UserMetadata.d.ts +3 -2
  120. package/lib/models/UserMetadata.js +4 -0
  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/interfaces.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SessionProvider = exports.AuthProvider = exports.PasswordProvider = void 0;
3
+ exports.PasswordValidationProvider = exports.AthenticationErrorCodes = exports.SessionProvider = exports.FederatedAuthProvider = exports.AuthProvider = exports.PasswordProvider = void 0;
4
4
  const di_1 = require("@spinajs/di");
5
5
  /**
6
6
  * Service used for generating random password & for hash raw string
@@ -8,10 +8,39 @@ const di_1 = require("@spinajs/di");
8
8
  class PasswordProvider {
9
9
  }
10
10
  exports.PasswordProvider = PasswordProvider;
11
+ /**
12
+ * Provides standard authentication based on login & password
13
+ *
14
+ * Unlike federated auth providers, it check local db for user,
15
+ * or some kind of other source
16
+ */
11
17
  class AuthProvider {
12
18
  }
13
19
  exports.AuthProvider = AuthProvider;
14
- class SessionProvider extends di_1.AsyncModule {
20
+ /**
21
+ * Used for implementign authentication with external services
22
+ * eg. slack or facebook that uses openid or similar auth
23
+ *
24
+ * NOTE: it should only authorize user, it should not register new one if
25
+ * not exists in use DB.
26
+ */
27
+ class FederatedAuthProvider {
28
+ }
29
+ exports.FederatedAuthProvider = FederatedAuthProvider;
30
+ class SessionProvider extends di_1.AsyncService {
15
31
  }
16
32
  exports.SessionProvider = SessionProvider;
33
+ var AthenticationErrorCodes;
34
+ (function (AthenticationErrorCodes) {
35
+ AthenticationErrorCodes["E_USER_BANNED"] = "E_USER_BANNED";
36
+ AthenticationErrorCodes["E_USER_NOT_ACTIVE"] = "E_USER_NOT_ACTIVE";
37
+ AthenticationErrorCodes["E_INVALID_CREDENTIALS"] = "E_INVALID_CREDENTIALS";
38
+ AthenticationErrorCodes["E_LOGIN_ATTEMPTS_EXCEEDED"] = "E_LOGIN_ATTEMPTS_EXCEEDED";
39
+ })(AthenticationErrorCodes = exports.AthenticationErrorCodes || (exports.AthenticationErrorCodes = {}));
40
+ /**
41
+ * Interface to provide implementation of password rule validation
42
+ */
43
+ class PasswordValidationProvider {
44
+ }
45
+ exports.PasswordValidationProvider = PasswordValidationProvider;
17
46
  //# sourceMappingURL=interfaces.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";;;AACA,oCAA0C;AAiC1C;;GAEG;AACH,MAAsB,gBAAgB;CAsBrC;AAtBD,4CAsBC;AAED,MAAsB,YAAY;CAIjC;AAJD,oCAIC;AAED,MAAsB,eAA8B,SAAQ,gBAAW;CAwBtE;AAxBD,0CAwBC"}
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";;;AACA,oCAA2C;AAiC3C;;GAEG;AACH,MAAsB,gBAAgB;CAsBrC;AAtBD,4CAsBC;AAED;;;;;GAKG;AACH,MAAsB,YAAY;CAgEjC;AAhED,oCAgEC;AAED;;;;;;GAMG;AACH,MAAsB,qBAAqB;CAwB1C;AAxBD,sDAwBC;AAED,MAAsB,eAA8B,SAAQ,iBAAY;CAgDvE;AAhDD,0CAgDC;AAED,IAAY,uBAKX;AALD,WAAY,uBAAuB;IACjC,0DAA+B,CAAA;IAC/B,kEAAuC,CAAA;IACvC,0EAA+C,CAAA;IAC/C,kFAAuD,CAAA;AACzD,CAAC,EALW,uBAAuB,GAAvB,+BAAuB,KAAvB,+BAAuB,QAKlC;AA2BD;;GAEG;AACH,MAAsB,0BAA0B;CAE/C;AAFD,gEAEC"}
@@ -0,0 +1,9 @@
1
+ import { Log } from '@spinajs/log';
2
+ import { QueueClient, QueueJob } from '@spinajs/queue';
3
+ export declare class UnbanUser extends QueueJob {
4
+ UserUUID: string;
5
+ protected Log: Log;
6
+ protected Queue: QueueClient;
7
+ constructor(UserUUID: string);
8
+ execute(): Promise<void>;
9
+ }
@@ -0,0 +1,44 @@
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.UnbanUser = void 0;
13
+ const di_1 = require("@spinajs/di");
14
+ const log_1 = require("@spinajs/log");
15
+ const queue_1 = require("@spinajs/queue");
16
+ const events_1 = require("../events");
17
+ const User_1 = require("../models/User");
18
+ let UnbanUser = class UnbanUser extends queue_1.QueueJob {
19
+ constructor(UserUUID) {
20
+ super();
21
+ this.UserUUID = UserUUID;
22
+ }
23
+ async execute() {
24
+ const user = await User_1.User.where('Id', this.UserUUID).orWhere('Uuid', this.UserUUID).firstOrThrow(new Error('User not found'));
25
+ user.IsBanned = false;
26
+ await user.update();
27
+ await user.Metadata.delete(/user:ban.*/);
28
+ await this.Queue.emit(new events_1.UserUnbanned(this.UserUUID));
29
+ }
30
+ };
31
+ __decorate([
32
+ (0, log_1.Logger)('rbac'),
33
+ __metadata("design:type", log_1.Log)
34
+ ], UnbanUser.prototype, "Log", void 0);
35
+ __decorate([
36
+ (0, di_1.Autoinject)(queue_1.QueueClient),
37
+ __metadata("design:type", queue_1.QueueClient)
38
+ ], UnbanUser.prototype, "Queue", void 0);
39
+ UnbanUser = __decorate([
40
+ (0, queue_1.Job)(),
41
+ __metadata("design:paramtypes", [String])
42
+ ], UnbanUser);
43
+ exports.UnbanUser = UnbanUser;
44
+ //# sourceMappingURL=UnbanUser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UnbanUser.js","sourceRoot":"","sources":["../../src/jobs/UnbanUser.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oCAAyC;AACzC,sCAA2C;AAC3C,0CAA4D;AAC5D,sCAAyC;AACzC,yCAAsC;AAGtC,IAAa,SAAS,GAAtB,MAAa,SAAU,SAAQ,gBAAQ;IAOrC,YAAmB,QAAgB;QACjC,KAAK,EAAE,CAAC;QADS,aAAQ,GAAR,QAAQ,CAAQ;IAEnC,CAAC;IAEM,KAAK,CAAC,OAAO;QAClB,MAAM,IAAI,GAAG,MAAM,WAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC5H,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAEtB,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,qBAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzD,CAAC;CACF,CAAA;AAjBC;IADC,IAAA,YAAM,EAAC,MAAM,CAAC;8BACA,SAAG;sCAAC;AAGnB;IADC,IAAA,eAAU,EAAC,mBAAW,CAAC;8BACP,mBAAW;wCAAC;AALlB,SAAS;IADrB,IAAA,WAAG,GAAE;;GACO,SAAS,CAmBrB;AAnBY,8BAAS"}
@@ -0,0 +1,6 @@
1
+ import { QueueMessage } from '@spinajs/queue';
2
+ export declare class UserPropertyChangedMessage extends QueueMessage {
3
+ Uuid: string;
4
+ Property: string;
5
+ Value: any;
6
+ }
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UserPropertyChangedMessage = void 0;
4
+ const queue_1 = require("@spinajs/queue");
5
+ class UserPropertyChangedMessage extends queue_1.QueueMessage {
6
+ }
7
+ exports.UserPropertyChangedMessage = UserPropertyChangedMessage;
8
+ //# sourceMappingURL=ChangedProperties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChangedProperties.js","sourceRoot":"","sources":["../../src/messages/ChangedProperties.ts"],"names":[],"mappings":";;;AAAA,0CAA8C;AAC9C,MAAa,0BAA2B,SAAQ,oBAAY;CAM3D;AAND,gEAMC"}
@@ -0,0 +1,14 @@
1
+ import { QueueMessage } from '@spinajs/queue';
2
+ import { DateTime } from 'luxon';
3
+ import { User } from '../models/User';
4
+ export declare class NewUserMessage extends QueueMessage {
5
+ Uuid: string;
6
+ Email: string;
7
+ Login: string;
8
+ Role: string[];
9
+ UserCreatedAt: DateTime;
10
+ IsBanned: boolean;
11
+ IsActive: boolean;
12
+ Metadata: Map<string, any>;
13
+ constructor(user: User, channel: string);
14
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NewUserMessage = void 0;
4
+ const queue_1 = require("@spinajs/queue");
5
+ class NewUserMessage extends queue_1.QueueMessage {
6
+ constructor(user, channel) {
7
+ super(channel);
8
+ this.Metadata = new Map();
9
+ this.Email = user.Email;
10
+ this.Login = user.Login;
11
+ this.Role = user.Role;
12
+ this.UserCreatedAt = user.CreatedAt;
13
+ this.IsBanned = user.IsBanned;
14
+ this.IsActive = user.IsActive;
15
+ for (const m of user.Metadata) {
16
+ this.Metadata.set(m.Key, m.Value);
17
+ }
18
+ }
19
+ }
20
+ exports.NewUserMessage = NewUserMessage;
21
+ //# sourceMappingURL=NewUser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NewUser.js","sourceRoot":"","sources":["../../src/messages/NewUser.ts"],"names":[],"mappings":";;;AAAA,0CAA8C;AAG9C,MAAa,cAAe,SAAQ,oBAAY;IAiB9C,YAAY,IAAU,EAAE,OAAe;QACrC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHV,aAAQ,GAAqB,IAAI,GAAG,EAAe,CAAC;QAKzD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE9B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;SACnC;IACH,CAAC;CACF;AA/BD,wCA+BC"}
@@ -0,0 +1,7 @@
1
+ import { QueueMessage } from '@spinajs/queue';
2
+ import { User } from '../models/User';
3
+ export declare class UserActivatedMessage extends QueueMessage {
4
+ Uuid: string;
5
+ Active: boolean;
6
+ constructor(user: User, channel: string);
7
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UserActivatedMessage = void 0;
4
+ const queue_1 = require("@spinajs/queue");
5
+ class UserActivatedMessage extends queue_1.QueueMessage {
6
+ constructor(user, channel) {
7
+ super(channel);
8
+ this.Active = user.IsActive;
9
+ this.Uuid = user.Uuid;
10
+ }
11
+ }
12
+ exports.UserActivatedMessage = UserActivatedMessage;
13
+ //# sourceMappingURL=UserActivated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserActivated.js","sourceRoot":"","sources":["../../src/messages/UserActivated.ts"],"names":[],"mappings":";;;AAAA,0CAA8C;AAE9C,MAAa,oBAAqB,SAAQ,oBAAY;IAKpD,YAAY,IAAU,EAAE,OAAe;QACrC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;CACF;AAXD,oDAWC"}
@@ -0,0 +1,7 @@
1
+ import { QueueMessage } from '@spinajs/queue';
2
+ import { User } from '../models/User';
3
+ export declare class UserBannedMessage extends QueueMessage {
4
+ Uuid: string;
5
+ Banned: boolean;
6
+ constructor(user: User, channel: string);
7
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UserBannedMessage = void 0;
4
+ const queue_1 = require("@spinajs/queue");
5
+ class UserBannedMessage extends queue_1.QueueMessage {
6
+ constructor(user, channel) {
7
+ super(channel);
8
+ this.Banned = user.IsBanned;
9
+ this.Uuid = user.Uuid;
10
+ }
11
+ }
12
+ exports.UserBannedMessage = UserBannedMessage;
13
+ //# sourceMappingURL=UserBanned.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserBanned.js","sourceRoot":"","sources":["../../src/messages/UserBanned.ts"],"names":[],"mappings":";;;AAAA,0CAA8C;AAE9C,MAAa,iBAAkB,SAAQ,oBAAY;IAKjD,YAAY,IAAU,EAAE,OAAe;QACrC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACxB,CAAC;CACF;AAXD,8CAWC"}
@@ -0,0 +1,4 @@
1
+ import { QueryBuilder, QueryMiddleware } from '@spinajs/orm';
2
+ export declare class RbacModelPermissionMiddleware extends QueryMiddleware {
3
+ afterQueryCreation(builder: QueryBuilder): void;
4
+ }
@@ -0,0 +1,23 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.RbacModelPermissionMiddleware = void 0;
10
+ const di_1 = require("@spinajs/di");
11
+ const orm_1 = require("@spinajs/orm");
12
+ let RbacModelPermissionMiddleware = class RbacModelPermissionMiddleware extends orm_1.QueryMiddleware {
13
+ afterQueryCreation(builder) {
14
+ if (builder instanceof orm_1.SelectQueryBuilder) {
15
+ //builder.Model.
16
+ }
17
+ }
18
+ };
19
+ RbacModelPermissionMiddleware = __decorate([
20
+ (0, di_1.Injectable)(orm_1.QueryMiddleware)
21
+ ], RbacModelPermissionMiddleware);
22
+ exports.RbacModelPermissionMiddleware = RbacModelPermissionMiddleware;
23
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":";;;;;;;;;AAAA,oCAAyC;AACzC,sCAAiF;AAGjF,IAAa,6BAA6B,GAA1C,MAAa,6BAA8B,SAAQ,qBAAe;IAChE,kBAAkB,CAAC,OAAqB;QACtC,IAAI,OAAO,YAAY,wBAAkB,EAAE;YACzC,gBAAgB;SACjB;IACH,CAAC;CACF,CAAA;AANY,6BAA6B;IADzC,IAAA,eAAU,EAAC,qBAAe,CAAC;GACf,6BAA6B,CAMzC;AANY,sEAA6B"}
@@ -13,20 +13,36 @@ let RBACInitial_2022_06_28_01_13_00 = class RBACInitial_2022_06_28_01_13_00 exte
13
13
  async up(connection) {
14
14
  await connection.schema().createTable('users', (table) => {
15
15
  table.int('Id').primaryKey().autoIncrement();
16
+ table.uuid('Uuid').notNull();
16
17
  table.string('Email', 64).unique().notNull();
17
18
  table.string('Password', 128).notNull();
18
19
  table.string('Login', 64).notNull();
19
- table.string('Role', 256).notNull();
20
+ table.string('Role', 256).notNull().default().value('guest');
21
+ table.boolean('IsBanned').notNull().default().value(0);
22
+ table.boolean('IsActive').notNull().default().value(0);
20
23
  table.dateTime('RegisteredAt');
21
24
  table.dateTime('CreatedAt').notNull().default().dateTime();
22
25
  table.dateTime('DeletedAt');
26
+ table.dateTime('LastLoginAt');
23
27
  });
24
28
  await connection.schema().createTable('users_metadata', (table) => {
25
29
  table.string('Key', 255).notNull();
30
+ table.enum('Type', ['number', 'float', 'string', 'json', 'boolean', 'datetime']).notNull();
26
31
  table.text('Value').notNull();
27
32
  table.int('user_id').notNull();
28
33
  table.foreignKey('user_id').references('users', 'Id').cascade();
29
34
  });
35
+ await connection.schema().createTable('user_actions', (table) => {
36
+ table.int('Id').primaryKey().autoIncrement();
37
+ table.string('Action', 255).notNull();
38
+ table.boolean('Persistent').notNull().default().value(0);
39
+ table.int('ResourceId');
40
+ table.text('Data');
41
+ table.dateTime('CreatedAt').notNull().default().dateTime();
42
+ table.int('user_id').notNull();
43
+ table.foreignKey('user_id').references('users', 'Id').cascade();
44
+ });
45
+ await connection.index().unique().table('users').name('user_uuid_idx').columns(['Uuid']);
30
46
  await connection.index().unique().table('users_metadata').name('owner_user_meta_key_idx').columns(['user_id', 'Key']);
31
47
  await connection.index().unique().table('users').name('user_login_idx').columns(['Login']);
32
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RBACInitial_2022_06_28_01_13_00.js","sourceRoot":"","sources":["../../src/migrations/RBACInitial_2022_06_28_01_13_00.ts"],"names":[],"mappings":";;;;;;;;;AAAA,sDAAsD;AACtD,sCAAkE;AAGlE,IAAa,+BAA+B,GAA5C,MAAa,+BAAgC,SAAQ,kBAAY;IACxD,KAAK,CAAC,EAAE,CAAC,UAAqB;QACnC,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YACvD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC,aAAa,EAAE,CAAC;YAC7C,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;YAC7C,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;YACxC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YACpC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;YACpC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YAC/B,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC;YAC3D,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC,WAAW,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE;YAChE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;YAC9B,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;YAC/B,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;QACtH,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED,qCAAqC;IACrC,gEAAgE;IACzD,KAAK,CAAC,IAAI,CAAC,WAAsB,IAAkB,CAAC;CAC5D,CAAA;AA3BY,+BAA+B;IAD3C,IAAA,eAAS,EAAC,SAAS,CAAC;GACR,+BAA+B,CA2B3C;AA3BY,0EAA+B"}
1
+ {"version":3,"file":"RBACInitial_2022_06_28_01_13_00.js","sourceRoot":"","sources":["../../src/migrations/RBACInitial_2022_06_28_01_13_00.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,44 @@
1
+ import { ISelectQueryBuilder } from './../../../orm/lib/interfaces.d';
1
2
  import { DateTime } from 'luxon';
2
- import { ModelBase, Relation } from '@spinajs/orm';
3
+ import { ModelBase, Relation, OneToManyRelationList, QueryScope } from '@spinajs/orm';
3
4
  import { UserMetadata } from './UserMetadata';
5
+ import { UserAction } from './UserTimeline';
6
+ declare class UserMetadataRelation extends OneToManyRelationList<UserMetadata, User> {
7
+ /**
8
+ *
9
+ * Checks if metadata exists, its DB first, it will only check DB for existence
10
+ *
11
+ * @param key - key to find
12
+ * @returns {true|false}
13
+ */
14
+ exists(key: string | RegExp): Promise<boolean>;
15
+ /**
16
+ *
17
+ * Deletes meta from DB
18
+ *
19
+ * @param key - meta key do delete or regexp
20
+ */
21
+ delete(key: string | RegExp): Promise<void>;
22
+ [index: string]: any;
23
+ }
24
+ export declare class UserQueryScopes implements QueryScope {
25
+ /**
26
+ *
27
+ * Fetch users that are not banned, are active & email confirmed, not deleted
28
+ *
29
+ */
30
+ isActiveUser(this: ISelectQueryBuilder<User>): ISelectQueryBuilder<User>;
31
+ }
4
32
  /**
5
- * Base modele for users used by ACL
33
+ * Base model for users used by auth and ACL system
6
34
  *
7
35
  * To add / extend fields simply extend this model and register as default user model in ACL service
8
36
  */
9
37
  export declare class User extends ModelBase {
10
38
  protected _hidden: string[];
39
+ static readonly _queryScopes: UserQueryScopes;
11
40
  Id: number;
41
+ Uuid: string;
12
42
  Email: string;
13
43
  /**
14
44
  * Hashed password for user
@@ -34,9 +64,17 @@ export declare class User extends ModelBase {
34
64
  * User deletion date
35
65
  */
36
66
  DeletedAt: DateTime;
67
+ LastLoginAt: DateTime;
68
+ IsBanned: boolean;
69
+ /**
70
+ * Account is fully active (eg. passed registration)
71
+ */
72
+ IsActive: boolean;
37
73
  /**
38
74
  * User additional information. Can be anything
39
75
  */
40
- Metadata: Relation<UserMetadata>;
76
+ Metadata: UserMetadataRelation;
77
+ Actions: Relation<UserAction, User>;
41
78
  can(resource: string, permission: string): any;
42
79
  }
80
+ export {};
@@ -9,42 +9,177 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.User = void 0;
12
+ exports.User = exports.UserQueryScopes = void 0;
13
13
  const luxon_1 = require("luxon");
14
14
  const orm_1 = require("@spinajs/orm");
15
15
  const di_1 = require("@spinajs/di");
16
16
  const UserMetadata_1 = require("./UserMetadata");
17
+ const UserTimeline_1 = require("./UserTimeline");
18
+ class UserMetadataRelation extends orm_1.OneToManyRelationList {
19
+ /**
20
+ *
21
+ * Checks if metadata exists, its DB first, it will only check DB for existence
22
+ *
23
+ * @param key - key to find
24
+ * @returns {true|false}
25
+ */
26
+ async exists(key) {
27
+ let result = null;
28
+ if (key instanceof RegExp) {
29
+ result = await UserMetadata_1.UserMetadata.where({
30
+ User: this.owner,
31
+ }).andWhere('Key', 'rlike', key.source);
32
+ }
33
+ else {
34
+ result = await UserMetadata_1.UserMetadata.where({
35
+ User: this.owner,
36
+ }).andWhere('Key', key);
37
+ }
38
+ return result !== null && result !== undefined;
39
+ }
40
+ /**
41
+ *
42
+ * Deletes meta from DB
43
+ *
44
+ * @param key - meta key do delete or regexp
45
+ */
46
+ async delete(key) {
47
+ if (key instanceof RegExp) {
48
+ await UserMetadata_1.UserMetadata.destroy()
49
+ .where({
50
+ User: this.owner,
51
+ })
52
+ .andWhere('Key', 'rlike', key.source);
53
+ }
54
+ else {
55
+ await UserMetadata_1.UserMetadata.destroy().where({
56
+ Key: key,
57
+ User: this.owner,
58
+ });
59
+ }
60
+ // refresh meta
61
+ await this.populate();
62
+ }
63
+ }
64
+ function UserMetadataRelationFactory(model, desc, container) {
65
+ const repository = container.resolve(UserMetadataRelation, [model, desc.TargetModel, desc, []]);
66
+ const proxy = {
67
+ set: (target, prop, value) => {
68
+ // if we try to call method or prop that exists return it
69
+ if (target[prop]) {
70
+ return (target[prop] = value);
71
+ }
72
+ else {
73
+ const userMeta = new UserMetadata_1.UserMetadata();
74
+ userMeta.User.Value = model;
75
+ userMeta.Key = prop;
76
+ userMeta.Value = value;
77
+ UserMetadata_1.UserMetadata.insert(userMeta, orm_1.InsertBehaviour.InsertOrUpdate);
78
+ let meta = target.find((x) => x.Value === prop);
79
+ if (meta) {
80
+ meta.Value = value;
81
+ }
82
+ else {
83
+ target.push(userMeta);
84
+ }
85
+ }
86
+ return true;
87
+ },
88
+ get: (target, prop) => {
89
+ // if we try to call method or prop that exists return it
90
+ if (target[prop]) {
91
+ return target[prop];
92
+ }
93
+ else {
94
+ // check for metadata entries
95
+ const found = target.find((x) => x.Key === prop);
96
+ if (found) {
97
+ return found.Value;
98
+ }
99
+ // if not found try to obtain it
100
+ // or return null
101
+ return UserMetadata_1.UserMetadata.where({
102
+ User: model,
103
+ Key: prop,
104
+ })
105
+ .first()
106
+ .then((res) => {
107
+ if (res) {
108
+ // add to this repo for cache
109
+ target.push(res);
110
+ }
111
+ return res;
112
+ });
113
+ }
114
+ },
115
+ };
116
+ return new Proxy(repository, proxy);
117
+ }
118
+ class UserQueryScopes {
119
+ /**
120
+ *
121
+ * Fetch users that are not banned, are active & email confirmed, not deleted
122
+ *
123
+ */
124
+ isActiveUser() {
125
+ return this.where({
126
+ IsBanned: false,
127
+ IsActive: true,
128
+ DeletedAt: null,
129
+ });
130
+ }
131
+ }
132
+ exports.UserQueryScopes = UserQueryScopes;
17
133
  /**
18
- * Base modele for users used by ACL
134
+ * Base model for users used by auth and ACL system
19
135
  *
20
136
  * To add / extend fields simply extend this model and register as default user model in ACL service
21
137
  */
22
138
  let User = class User extends orm_1.ModelBase {
23
139
  constructor() {
24
140
  super(...arguments);
25
- this._hidden = ['Password'];
141
+ this._hidden = ['Password', 'Id'];
26
142
  }
27
143
  can(resource, permission) {
28
144
  const ac = di_1.DI.get('AccessControl');
29
145
  return ac.can(this.Role)[permission](resource);
30
146
  }
31
147
  };
148
+ User._queryScopes = new UserQueryScopes();
32
149
  __decorate([
33
150
  (0, orm_1.Primary)(),
34
151
  __metadata("design:type", Number)
35
152
  ], User.prototype, "Id", void 0);
153
+ __decorate([
154
+ (0, orm_1.Uuid)(),
155
+ __metadata("design:type", String)
156
+ ], User.prototype, "Uuid", void 0);
36
157
  __decorate([
37
158
  (0, orm_1.CreatedAt)(),
38
159
  __metadata("design:type", luxon_1.DateTime)
39
160
  ], User.prototype, "CreatedAt", void 0);
161
+ __decorate([
162
+ (0, orm_1.DateTime)(),
163
+ __metadata("design:type", luxon_1.DateTime)
164
+ ], User.prototype, "RegisteredAt", void 0);
40
165
  __decorate([
41
166
  (0, orm_1.SoftDelete)(),
42
167
  __metadata("design:type", luxon_1.DateTime)
43
168
  ], User.prototype, "DeletedAt", void 0);
44
169
  __decorate([
45
- (0, orm_1.HasMany)(UserMetadata_1.UserMetadata),
46
- __metadata("design:type", orm_1.Relation)
170
+ (0, orm_1.DateTime)(),
171
+ __metadata("design:type", luxon_1.DateTime)
172
+ ], User.prototype, "LastLoginAt", void 0);
173
+ __decorate([
174
+ (0, orm_1.HasMany)(UserMetadata_1.UserMetadata, {
175
+ factory: UserMetadataRelationFactory,
176
+ }),
177
+ __metadata("design:type", UserMetadataRelation)
47
178
  ], User.prototype, "Metadata", void 0);
179
+ __decorate([
180
+ (0, orm_1.HasMany)(UserTimeline_1.UserAction),
181
+ __metadata("design:type", orm_1.Relation)
182
+ ], User.prototype, "Actions", void 0);
48
183
  User = __decorate([
49
184
  (0, orm_1.Connection)('default'),
50
185
  (0, orm_1.Model)('users')
@@ -1 +1 @@
1
- {"version":3,"file":"User.js","sourceRoot":"","sources":["../../src/models/User.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iCAAiC;AACjC,sCAA+G;AAE/G,oCAAiC;AACjC,iDAA8C;AAE9C;;;;GAIG;AAGH,IAAa,IAAI,GAAjB,MAAa,IAAK,SAAQ,eAAS;IAAnC;;QACY,YAAO,GAAa,CAAC,UAAU,CAAC,CAAC;IAiD7C,CAAC;IAJQ,GAAG,CAAC,QAAgB,EAAE,UAAkB;QAC7C,MAAM,EAAE,GAAG,OAAE,CAAC,GAAG,CAAgB,eAAe,CAAC,CAAC;QAClD,OAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAS,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC1D,CAAC;CACF,CAAA;AA9CC;IADC,IAAA,aAAO,GAAE;;gCACQ;AAuBlB;IADC,IAAA,eAAS,GAAE;8BACM,gBAAQ;uCAAC;AAW3B;IADC,IAAA,gBAAU,GAAE;8BACK,gBAAQ;uCAAC;AAM3B;IADC,IAAA,aAAO,EAAC,2BAAY,CAAC;8BACL,cAAQ;sCAAe;AA5C7B,IAAI;IAFhB,IAAA,gBAAU,EAAC,SAAS,CAAC;IACrB,IAAA,WAAK,EAAC,OAAO,CAAC;GACF,IAAI,CAkDhB;AAlDY,oBAAI"}
1
+ {"version":3,"file":"User.js","sourceRoot":"","sources":["../../src/models/User.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import { ModelBase, SingleRelation } from '@spinajs/orm';
2
2
  import type { User } from './User';
3
- export declare class UserMetadata extends ModelBase {
3
+ export declare class UserMetadata extends ModelBase<UserMetadata> {
4
4
  Id: number;
5
5
  Key: string;
6
- Value: string;
6
+ Type: 'number' | 'float' | 'string' | 'json' | 'boolean' | 'datetime';
7
+ Value: any;
7
8
  User: SingleRelation<User>;
8
9
  }
@@ -17,6 +17,10 @@ __decorate([
17
17
  (0, orm_1.Primary)(),
18
18
  __metadata("design:type", Number)
19
19
  ], UserMetadata.prototype, "Id", void 0);
20
+ __decorate([
21
+ (0, orm_1.UniversalConverter)('Type'),
22
+ __metadata("design:type", Object)
23
+ ], UserMetadata.prototype, "Value", void 0);
20
24
  __decorate([
21
25
  (0, orm_1.BelongsTo)('User'),
22
26
  __metadata("design:type", orm_1.SingleRelation)
@@ -1 +1 @@
1
- {"version":3,"file":"UserMetadata.js","sourceRoot":"","sources":["../../src/models/UserMetadata.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,sCAAgG;AAKhG,IAAa,YAAY,GAAzB,MAAa,YAAa,SAAQ,eAAS;CAU1C,CAAA;AARC;IADC,IAAA,aAAO,GAAE;;wCACQ;AAOlB;IADC,IAAA,eAAS,EAAC,MAAM,CAAC;8BACL,oBAAc;0CAAO;AATvB,YAAY;IAFxB,IAAA,gBAAU,EAAC,SAAS,CAAC;IACrB,IAAA,WAAK,EAAC,gBAAgB,CAAC;GACX,YAAY,CAUxB;AAVY,oCAAY"}
1
+ {"version":3,"file":"UserMetadata.js","sourceRoot":"","sources":["../../src/models/UserMetadata.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,sCAAoH;AAMpH,IAAa,YAAY,GAAzB,MAAa,YAAa,SAAQ,eAAuB;CAaxD,CAAA;AAXC;IADC,IAAA,aAAO,GAAE;;wCACQ;AAOlB;IADC,IAAA,wBAAkB,EAAC,MAAM,CAAC;;2CACT;AAGlB;IADC,IAAA,eAAS,EAAC,MAAM,CAAC;8BACL,oBAAc;0CAAO;AAZvB,YAAY;IAFxB,IAAA,gBAAU,EAAC,SAAS,CAAC;IACrB,IAAA,WAAK,EAAC,gBAAgB,CAAC;GACX,YAAY,CAaxB;AAbY,oCAAY"}
@@ -0,0 +1,28 @@
1
+ import { ModelBase, SingleRelation } from '@spinajs/orm';
2
+ import { DateTime } from 'luxon';
3
+ import type { User } from './User';
4
+ /**
5
+ * Timeline table for storing user actions / interactions
6
+ * eg. login attempts, failed logins, resource deletions, alterations etc.
7
+ */
8
+ export declare class UserAction extends ModelBase<UserAction> {
9
+ Id: number;
10
+ User: SingleRelation<User>;
11
+ Action: string;
12
+ Data: string;
13
+ /**
14
+ * True if this timeline event is persistent
15
+ * eg. we clear out login attempts older than 5 days
16
+ * but we want to save for eg. events related to payments
17
+ */
18
+ Persistent: boolean;
19
+ /**
20
+ * If action is performed on some kind of resource
21
+ * Here is stored this resource identifier or primary key in db
22
+ */
23
+ ResourceId: number;
24
+ asNumber(): number;
25
+ asFloat(): number;
26
+ asJsonObject<T = {}>(): T;
27
+ CreatedAt: DateTime;
28
+ }