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

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 (95) hide show
  1. package/README.md +274 -291
  2. package/cjs/config/auth.constants.js +12 -0
  3. package/cjs/controllers/authentication.controller.js +219 -10
  4. package/cjs/controllers/branch.controller.js +44 -1
  5. package/cjs/controllers/company-selection.controller.js +27 -20
  6. package/cjs/controllers/company.controller.js +44 -1
  7. package/cjs/controllers/user-permission.controller.js +40 -25
  8. package/cjs/controllers/user.controller.js +211 -7
  9. package/cjs/dtos/authentication.dto.js +119 -13
  10. package/cjs/dtos/user-permission.dto.js +28 -0
  11. package/cjs/dtos/user.dto.js +19 -4
  12. package/cjs/entities/index.js +5 -1
  13. package/cjs/entities/pending-registration.entity.js +125 -0
  14. package/cjs/entities/user-company-permission.entity.js +0 -6
  15. package/cjs/entities/user-token.entity.js +129 -0
  16. package/cjs/guards/auth-throttler.guard.js +53 -0
  17. package/cjs/interceptors/clear-token.interceptor.js +3 -6
  18. package/cjs/interceptors/set-token.interceptor.js +38 -31
  19. package/cjs/interfaces/auth-email-provider.interface.js +45 -0
  20. package/cjs/interfaces/index.js +2 -0
  21. package/cjs/interfaces/user-enricher.interface.js +4 -0
  22. package/cjs/modules/auth.module.js +8 -20
  23. package/cjs/services/auth-config.service.js +23 -2
  24. package/cjs/services/auth-datasource.provider.js +5 -3
  25. package/cjs/services/auth-email.service.js +471 -0
  26. package/cjs/services/authentication.service.js +169 -77
  27. package/cjs/services/branch.service.js +6 -5
  28. package/cjs/services/company-selection-session.service.js +1 -1
  29. package/cjs/services/index.js +1 -0
  30. package/cjs/services/user-permission.service.js +0 -2
  31. package/cjs/services/user.service.js +213 -34
  32. package/cjs/validators/password.validator.js +45 -0
  33. package/config/auth.constants.d.ts +3 -0
  34. package/controllers/authentication.controller.d.ts +13 -9
  35. package/controllers/company-selection.controller.d.ts +6 -2
  36. package/controllers/user.controller.d.ts +33 -0
  37. package/dtos/authentication.dto.d.ts +21 -3
  38. package/dtos/company-branch.dto.d.ts +0 -1
  39. package/dtos/company.dto.d.ts +0 -1
  40. package/dtos/user-permission.dto.d.ts +4 -0
  41. package/dtos/user.dto.d.ts +1 -2
  42. package/entities/index.d.ts +7 -3
  43. package/entities/pending-registration.entity.d.ts +17 -0
  44. package/entities/user-company-permission.entity.d.ts +0 -2
  45. package/entities/user-token.entity.d.ts +15 -0
  46. package/fesm/config/auth.constants.js +6 -2
  47. package/fesm/controllers/authentication.controller.js +221 -12
  48. package/fesm/controllers/branch.controller.js +45 -2
  49. package/fesm/controllers/company-selection.controller.js +28 -21
  50. package/fesm/controllers/company.controller.js +45 -2
  51. package/fesm/controllers/user-permission.controller.js +41 -26
  52. package/fesm/controllers/user.controller.js +214 -10
  53. package/fesm/dtos/authentication.dto.js +106 -14
  54. package/fesm/dtos/user-permission.dto.js +28 -0
  55. package/fesm/dtos/user.dto.js +20 -5
  56. package/fesm/entities/index.js +7 -1
  57. package/fesm/entities/pending-registration.entity.js +115 -0
  58. package/fesm/entities/user-company-permission.entity.js +0 -6
  59. package/fesm/entities/user-token.entity.js +113 -0
  60. package/fesm/guards/auth-throttler.guard.js +43 -0
  61. package/fesm/interceptors/clear-token.interceptor.js +2 -5
  62. package/fesm/interceptors/set-token.interceptor.js +37 -30
  63. package/fesm/interfaces/auth-email-provider.interface.js +38 -0
  64. package/fesm/interfaces/authentication.interface.js +1 -1
  65. package/fesm/interfaces/index.js +2 -0
  66. package/fesm/interfaces/user-enricher.interface.js +26 -0
  67. package/fesm/modules/auth.module.js +10 -22
  68. package/fesm/services/auth-config.service.js +24 -3
  69. package/fesm/services/auth-datasource.provider.js +6 -4
  70. package/fesm/services/auth-email.service.js +420 -0
  71. package/fesm/services/authentication.service.js +169 -77
  72. package/fesm/services/branch.service.js +6 -5
  73. package/fesm/services/company-selection-session.service.js +1 -1
  74. package/fesm/services/index.js +1 -0
  75. package/fesm/services/user-permission.service.js +1 -3
  76. package/fesm/services/user.service.js +215 -36
  77. package/fesm/validators/password.validator.js +48 -0
  78. package/guards/auth-throttler.guard.d.ts +7 -0
  79. package/interceptors/set-token.interceptor.d.ts +1 -0
  80. package/interfaces/auth-email-provider.interface.d.ts +6 -0
  81. package/interfaces/auth-module-options.interface.d.ts +4 -1
  82. package/interfaces/authentication.interface.d.ts +14 -0
  83. package/interfaces/index.d.ts +2 -0
  84. package/interfaces/user-enricher.interface.d.ts +64 -0
  85. package/interfaces/user.interface.d.ts +1 -0
  86. package/modules/auth.module.d.ts +0 -1
  87. package/package.json +4 -4
  88. package/services/auth-config.service.d.ts +5 -1
  89. package/services/auth-email.service.d.ts +51 -0
  90. package/services/authentication.service.d.ts +16 -11
  91. package/services/company-selection-session.service.d.ts +1 -1
  92. package/services/index.d.ts +1 -0
  93. package/services/user-permission.service.d.ts +0 -1
  94. package/services/user.service.d.ts +19 -3
  95. package/validators/password.validator.d.ts +10 -0
@@ -1,14 +1,13 @@
1
1
  import { JwtService } from '@nestjs/jwt';
2
- import { Repository } from 'typeorm';
3
2
  import { AuthConfigService } from './auth-config.service';
4
3
  import { AuthDataSourceProvider } from './auth-datasource.provider';
5
4
  import { RegistrationDto } from '../dtos/authentication.dto';
6
5
  import { HybridCache } from '@flusys/nestjs-shared/classes';
7
- import { LoginResponse, LoginResponseRequiresSelection, MeResponse } from '../interfaces/authentication.interface';
6
+ import { LoginResponse, LoginResponseRequiresEmailVerification, LoginResponseRequiresSelection, MeResponse, RegistrationResponse } from '../interfaces/authentication.interface';
7
+ import { AuthEmailService } from './auth-email.service';
8
8
  import { CompanyBranch } from '../entities/company-branch.entity';
9
9
  import { Company } from '../entities/company.entity';
10
- import { UserCompanyPermission } from '../entities/user-company-permission.entity';
11
- import { User } from '../entities/user.entity';
10
+ import { PendingRegistration } from '../entities/pending-registration.entity';
12
11
  import { CompanySelectionSessionService } from './company-selection-session.service';
13
12
  export declare class AuthenticationService {
14
13
  private readonly jwtService;
@@ -16,20 +15,24 @@ export declare class AuthenticationService {
16
15
  private readonly cacheManager?;
17
16
  private readonly dataSourceProvider?;
18
17
  private readonly sessionService?;
19
- private readonly injectedUserRepository?;
20
- private readonly injectedPermissionRepository?;
21
- private readonly injectedCompanyRepository?;
22
- private readonly injectedBranchRepository?;
18
+ private readonly authEmailService?;
23
19
  private readonly logger;
24
- constructor(jwtService: JwtService, authConfig: AuthConfigService, cacheManager?: HybridCache, dataSourceProvider?: AuthDataSourceProvider, sessionService?: CompanySelectionSessionService, injectedUserRepository?: Repository<User>, injectedPermissionRepository?: Repository<UserCompanyPermission>, injectedCompanyRepository?: Repository<Company>, injectedBranchRepository?: Repository<CompanyBranch>);
20
+ constructor(jwtService: JwtService, authConfig: AuthConfigService, cacheManager?: HybridCache, dataSourceProvider?: AuthDataSourceProvider, sessionService?: CompanySelectionSessionService, authEmailService?: AuthEmailService);
25
21
  private getUserRepository;
26
22
  private getPermissionRepository;
27
23
  private getCompanyRepository;
28
24
  private getBranchRepository;
29
- login(email: string, password: string): Promise<LoginResponse | LoginResponseRequiresSelection>;
25
+ login(email: string, password: string): Promise<LoginResponse | LoginResponseRequiresSelection | LoginResponseRequiresEmailVerification>;
30
26
  private handleCompanyBasedLogin;
31
- register(dto: RegistrationDto): Promise<LoginResponse>;
27
+ register(dto: RegistrationDto, verifyUrlBase?: string): Promise<RegistrationResponse | {
28
+ requiresEmailVerification: true;
29
+ message: string;
30
+ }>;
31
+ private createUserDirectly;
32
+ createUserFromPendingRegistration(pending: PendingRegistration): Promise<RegistrationResponse>;
33
+ private handleCompanyRegistrationFromPending;
32
34
  private handleCompanyRegistration;
35
+ private processCompanyRegistration;
33
36
  private generateSlug;
34
37
  select(sessionId: string, companyId: string, branchId: string): Promise<LoginResponse>;
35
38
  switchCompany(userId: string, companyId: string, branchId: string): Promise<LoginResponse>;
@@ -51,4 +54,6 @@ export declare class AuthenticationService {
51
54
  private generateLoginResponse;
52
55
  private generateLoginResponseWithCompany;
53
56
  private generateCompanySelectionResponse;
57
+ private generateRegistrationResponse;
58
+ private generateRegistrationResponseWithCompany;
54
59
  }
@@ -8,7 +8,7 @@ interface StoredSession {
8
8
  export declare class CompanySelectionSessionService {
9
9
  protected cacheManager: HybridCache;
10
10
  constructor(cacheManager: HybridCache);
11
- createSession(userId: string, companyId?: string): Promise<string>;
11
+ createSession(userId: string): Promise<string>;
12
12
  getSession(sessionId: string): Promise<StoredSession | null>;
13
13
  consumeSession(sessionId: string): Promise<StoredSession | null>;
14
14
  deleteSession(sessionId: string): Promise<void>;
@@ -1,4 +1,5 @@
1
1
  export * from './authentication.service';
2
+ export * from './auth-email.service';
2
3
  export * from './company-selection-session.service';
3
4
  export * from './user.service';
4
5
  export * from './company.service';
@@ -3,7 +3,6 @@ import { UserCompanyPermission } from '../entities/user-company-permission.entit
3
3
  import { AuthDataSourceProvider } from './auth-datasource.provider';
4
4
  export declare class UserPermissionService {
5
5
  private readonly dataSourceProvider;
6
- private readonly logger;
7
6
  private _repository;
8
7
  constructor(dataSourceProvider: AuthDataSourceProvider);
9
8
  private getRepository;
@@ -6,23 +6,28 @@ import { AuthConfigService } from './auth-config.service';
6
6
  import { AuthDataSourceProvider } from './auth-datasource.provider';
7
7
  import { CreateUserDto, UpdateUserDto } from '../dtos/user.dto';
8
8
  import { IUser } from '../interfaces/user.interface';
9
+ import { IEnrichedUser, IProfileExtras, IProfileSection, IProfileSectionData, IUserEnricher } from '../interfaces/user-enricher.interface';
9
10
  import { User } from '../entities/user.entity';
10
11
  export declare class UserService extends RequestScopedApiService<CreateUserDto, UpdateUserDto, IUser, User, Repository<User>> {
11
12
  protected cacheManager: HybridCache;
12
13
  protected utilsService: UtilsService;
13
14
  private readonly dataSourceProvider;
14
15
  private readonly authConfig;
16
+ private readonly userEnricher?;
15
17
  private permissionRepository?;
16
18
  private dataSource?;
17
- constructor(cacheManager: HybridCache, utilsService: UtilsService, dataSourceProvider: AuthDataSourceProvider, authConfig: AuthConfigService);
19
+ constructor(cacheManager: HybridCache, utilsService: UtilsService, dataSourceProvider: AuthDataSourceProvider, authConfig: AuthConfigService, userEnricher?: IUserEnricher);
18
20
  protected resolveEntity(): EntityTarget<User>;
19
21
  protected getDataSourceProvider(): AuthDataSourceProvider;
20
22
  protected ensureRepositoryInitialized(): Promise<void>;
23
+ private validateProfileOwnership;
21
24
  verifyEmail(id: string): Promise<void>;
22
25
  verifyPhone(id: string): Promise<void>;
23
26
  updateStatus(id: string, isActive: boolean, user?: ILoggedUserInfo | null): Promise<void>;
24
- protected convertSingleDtoToEntity(dto: CreateUserDto | UpdateUserDto, user: any): Promise<User>;
27
+ protected convertSingleDtoToEntity(dto: CreateUserDto | UpdateUserDto, user: ILoggedUserInfo | null): Promise<User>;
25
28
  protected convertEntityToResponseDto(entity: User, isRaw: boolean): IUser;
29
+ private convertRawToResponseDto;
30
+ private convertEntityToDto;
26
31
  protected convertEntityListToResponseListDto(entities: User[], isRaw: boolean): IUser[];
27
32
  protected getGlobalSearchQuery(query: any, search: string, _user: any): Promise<{
28
33
  query: any;
@@ -33,5 +38,16 @@ export declare class UserService extends RequestScopedApiService<CreateUserDto,
33
38
  isRaw: boolean;
34
39
  }>;
35
40
  insert(dto: CreateUserDto, user: ILoggedUserInfo | null): Promise<IUser>;
36
- profile(dto: UpdateUserDto, user: ILoggedUserInfo): Promise<string>;
41
+ getProfileWithExtras(userId: string, user: ILoggedUserInfo): Promise<{
42
+ user: IUser;
43
+ extras?: IProfileExtras;
44
+ }>;
45
+ getEnrichedList(users: IUser[], user: ILoggedUserInfo | null): Promise<IEnrichedUser[]>;
46
+ getProfileSections(): Promise<IProfileSection[]>;
47
+ getProfileSectionData(userId: string, sectionId: string, user: ILoggedUserInfo): Promise<IProfileSectionData | null>;
48
+ updateProfileSection(userId: string, sectionId: string, data: Record<string, any>, user: ILoggedUserInfo): Promise<void>;
49
+ getProfileCompletion(userId: string, user: ILoggedUserInfo): Promise<number>;
50
+ profile(dto: UpdateUserDto & {
51
+ extras?: Record<string, any>;
52
+ }, user: ILoggedUserInfo): Promise<string>;
37
53
  }
@@ -0,0 +1,10 @@
1
+ import { ValidationOptions } from 'class-validator';
2
+ export interface PasswordComplexityOptions {
3
+ minLength?: number;
4
+ maxLength?: number;
5
+ requireUppercase?: boolean;
6
+ requireLowercase?: boolean;
7
+ requireNumber?: boolean;
8
+ requireSpecialChar?: boolean;
9
+ }
10
+ export declare function IsStrongPassword(options?: PasswordComplexityOptions, validationOptions?: ValidationOptions): (object: object, propertyName: string) => void;