@flusys/nestjs-auth 7.1.0 → 8.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/config/index.d.ts +3 -3
- package/config/message-keys.d.ts +4 -0
- package/controllers/authentication.controller.d.ts +5 -5
- package/controllers/branch.controller.d.ts +2 -2
- package/controllers/company-selection.controller.d.ts +4 -4
- package/controllers/company.controller.d.ts +2 -2
- package/controllers/email-verification.controller.d.ts +6 -6
- package/controllers/index.d.ts +9 -9
- package/controllers/social-auth-config.controller.d.ts +2 -2
- package/controllers/social-auth.controller.d.ts +3 -3
- package/controllers/user-permission.controller.d.ts +7 -4
- package/controllers/user.controller.d.ts +7 -7
- package/docs/auth-swagger.config.d.ts +2 -2
- package/docs/index.d.ts +1 -1
- package/dtos/index.d.ts +6 -6
- package/dtos/social-auth.dto.d.ts +1 -1
- package/dtos/user-permission.dto.d.ts +30 -0
- package/entities/company-branch.entity.d.ts +1 -1
- package/entities/company.entity.d.ts +1 -1
- package/entities/index.d.ts +14 -14
- package/entities/pending-registration.entity.d.ts +1 -1
- package/entities/user-company-permission.entity.d.ts +4 -4
- package/enums/index.d.ts +2 -2
- package/fesm/118.js +1404 -0
- package/fesm/120.js +2265 -0
- package/fesm/24.js +4422 -0
- package/fesm/370.js +1163 -0
- package/fesm/446.js +877 -0
- package/fesm/chunks/117.js +69 -0
- package/fesm/config/index.js +246 -3
- package/fesm/controllers/index.js +27 -9
- package/fesm/docs/index.js +479 -1
- package/fesm/dtos/index.js +135 -6
- package/fesm/entities/index.js +68 -22
- package/fesm/enums/index.js +53 -2
- package/fesm/helpers/index.js +115 -2
- package/fesm/index.js +1455 -13
- package/fesm/interceptors/index.js +510 -2
- package/fesm/interfaces/index.js +75 -8
- package/fesm/modules/index.js +546 -1
- package/fesm/runtime.js +134 -0
- package/fesm/services/index.js +67 -11
- package/helpers/auth-response.mapper.d.ts +3 -3
- package/helpers/index.d.ts +2 -2
- package/helpers/token.helper.d.ts +2 -2
- package/index.d.ts +13 -13
- package/interceptors/clear-token.interceptor.d.ts +2 -2
- package/interceptors/index.d.ts +2 -2
- package/interceptors/set-token.interceptor.d.ts +2 -2
- package/interfaces/auth-module-options.interface.d.ts +3 -3
- package/interfaces/authentication.interface.d.ts +3 -3
- package/interfaces/company-branch.interface.d.ts +2 -2
- package/interfaces/company.interface.d.ts +1 -1
- package/interfaces/index.d.ts +8 -8
- package/interfaces/social-auth.interface.d.ts +2 -2
- package/interfaces/user-enricher.interface.d.ts +3 -3
- package/modules/auth.module.d.ts +4 -4
- package/modules/index.d.ts +1 -1
- package/package.json +32 -39
- package/providers/facebook.social-provider.d.ts +2 -2
- package/providers/google.social-provider.d.ts +2 -2
- package/providers/index.d.ts +1 -1
- package/providers/linkedin.social-provider.d.ts +2 -2
- package/providers/microsoft.social-provider.d.ts +2 -2
- package/providers/social-provider.registry.d.ts +2 -2
- package/services/auth-config.service.d.ts +3 -3
- package/services/auth-datasource.provider.d.ts +3 -3
- package/services/auth-email.service.d.ts +3 -3
- package/services/authentication.service.d.ts +12 -12
- package/services/branch.service.d.ts +7 -7
- package/services/company.service.d.ts +6 -6
- package/services/index.d.ts +11 -11
- package/services/social-auth-config.service.d.ts +6 -6
- package/services/social-auth.service.d.ts +5 -5
- package/services/user-permission.service.d.ts +10 -4
- package/services/user.service.d.ts +7 -7
- package/strategies/jwt.strategy.d.ts +4 -4
- package/validators/password.validator.d.ts +1 -1
- package/cjs/config/auth.constants.js +0 -49
- package/cjs/config/event-actions.js +0 -47
- package/cjs/config/index.js +0 -20
- package/cjs/config/message-keys.js +0 -135
- package/cjs/controllers/authentication.controller.js +0 -427
- package/cjs/controllers/authentication.controller.spec.js +0 -219
- package/cjs/controllers/branch.controller.js +0 -102
- package/cjs/controllers/branch.controller.spec.js +0 -134
- package/cjs/controllers/company-selection.controller.js +0 -198
- package/cjs/controllers/company-selection.controller.spec.js +0 -84
- package/cjs/controllers/company.controller.js +0 -102
- package/cjs/controllers/company.controller.spec.js +0 -131
- package/cjs/controllers/email-verification.controller.js +0 -224
- package/cjs/controllers/email-verification.controller.spec.js +0 -142
- package/cjs/controllers/index.js +0 -26
- package/cjs/controllers/social-auth-config.controller.js +0 -107
- package/cjs/controllers/social-auth.controller.js +0 -175
- package/cjs/controllers/social-auth.controller.spec.js +0 -79
- package/cjs/controllers/user-permission.controller.js +0 -223
- package/cjs/controllers/user-permission.controller.spec.js +0 -138
- package/cjs/controllers/user.controller.js +0 -438
- package/cjs/controllers/user.controller.spec.js +0 -204
- package/cjs/docs/auth-swagger.config.js +0 -461
- package/cjs/docs/auth-swagger.config.spec.js +0 -130
- package/cjs/docs/index.js +0 -18
- package/cjs/dtos/authentication.dto.js +0 -755
- package/cjs/dtos/company-branch.dto.js +0 -294
- package/cjs/dtos/company.dto.js +0 -298
- package/cjs/dtos/index.js +0 -23
- package/cjs/dtos/social-auth.dto.js +0 -318
- package/cjs/dtos/user-permission.dto.js +0 -358
- package/cjs/dtos/user.dto.js +0 -413
- package/cjs/entities/app-user.entity.js +0 -25
- package/cjs/entities/company-branch.entity.js +0 -163
- package/cjs/entities/company.entity.js +0 -146
- package/cjs/entities/index.js +0 -67
- package/cjs/entities/index.spec.js +0 -84
- package/cjs/entities/pending-registration.entity.js +0 -135
- package/cjs/entities/social-auth-config.entity.js +0 -102
- package/cjs/entities/user-company-permission.entity.js +0 -153
- package/cjs/entities/user-token.entity.js +0 -120
- package/cjs/enums/index.js +0 -19
- package/cjs/enums/social-provider-type.enum.js +0 -17
- package/cjs/enums/user-org-permission-type.enum.js +0 -15
- package/cjs/helpers/auth-response.mapper.js +0 -46
- package/cjs/helpers/auth-response.mapper.spec.js +0 -139
- package/cjs/helpers/index.js +0 -19
- package/cjs/helpers/token.helper.js +0 -58
- package/cjs/helpers/token.helper.spec.js +0 -86
- package/cjs/index.js +0 -30
- package/cjs/interceptors/clear-token.interceptor.js +0 -73
- package/cjs/interceptors/clear-token.interceptor.spec.js +0 -107
- package/cjs/interceptors/index.js +0 -19
- package/cjs/interceptors/set-token.interceptor.js +0 -107
- package/cjs/interceptors/set-token.interceptor.spec.js +0 -165
- package/cjs/interfaces/auth-email-provider.interface.js +0 -45
- package/cjs/interfaces/auth-module-options.interface.js +0 -4
- package/cjs/interfaces/authentication.interface.js +0 -4
- package/cjs/interfaces/company-branch.interface.js +0 -4
- package/cjs/interfaces/company.interface.js +0 -4
- package/cjs/interfaces/index.js +0 -25
- package/cjs/interfaces/social-auth.interface.js +0 -4
- package/cjs/interfaces/user-enricher.interface.js +0 -4
- package/cjs/interfaces/user.interface.js +0 -4
- package/cjs/modules/auth.module.js +0 -208
- package/cjs/modules/auth.module.spec.js +0 -258
- package/cjs/modules/index.js +0 -18
- package/cjs/providers/facebook.social-provider.js +0 -73
- package/cjs/providers/google.social-provider.js +0 -68
- package/cjs/providers/index.js +0 -18
- package/cjs/providers/linkedin.social-provider.js +0 -66
- package/cjs/providers/microsoft.social-provider.js +0 -78
- package/cjs/providers/oauth-http.util.js +0 -107
- package/cjs/providers/social-provider.registry.js +0 -24
- package/cjs/providers/social-provider.registry.spec.js +0 -135
- package/cjs/services/auth-config.service.js +0 -113
- package/cjs/services/auth-config.service.spec.js +0 -100
- package/cjs/services/auth-datasource.provider.js +0 -138
- package/cjs/services/auth-datasource.provider.spec.js +0 -191
- package/cjs/services/auth-email.service.js +0 -539
- package/cjs/services/auth-email.service.spec.js +0 -456
- package/cjs/services/authentication.service.js +0 -1203
- package/cjs/services/authentication.service.spec.js +0 -1020
- package/cjs/services/branch.service.js +0 -153
- package/cjs/services/branch.service.spec.js +0 -169
- package/cjs/services/company-selection-session.service.js +0 -121
- package/cjs/services/company-selection-session.service.spec.js +0 -90
- package/cjs/services/company.service.js +0 -140
- package/cjs/services/company.service.spec.js +0 -127
- package/cjs/services/index.js +0 -28
- package/cjs/services/social-auth-config.service.js +0 -103
- package/cjs/services/social-auth-config.service.spec.js +0 -71
- package/cjs/services/social-auth.service.js +0 -310
- package/cjs/services/social-auth.service.spec.js +0 -310
- package/cjs/services/user-permission.service.js +0 -236
- package/cjs/services/user-permission.service.spec.js +0 -254
- package/cjs/services/user.service.js +0 -671
- package/cjs/services/user.service.spec.js +0 -718
- package/cjs/strategies/jwt.strategy.js +0 -140
- package/cjs/strategies/jwt.strategy.spec.js +0 -166
- package/cjs/validators/password.validator.js +0 -45
- package/cjs/validators/password.validator.spec.js +0 -161
- package/fesm/config/auth.constants.js +0 -14
- package/fesm/config/event-actions.js +0 -26
- package/fesm/config/message-keys.js +0 -99
- package/fesm/controllers/authentication.controller.js +0 -417
- package/fesm/controllers/authentication.controller.spec.js +0 -215
- package/fesm/controllers/branch.controller.js +0 -92
- package/fesm/controllers/branch.controller.spec.js +0 -130
- package/fesm/controllers/company-selection.controller.js +0 -188
- package/fesm/controllers/company-selection.controller.spec.js +0 -80
- package/fesm/controllers/company.controller.js +0 -92
- package/fesm/controllers/company.controller.spec.js +0 -127
- package/fesm/controllers/email-verification.controller.js +0 -214
- package/fesm/controllers/email-verification.controller.spec.js +0 -138
- package/fesm/controllers/social-auth-config.controller.js +0 -97
- package/fesm/controllers/social-auth.controller.js +0 -165
- package/fesm/controllers/social-auth.controller.spec.js +0 -75
- package/fesm/controllers/user-permission.controller.js +0 -213
- package/fesm/controllers/user-permission.controller.spec.js +0 -134
- package/fesm/controllers/user.controller.js +0 -428
- package/fesm/controllers/user.controller.spec.js +0 -200
- package/fesm/docs/auth-swagger.config.js +0 -454
- package/fesm/docs/auth-swagger.config.spec.js +0 -126
- package/fesm/dtos/authentication.dto.js +0 -683
- package/fesm/dtos/company-branch.dto.js +0 -279
- package/fesm/dtos/company.dto.js +0 -283
- package/fesm/dtos/social-auth.dto.js +0 -282
- package/fesm/dtos/user-permission.dto.js +0 -339
- package/fesm/dtos/user.dto.js +0 -391
- package/fesm/entities/app-user.entity.js +0 -15
- package/fesm/entities/company-branch.entity.js +0 -153
- package/fesm/entities/company.entity.js +0 -136
- package/fesm/entities/index.spec.js +0 -80
- package/fesm/entities/pending-registration.entity.js +0 -125
- package/fesm/entities/social-auth-config.entity.js +0 -92
- package/fesm/entities/user-company-permission.entity.js +0 -136
- package/fesm/entities/user-token.entity.js +0 -104
- package/fesm/enums/social-provider-type.enum.js +0 -7
- package/fesm/enums/user-org-permission-type.enum.js +0 -5
- package/fesm/helpers/auth-response.mapper.js +0 -25
- package/fesm/helpers/auth-response.mapper.spec.js +0 -135
- package/fesm/helpers/token.helper.js +0 -40
- package/fesm/helpers/token.helper.spec.js +0 -82
- package/fesm/interceptors/clear-token.interceptor.js +0 -63
- package/fesm/interceptors/clear-token.interceptor.spec.js +0 -103
- package/fesm/interceptors/set-token.interceptor.js +0 -98
- package/fesm/interceptors/set-token.interceptor.spec.js +0 -161
- package/fesm/interfaces/auth-email-provider.interface.js +0 -38
- package/fesm/interfaces/auth-module-options.interface.js +0 -3
- package/fesm/interfaces/authentication.interface.js +0 -1
- package/fesm/interfaces/company-branch.interface.js +0 -1
- package/fesm/interfaces/company.interface.js +0 -1
- package/fesm/interfaces/social-auth.interface.js +0 -1
- package/fesm/interfaces/user-enricher.interface.js +0 -4
- package/fesm/interfaces/user.interface.js +0 -1
- package/fesm/modules/auth.module.js +0 -198
- package/fesm/modules/auth.module.spec.js +0 -254
- package/fesm/providers/facebook.social-provider.js +0 -63
- package/fesm/providers/google.social-provider.js +0 -58
- package/fesm/providers/index.js +0 -1
- package/fesm/providers/linkedin.social-provider.js +0 -56
- package/fesm/providers/microsoft.social-provider.js +0 -68
- package/fesm/providers/oauth-http.util.js +0 -77
- package/fesm/providers/social-provider.registry.js +0 -14
- package/fesm/providers/social-provider.registry.spec.js +0 -131
- package/fesm/services/auth-config.service.js +0 -103
- package/fesm/services/auth-config.service.spec.js +0 -96
- package/fesm/services/auth-datasource.provider.js +0 -87
- package/fesm/services/auth-datasource.provider.spec.js +0 -187
- package/fesm/services/auth-email.service.js +0 -488
- package/fesm/services/auth-email.service.spec.js +0 -411
- package/fesm/services/authentication.service.js +0 -1152
- package/fesm/services/authentication.service.spec.js +0 -975
- package/fesm/services/branch.service.js +0 -143
- package/fesm/services/branch.service.spec.js +0 -165
- package/fesm/services/company-selection-session.service.js +0 -111
- package/fesm/services/company-selection-session.service.spec.js +0 -86
- package/fesm/services/company.service.js +0 -130
- package/fesm/services/company.service.spec.js +0 -123
- package/fesm/services/social-auth-config.service.js +0 -93
- package/fesm/services/social-auth-config.service.spec.js +0 -67
- package/fesm/services/social-auth.service.js +0 -300
- package/fesm/services/social-auth.service.spec.js +0 -265
- package/fesm/services/user-permission.service.js +0 -226
- package/fesm/services/user-permission.service.spec.js +0 -250
- package/fesm/services/user.service.js +0 -620
- package/fesm/services/user.service.spec.js +0 -673
- package/fesm/strategies/jwt.strategy.js +0 -130
- package/fesm/strategies/jwt.strategy.spec.js +0 -162
- package/fesm/validators/password.validator.js +0 -48
- package/fesm/validators/password.validator.spec.js +0 -157
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import { createMockDataSourceProvider, createMockRepository } from '@test-utils/mocks/repository.mock';
|
|
2
|
-
import { CompanyService } from './company.service';
|
|
3
|
-
import { CompanyBranch } from '../entities/company-branch.entity';
|
|
4
|
-
import { UserCompanyPermission } from '../entities/user-company-permission.entity';
|
|
5
|
-
describe('CompanyService', ()=>{
|
|
6
|
-
let service;
|
|
7
|
-
let mockRepo;
|
|
8
|
-
let mockPermissionSyncAdapter;
|
|
9
|
-
let mockQueryRunner;
|
|
10
|
-
let branchRepo;
|
|
11
|
-
let permissionRepo;
|
|
12
|
-
beforeEach(()=>{
|
|
13
|
-
mockRepo = createMockRepository();
|
|
14
|
-
mockRepo.find.mockResolvedValue([]);
|
|
15
|
-
const mockDataSourceProvider = createMockDataSourceProvider(mockRepo);
|
|
16
|
-
mockPermissionSyncAdapter = {
|
|
17
|
-
onCompanyDeleted: jest.fn()
|
|
18
|
-
};
|
|
19
|
-
service = new CompanyService({}, {}, mockDataSourceProvider, mockPermissionSyncAdapter);
|
|
20
|
-
branchRepo = createMockRepository();
|
|
21
|
-
branchRepo.find.mockResolvedValue([]);
|
|
22
|
-
permissionRepo = createMockRepository();
|
|
23
|
-
mockQueryRunner = {
|
|
24
|
-
manager: {
|
|
25
|
-
getRepository: jest.fn().mockImplementation((entity)=>{
|
|
26
|
-
if (entity === CompanyBranch) return branchRepo;
|
|
27
|
-
if (entity === UserCompanyPermission) return permissionRepo;
|
|
28
|
-
throw new Error('Unexpected entity');
|
|
29
|
-
})
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
});
|
|
33
|
-
describe('beforeDeleteOperation', ()=>{
|
|
34
|
-
it('deletes permissions for the companies and their branches', async ()=>{
|
|
35
|
-
branchRepo.find.mockResolvedValue([
|
|
36
|
-
{
|
|
37
|
-
id: 'branch-1'
|
|
38
|
-
}
|
|
39
|
-
]);
|
|
40
|
-
await service.beforeDeleteOperation({
|
|
41
|
-
id: [
|
|
42
|
-
'company-1'
|
|
43
|
-
]
|
|
44
|
-
}, null, mockQueryRunner);
|
|
45
|
-
const deleteArg = permissionRepo.delete.mock.calls[0][0];
|
|
46
|
-
expect(deleteArg.targetId._value).toEqual(expect.arrayContaining([
|
|
47
|
-
'company-1',
|
|
48
|
-
'branch-1'
|
|
49
|
-
]));
|
|
50
|
-
});
|
|
51
|
-
it('handles a single (non-array) company id', async ()=>{
|
|
52
|
-
await service.beforeDeleteOperation({
|
|
53
|
-
id: 'company-1'
|
|
54
|
-
}, null, mockQueryRunner);
|
|
55
|
-
expect(branchRepo.find).toHaveBeenCalledWith(expect.objectContaining({
|
|
56
|
-
where: {
|
|
57
|
-
companyId: expect.anything()
|
|
58
|
-
}
|
|
59
|
-
}));
|
|
60
|
-
});
|
|
61
|
-
it('does nothing further when no permission sync adapter is configured', async ()=>{
|
|
62
|
-
service = new CompanyService({}, {}, createMockDataSourceProvider(mockRepo), undefined);
|
|
63
|
-
await expect(service.beforeDeleteOperation({
|
|
64
|
-
id: [
|
|
65
|
-
'company-1'
|
|
66
|
-
]
|
|
67
|
-
}, null, mockQueryRunner)).resolves.toBeUndefined();
|
|
68
|
-
});
|
|
69
|
-
it('notifies the permission sync adapter for each deleted company', async ()=>{
|
|
70
|
-
await service.beforeDeleteOperation({
|
|
71
|
-
id: [
|
|
72
|
-
'company-1',
|
|
73
|
-
'company-2'
|
|
74
|
-
]
|
|
75
|
-
}, null, mockQueryRunner);
|
|
76
|
-
expect(mockPermissionSyncAdapter.onCompanyDeleted).toHaveBeenCalledWith('company-1');
|
|
77
|
-
expect(mockPermissionSyncAdapter.onCompanyDeleted).toHaveBeenCalledWith('company-2');
|
|
78
|
-
});
|
|
79
|
-
it('rejects deleting a readonly company', async ()=>{
|
|
80
|
-
mockRepo.find.mockResolvedValue([
|
|
81
|
-
{
|
|
82
|
-
id: 'company-1',
|
|
83
|
-
name: 'Default Company',
|
|
84
|
-
readOnly: true
|
|
85
|
-
}
|
|
86
|
-
]);
|
|
87
|
-
await expect(service.beforeDeleteOperation({
|
|
88
|
-
id: 'company-1'
|
|
89
|
-
}, null, mockQueryRunner)).rejects.toThrow('Cannot delete readonly company');
|
|
90
|
-
expect(branchRepo.find).not.toHaveBeenCalled();
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
describe('getSelectQuery', ()=>{
|
|
94
|
-
it('applies the default selected fields when none are provided', async ()=>{
|
|
95
|
-
const qb = mockRepo.createQueryBuilder();
|
|
96
|
-
const { isRaw } = await service.getSelectQuery(qb, null);
|
|
97
|
-
expect(qb.select).toHaveBeenCalledWith(expect.arrayContaining([
|
|
98
|
-
'company.id',
|
|
99
|
-
'company.name',
|
|
100
|
-
'company.slug'
|
|
101
|
-
]));
|
|
102
|
-
expect(isRaw).toBe(false);
|
|
103
|
-
});
|
|
104
|
-
it('honors an explicit select list', async ()=>{
|
|
105
|
-
const qb = mockRepo.createQueryBuilder();
|
|
106
|
-
await service.getSelectQuery(qb, null, [
|
|
107
|
-
'id'
|
|
108
|
-
]);
|
|
109
|
-
expect(qb.select).toHaveBeenCalledWith([
|
|
110
|
-
'company.id'
|
|
111
|
-
]);
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
describe('getGlobalSearchQuery', ()=>{
|
|
115
|
-
it('adds a LIKE search clause across name/slug/email', async ()=>{
|
|
116
|
-
const qb = mockRepo.createQueryBuilder();
|
|
117
|
-
await service.getGlobalSearchQuery(qb, 'acme');
|
|
118
|
-
expect(qb.andWhere).toHaveBeenCalledWith(expect.stringContaining('company.name LIKE'), {
|
|
119
|
-
search: '%acme%'
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
});
|
|
123
|
-
});
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
function _define_property(obj, key, value) {
|
|
2
|
-
if (key in obj) {
|
|
3
|
-
Object.defineProperty(obj, key, {
|
|
4
|
-
value: value,
|
|
5
|
-
enumerable: true,
|
|
6
|
-
configurable: true,
|
|
7
|
-
writable: true
|
|
8
|
-
});
|
|
9
|
-
} else {
|
|
10
|
-
obj[key] = value;
|
|
11
|
-
}
|
|
12
|
-
return obj;
|
|
13
|
-
}
|
|
14
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
15
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
16
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
17
|
-
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;
|
|
18
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
|
-
}
|
|
20
|
-
function _ts_metadata(k, v) {
|
|
21
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
22
|
-
}
|
|
23
|
-
function _ts_param(paramIndex, decorator) {
|
|
24
|
-
return function(target, key) {
|
|
25
|
-
decorator(target, key, paramIndex);
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
import { ApiService, HybridCache } from '@flusys/nestjs-shared/classes';
|
|
29
|
-
import { UtilsService } from '@flusys/nestjs-shared/modules';
|
|
30
|
-
import { ConflictException, Inject, Injectable, Scope } from '@nestjs/common';
|
|
31
|
-
import { IsNull, Not } from 'typeorm';
|
|
32
|
-
import { AUTH_EVENT_ENTITIES, AUTH_EVENT_MODULE, SOCIAL_AUTH_CONFIG_MESSAGES } from '../config';
|
|
33
|
-
import { SocialAuthConfig } from '../entities/social-auth-config.entity';
|
|
34
|
-
import { AuthDataSourceProvider } from './auth-datasource.provider';
|
|
35
|
-
export class SocialAuthConfigService extends ApiService {
|
|
36
|
-
async beforeInsertOperation(dto, _user, _queryRunner) {
|
|
37
|
-
for (const entry of Array.isArray(dto) ? dto : [
|
|
38
|
-
dto
|
|
39
|
-
]){
|
|
40
|
-
await this.ensureProviderUnclaimed(entry.provider);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
async beforeUpdateOperation(dto, _user, _queryRunner) {
|
|
44
|
-
for (const entry of Array.isArray(dto) ? dto : [
|
|
45
|
-
dto
|
|
46
|
-
]){
|
|
47
|
-
if (entry.provider) await this.ensureProviderUnclaimed(entry.provider, entry.id);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
async ensureProviderUnclaimed(provider, exceptId) {
|
|
51
|
-
await this.ensureDataSourceRepository();
|
|
52
|
-
const existing = await this.repository.findOne({
|
|
53
|
-
where: {
|
|
54
|
-
provider,
|
|
55
|
-
deletedAt: IsNull(),
|
|
56
|
-
...exceptId ? {
|
|
57
|
-
id: Not(exceptId)
|
|
58
|
-
} : {}
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
if (existing) {
|
|
62
|
-
throw new ConflictException({
|
|
63
|
-
message: `Social provider "${provider}" is already configured`,
|
|
64
|
-
messageKey: SOCIAL_AUTH_CONFIG_MESSAGES.PROVIDER_ALREADY_CONFIGURED,
|
|
65
|
-
messageVariables: {
|
|
66
|
-
provider
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
async getExtraManipulateQuery(query, filterDto, user) {
|
|
72
|
-
const result = await super.getExtraManipulateQuery(query, filterDto, user);
|
|
73
|
-
query.orderBy(`${this.entityName}.provider`, 'ASC');
|
|
74
|
-
return result;
|
|
75
|
-
}
|
|
76
|
-
constructor(cacheManager, utilsService, dataSourceProvider){
|
|
77
|
-
super(AUTH_EVENT_ENTITIES.SOCIAL_AUTH_CONFIG, cacheManager, utilsService, SocialAuthConfigService.name, true, AUTH_EVENT_MODULE, dataSourceProvider, SocialAuthConfig), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
SocialAuthConfigService = _ts_decorate([
|
|
81
|
-
Injectable({
|
|
82
|
-
scope: Scope.REQUEST
|
|
83
|
-
}),
|
|
84
|
-
_ts_param(0, Inject('CACHE_INSTANCE')),
|
|
85
|
-
_ts_param(1, Inject(UtilsService)),
|
|
86
|
-
_ts_param(2, Inject(AuthDataSourceProvider)),
|
|
87
|
-
_ts_metadata("design:type", Function),
|
|
88
|
-
_ts_metadata("design:paramtypes", [
|
|
89
|
-
typeof HybridCache === "undefined" ? Object : HybridCache,
|
|
90
|
-
typeof UtilsService === "undefined" ? Object : UtilsService,
|
|
91
|
-
typeof AuthDataSourceProvider === "undefined" ? Object : AuthDataSourceProvider
|
|
92
|
-
])
|
|
93
|
-
], SocialAuthConfigService);
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { ConflictException } from '@nestjs/common';
|
|
2
|
-
import { createMockRepository } from '@test-utils/mocks/repository.mock';
|
|
3
|
-
import { Not } from 'typeorm';
|
|
4
|
-
import { SocialProviderTypeEnum } from '../enums/social-provider-type.enum';
|
|
5
|
-
import { SocialAuthConfigService } from './social-auth-config.service';
|
|
6
|
-
describe('SocialAuthConfigService', ()=>{
|
|
7
|
-
let repo;
|
|
8
|
-
let service;
|
|
9
|
-
beforeEach(()=>{
|
|
10
|
-
repo = createMockRepository();
|
|
11
|
-
const dataSourceProvider = {
|
|
12
|
-
getRepository: jest.fn().mockResolvedValue(repo)
|
|
13
|
-
};
|
|
14
|
-
service = new SocialAuthConfigService({
|
|
15
|
-
get: jest.fn(),
|
|
16
|
-
set: jest.fn(),
|
|
17
|
-
del: jest.fn()
|
|
18
|
-
}, {}, dataSourceProvider);
|
|
19
|
-
});
|
|
20
|
-
const beforeInsert = (dto)=>service.beforeInsertOperation(dto, null, {});
|
|
21
|
-
const beforeUpdate = (dto)=>service.beforeUpdateOperation(dto, null, {});
|
|
22
|
-
it('allows the first configuration of a provider', async ()=>{
|
|
23
|
-
repo.findOne.mockResolvedValue(null);
|
|
24
|
-
await expect(beforeInsert({
|
|
25
|
-
provider: SocialProviderTypeEnum.GOOGLE
|
|
26
|
-
})).resolves.toBeUndefined();
|
|
27
|
-
});
|
|
28
|
-
it('rejects a second row for a provider that is already configured', async ()=>{
|
|
29
|
-
repo.findOne.mockResolvedValue({
|
|
30
|
-
id: 'existing'
|
|
31
|
-
});
|
|
32
|
-
await expect(beforeInsert({
|
|
33
|
-
provider: SocialProviderTypeEnum.GOOGLE
|
|
34
|
-
})).rejects.toThrow(ConflictException);
|
|
35
|
-
});
|
|
36
|
-
it('checks every provider in a batch insert', async ()=>{
|
|
37
|
-
repo.findOne.mockResolvedValue(null);
|
|
38
|
-
await beforeInsert([
|
|
39
|
-
{
|
|
40
|
-
provider: SocialProviderTypeEnum.GOOGLE
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
provider: SocialProviderTypeEnum.FACEBOOK
|
|
44
|
-
}
|
|
45
|
-
]);
|
|
46
|
-
expect(repo.findOne).toHaveBeenCalledTimes(2);
|
|
47
|
-
});
|
|
48
|
-
it('lets a row keep its own provider on update', async ()=>{
|
|
49
|
-
repo.findOne.mockResolvedValue(null);
|
|
50
|
-
await beforeUpdate({
|
|
51
|
-
id: 'config-1',
|
|
52
|
-
provider: SocialProviderTypeEnum.GOOGLE
|
|
53
|
-
});
|
|
54
|
-
expect(repo.findOne).toHaveBeenCalledWith(expect.objectContaining({
|
|
55
|
-
where: expect.objectContaining({
|
|
56
|
-
id: Not('config-1')
|
|
57
|
-
})
|
|
58
|
-
}));
|
|
59
|
-
});
|
|
60
|
-
it('skips the check for an update that does not touch the provider', async ()=>{
|
|
61
|
-
await beforeUpdate({
|
|
62
|
-
id: 'config-1',
|
|
63
|
-
isEnabled: false
|
|
64
|
-
});
|
|
65
|
-
expect(repo.findOne).not.toHaveBeenCalled();
|
|
66
|
-
});
|
|
67
|
-
});
|
|
@@ -1,300 +0,0 @@
|
|
|
1
|
-
function _define_property(obj, key, value) {
|
|
2
|
-
if (key in obj) {
|
|
3
|
-
Object.defineProperty(obj, key, {
|
|
4
|
-
value: value,
|
|
5
|
-
enumerable: true,
|
|
6
|
-
configurable: true,
|
|
7
|
-
writable: true
|
|
8
|
-
});
|
|
9
|
-
} else {
|
|
10
|
-
obj[key] = value;
|
|
11
|
-
}
|
|
12
|
-
return obj;
|
|
13
|
-
}
|
|
14
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
15
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
16
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
17
|
-
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;
|
|
18
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
|
-
}
|
|
20
|
-
function _ts_metadata(k, v) {
|
|
21
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
22
|
-
}
|
|
23
|
-
function _ts_param(paramIndex, decorator) {
|
|
24
|
-
return function(target, key) {
|
|
25
|
-
decorator(target, key, paramIndex);
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
import { LogAction } from '@flusys/nestjs-shared';
|
|
29
|
-
import { HybridCache, publishDomainEvent } from '@flusys/nestjs-shared/classes';
|
|
30
|
-
import { SYSTEM_MESSAGES } from '@flusys/nestjs-shared/constants';
|
|
31
|
-
import { BadRequestException, Inject, Injectable, InternalServerErrorException, Optional, Scope, UnauthorizedException } from '@nestjs/common';
|
|
32
|
-
import { randomBytes } from 'crypto';
|
|
33
|
-
import { IsNull } from 'typeorm';
|
|
34
|
-
import { AUTH_EVENT_ACTIONS, AUTH_EVENT_ENTITIES, AUTH_EVENT_MODULE, SOCIAL_AUTH_MESSAGES, SOCIAL_STATE_PREFIX, SOCIAL_STATE_TTL_MS } from '../config';
|
|
35
|
-
import { AppUser } from '../entities/app-user.entity';
|
|
36
|
-
import { SocialAuthConfig } from '../entities/social-auth-config.entity';
|
|
37
|
-
import { SocialProviderTypeEnum } from '../enums/social-provider-type.enum';
|
|
38
|
-
import { getSocialProvider } from '../providers/social-provider.registry';
|
|
39
|
-
import { AuthDataSourceProvider } from './auth-datasource.provider';
|
|
40
|
-
import { AuthenticationService } from './authentication.service';
|
|
41
|
-
export class SocialAuthService {
|
|
42
|
-
async listEnabledProviders(redirectUri) {
|
|
43
|
-
const repository = await this.dataSourceProvider.getRepository(SocialAuthConfig);
|
|
44
|
-
const configs = await repository.find({
|
|
45
|
-
where: {
|
|
46
|
-
isEnabled: true,
|
|
47
|
-
deletedAt: IsNull()
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
return configs.filter((config)=>!!config.clientId && !!config.clientSecret).map((config)=>({
|
|
51
|
-
provider: config.provider,
|
|
52
|
-
redirectUri
|
|
53
|
-
}));
|
|
54
|
-
}
|
|
55
|
-
async createAuthorization(provider, redirectUri) {
|
|
56
|
-
const config = await this.getUsableConfig(provider);
|
|
57
|
-
const state = randomBytes(24).toString('hex');
|
|
58
|
-
await this.getCache().set(this.stateKey(state), {
|
|
59
|
-
provider,
|
|
60
|
-
redirectUri
|
|
61
|
-
}, SOCIAL_STATE_TTL_MS);
|
|
62
|
-
return {
|
|
63
|
-
provider,
|
|
64
|
-
authorizationUrl: getSocialProvider(provider).buildAuthorizationUrl(this.toCredentials(config, redirectUri), state),
|
|
65
|
-
state
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
async completeLogin(code, state, redirectUri) {
|
|
69
|
-
const provider = await this.consumeState(state, redirectUri);
|
|
70
|
-
const config = await this.getUsableConfig(provider);
|
|
71
|
-
const profile = await getSocialProvider(provider).fetchProfile(this.toCredentials(config, redirectUri), code);
|
|
72
|
-
if (!profile.providerUserId) {
|
|
73
|
-
throw new UnauthorizedException({
|
|
74
|
-
message: `${provider} did not return an account identifier`,
|
|
75
|
-
messageKey: SOCIAL_AUTH_MESSAGES.PROFILE_INCOMPLETE,
|
|
76
|
-
messageVariables: {
|
|
77
|
-
provider
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
const user = await this.resolveUser(provider, profile);
|
|
82
|
-
const response = await this.authService.issueLoginForUser(user);
|
|
83
|
-
this.publishSocialEvent(AUTH_EVENT_ENTITIES.SESSION, AUTH_EVENT_ACTIONS.SOCIAL_LOGGED_IN, user, provider);
|
|
84
|
-
return response;
|
|
85
|
-
}
|
|
86
|
-
async resolveUser(provider, profile) {
|
|
87
|
-
this.ensureVerifiedEmail(provider, profile);
|
|
88
|
-
const userRepository = await this.dataSourceProvider.getRepository(AppUser);
|
|
89
|
-
const existing = await userRepository.findOne({
|
|
90
|
-
where: {
|
|
91
|
-
email: profile.email
|
|
92
|
-
},
|
|
93
|
-
withDeleted: true
|
|
94
|
-
});
|
|
95
|
-
if (existing?.deletedAt) {
|
|
96
|
-
throw new UnauthorizedException({
|
|
97
|
-
message: 'This account has been permanently deleted. Please contact your system administrator.',
|
|
98
|
-
messageKey: SOCIAL_AUTH_MESSAGES.ACCOUNT_DELETED
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
if (existing) {
|
|
102
|
-
// The provider already proved ownership of this email (ensureVerifiedEmail above),
|
|
103
|
-
// so a social login carries at least as much proof as clicking a verification link.
|
|
104
|
-
if (!existing.emailVerified) {
|
|
105
|
-
existing.emailVerified = true;
|
|
106
|
-
await userRepository.save(existing);
|
|
107
|
-
}
|
|
108
|
-
return existing;
|
|
109
|
-
}
|
|
110
|
-
const user = await this.registerUser(provider, userRepository, profile);
|
|
111
|
-
this.publishSocialEvent(AUTH_EVENT_ENTITIES.USER, AUTH_EVENT_ACTIONS.REGISTERED, user, provider);
|
|
112
|
-
return user;
|
|
113
|
-
}
|
|
114
|
-
ensureVerifiedEmail(provider, profile) {
|
|
115
|
-
if (!profile.email) {
|
|
116
|
-
throw new UnauthorizedException({
|
|
117
|
-
message: `${provider} did not share an email address`,
|
|
118
|
-
messageKey: SOCIAL_AUTH_MESSAGES.EMAIL_REQUIRED,
|
|
119
|
-
messageVariables: {
|
|
120
|
-
provider
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
if (!profile.emailVerified) {
|
|
125
|
-
throw new UnauthorizedException({
|
|
126
|
-
message: `${provider} has not verified this email address`,
|
|
127
|
-
messageKey: SOCIAL_AUTH_MESSAGES.EMAIL_NOT_VERIFIED,
|
|
128
|
-
messageVariables: {
|
|
129
|
-
provider
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
async registerUser(provider, userRepository, profile) {
|
|
135
|
-
if (!this.dataSourceProvider.isSignUpEnabled()) {
|
|
136
|
-
throw new UnauthorizedException({
|
|
137
|
-
message: `No account is linked to this ${provider} profile`,
|
|
138
|
-
messageKey: SOCIAL_AUTH_MESSAGES.ACCOUNT_NOT_LINKED,
|
|
139
|
-
messageVariables: {
|
|
140
|
-
provider
|
|
141
|
-
}
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
if (this.dataSourceProvider.isCompanyFeatureEnabled()) {
|
|
145
|
-
throw new UnauthorizedException({
|
|
146
|
-
message: `No account is linked to this ${provider} profile. Please sign up manually and join or create a company first, then social sign-in will work.`,
|
|
147
|
-
messageKey: SOCIAL_AUTH_MESSAGES.COMPANY_REQUIRED,
|
|
148
|
-
messageVariables: {
|
|
149
|
-
provider
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
return userRepository.save(userRepository.create({
|
|
154
|
-
email: profile.email,
|
|
155
|
-
name: profile.name,
|
|
156
|
-
password: null,
|
|
157
|
-
isActive: true,
|
|
158
|
-
emailVerified: true
|
|
159
|
-
}));
|
|
160
|
-
}
|
|
161
|
-
async getUsableConfig(provider) {
|
|
162
|
-
const repository = await this.dataSourceProvider.getRepository(SocialAuthConfig);
|
|
163
|
-
const config = await repository.findOne({
|
|
164
|
-
where: {
|
|
165
|
-
provider,
|
|
166
|
-
deletedAt: IsNull()
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
if (!config?.isEnabled) {
|
|
170
|
-
throw new BadRequestException({
|
|
171
|
-
message: `Social sign-in with ${provider} is not enabled`,
|
|
172
|
-
messageKey: SOCIAL_AUTH_MESSAGES.PROVIDER_DISABLED,
|
|
173
|
-
messageVariables: {
|
|
174
|
-
provider
|
|
175
|
-
}
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
if (!config.clientId || !config.clientSecret) {
|
|
179
|
-
throw new BadRequestException({
|
|
180
|
-
message: `Social sign-in with ${provider} is missing its client credentials`,
|
|
181
|
-
messageKey: SOCIAL_AUTH_MESSAGES.PROVIDER_NOT_CONFIGURED,
|
|
182
|
-
messageVariables: {
|
|
183
|
-
provider
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
return config;
|
|
188
|
-
}
|
|
189
|
-
toCredentials(config, redirectUri) {
|
|
190
|
-
return {
|
|
191
|
-
clientId: config.clientId,
|
|
192
|
-
clientSecret: config.clientSecret,
|
|
193
|
-
redirectUri,
|
|
194
|
-
scopes: config.scopes,
|
|
195
|
-
extraConfig: config.extraConfig
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
async consumeState(state, redirectUri) {
|
|
199
|
-
const key = this.stateKey(state);
|
|
200
|
-
const stored = await this.getCache().get(key);
|
|
201
|
-
await this.getCache().del(key);
|
|
202
|
-
if (!stored) {
|
|
203
|
-
throw new UnauthorizedException({
|
|
204
|
-
message: 'Social sign-in session is invalid or has expired',
|
|
205
|
-
messageKey: SOCIAL_AUTH_MESSAGES.STATE_INVALID
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
if (stored.redirectUri !== redirectUri) {
|
|
209
|
-
throw new UnauthorizedException({
|
|
210
|
-
message: 'Redirect URI does not match the one the sign-in started with',
|
|
211
|
-
messageKey: SOCIAL_AUTH_MESSAGES.REDIRECT_URI_MISMATCH
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
return stored.provider;
|
|
215
|
-
}
|
|
216
|
-
stateKey(state) {
|
|
217
|
-
return `${SOCIAL_STATE_PREFIX}:${state}`;
|
|
218
|
-
}
|
|
219
|
-
getCache() {
|
|
220
|
-
if (!this.cacheManager) {
|
|
221
|
-
throw new InternalServerErrorException({
|
|
222
|
-
message: 'Cache is required to hold the social sign-in state',
|
|
223
|
-
messageKey: SYSTEM_MESSAGES.SERVICE_NOT_AVAILABLE,
|
|
224
|
-
messageVariables: {
|
|
225
|
-
provider: 'CACHE_INSTANCE',
|
|
226
|
-
available: ''
|
|
227
|
-
}
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
return this.cacheManager;
|
|
231
|
-
}
|
|
232
|
-
publishSocialEvent(entity, action, user, provider) {
|
|
233
|
-
void publishDomainEvent({
|
|
234
|
-
module: AUTH_EVENT_MODULE,
|
|
235
|
-
entity,
|
|
236
|
-
action,
|
|
237
|
-
ids: [
|
|
238
|
-
user.id
|
|
239
|
-
],
|
|
240
|
-
metadata: {
|
|
241
|
-
email: user.email,
|
|
242
|
-
provider
|
|
243
|
-
},
|
|
244
|
-
user: {
|
|
245
|
-
id: user.id,
|
|
246
|
-
email: user.email
|
|
247
|
-
}
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
constructor(authService, dataSourceProvider, cacheManager){
|
|
251
|
-
_define_property(this, "authService", void 0);
|
|
252
|
-
_define_property(this, "dataSourceProvider", void 0);
|
|
253
|
-
_define_property(this, "cacheManager", void 0);
|
|
254
|
-
this.authService = authService;
|
|
255
|
-
this.dataSourceProvider = dataSourceProvider;
|
|
256
|
-
this.cacheManager = cacheManager;
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
_ts_decorate([
|
|
260
|
-
LogAction({
|
|
261
|
-
action: 'auth.social.authorize',
|
|
262
|
-
module: 'auth',
|
|
263
|
-
includeParams: false
|
|
264
|
-
}),
|
|
265
|
-
_ts_metadata("design:type", Function),
|
|
266
|
-
_ts_metadata("design:paramtypes", [
|
|
267
|
-
typeof SocialProviderTypeEnum === "undefined" ? Object : SocialProviderTypeEnum,
|
|
268
|
-
String
|
|
269
|
-
]),
|
|
270
|
-
_ts_metadata("design:returntype", Promise)
|
|
271
|
-
], SocialAuthService.prototype, "createAuthorization", null);
|
|
272
|
-
_ts_decorate([
|
|
273
|
-
LogAction({
|
|
274
|
-
action: 'auth.social.login',
|
|
275
|
-
module: 'auth',
|
|
276
|
-
includeParams: false
|
|
277
|
-
}),
|
|
278
|
-
_ts_metadata("design:type", Function),
|
|
279
|
-
_ts_metadata("design:paramtypes", [
|
|
280
|
-
String,
|
|
281
|
-
String,
|
|
282
|
-
String
|
|
283
|
-
]),
|
|
284
|
-
_ts_metadata("design:returntype", Promise)
|
|
285
|
-
], SocialAuthService.prototype, "completeLogin", null);
|
|
286
|
-
SocialAuthService = _ts_decorate([
|
|
287
|
-
Injectable({
|
|
288
|
-
scope: Scope.REQUEST
|
|
289
|
-
}),
|
|
290
|
-
_ts_param(0, Inject(AuthenticationService)),
|
|
291
|
-
_ts_param(1, Inject(AuthDataSourceProvider)),
|
|
292
|
-
_ts_param(2, Optional()),
|
|
293
|
-
_ts_param(2, Inject('CACHE_INSTANCE')),
|
|
294
|
-
_ts_metadata("design:type", Function),
|
|
295
|
-
_ts_metadata("design:paramtypes", [
|
|
296
|
-
typeof AuthenticationService === "undefined" ? Object : AuthenticationService,
|
|
297
|
-
typeof AuthDataSourceProvider === "undefined" ? Object : AuthDataSourceProvider,
|
|
298
|
-
typeof HybridCache === "undefined" ? Object : HybridCache
|
|
299
|
-
])
|
|
300
|
-
], SocialAuthService);
|