-
Notifications
You must be signed in to change notification settings - Fork 70
/
job-processing.service.ts
102 lines (98 loc) · 3.83 KB
/
job-processing.service.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import {BindingScope, inject, injectable} from '@loopback/core';
import {EntityCrudRepository, Filter, repository} from '@loopback/repository';
import {HttpErrors} from '@loopback/rest';
import {AuditLog, AuditLogRepository} from '@sourceloop/audit-log';
import {FileStatusKey} from '../enums/file-status-key.enum';
import {OperationKey} from '../enums/operation-key.enum';
import {
AuditLogExportServiceBindings,
ColumnBuilderServiceBindings,
QuerySelectedFilesServiceBindings,
} from '../keys';
import {CustomFilter, Job, MappingLog} from '../models';
import {JobRepository, MappingLogRepository} from '../repositories';
import {
AuditLogExportFn,
ColumnBuilderFn,
QuerySelectedFilesFn,
} from '../types';
@injectable({scope: BindingScope.TRANSIENT})
export class JobProcessingService {
constructor(
@inject(QuerySelectedFilesServiceBindings.QUERY_ARCHIVED_LOGS)
public querySelectedFiles: QuerySelectedFilesFn,
@inject(AuditLogExportServiceBindings.EXPORT_AUDIT_LOGS)
public auditLogExport: AuditLogExportFn,
@inject(ColumnBuilderServiceBindings.COLUMN_BUILDER)
public columnBuilder: ColumnBuilderFn,
@repository(MappingLogRepository)
public mappingLogRepository: EntityCrudRepository<MappingLog, string, {}>,
@repository(JobRepository)
public jobRepository: EntityCrudRepository<Job, string, {}>,
@repository(AuditLogRepository)
public auditLogRepository: EntityCrudRepository<AuditLog, string, {}>,
) {}
async start(jobId: string) {
const job = await this.jobRepository.findById(jobId);
try {
const filter: Filter<AuditLog> = (
await this.jobRepository.findById(jobId)
).filterUsed;
const customFilter = new CustomFilter();
if (filter?.where && 'and' in filter.where) {
const andArray = filter.where?.and;
for (const condition of andArray) {
if (condition.actedAt?.between) {
const [start, end] = condition.actedAt.between;
customFilter.date = {
fromDate: start,
toDate: end,
};
}
if (condition.actedOn) {
customFilter.actedOn = condition.actedOn;
}
if (condition.entityId) {
customFilter.entityId = condition.entityId;
}
}
}
const mappingLogs: MappingLog[] = await this.mappingLogRepository.find();
const finalData: AuditLog[] = [];
/*Creating a for loop over all the archived files*/
for (const mappingLog of mappingLogs) {
const filterUsed: CustomFilter = mappingLog.filterUsed as CustomFilter;
if (
(customFilter.actedOn == null ||
filterUsed.actedOn == null ||
filterUsed.actedOn === customFilter.actedOn) &&
(customFilter.entityId ??
filterUsed.entityId ??
filterUsed.entityId === customFilter.entityId) &&
(customFilter.date == null ||
filterUsed.date == null ||
(filterUsed.date?.fromDate <= customFilter.date?.toDate &&
filterUsed.date?.toDate >= customFilter.date?.fromDate))
) {
//logs from s3
finalData.push(
...(await this.querySelectedFiles(mappingLog.fileName, filter)),
);
}
}
//logs from db
finalData.push(...(await this.auditLogRepository.find(filter)));
if (job.operation === OperationKey.EXPORT) {
const customColumnData = await this.columnBuilder(finalData);
await this.auditLogExport(customColumnData);
}
job.status = FileStatusKey.COMPLETED;
job.result = JSON.stringify(finalData);
await this.jobRepository.updateById(jobId, job);
} catch (error) {
job.status = FileStatusKey.COMPLETED;
await this.jobRepository.updateById(jobId, job);
throw new HttpErrors.UnprocessableEntity(error.message);
}
}
}