@solidstarters/solid-core 1.2.87 → 1.2.89
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/dist/controllers/export-template.controller.d.ts +3 -2
- package/dist/controllers/export-template.controller.d.ts.map +1 -1
- package/dist/controllers/export-template.controller.js +23 -10
- package/dist/controllers/export-template.controller.js.map +1 -1
- package/dist/dtos/export.dto.d.ts +5 -0
- package/dist/dtos/export.dto.d.ts.map +1 -0
- package/dist/dtos/export.dto.js +12 -0
- package/dist/dtos/export.dto.js.map +1 -0
- package/dist/entities/export-transaction.entity.js +1 -1
- package/dist/entities/export-transaction.entity.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +1 -1
- package/dist/services/authentication.service.d.ts +2 -0
- package/dist/services/authentication.service.d.ts.map +1 -1
- package/dist/services/authentication.service.js +20 -15
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/export-template.service.d.ts +3 -2
- package/dist/services/export-template.service.d.ts.map +1 -1
- package/dist/services/export-template.service.js +6 -6
- package/dist/services/export-template.service.js.map +1 -1
- package/dist/services/export-transaction.service.d.ts +6 -3
- package/dist/services/export-transaction.service.d.ts.map +1 -1
- package/dist/services/export-transaction.service.js +101 -22
- package/dist/services/export-transaction.service.js.map +1 -1
- package/dist/services/refresh-token-ids-storage.service.d.ts +6 -3
- package/dist/services/refresh-token-ids-storage.service.d.ts.map +1 -1
- package/dist/services/refresh-token-ids-storage.service.js +52 -7
- package/dist/services/refresh-token-ids-storage.service.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/controllers/export-template.controller.ts +20 -7
- package/src/dtos/export.dto.ts +5 -0
- package/src/entities/export-transaction.entity.ts +1 -1
- package/src/seeders/seed-data/solid-core-metadata.json +1 -1
- package/src/services/authentication.service.ts +44 -23
- package/src/services/export-template.service.ts +7 -6
- package/src/services/export-transaction.service.ts +136 -25
- package/src/services/refresh-token-ids-storage.service.ts +90 -7
|
@@ -33,6 +33,7 @@ const csv_service_1 = require("./csv.service");
|
|
|
33
33
|
const excel_service_1 = require("./excel.service");
|
|
34
34
|
const mediaStorageProviders_1 = require("./mediaStorageProviders");
|
|
35
35
|
const solid_introspect_service_1 = require("./solid-introspect.service");
|
|
36
|
+
const model_metadata_entity_1 = require("../entities/model-metadata.entity");
|
|
36
37
|
const EXPORT_CHUNK_SIZE = 100;
|
|
37
38
|
var ExportStatus;
|
|
38
39
|
(function (ExportStatus) {
|
|
@@ -46,7 +47,7 @@ var ExportFormat;
|
|
|
46
47
|
ExportFormat["EXCEL"] = "excel";
|
|
47
48
|
})(ExportFormat || (ExportFormat = {}));
|
|
48
49
|
let ExportTransactionService = ExportTransactionService_1 = class ExportTransactionService extends crud_service_1.CRUDService {
|
|
49
|
-
constructor(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, introspectService, excelService, csvService, fieldRepo, moduleRef) {
|
|
50
|
+
constructor(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, introspectService, excelService, csvService, fieldRepo, ModelMetadataRepo, moduleRef) {
|
|
50
51
|
super(modelMetadataService, moduleMetadataService, configService, fileService, discoveryService, crudHelperService, entityManager, repo, 'exportTransaction', 'solid-core', moduleRef);
|
|
51
52
|
this.modelMetadataService = modelMetadataService;
|
|
52
53
|
this.moduleMetadataService = moduleMetadataService;
|
|
@@ -60,16 +61,24 @@ let ExportTransactionService = ExportTransactionService_1 = class ExportTransact
|
|
|
60
61
|
this.excelService = excelService;
|
|
61
62
|
this.csvService = csvService;
|
|
62
63
|
this.fieldRepo = fieldRepo;
|
|
64
|
+
this.ModelMetadataRepo = ModelMetadataRepo;
|
|
63
65
|
this.moduleRef = moduleRef;
|
|
64
66
|
this.logger = new common_1.Logger(ExportTransactionService_1.name);
|
|
65
67
|
}
|
|
66
|
-
async triggerExportSync(id) {
|
|
68
|
+
async triggerExportSync(id, exportTransactionEntity, updateDto, filters) {
|
|
67
69
|
try {
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
+
const modeldata = await this.ModelMetadataRepo.findOne({
|
|
71
|
+
where: { id: updateDto?.modelMetadataId },
|
|
72
|
+
relations: { fields: true },
|
|
73
|
+
});
|
|
74
|
+
const modelName = modeldata?.singularName;
|
|
75
|
+
const modelTemplateName = modelName;
|
|
76
|
+
const fields = JSON.parse(updateDto?.fields);
|
|
77
|
+
const templateFormat = updateDto?.templateFormat;
|
|
78
|
+
const { exportStream, templateName, uuid, exportTransaction } = await this.getExportStreamDetails(modelName, modelTemplateName, fields, modeldata, templateFormat, id, exportTransactionEntity, filters);
|
|
70
79
|
this.updateExportTransaction(id, ExportStatus.COMPLETED);
|
|
71
|
-
const fileName = this.getFileName(templateName, uuid,
|
|
72
|
-
const mimeType = this.getMimeType(
|
|
80
|
+
const fileName = this.getFileName(templateName, uuid, templateFormat);
|
|
81
|
+
const mimeType = this.getMimeType(templateFormat);
|
|
73
82
|
return { exportStream, fileName, mimeType, exportTransaction };
|
|
74
83
|
}
|
|
75
84
|
catch (error) {
|
|
@@ -77,12 +86,18 @@ let ExportTransactionService = ExportTransactionService_1 = class ExportTransact
|
|
|
77
86
|
throw error;
|
|
78
87
|
}
|
|
79
88
|
}
|
|
80
|
-
async triggerExportAsync(id) {
|
|
89
|
+
async triggerExportAsync(id, exportTransactionEntity, updateDto, filters) {
|
|
81
90
|
try {
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
91
|
+
const modeldata = await this.ModelMetadataRepo.findOne({
|
|
92
|
+
where: { id: updateDto?.modelMetadataId },
|
|
93
|
+
relations: { fields: true },
|
|
94
|
+
});
|
|
95
|
+
const modelName = modeldata?.singularName;
|
|
96
|
+
const modelTemplateName = modelName;
|
|
97
|
+
const fields = JSON.parse(updateDto?.fields);
|
|
98
|
+
const templateFormat = updateDto?.templateFormat;
|
|
99
|
+
const { exportStream, templateName, uuid, exportTransaction } = await this.getExportStreamDetails(modelName, modelTemplateName, fields, modeldata, templateFormat, id, exportTransactionEntity, filters);
|
|
100
|
+
await this.storeExportStream(exportStream, exportTransaction, this.getFileName(templateName, uuid, templateFormat));
|
|
86
101
|
this.updateExportTransaction(id, ExportStatus.COMPLETED);
|
|
87
102
|
}
|
|
88
103
|
catch (error) {
|
|
@@ -93,20 +108,17 @@ let ExportTransactionService = ExportTransactionService_1 = class ExportTransact
|
|
|
93
108
|
async loadExportTransaction(id) {
|
|
94
109
|
return await this.repo.findOne({
|
|
95
110
|
where: { id: id },
|
|
96
|
-
relations: { exportTemplate: { modelMetadata: true } },
|
|
111
|
+
relations: { exportTemplate: { modelMetadata: { fields: true } } },
|
|
97
112
|
});
|
|
98
113
|
}
|
|
99
114
|
async updateExportTransaction(id, status, error) {
|
|
100
115
|
await this.repo.update(id, { status, error });
|
|
101
116
|
}
|
|
102
|
-
async getExportStreamDetails(exportTransaction) {
|
|
103
|
-
const fields = JSON.parse(exportTransaction.exportTemplate.fields);
|
|
104
|
-
const modelName = exportTransaction.exportTemplate.modelMetadata.singularName;
|
|
117
|
+
async getExportStreamDetails(modelName, templateName, fields, modelData, templateFormat, id, exportTransaction, filters) {
|
|
105
118
|
const modelService = this.introspectService.getProvider(`${(0, strings_1.classify)(modelName)}Service`);
|
|
106
|
-
const
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
let exportStream = await this.getExportStream(exportTransaction.exportTemplate.templateFormat, dataRecordsFunc);
|
|
119
|
+
const uuid = String(id);
|
|
120
|
+
const dataRecordsFunc = await this.getDataRecordsFunc(fields, modelService, modelData, filters);
|
|
121
|
+
let exportStream = await this.getExportStream(templateFormat, dataRecordsFunc);
|
|
110
122
|
return { exportStream, templateName, uuid, exportTransaction };
|
|
111
123
|
}
|
|
112
124
|
async getExportStream(templateFormat, dataRecordsFunc) {
|
|
@@ -145,17 +157,59 @@ let ExportTransactionService = ExportTransactionService_1 = class ExportTransact
|
|
|
145
157
|
getMimeType(fileFormat) {
|
|
146
158
|
return (fileFormat === ExportFormat.EXCEL) ? 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' : 'text/csv';
|
|
147
159
|
}
|
|
148
|
-
async getDataRecordsFunc(fields, modelService) {
|
|
160
|
+
async getDataRecordsFunc(fields, modelService, modelMetadata, filters) {
|
|
161
|
+
const relatedFieldNames = modelMetadata?.fields
|
|
162
|
+
.filter((field) => field.relationType !== null)
|
|
163
|
+
.map((field) => field.name);
|
|
164
|
+
const relatedModelsUserKeyMap = new Map();
|
|
165
|
+
for (const field of modelMetadata?.fields || []) {
|
|
166
|
+
if (field.relationType && field.relationCoModelSingularName && fields.includes(field.name)) {
|
|
167
|
+
const relatedModelMetadata = await this.ModelMetadataRepo.findOne({
|
|
168
|
+
where: { singularName: field.relationCoModelSingularName },
|
|
169
|
+
relations: ['userKeyField'],
|
|
170
|
+
});
|
|
171
|
+
if (relatedModelMetadata?.userKeyField?.name) {
|
|
172
|
+
relatedModelsUserKeyMap.set(field.name, relatedModelMetadata.userKeyField.name);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
149
176
|
return async (chunkIndex, chunkSize) => {
|
|
150
177
|
const offset = chunkIndex * chunkSize;
|
|
151
178
|
const recordFilterDto = {
|
|
152
|
-
fields,
|
|
153
179
|
limit: chunkSize,
|
|
154
180
|
offset,
|
|
181
|
+
populate: relatedFieldNames
|
|
155
182
|
};
|
|
183
|
+
const cleanedFilters = cleanNullsFromObject(filters);
|
|
184
|
+
if (cleanedFilters && Object.keys(cleanedFilters).length > 0) {
|
|
185
|
+
recordFilterDto.filters = cleanedFilters;
|
|
186
|
+
}
|
|
187
|
+
const nonRelationalFieldSet = new Set(modelMetadata?.fields
|
|
188
|
+
.filter((field) => fields.includes(field.name) && field.relationType === null)
|
|
189
|
+
.map((field) => field.name));
|
|
156
190
|
const data = await modelService.instance.find(recordFilterDto);
|
|
157
191
|
const records = data.records ?? [];
|
|
158
|
-
|
|
192
|
+
const cleanedRecords = records.map((record) => {
|
|
193
|
+
const newRecord = {};
|
|
194
|
+
for (const key of nonRelationalFieldSet) {
|
|
195
|
+
newRecord[key] = record[key];
|
|
196
|
+
}
|
|
197
|
+
for (const [relatedFieldName, userKeyFieldName] of relatedModelsUserKeyMap.entries()) {
|
|
198
|
+
const relatedData = record[relatedFieldName];
|
|
199
|
+
if (Array.isArray(relatedData)) {
|
|
200
|
+
const values = relatedData.map(item => item?.[userKeyFieldName]).filter(Boolean);
|
|
201
|
+
newRecord[relatedFieldName] = values.join(', ');
|
|
202
|
+
}
|
|
203
|
+
else if (relatedData && typeof relatedData === 'object') {
|
|
204
|
+
newRecord[relatedFieldName] = relatedData?.[userKeyFieldName] ?? null;
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
newRecord[relatedFieldName] = null;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return newRecord;
|
|
211
|
+
});
|
|
212
|
+
return cleanedRecords;
|
|
159
213
|
};
|
|
160
214
|
}
|
|
161
215
|
async toDto(data) {
|
|
@@ -174,6 +228,7 @@ exports.ExportTransactionService = ExportTransactionService = ExportTransactionS
|
|
|
174
228
|
__param(6, (0, typeorm_1.InjectEntityManager)()),
|
|
175
229
|
__param(7, (0, typeorm_1.InjectRepository)(export_transaction_entity_1.ExportTransaction, 'default')),
|
|
176
230
|
__param(11, (0, typeorm_1.InjectRepository)(field_metadata_entity_1.FieldMetadata, 'default')),
|
|
231
|
+
__param(12, (0, typeorm_1.InjectRepository)(model_metadata_entity_1.ModelMetadata, 'default')),
|
|
177
232
|
__metadata("design:paramtypes", [model_metadata_service_1.ModelMetadataService,
|
|
178
233
|
module_metadata_service_1.ModuleMetadataService,
|
|
179
234
|
config_1.ConfigService,
|
|
@@ -186,6 +241,30 @@ exports.ExportTransactionService = ExportTransactionService = ExportTransactionS
|
|
|
186
241
|
excel_service_1.ExcelService,
|
|
187
242
|
csv_service_1.CsvService,
|
|
188
243
|
typeorm_2.Repository,
|
|
244
|
+
typeorm_2.Repository,
|
|
189
245
|
core_1.ModuleRef])
|
|
190
246
|
], ExportTransactionService);
|
|
247
|
+
function cleanNullsFromObject(obj) {
|
|
248
|
+
if (Array.isArray(obj)) {
|
|
249
|
+
return obj
|
|
250
|
+
.filter(item => item !== null && item !== undefined)
|
|
251
|
+
.map(cleanNullsFromObject);
|
|
252
|
+
}
|
|
253
|
+
else if (typeof obj === 'object' && obj !== null) {
|
|
254
|
+
const newObj = {};
|
|
255
|
+
for (const key in obj) {
|
|
256
|
+
const value = obj[key];
|
|
257
|
+
if (value !== null && value !== undefined) {
|
|
258
|
+
const cleanedValue = cleanNullsFromObject(value);
|
|
259
|
+
if ((typeof cleanedValue === 'object' && Object.keys(cleanedValue).length > 0) ||
|
|
260
|
+
(Array.isArray(cleanedValue) && cleanedValue.length > 0) ||
|
|
261
|
+
typeof cleanedValue !== 'object') {
|
|
262
|
+
newObj[key] = cleanedValue;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return newObj;
|
|
267
|
+
}
|
|
268
|
+
return obj;
|
|
269
|
+
}
|
|
191
270
|
//# sourceMappingURL=export-transaction.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"export-transaction.service.js","sourceRoot":"","sources":["../../src/services/export-transaction.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,uCAA2D;AAC3D,6CAAwE;AACxE,qCAAoD;AAEpD,2CAA+C;AAC/C,+DAAqE;AACrE,iDAAwD;AACxD,iDAAwD;AAGxD,qEAA2E;AAC3E,uEAA6E;AAG7E,oEAA6E;AAE7E,qDAA2C;AAE3C,yFAAoF;AAEpF,6EAAmE;AAEnE,qFAA0E;AAC1E,+CAA2C;AAC3C,mDAA+C;AAC/C,mEAAkE;AAClE,yEAAoE;
|
|
1
|
+
{"version":3,"file":"export-transaction.service.js","sourceRoot":"","sources":["../../src/services/export-transaction.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { Cache } from 'cache-manager';
|
|
2
|
+
import { AuthenticationService } from './authentication.service';
|
|
2
3
|
export declare class InvalidatedRefreshTokenError extends Error {
|
|
3
4
|
}
|
|
4
5
|
export declare class RefreshTokenIdsStorageService {
|
|
5
6
|
private cacheManager;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
private readonly authenticationService;
|
|
8
|
+
constructor(cacheManager: Cache, authenticationService: AuthenticationService);
|
|
9
|
+
insert(userId: number, refreshToken: string): Promise<void>;
|
|
10
|
+
validate(userId: number, refreshToken: string): Promise<boolean>;
|
|
9
11
|
invalidate(userId: number): Promise<void>;
|
|
12
|
+
validateAndRotate(user: any, refreshToken: string): Promise<string>;
|
|
10
13
|
private getKey;
|
|
11
14
|
}
|
|
12
15
|
//# sourceMappingURL=refresh-token-ids-storage.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh-token-ids-storage.service.d.ts","sourceRoot":"","sources":["../../src/services/refresh-token-ids-storage.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"refresh-token-ids-storage.service.d.ts","sourceRoot":"","sources":["../../src/services/refresh-token-ids-storage.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,qBAAa,4BAA6B,SAAQ,KAAK;CAAI;AAE3D,qBAEa,6BAA6B;IAeX,OAAO,CAAC,YAAY;IAE3C,OAAO,CAAC,QAAQ,CAAC,qBAAqB;gBAFP,YAAY,EAAE,KAAK,EAEjC,qBAAqB,EAAE,qBAAqB;IAG3D,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3D,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUhE,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqEzE,OAAO,CAAC,MAAM;CAGjB"}
|
|
@@ -15,26 +15,70 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
exports.RefreshTokenIdsStorageService = exports.InvalidatedRefreshTokenError = void 0;
|
|
16
16
|
const cache_manager_1 = require("@nestjs/cache-manager");
|
|
17
17
|
const common_1 = require("@nestjs/common");
|
|
18
|
+
const authentication_service_1 = require("./authentication.service");
|
|
18
19
|
class InvalidatedRefreshTokenError extends Error {
|
|
19
20
|
}
|
|
20
21
|
exports.InvalidatedRefreshTokenError = InvalidatedRefreshTokenError;
|
|
21
22
|
let RefreshTokenIdsStorageService = class RefreshTokenIdsStorageService {
|
|
22
|
-
constructor(cacheManager) {
|
|
23
|
+
constructor(cacheManager, authenticationService) {
|
|
23
24
|
this.cacheManager = cacheManager;
|
|
25
|
+
this.authenticationService = authenticationService;
|
|
24
26
|
}
|
|
25
|
-
async insert(userId,
|
|
26
|
-
await this.cacheManager.
|
|
27
|
+
async insert(userId, refreshToken) {
|
|
28
|
+
const existing = (await this.cacheManager.get(this.getKey(userId)));
|
|
29
|
+
const refreshTokenState = {
|
|
30
|
+
currentRefreshToken: refreshToken,
|
|
31
|
+
previousRefreshToken: "",
|
|
32
|
+
};
|
|
33
|
+
await this.cacheManager.set(this.getKey(userId), refreshTokenState);
|
|
27
34
|
}
|
|
28
|
-
async validate(userId,
|
|
35
|
+
async validate(userId, refreshToken) {
|
|
29
36
|
const storedId = await this.cacheManager.get(this.getKey(userId));
|
|
30
|
-
if (storedId !==
|
|
37
|
+
if (storedId !== refreshToken) {
|
|
31
38
|
throw new InvalidatedRefreshTokenError();
|
|
32
39
|
}
|
|
33
|
-
return storedId ===
|
|
40
|
+
return storedId === refreshToken;
|
|
34
41
|
}
|
|
35
42
|
async invalidate(userId) {
|
|
36
43
|
await this.cacheManager.del(this.getKey(userId));
|
|
37
44
|
}
|
|
45
|
+
async validateAndRotate(user, refreshToken) {
|
|
46
|
+
let valid = false;
|
|
47
|
+
const refreshTokenState = await this.cacheManager.get(this.getKey(user.id));
|
|
48
|
+
console.log("refreshTokenState", refreshTokenState);
|
|
49
|
+
let newRefreshToken;
|
|
50
|
+
if (refreshTokenState &&
|
|
51
|
+
typeof refreshTokenState === 'object' &&
|
|
52
|
+
'currentRefreshToken' in refreshTokenState &&
|
|
53
|
+
'previousRefreshToken' in refreshTokenState) {
|
|
54
|
+
if (refreshTokenState.currentRefreshToken === refreshToken) {
|
|
55
|
+
valid = true;
|
|
56
|
+
newRefreshToken = await this.authenticationService.generateRefreshToken(user);
|
|
57
|
+
await this.cacheManager.set(this.getKey(user.id), {
|
|
58
|
+
currentRefreshToken: newRefreshToken,
|
|
59
|
+
previousRefreshToken: refreshTokenState.currentRefreshToken,
|
|
60
|
+
});
|
|
61
|
+
setTimeout(async () => {
|
|
62
|
+
const state = (await this.cacheManager.get(this.getKey(user.id)));
|
|
63
|
+
if (state && state.currentRefreshToken === newRefreshToken) {
|
|
64
|
+
await this.cacheManager.set(this.getKey(user.id), {
|
|
65
|
+
currentRefreshToken: newRefreshToken,
|
|
66
|
+
previousRefreshToken: "",
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}, 1 * 60 * 1000);
|
|
70
|
+
}
|
|
71
|
+
else if (refreshTokenState.previousRefreshToken === refreshToken) {
|
|
72
|
+
valid = true;
|
|
73
|
+
const existingRefreshTokenState = (await this.cacheManager.get(this.getKey(user.id)));
|
|
74
|
+
newRefreshToken = existingRefreshTokenState?.currentRefreshToken;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (!valid) {
|
|
78
|
+
throw new InvalidatedRefreshTokenError();
|
|
79
|
+
}
|
|
80
|
+
return newRefreshToken;
|
|
81
|
+
}
|
|
38
82
|
getKey(userId) {
|
|
39
83
|
return `user-${userId}`;
|
|
40
84
|
}
|
|
@@ -43,6 +87,7 @@ exports.RefreshTokenIdsStorageService = RefreshTokenIdsStorageService;
|
|
|
43
87
|
exports.RefreshTokenIdsStorageService = RefreshTokenIdsStorageService = __decorate([
|
|
44
88
|
(0, common_1.Injectable)(),
|
|
45
89
|
__param(0, (0, common_1.Inject)(cache_manager_1.CACHE_MANAGER)),
|
|
46
|
-
|
|
90
|
+
__param(1, (0, common_1.Inject)((0, common_1.forwardRef)(() => authentication_service_1.AuthenticationService))),
|
|
91
|
+
__metadata("design:paramtypes", [Object, authentication_service_1.AuthenticationService])
|
|
47
92
|
], RefreshTokenIdsStorageService);
|
|
48
93
|
//# sourceMappingURL=refresh-token-ids-storage.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh-token-ids-storage.service.js","sourceRoot":"","sources":["../../src/services/refresh-token-ids-storage.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,yDAAsD;AACtD,
|
|
1
|
+
{"version":3,"file":"refresh-token-ids-storage.service.js","sourceRoot":"","sources":["../../src/services/refresh-token-ids-storage.service.ts"],"names":[],"mappings":"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"}
|