@flusys/nestjs-auth 1.0.0-beta → 1.1.0-beta

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 (55) hide show
  1. package/cjs/config/auth.constants.js +4 -0
  2. package/cjs/controllers/authentication.controller.js +167 -5
  3. package/cjs/controllers/user.controller.js +151 -0
  4. package/cjs/dtos/authentication.dto.js +106 -3
  5. package/cjs/entities/index.js +5 -1
  6. package/cjs/entities/pending-registration.entity.js +125 -0
  7. package/cjs/entities/user-token.entity.js +129 -0
  8. package/cjs/interfaces/auth-email-provider.interface.js +45 -0
  9. package/cjs/interfaces/index.js +2 -0
  10. package/cjs/interfaces/user-enricher.interface.js +4 -0
  11. package/cjs/modules/auth.module.js +8 -2
  12. package/cjs/services/auth-config.service.js +4 -0
  13. package/cjs/services/auth-datasource.provider.js +4 -2
  14. package/cjs/services/auth-email.service.js +452 -0
  15. package/cjs/services/authentication.service.js +156 -37
  16. package/cjs/services/index.js +1 -0
  17. package/cjs/services/user.service.js +147 -11
  18. package/config/auth.constants.d.ts +1 -0
  19. package/controllers/authentication.controller.d.ts +13 -9
  20. package/controllers/user.controller.d.ts +27 -0
  21. package/dtos/authentication.dto.d.ts +21 -3
  22. package/dtos/user.dto.d.ts +1 -0
  23. package/entities/index.d.ts +7 -3
  24. package/entities/pending-registration.entity.d.ts +17 -0
  25. package/entities/user-token.entity.d.ts +15 -0
  26. package/fesm/config/auth.constants.js +11 -0
  27. package/fesm/controllers/authentication.controller.js +168 -6
  28. package/fesm/controllers/user.controller.js +151 -0
  29. package/fesm/dtos/authentication.dto.js +92 -3
  30. package/fesm/entities/index.js +7 -1
  31. package/fesm/entities/pending-registration.entity.js +115 -0
  32. package/fesm/entities/user-token.entity.js +113 -0
  33. package/fesm/interfaces/auth-email-provider.interface.js +38 -0
  34. package/fesm/interfaces/authentication.interface.js +1 -1
  35. package/fesm/interfaces/index.js +2 -0
  36. package/fesm/interfaces/user-enricher.interface.js +26 -0
  37. package/fesm/modules/auth.module.js +9 -3
  38. package/fesm/services/auth-config.service.js +4 -0
  39. package/fesm/services/auth-datasource.provider.js +4 -2
  40. package/fesm/services/auth-email.service.js +401 -0
  41. package/fesm/services/authentication.service.js +156 -37
  42. package/fesm/services/index.js +1 -0
  43. package/fesm/services/user.service.js +149 -13
  44. package/interfaces/auth-email-provider.interface.d.ts +6 -0
  45. package/interfaces/auth-module-options.interface.d.ts +4 -1
  46. package/interfaces/authentication.interface.d.ts +14 -0
  47. package/interfaces/index.d.ts +2 -0
  48. package/interfaces/user-enricher.interface.d.ts +67 -0
  49. package/interfaces/user.interface.d.ts +1 -0
  50. package/package.json +3 -3
  51. package/services/auth-config.service.d.ts +1 -0
  52. package/services/auth-email.service.d.ts +50 -0
  53. package/services/authentication.service.d.ts +16 -4
  54. package/services/index.d.ts +1 -0
  55. package/services/user.service.d.ts +16 -3
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "PendingRegistration", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return PendingRegistration;
9
+ }
10
+ });
11
+ const _typeorm = require("typeorm");
12
+ function _define_property(obj, key, value) {
13
+ if (key in obj) {
14
+ Object.defineProperty(obj, key, {
15
+ value: value,
16
+ enumerable: true,
17
+ configurable: true,
18
+ writable: true
19
+ });
20
+ } else {
21
+ obj[key] = value;
22
+ }
23
+ return obj;
24
+ }
25
+ function _ts_decorate(decorators, target, key, desc) {
26
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
27
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
28
+ 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;
29
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
30
+ }
31
+ function _ts_metadata(k, v) {
32
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
33
+ }
34
+ let PendingRegistration = class PendingRegistration {
35
+ constructor(){
36
+ _define_property(this, "id", void 0);
37
+ _define_property(this, "email", void 0);
38
+ _define_property(this, "name", void 0);
39
+ _define_property(this, "phone", void 0);
40
+ _define_property(this, "passwordHash", void 0);
41
+ _define_property(this, "token", void 0);
42
+ _define_property(this, "expiresAt", void 0);
43
+ _define_property(this, "companyData", void 0);
44
+ _define_property(this, "createdAt", void 0);
45
+ }
46
+ };
47
+ _ts_decorate([
48
+ (0, _typeorm.PrimaryGeneratedColumn)('uuid'),
49
+ _ts_metadata("design:type", String)
50
+ ], PendingRegistration.prototype, "id", void 0);
51
+ _ts_decorate([
52
+ (0, _typeorm.Column)({
53
+ type: 'varchar',
54
+ length: 255
55
+ }),
56
+ _ts_metadata("design:type", String)
57
+ ], PendingRegistration.prototype, "email", void 0);
58
+ _ts_decorate([
59
+ (0, _typeorm.Column)({
60
+ type: 'varchar',
61
+ length: 255,
62
+ nullable: true
63
+ }),
64
+ _ts_metadata("design:type", Object)
65
+ ], PendingRegistration.prototype, "name", void 0);
66
+ _ts_decorate([
67
+ (0, _typeorm.Column)({
68
+ type: 'varchar',
69
+ length: 255,
70
+ nullable: true
71
+ }),
72
+ _ts_metadata("design:type", Object)
73
+ ], PendingRegistration.prototype, "phone", void 0);
74
+ _ts_decorate([
75
+ (0, _typeorm.Column)({
76
+ type: 'text',
77
+ name: 'passwordHash'
78
+ }),
79
+ _ts_metadata("design:type", String)
80
+ ], PendingRegistration.prototype, "passwordHash", void 0);
81
+ _ts_decorate([
82
+ (0, _typeorm.Column)({
83
+ type: 'varchar',
84
+ length: 64
85
+ }),
86
+ _ts_metadata("design:type", String)
87
+ ], PendingRegistration.prototype, "token", void 0);
88
+ _ts_decorate([
89
+ (0, _typeorm.Column)({
90
+ type: 'timestamp',
91
+ name: 'expires_at'
92
+ }),
93
+ _ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
94
+ ], PendingRegistration.prototype, "expiresAt", void 0);
95
+ _ts_decorate([
96
+ (0, _typeorm.Column)({
97
+ type: 'json',
98
+ nullable: true,
99
+ name: 'company_data'
100
+ }),
101
+ _ts_metadata("design:type", Object)
102
+ ], PendingRegistration.prototype, "companyData", void 0);
103
+ _ts_decorate([
104
+ (0, _typeorm.CreateDateColumn)({
105
+ type: 'timestamp',
106
+ name: 'created_at'
107
+ }),
108
+ _ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
109
+ ], PendingRegistration.prototype, "createdAt", void 0);
110
+ PendingRegistration = _ts_decorate([
111
+ (0, _typeorm.Entity)('pending_registrations'),
112
+ (0, _typeorm.Index)('IDX_pending_reg_email', [
113
+ 'email'
114
+ ], {
115
+ unique: true
116
+ }),
117
+ (0, _typeorm.Index)('IDX_pending_reg_token', [
118
+ 'token'
119
+ ], {
120
+ unique: true
121
+ }),
122
+ (0, _typeorm.Index)('IDX_pending_reg_expires', [
123
+ 'expiresAt'
124
+ ])
125
+ ], PendingRegistration);
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get TokenType () {
13
+ return TokenType;
14
+ },
15
+ get UserToken () {
16
+ return UserToken;
17
+ }
18
+ });
19
+ const _typeorm = require("typeorm");
20
+ function _define_property(obj, key, value) {
21
+ if (key in obj) {
22
+ Object.defineProperty(obj, key, {
23
+ value: value,
24
+ enumerable: true,
25
+ configurable: true,
26
+ writable: true
27
+ });
28
+ } else {
29
+ obj[key] = value;
30
+ }
31
+ return obj;
32
+ }
33
+ function _ts_decorate(decorators, target, key, desc) {
34
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
35
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
36
+ 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;
37
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
38
+ }
39
+ function _ts_metadata(k, v) {
40
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
41
+ }
42
+ var TokenType = /*#__PURE__*/ function(TokenType) {
43
+ TokenType["PASSWORD_RESET"] = "password_reset";
44
+ TokenType["EMAIL_VERIFICATION"] = "email_verification";
45
+ TokenType["EMAIL_CHANGE"] = "email_change";
46
+ return TokenType;
47
+ }({});
48
+ let UserToken = class UserToken {
49
+ constructor(){
50
+ _define_property(this, "id", void 0);
51
+ _define_property(this, "userId", void 0);
52
+ _define_property(this, "type", void 0);
53
+ _define_property(this, "token", void 0);
54
+ _define_property(this, "expiresAt", void 0);
55
+ _define_property(this, "usedAt", void 0);
56
+ _define_property(this, "metadata", void 0);
57
+ _define_property(this, "createdAt", void 0);
58
+ }
59
+ };
60
+ _ts_decorate([
61
+ (0, _typeorm.PrimaryGeneratedColumn)('uuid'),
62
+ _ts_metadata("design:type", String)
63
+ ], UserToken.prototype, "id", void 0);
64
+ _ts_decorate([
65
+ (0, _typeorm.Column)({
66
+ type: 'uuid',
67
+ name: 'user_id'
68
+ }),
69
+ _ts_metadata("design:type", String)
70
+ ], UserToken.prototype, "userId", void 0);
71
+ _ts_decorate([
72
+ (0, _typeorm.Column)({
73
+ type: 'varchar',
74
+ length: 32
75
+ }),
76
+ _ts_metadata("design:type", String)
77
+ ], UserToken.prototype, "type", void 0);
78
+ _ts_decorate([
79
+ (0, _typeorm.Column)({
80
+ type: 'varchar',
81
+ length: 64
82
+ }),
83
+ _ts_metadata("design:type", String)
84
+ ], UserToken.prototype, "token", void 0);
85
+ _ts_decorate([
86
+ (0, _typeorm.Column)({
87
+ type: 'timestamp',
88
+ name: 'expires_at'
89
+ }),
90
+ _ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
91
+ ], UserToken.prototype, "expiresAt", void 0);
92
+ _ts_decorate([
93
+ (0, _typeorm.Column)({
94
+ type: 'timestamp',
95
+ name: 'used_at',
96
+ nullable: true
97
+ }),
98
+ _ts_metadata("design:type", Object)
99
+ ], UserToken.prototype, "usedAt", void 0);
100
+ _ts_decorate([
101
+ (0, _typeorm.Column)({
102
+ type: 'varchar',
103
+ length: 255,
104
+ nullable: true
105
+ }),
106
+ _ts_metadata("design:type", Object)
107
+ ], UserToken.prototype, "metadata", void 0);
108
+ _ts_decorate([
109
+ (0, _typeorm.CreateDateColumn)({
110
+ type: 'timestamp',
111
+ name: 'created_at'
112
+ }),
113
+ _ts_metadata("design:type", typeof Date === "undefined" ? Object : Date)
114
+ ], UserToken.prototype, "createdAt", void 0);
115
+ UserToken = _ts_decorate([
116
+ (0, _typeorm.Entity)('user_tokens'),
117
+ (0, _typeorm.Index)('IDX_user_token_token', [
118
+ 'token'
119
+ ], {
120
+ unique: true
121
+ }),
122
+ (0, _typeorm.Index)('IDX_user_token_user_type', [
123
+ 'userId',
124
+ 'type'
125
+ ]),
126
+ (0, _typeorm.Index)('IDX_user_token_expires', [
127
+ 'expiresAt'
128
+ ])
129
+ ], UserToken);
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Auth Email Provider Interface
3
+ *
4
+ * This interface defines the contract for email sending in the auth module.
5
+ * It allows auth to work independently of the email module.
6
+ *
7
+ * To use email features in auth:
8
+ * 1. Provide AUTH_EMAIL_PROVIDER in your app module
9
+ * 2. Implement IAuthEmailProvider using EmailSendService from nestjs-email
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * // In app.module.ts or a provider file
14
+ * {
15
+ * provide: AUTH_EMAIL_PROVIDER,
16
+ * useFactory: (emailSendService: EmailSendService) => ({
17
+ * sendPasswordResetEmail: async (email, token, resetUrl) => {
18
+ * await emailSendService.sendTemplateEmail({
19
+ * templateSlug: 'password-reset',
20
+ * to: email,
21
+ * variables: { resetUrl, token },
22
+ * });
23
+ * },
24
+ * sendVerificationEmail: async (email, token, verifyUrl) => {
25
+ * await emailSendService.sendTemplateEmail({
26
+ * templateSlug: 'email-verification',
27
+ * to: email,
28
+ * variables: { verifyUrl, token },
29
+ * });
30
+ * },
31
+ * }),
32
+ * inject: [EmailSendService],
33
+ * }
34
+ * ```
35
+ */ "use strict";
36
+ Object.defineProperty(exports, "__esModule", {
37
+ value: true
38
+ });
39
+ Object.defineProperty(exports, "AUTH_EMAIL_PROVIDER", {
40
+ enumerable: true,
41
+ get: function() {
42
+ return AUTH_EMAIL_PROVIDER;
43
+ }
44
+ });
45
+ const AUTH_EMAIL_PROVIDER = 'AUTH_EMAIL_PROVIDER';
@@ -3,9 +3,11 @@ Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
5
  _export_star(require("./authentication.interface"), exports);
6
+ _export_star(require("./auth-email-provider.interface"), exports);
6
7
  _export_star(require("./company-branch.interface"), exports);
7
8
  _export_star(require("./company.interface"), exports);
8
9
  _export_star(require("./user.interface"), exports);
10
+ _export_star(require("./user-enricher.interface"), exports);
9
11
  _export_star(require("./auth-module-options.interface"), exports);
10
12
  function _export_star(from, to) {
11
13
  Object.keys(from).forEach(function(k) {
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
@@ -34,7 +34,7 @@ let AuthModule = class AuthModule {
34
34
  return this.buildDynamicModule(options);
35
35
  }
36
36
  static forRootAsync(asyncOptions) {
37
- const { global = false, includeController = true, bootstrapAppConfig: { enableCompanyFeature } = {}, imports: externalImports = [] } = asyncOptions;
37
+ const { global = false, includeController = true, bootstrapAppConfig: { enableCompanyFeature } = {}, imports: externalImports = [], providers: additionalProviders = [] } = asyncOptions;
38
38
  const asyncProviders = this.createAsyncProviders(asyncOptions);
39
39
  // Build imports
40
40
  const imports = [
@@ -61,6 +61,7 @@ let AuthModule = class AuthModule {
61
61
  // Build providers
62
62
  const providers = [
63
63
  ...asyncProviders,
64
+ ...additionalProviders,
64
65
  // Config & Infrastructure
65
66
  _authconfigservice.AuthConfigService,
66
67
  _authdatasourceprovider.AuthDataSourceProvider,
@@ -68,6 +69,7 @@ let AuthModule = class AuthModule {
68
69
  _jwtstrategy.JwtStrategy,
69
70
  _guards.JwtAuthGuard,
70
71
  _services.AuthenticationService,
72
+ _services.AuthEmailService,
71
73
  // Interceptors
72
74
  _settokeninterceptor.SetToken,
73
75
  _cleartokeninterceptor.ClearToken,
@@ -87,6 +89,7 @@ let AuthModule = class AuthModule {
87
89
  _jwtstrategy.JwtStrategy,
88
90
  _guards.JwtAuthGuard,
89
91
  _services.AuthenticationService,
92
+ _services.AuthEmailService,
90
93
  _services.UserService
91
94
  ];
92
95
  if (enableCompanyFeature) {
@@ -102,7 +105,7 @@ let AuthModule = class AuthModule {
102
105
  };
103
106
  }
104
107
  static buildDynamicModule(options) {
105
- const { bootstrapAppConfig: { enableCompanyFeature } = {}, includeController = true, global = false } = options;
108
+ const { bootstrapAppConfig: { enableCompanyFeature } = {}, includeController = true, global = false, providers: additionalProviders = [] } = options;
106
109
  const imports = [
107
110
  _passport.PassportModule.register({
108
111
  defaultStrategy: 'jwt'
@@ -128,6 +131,7 @@ let AuthModule = class AuthModule {
128
131
  provide: _authconstants.AUTH_MODULE_OPTIONS,
129
132
  useValue: options
130
133
  },
134
+ ...additionalProviders,
131
135
  // Config & Infrastructure
132
136
  _authconfigservice.AuthConfigService,
133
137
  _authdatasourceprovider.AuthDataSourceProvider,
@@ -135,6 +139,7 @@ let AuthModule = class AuthModule {
135
139
  _jwtstrategy.JwtStrategy,
136
140
  _guards.JwtAuthGuard,
137
141
  _services.AuthenticationService,
142
+ _services.AuthEmailService,
138
143
  // Interceptors
139
144
  _settokeninterceptor.SetToken,
140
145
  _cleartokeninterceptor.ClearToken,
@@ -153,6 +158,7 @@ let AuthModule = class AuthModule {
153
158
  _jwtstrategy.JwtStrategy,
154
159
  _guards.JwtAuthGuard,
155
160
  _services.AuthenticationService,
161
+ _services.AuthEmailService,
156
162
  _services.UserService
157
163
  ];
158
164
  if (enableCompanyFeature) {
@@ -66,6 +66,10 @@ let AuthConfigService = class AuthConfigService {
66
66
  /** Get refresh token cookie name */ getRefreshTokenCookieName() {
67
67
  return this.config.refreshTokenCookieName ?? 'fsn_refresh_token';
68
68
  }
69
+ // Frontend Configuration
70
+ /** Get frontend URL for email links */ getFrontendUrl() {
71
+ return this.config.frontendUrl;
72
+ }
69
73
  // Database Configuration
70
74
  /** Get default database config */ getDefaultDatabaseConfig() {
71
75
  return this.config.defaultDatabaseConfig ?? this.config.tenantDefaultDatabaseConfig;
@@ -153,9 +153,11 @@ let AuthDataSourceProvider = class AuthDataSourceProvider extends _modules.Multi
153
153
  // Entity Management
154
154
  /** Get auth entities based on company feature flag */ async getAuthEntities(enableCompanyFeature) {
155
155
  const enable = enableCompanyFeature ?? this.getEnableCompanyFeature();
156
- const { Company, CompanyBranch, User, UserCompanyPermission } = await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../entities")));
156
+ const { Company, CompanyBranch, User, UserCompanyPermission, UserToken, PendingRegistration } = await Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../entities")));
157
157
  const coreEntities = [
158
- User
158
+ User,
159
+ UserToken,
160
+ PendingRegistration
159
161
  ];
160
162
  const companyEntities = enable ? [
161
163
  Company,