tango-app-api-audit 1.0.56 → 1.0.58
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/package.json +2 -2
- package/src/controllers/audit.controllers.js +163 -10
- package/src/controllers/auditMetrics.controllers.js +1 -147
- package/src/docs/audit.docs.js +78 -1
- package/src/docs/auditMetrics.docs.js +1 -23
- package/src/dtos/audit.dtos.js +34 -0
- package/src/dtos/auditMetrics.dtos.js +0 -16
- package/src/routes/audit.routes.js +6 -3
- package/src/routes/auditMetrics.routes.js +3 -4
- package/src/validation/audit.validation.js +6 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tango-app-api-audit",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.58",
|
|
4
4
|
"description": "audit & audit metrics apis",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"nodemon": "^3.1.3",
|
|
26
26
|
"swagger-ui-express": "^5.0.1",
|
|
27
27
|
"tango-api-schema": "^2.0.152",
|
|
28
|
-
"tango-app-api-middleware": "^3.1.
|
|
28
|
+
"tango-app-api-middleware": "^3.1.30",
|
|
29
29
|
"winston": "^3.13.0",
|
|
30
30
|
"winston-daily-rotate-file": "^5.0.0"
|
|
31
31
|
},
|
|
@@ -17,11 +17,12 @@ import {
|
|
|
17
17
|
} from '../service/userAudit.service.js';
|
|
18
18
|
import {
|
|
19
19
|
aggregateAssignAudit,
|
|
20
|
+
createAssignAudit,
|
|
20
21
|
updateOneAssignAudit,
|
|
21
22
|
} from '../service/assignAudit.service.js';
|
|
22
23
|
import { aggregateUser, findOneUser } from '../service/user.service.js';
|
|
23
24
|
import dayjs from 'dayjs';
|
|
24
|
-
import { aggregateClient, findClient } from '../service/client.service.js';
|
|
25
|
+
import { aggregateClient, findClient, findOneClient } from '../service/client.service.js';
|
|
25
26
|
import { logger } from 'tango-app-api-middleware';
|
|
26
27
|
import {
|
|
27
28
|
listQueue,
|
|
@@ -532,7 +533,6 @@ export async function getAuditFile( req, res ) {
|
|
|
532
533
|
queueName: inputData.queueName,
|
|
533
534
|
beforeCount: msg.total_count || files.length,
|
|
534
535
|
auditStatus: 'inprogress',
|
|
535
|
-
moduleType: 'traffic',
|
|
536
536
|
fileDateISO: start,
|
|
537
537
|
timeSpent: 0,
|
|
538
538
|
startTime: new Date(),
|
|
@@ -1207,8 +1207,22 @@ export async function save( req, res ) {
|
|
|
1207
1207
|
try {
|
|
1208
1208
|
const bucket = JSON.parse( process.env.BUCKET );
|
|
1209
1209
|
const sqs = JSON.parse( process.env.SQS );
|
|
1210
|
-
|
|
1211
1210
|
const inputData = req.body;
|
|
1211
|
+
let storeAuditData = await findOneStoreAudit( {
|
|
1212
|
+
storeId: inputData.storeId,
|
|
1213
|
+
fileDate: inputData.fileDate,
|
|
1214
|
+
moduleType: inputData.moduleType,
|
|
1215
|
+
zoneName: inputData.zoneName,
|
|
1216
|
+
auditType: inputData.auditType,
|
|
1217
|
+
} );
|
|
1218
|
+
logger.info( { storeAuditData: storeAuditData } );
|
|
1219
|
+
if ( storeAuditData==null ) {
|
|
1220
|
+
logger.error( {
|
|
1221
|
+
error: `No data found: ${inputData.storeId}/${inputData.zoneName}/${inputData.fileDate}/${bucket.masterJsonFile}`,
|
|
1222
|
+
type: 'DATABASE_RECORD_NOTFOUND',
|
|
1223
|
+
} );
|
|
1224
|
+
return res.sendError( storeAuditData, 204 );
|
|
1225
|
+
}
|
|
1212
1226
|
const params = {
|
|
1213
1227
|
Key: `${inputData.storeId}/${inputData.zoneName}/${inputData.fileDate}/${bucket.masterJsonFile}`,
|
|
1214
1228
|
};
|
|
@@ -1300,13 +1314,6 @@ export async function save( req, res ) {
|
|
|
1300
1314
|
clientId: 1,
|
|
1301
1315
|
},
|
|
1302
1316
|
);
|
|
1303
|
-
let storeAuditData = await findOneStoreAudit( {
|
|
1304
|
-
storeId: inputData.storeId,
|
|
1305
|
-
fileDate: inputData.fileDate,
|
|
1306
|
-
moduleType: inputData.moduleType,
|
|
1307
|
-
zoneName: inputData.zoneName,
|
|
1308
|
-
auditType: inputData.auditType,
|
|
1309
|
-
} );
|
|
1310
1317
|
|
|
1311
1318
|
let clientData = await findClient( { clientId: storeConfig.clientId } );
|
|
1312
1319
|
|
|
@@ -2698,6 +2705,152 @@ export async function overAllAuditSummary( req, res ) {
|
|
|
2698
2705
|
}
|
|
2699
2706
|
}
|
|
2700
2707
|
|
|
2708
|
+
export async function reTrigger( req, res ) {
|
|
2709
|
+
try {
|
|
2710
|
+
const openSearch = JSON.parse( process.env.OPENSEARCH );
|
|
2711
|
+
const inputData = req.body;
|
|
2712
|
+
const sqs = JSON.parse( process.env.SQS );
|
|
2713
|
+
const query ={
|
|
2714
|
+
storeId: inputData.storeId,
|
|
2715
|
+
fileDate: inputData.fileDate,
|
|
2716
|
+
zoneName: inputData.zoneName,
|
|
2717
|
+
};
|
|
2718
|
+
const getQueueName = await findOneClient( { clientId: req.audit.clientId }, { 'auditConfigs': 1 } );
|
|
2719
|
+
const queueName = inputData.moduleType == 'zone' ? getQueueName?.auditConfigs?.zoneQueueName : getQueueName?.auditConfigs?.trafficQueueName;
|
|
2720
|
+
if ( !getQueueName || queueName == '' ) {
|
|
2721
|
+
return res.sendError( 'queueName does not create', 400 );
|
|
2722
|
+
}
|
|
2723
|
+
switch ( inputData.triggerType ) {
|
|
2724
|
+
case 'queue':
|
|
2725
|
+
const msg = {
|
|
2726
|
+
store_id: inputData.storeId,
|
|
2727
|
+
zone_id: inputData.zoneName,
|
|
2728
|
+
curr_date: inputData.fileDate,
|
|
2729
|
+
audit_type: inputData.auditType,
|
|
2730
|
+
total_count: inputData.totalCount,
|
|
2731
|
+
};
|
|
2732
|
+
|
|
2733
|
+
const sqsProduceQueue = {
|
|
2734
|
+
QueueUrl: `${sqs.url}${queueName}`,
|
|
2735
|
+
MessageBody: JSON.stringify( msg ),
|
|
2736
|
+
};
|
|
2737
|
+
const sqsQueue = await sendMessageToQueue( sqsProduceQueue.QueueUrl, sqsProduceQueue.MessageBody );
|
|
2738
|
+
if ( sqsQueue?.errorCode ) {
|
|
2739
|
+
const error = sqsQueue?.errorMsg;
|
|
2740
|
+
const code = sqsQueue?.errorCode;
|
|
2741
|
+
return res.sendError( error, code );
|
|
2742
|
+
} else {
|
|
2743
|
+
if ( req.audit.status !== 'completed' ) {
|
|
2744
|
+
const userRecord ={
|
|
2745
|
+
auditStatus: 'skipped',
|
|
2746
|
+
isDraft: false,
|
|
2747
|
+
};
|
|
2748
|
+
const query ={
|
|
2749
|
+
storeId: inputData.storeId,
|
|
2750
|
+
zoneName: inputData.zoneName,
|
|
2751
|
+
fileDate: inputData.fileDate,
|
|
2752
|
+
auditStatus: req.audit.status,
|
|
2753
|
+
|
|
2754
|
+
};
|
|
2755
|
+
await updateOneUserAudit( query, userRecord );
|
|
2756
|
+
}
|
|
2757
|
+
|
|
2758
|
+
const storeRecord ={
|
|
2759
|
+
status: req.audit.status !== 'completed' ? 'skipped': 'not_assign',
|
|
2760
|
+
};
|
|
2761
|
+
|
|
2762
|
+
await updateOneStoreAudit( query, storeRecord );
|
|
2763
|
+
const logData = {
|
|
2764
|
+
userId: req.user._id,
|
|
2765
|
+
userName: req.user.userName,
|
|
2766
|
+
logType: 'audit',
|
|
2767
|
+
logSubType: 'reTrigger',
|
|
2768
|
+
logData: {
|
|
2769
|
+
beforeCount: inputData.totalCount,
|
|
2770
|
+
afterCount: '',
|
|
2771
|
+
fileDate: inputData.fileDate,
|
|
2772
|
+
auditType: inputData.auditType,
|
|
2773
|
+
storeId: inputData.storeId,
|
|
2774
|
+
zoneName: inputData.zoneName,
|
|
2775
|
+
moduleType: inputData.moduleType,
|
|
2776
|
+
queueName: queueName,
|
|
2777
|
+
message: inputData.comments,
|
|
2778
|
+
triggerBy: req.user.userName,
|
|
2779
|
+
triggerId: req.user._id,
|
|
2780
|
+
triggerType: inputData.triggerType,
|
|
2781
|
+
},
|
|
2782
|
+
};
|
|
2783
|
+
await insertOpenSearchData( openSearch.activityLog, logData );
|
|
2784
|
+
}
|
|
2785
|
+
break;
|
|
2786
|
+
case 'user':
|
|
2787
|
+
const assignUser = await findOneUser( { _id: new mongoose.Types.ObjectId( inputData.userId ) } );
|
|
2788
|
+
const assignUserRecord = {
|
|
2789
|
+
storeId: inputData.storeId,
|
|
2790
|
+
clientId: req.audit.clientId,
|
|
2791
|
+
zoneName: inputData.zoneName,
|
|
2792
|
+
fileDate: inputData.fileDate,
|
|
2793
|
+
moduleType: inputData.moduleType,
|
|
2794
|
+
fileDateISO: dayjs( new Date( ( inputData.fileDate ).split( '-' ).reverse().join( '-' ) ) ).format(),
|
|
2795
|
+
auditType: inputData.auditType,
|
|
2796
|
+
fileCount: inputData.beforeCount,
|
|
2797
|
+
queueName: queueName,
|
|
2798
|
+
userId: inputData.userId,
|
|
2799
|
+
userName: assignUser.userName,
|
|
2800
|
+
};
|
|
2801
|
+
await createAssignAudit( assignUserRecord );
|
|
2802
|
+
|
|
2803
|
+
if ( req.audit.status !== 'completed' ) {
|
|
2804
|
+
const userRecord ={
|
|
2805
|
+
auditStatus: 'skipped',
|
|
2806
|
+
isDraft: false,
|
|
2807
|
+
};
|
|
2808
|
+
const query ={
|
|
2809
|
+
storeId: inputData.storeId,
|
|
2810
|
+
zoneName: inputData.zoneName,
|
|
2811
|
+
fileDate: inputData.fileDate,
|
|
2812
|
+
auditStatus: req.audit.status,
|
|
2813
|
+
|
|
2814
|
+
};
|
|
2815
|
+
await updateOneUserAudit( query, userRecord );
|
|
2816
|
+
}
|
|
2817
|
+
|
|
2818
|
+
const storeRecord ={
|
|
2819
|
+
status: req.audit.status !== 'completed' ? 'skipped': 'assigned',
|
|
2820
|
+
};
|
|
2821
|
+
|
|
2822
|
+
await updateOneStoreAudit( query, storeRecord );
|
|
2823
|
+
const logData = {
|
|
2824
|
+
userId: req.user._id,
|
|
2825
|
+
userName: req.user.userName,
|
|
2826
|
+
logType: 'audit',
|
|
2827
|
+
logSubType: 'reTrigger',
|
|
2828
|
+
logData: {
|
|
2829
|
+
beforeCount: inputData.totalCount,
|
|
2830
|
+
afterCount: '',
|
|
2831
|
+
fileDate: inputData.fileDate,
|
|
2832
|
+
auditType: inputData.auditType,
|
|
2833
|
+
storeId: inputData.storeId,
|
|
2834
|
+
zoneName: inputData.zoneName,
|
|
2835
|
+
moduleType: inputData.moduleType,
|
|
2836
|
+
queueName: queueName,
|
|
2837
|
+
message: inputData.comments,
|
|
2838
|
+
triggerBy: req.user.userName,
|
|
2839
|
+
triggerId: req.user._id,
|
|
2840
|
+
triggerType: inputData.triggerType,
|
|
2841
|
+
},
|
|
2842
|
+
};
|
|
2843
|
+
await insertOpenSearchData( openSearch.activityLog, logData );
|
|
2844
|
+
}
|
|
2845
|
+
|
|
2846
|
+
return res.sendSuccess( { result: 'The File has been Re Trigger Succesfully' } );
|
|
2847
|
+
} catch ( error ) {
|
|
2848
|
+
const err = error.message;
|
|
2849
|
+
logger.error( { error: error, message: req.body } );
|
|
2850
|
+
return res.sendError( err, 500 );
|
|
2851
|
+
}
|
|
2852
|
+
}
|
|
2853
|
+
|
|
2701
2854
|
export async function overViewCard( req, res ) {
|
|
2702
2855
|
try {
|
|
2703
2856
|
const inputData = req.body;
|
|
@@ -1,155 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { updateOneUserAudit } from '../service/userAudit.service.js';
|
|
3
|
-
import mongoose from 'mongoose';
|
|
4
|
-
import { updateOneStoreAudit } from '../service/storeAudit.service.js';
|
|
5
|
-
import { findOneUser } from '../service/user.service.js';
|
|
6
|
-
import dayjs from 'dayjs';
|
|
7
|
-
import { createAssignAudit } from '../service/assignAudit.service.js';
|
|
8
|
-
import { findOneClient } from '../service/client.service.js';
|
|
1
|
+
import { logger } from 'tango-app-api-middleware';
|
|
9
2
|
import { getAuditFilterData, getAuditImageData, zipDownloadImage } from '../validation/audit.validation.js';
|
|
10
3
|
import { getReauditImg } from './audit.controllers.js';
|
|
11
4
|
// import { listQueue } from 'tango-app-api-middleware/src/utils/aws/sqs.js';
|
|
12
5
|
|
|
13
6
|
|
|
14
|
-
export async function reTrigger( req, res ) {
|
|
15
|
-
try {
|
|
16
|
-
const openSearch = JSON.parse( process.env.OPENSEARCH );
|
|
17
|
-
const inputData = req.body;
|
|
18
|
-
const sqs = JSON.parse( process.env.SQS );
|
|
19
|
-
const query ={
|
|
20
|
-
storeId: inputData.storeId,
|
|
21
|
-
fileDate: inputData.fileDate,
|
|
22
|
-
};
|
|
23
|
-
const getQueueName = await findOneClient( { clientId: req.audit.clientId }, { 'auditConfigs.queueName': 1 } );
|
|
24
|
-
|
|
25
|
-
if ( !getQueueName || getQueueName?.auditConfigs?.queueName == '' ) {
|
|
26
|
-
return res.sendError( 'queueName does not create', 400 );
|
|
27
|
-
}
|
|
28
|
-
const queueName = getQueueName?.auditConfigs?.queueName;
|
|
29
|
-
logger.info( { queueName: queueName } );
|
|
30
|
-
switch ( inputData.triggerType ) {
|
|
31
|
-
case 'queue':
|
|
32
|
-
const msg = {
|
|
33
|
-
store_id: inputData.storeId,
|
|
34
|
-
curr_date: inputData.fileDate,
|
|
35
|
-
audit_type: inputData.type,
|
|
36
|
-
total_count: inputData.totalCount,
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
const sqsProduceQueue = {
|
|
40
|
-
QueueUrl: `${sqs.url}${queueName}`,
|
|
41
|
-
MessageBody: JSON.stringify( msg ),
|
|
42
|
-
};
|
|
43
|
-
const sqsQueue = await sendMessageToQueue( sqsProduceQueue.QueueUrl, sqsProduceQueue.MessageBody );
|
|
44
|
-
if ( sqsQueue?.errorCode ) {
|
|
45
|
-
const error = sqsQueue?.errorMsg;
|
|
46
|
-
const code = sqsQueue?.errorCode;
|
|
47
|
-
return res.sendError( error, code );
|
|
48
|
-
} else {
|
|
49
|
-
if ( req.audit.status !== 'completed' ) {
|
|
50
|
-
const userRecord ={
|
|
51
|
-
auditStatus: 'skipped',
|
|
52
|
-
isDraft: false,
|
|
53
|
-
};
|
|
54
|
-
const query ={
|
|
55
|
-
storeId: inputData.storeId,
|
|
56
|
-
fileDate: inputData.fileDate,
|
|
57
|
-
auditStatus: req.audit.status,
|
|
58
|
-
|
|
59
|
-
};
|
|
60
|
-
await updateOneUserAudit( query, userRecord );
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
const storeRecord ={
|
|
64
|
-
status: req.audit.status !== 'completed' ? 'skipped': 'not_assign',
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
await updateOneStoreAudit( query, storeRecord );
|
|
68
|
-
const logData = {
|
|
69
|
-
userId: req.user._id,
|
|
70
|
-
userName: req.user.userName,
|
|
71
|
-
logType: 'audit',
|
|
72
|
-
logSubType: 'reTrigger',
|
|
73
|
-
logData: {
|
|
74
|
-
beforeCount: inputData.totalCount,
|
|
75
|
-
afterCount: '',
|
|
76
|
-
fileDate: inputData.fileDate,
|
|
77
|
-
auditType: inputData.type,
|
|
78
|
-
storeId: inputData.storeId,
|
|
79
|
-
queueName: queueName,
|
|
80
|
-
message: inputData.comments,
|
|
81
|
-
triggerBy: req.user.userName,
|
|
82
|
-
triggerId: req.user._id,
|
|
83
|
-
triggerType: inputData.triggerType,
|
|
84
|
-
},
|
|
85
|
-
};
|
|
86
|
-
await insertOpenSearchData( openSearch.activityLog, logData );
|
|
87
|
-
}
|
|
88
|
-
break;
|
|
89
|
-
case 'user':
|
|
90
|
-
const assignUser = await findOneUser( { _id: new mongoose.Types.ObjectId( inputData.userId ) } );
|
|
91
|
-
const assignUserRecord = {
|
|
92
|
-
storeId: inputData.storeId,
|
|
93
|
-
clientId: req.audit.clientId,
|
|
94
|
-
fileDate: inputData.fileDate,
|
|
95
|
-
moduleType: 'traffic',
|
|
96
|
-
fileDateISO: dayjs( inputData.fileDate, 'DD-MM-YYYY' ).format(),
|
|
97
|
-
auditType: inputData.type,
|
|
98
|
-
fileCount: inputData.beforeCount,
|
|
99
|
-
queueName: queueName,
|
|
100
|
-
userId: inputData.userId,
|
|
101
|
-
userName: assignUser.userName,
|
|
102
|
-
};
|
|
103
|
-
await createAssignAudit( assignUserRecord );
|
|
104
|
-
|
|
105
|
-
if ( req.audit.status !== 'completed' ) {
|
|
106
|
-
const userRecord ={
|
|
107
|
-
auditStatus: 'skipped',
|
|
108
|
-
isDraft: false,
|
|
109
|
-
};
|
|
110
|
-
const query ={
|
|
111
|
-
storeId: inputData.storeId,
|
|
112
|
-
fileDate: inputData.fileDate,
|
|
113
|
-
auditStatus: req.audit.status,
|
|
114
|
-
|
|
115
|
-
};
|
|
116
|
-
await updateOneUserAudit( query, userRecord );
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const storeRecord ={
|
|
120
|
-
status: req.audit.status !== 'completed' ? 'skipped': 'assigned',
|
|
121
|
-
};
|
|
122
|
-
|
|
123
|
-
await updateOneStoreAudit( query, storeRecord );
|
|
124
|
-
const logData = {
|
|
125
|
-
userId: req.user._id,
|
|
126
|
-
userName: req.user.userName,
|
|
127
|
-
logType: 'audit',
|
|
128
|
-
logSubType: 'reTrigger',
|
|
129
|
-
logData: {
|
|
130
|
-
beforeCount: inputData.totalCount,
|
|
131
|
-
afterCount: '',
|
|
132
|
-
fileDate: inputData.fileDate,
|
|
133
|
-
auditType: inputData.type,
|
|
134
|
-
storeId: inputData.storeId,
|
|
135
|
-
queueName: queueName,
|
|
136
|
-
message: inputData.comments,
|
|
137
|
-
triggerBy: req.user.userName,
|
|
138
|
-
triggerId: req.user._id,
|
|
139
|
-
triggerType: inputData.triggerType,
|
|
140
|
-
},
|
|
141
|
-
};
|
|
142
|
-
await insertOpenSearchData( openSearch.activityLog, logData );
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
return res.sendSuccess( { result: 'The File has been Re Trigger Succesfully' } );
|
|
146
|
-
} catch ( error ) {
|
|
147
|
-
const err = error.message;
|
|
148
|
-
logger.error( { error: error, message: req.body } );
|
|
149
|
-
return res.sendError( err, 500 );
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
7
|
export async function auditImages( req, res ) {
|
|
154
8
|
try {
|
|
155
9
|
const inputData = req.query;
|
package/src/docs/audit.docs.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { auditStoreSchema, clientMetricsSchema, clientSchema, getDraftedDataSchema, getFileSchema, overAllAuditSummarySchema, overViewCardSchema, overViewTableSchema, saveDraftSchema, saveSchema, storeMetricsSchema, summarySplitSchema, userAuditHistorySchema, userMetricsSchema, userSchema, workSpaceSchema } from '../dtos/audit.dtos.js';
|
|
1
|
+
import { auditStoreSchema, clientMetricsSchema, clientSchema, getDraftedDataSchema, getFileSchema, overAllAuditSummarySchema, overViewCardSchema, overViewTableSchema, reTriggerValidSchema, saveDraftSchema, saveSchema, storeMetricsSchema, summarySplitSchema, userAuditHistorySchema, userMetricsSchema, userSchema, workSpaceSchema, auditImageValidSchema } from '../dtos/audit.dtos.js';
|
|
2
2
|
import j2s from 'joi-to-swagger';
|
|
3
3
|
|
|
4
4
|
export const auditDocs = {
|
|
@@ -398,6 +398,29 @@ export const auditDocs = {
|
|
|
398
398
|
},
|
|
399
399
|
},
|
|
400
400
|
|
|
401
|
+
'/v3/audit/metrics/re-trigger': {
|
|
402
|
+
post: {
|
|
403
|
+
tags: [ 'Audit Metrics' ],
|
|
404
|
+
description: `Manual re trigger a file`,
|
|
405
|
+
operationId: 'metrics/re-trigger',
|
|
406
|
+
parameters: {},
|
|
407
|
+
requestBody: {
|
|
408
|
+
content: {
|
|
409
|
+
'application/json': {
|
|
410
|
+
schema: j2s( reTriggerValidSchema ).swagger,
|
|
411
|
+
},
|
|
412
|
+
},
|
|
413
|
+
},
|
|
414
|
+
responses: {
|
|
415
|
+
200: { description: 'Successful' },
|
|
416
|
+
401: { description: 'Unauthorized User' },
|
|
417
|
+
422: { description: 'Field Error' },
|
|
418
|
+
500: { description: 'Server Error' },
|
|
419
|
+
204: { description: 'Not Found' },
|
|
420
|
+
},
|
|
421
|
+
},
|
|
422
|
+
},
|
|
423
|
+
|
|
401
424
|
'/v3/audit/metrics/overview-card': {
|
|
402
425
|
post: {
|
|
403
426
|
tags: [ 'Audit Metrics' ],
|
|
@@ -443,4 +466,58 @@ export const auditDocs = {
|
|
|
443
466
|
},
|
|
444
467
|
},
|
|
445
468
|
},
|
|
469
|
+
|
|
470
|
+
'/v3/audit/audit-images': {
|
|
471
|
+
get: {
|
|
472
|
+
tags: [ 'Audit Metrics' ],
|
|
473
|
+
description: `View and Download audit images`,
|
|
474
|
+
operationId: 'audit-images',
|
|
475
|
+
parameters: [
|
|
476
|
+
{
|
|
477
|
+
in: 'query',
|
|
478
|
+
name: 'fileDate',
|
|
479
|
+
scema: j2s( auditImageValidSchema ).swagger,
|
|
480
|
+
require: true,
|
|
481
|
+
},
|
|
482
|
+
{
|
|
483
|
+
in: 'query',
|
|
484
|
+
name: 'storeId',
|
|
485
|
+
scema: j2s( auditImageValidSchema ).swagger,
|
|
486
|
+
require: true,
|
|
487
|
+
},
|
|
488
|
+
{
|
|
489
|
+
in: 'query',
|
|
490
|
+
name: 'imageType',
|
|
491
|
+
scema: j2s( auditImageValidSchema ).swagger,
|
|
492
|
+
require: true,
|
|
493
|
+
},
|
|
494
|
+
{
|
|
495
|
+
in: 'query',
|
|
496
|
+
name: 'export',
|
|
497
|
+
scema: j2s( auditImageValidSchema ).swagger,
|
|
498
|
+
require: true,
|
|
499
|
+
},
|
|
500
|
+
{
|
|
501
|
+
in: 'query',
|
|
502
|
+
name: 'moduleType',
|
|
503
|
+
scema: j2s( auditImageValidSchema ).swagger,
|
|
504
|
+
require: true,
|
|
505
|
+
},
|
|
506
|
+
{
|
|
507
|
+
in: 'query',
|
|
508
|
+
name: 'zoneName',
|
|
509
|
+
scema: j2s( auditImageValidSchema ).swagger,
|
|
510
|
+
require: true,
|
|
511
|
+
},
|
|
512
|
+
],
|
|
513
|
+
responses: {
|
|
514
|
+
200: { description: 'Successful' },
|
|
515
|
+
401: { description: 'Unauthorized User' },
|
|
516
|
+
422: { description: 'Field Error' },
|
|
517
|
+
500: { description: 'Server Error' },
|
|
518
|
+
204: { description: 'Not Found' },
|
|
519
|
+
},
|
|
520
|
+
|
|
521
|
+
},
|
|
522
|
+
},
|
|
446
523
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import j2s from 'joi-to-swagger';
|
|
2
|
-
import { auditImageValidSchema, getAuditImagesSchema
|
|
2
|
+
import { auditImageValidSchema, getAuditImagesSchema } from '../dtos/auditMetrics.dtos.js';
|
|
3
3
|
|
|
4
4
|
export const auditMetricsDocs = {
|
|
5
5
|
|
|
@@ -27,28 +27,6 @@ export const auditMetricsDocs = {
|
|
|
27
27
|
},
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
'/v3/audit-metrics/re-trigger': {
|
|
31
|
-
post: {
|
|
32
|
-
tags: [ 'Audit Metrics' ],
|
|
33
|
-
description: `Manual re trigger a file`,
|
|
34
|
-
operationId: 're-trigger',
|
|
35
|
-
parameters: {},
|
|
36
|
-
requestBody: {
|
|
37
|
-
content: {
|
|
38
|
-
'application/json': {
|
|
39
|
-
schema: j2s( reTriggerValidSchema ).swagger,
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
responses: {
|
|
44
|
-
200: { description: 'Successful' },
|
|
45
|
-
401: { description: 'Unauthorized User' },
|
|
46
|
-
422: { description: 'Field Error' },
|
|
47
|
-
500: { description: 'Server Error' },
|
|
48
|
-
204: { description: 'Not Found' },
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
},
|
|
52
30
|
'/v3/audit-metrics/audit-images': {
|
|
53
31
|
get: {
|
|
54
32
|
tags: [ 'Audit Metrics' ],
|
package/src/dtos/audit.dtos.js
CHANGED
|
@@ -261,6 +261,24 @@ export const overAllAuditSummaryValid = {
|
|
|
261
261
|
body: overAllAuditSummarySchema,
|
|
262
262
|
};
|
|
263
263
|
|
|
264
|
+
export const reTriggerValidSchema = joi.object(
|
|
265
|
+
{
|
|
266
|
+
fileDate: joi.string().required(),
|
|
267
|
+
storeId: joi.string().required(),
|
|
268
|
+
zoneName: joi.string().required(),
|
|
269
|
+
moduleType: joi.string().required(),
|
|
270
|
+
auditType: joi.string().required(),
|
|
271
|
+
triggerType: joi.string().optional(),
|
|
272
|
+
totalCount: joi.number().required(),
|
|
273
|
+
userId: joi.string().optional(),
|
|
274
|
+
comments: joi.string().optional().allow( '' ),
|
|
275
|
+
},
|
|
276
|
+
);
|
|
277
|
+
|
|
278
|
+
export const reTriggerValid = {
|
|
279
|
+
body: reTriggerValidSchema,
|
|
280
|
+
};
|
|
281
|
+
|
|
264
282
|
export const overViewCardSchema = joi.object(
|
|
265
283
|
{
|
|
266
284
|
fromDate: joi.string().required(),
|
|
@@ -284,3 +302,19 @@ export const summarySplitSchema = joi.object(
|
|
|
284
302
|
export const summarySplitValid = {
|
|
285
303
|
body: summarySplitSchema,
|
|
286
304
|
};
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
export const auditImageValidSchema = joi.object(
|
|
308
|
+
{
|
|
309
|
+
fileDate: joi.string().required(),
|
|
310
|
+
storeId: joi.string().required(),
|
|
311
|
+
imageType: joi.string().required(),
|
|
312
|
+
export: joi.boolean().required(),
|
|
313
|
+
moduleType: joi.string().required(),
|
|
314
|
+
zoneName: joi.string().required(),
|
|
315
|
+
},
|
|
316
|
+
);
|
|
317
|
+
|
|
318
|
+
export const auditImageValid = {
|
|
319
|
+
query: auditImageValidSchema,
|
|
320
|
+
};
|
|
@@ -14,22 +14,6 @@ export const getAuditImagesValid = {
|
|
|
14
14
|
};
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
export const reTriggerValidSchema = joi.object(
|
|
18
|
-
{
|
|
19
|
-
fileDate: joi.string().required(),
|
|
20
|
-
storeId: joi.string().required(),
|
|
21
|
-
type: joi.string().optional(),
|
|
22
|
-
triggerType: joi.string().optional(),
|
|
23
|
-
totalCount: joi.number().required(),
|
|
24
|
-
userId: joi.string().optional(),
|
|
25
|
-
comments: joi.string().optional().allow( '' ),
|
|
26
|
-
},
|
|
27
|
-
);
|
|
28
|
-
|
|
29
|
-
export const reTriggerValid = {
|
|
30
|
-
body: reTriggerValidSchema,
|
|
31
|
-
};
|
|
32
|
-
|
|
33
17
|
export const auditImageValidSchema = joi.object(
|
|
34
18
|
{
|
|
35
19
|
fileDate: joi.string().required(),
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
|
-
import { isExistsQueue, validateUserAudit } from '../validation/audit.validation.js';
|
|
2
|
+
import { isAuditDocumentExist, isAuditInputFolderExist, isExistsQueue, validateUserAudit } from '../validation/audit.validation.js';
|
|
3
3
|
import { isAllowedSessionHandler, validate } from 'tango-app-api-middleware';
|
|
4
|
-
import { auditStoreList, auditUserList, clientMetrics, clients, getAuditFile, getDraftedData, overAllAuditSummary, overViewCard, overViewTable, save, saveDraft, storeMetrics, summarySplit, userAuditHistory, userMetrics, workSpace } from '../controllers/audit.controllers.js';
|
|
5
|
-
import { auditStoreValid, clientMetricsValid, clientValid, getDraftedDataValid, getFileValid, overAllAuditSummaryValid, overViewCardValid, overViewTableValid, saveDraftValid, saveValid, storeMetricsValid, summarySplitValid, userAuditHistoryValid, userMetricsValid, workSpaceValid } from '../dtos/audit.dtos.js';
|
|
4
|
+
import { auditStoreList, auditUserList, clientMetrics, clients, getAuditFile, getDraftedData, overAllAuditSummary, overViewCard, overViewTable, reTrigger, save, saveDraft, storeMetrics, summarySplit, userAuditHistory, userMetrics, workSpace } from '../controllers/audit.controllers.js';
|
|
5
|
+
import { auditStoreValid, clientMetricsValid, clientValid, getDraftedDataValid, getFileValid, overAllAuditSummaryValid, overViewCardValid, overViewTableValid, reTriggerValid, saveDraftValid, saveValid, storeMetricsValid, summarySplitValid, userAuditHistoryValid, userMetricsValid, workSpaceValid, auditImageValid } from '../dtos/audit.dtos.js';
|
|
6
|
+
import { auditImages } from '../controllers/auditMetrics.controllers.js';
|
|
6
7
|
|
|
7
8
|
export const auditRouter = express.Router();
|
|
8
9
|
|
|
@@ -26,6 +27,8 @@ auditRouter.post( '/metrics/store-metrics', isAllowedSessionHandler, validate( s
|
|
|
26
27
|
auditRouter.post( '/metrics/user-metrics', isAllowedSessionHandler, validate( userMetricsValid ), userMetrics );
|
|
27
28
|
auditRouter.post( '/metrics/overview-table', isAllowedSessionHandler, validate( overViewTableValid ), overViewTable );
|
|
28
29
|
auditRouter.post( '/metrics/overall-audit-summary', isAllowedSessionHandler, validate( overAllAuditSummaryValid ), overAllAuditSummary );
|
|
30
|
+
auditRouter.post( '/metrics/re-trigger', isAllowedSessionHandler, validate( reTriggerValid ), isAuditDocumentExist, isAuditInputFolderExist, reTrigger );
|
|
31
|
+
auditRouter.get( '/audit-images', isAllowedSessionHandler, validate( auditImageValid ), isAuditInputFolderExist, auditImages );
|
|
29
32
|
|
|
30
33
|
|
|
31
34
|
// hold
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
|
|
2
2
|
import express from 'express';
|
|
3
3
|
import { isAllowedSessionHandler, validate } from 'tango-app-api-middleware';
|
|
4
|
-
import { auditImages
|
|
5
|
-
import { auditImageValid,
|
|
6
|
-
import {
|
|
4
|
+
import { auditImages } from '../controllers/auditMetrics.controllers.js';
|
|
5
|
+
import { auditImageValid, viewLogValid } from '../dtos/auditMetrics.dtos.js';
|
|
6
|
+
import { isAuditInputFolderExist } from '../validation/audit.validation.js';
|
|
7
7
|
|
|
8
8
|
export const auditMetricsRouter = express.Router();
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
auditMetricsRouter.post( '/re-trigger', isAllowedSessionHandler, validate( reTriggerValid ), isAuditDocumentExist, isAuditInputFolderExist, reTrigger );
|
|
12
11
|
auditMetricsRouter.get( '/audit-images', isAllowedSessionHandler, validate( auditImageValid ), isAuditInputFolderExist, auditImages );
|
|
13
12
|
auditMetricsRouter.post( '/view-log', isAllowedSessionHandler, validate( viewLogValid ), isAuditInputFolderExist, auditImages );
|
|
14
13
|
|
|
@@ -167,7 +167,7 @@ export async function isAuditInputFolderExist( req, res, next ) {
|
|
|
167
167
|
const inputData = req.method === 'POST' ? req.body : req.query;
|
|
168
168
|
const params={
|
|
169
169
|
Bucket: bucket.auditInput,
|
|
170
|
-
Key: `${inputData.fileDate}/${inputData.storeId}`,
|
|
170
|
+
Key: `${inputData.fileDate}/${inputData.storeId}/${inputData.zoneName}`,
|
|
171
171
|
};
|
|
172
172
|
const isExist = await checkFileExist( params );
|
|
173
173
|
if ( isExist ) {
|
|
@@ -188,6 +188,8 @@ export async function isAuditDocumentExist( req, res, next ) {
|
|
|
188
188
|
const query={
|
|
189
189
|
storeId: inputData.storeId,
|
|
190
190
|
fileDate: inputData.fileDate,
|
|
191
|
+
zoneName: inputData.zoneName,
|
|
192
|
+
moduleType: inputData.moduleType,
|
|
191
193
|
};
|
|
192
194
|
const auditInfo = await findOneStoreAudit( query );
|
|
193
195
|
if ( auditInfo ) {
|
|
@@ -211,7 +213,7 @@ export async function getAuditImageData( data ) {
|
|
|
211
213
|
const files = [];
|
|
212
214
|
const fetchData = {
|
|
213
215
|
Bucket: `${bucket.auditInput}`,
|
|
214
|
-
filePath: `${fileDate}/${storeId}/`,
|
|
216
|
+
filePath: `${fileDate}/${storeId}/${data.zoneName}/`,
|
|
215
217
|
};
|
|
216
218
|
const folderPath = await listFileWithoutLimit( fetchData );
|
|
217
219
|
if ( folderPath.statusCode == 404 ) {
|
|
@@ -223,7 +225,7 @@ export async function getAuditImageData( data ) {
|
|
|
223
225
|
if ( auditImages && auditImages?.length > 0 ) {
|
|
224
226
|
for ( let i = 0; i < auditImages.length; i++ ) {
|
|
225
227
|
const img = auditImages[i].Key.split( '/' );
|
|
226
|
-
const image = img[
|
|
228
|
+
const image = img[3].split( '.' );
|
|
227
229
|
const indexes = image[0].split( '_' );
|
|
228
230
|
const params = {
|
|
229
231
|
file_path: auditImages[i].Key,
|
|
@@ -301,7 +303,7 @@ export async function getAuditFilterData( data ) {
|
|
|
301
303
|
const fileDate = data.fileDate;
|
|
302
304
|
const params = {
|
|
303
305
|
Bucket: `${bucket.auditOutput}`,
|
|
304
|
-
Key: `${storeId}/${fileDate}/${bucket.masterJsonFile}`,
|
|
306
|
+
Key: `${storeId}/${data.zoneName}/${fileDate}/${bucket.masterJsonFile}`,
|
|
305
307
|
};
|
|
306
308
|
const mappingFile = await getJsonFileData( params );
|
|
307
309
|
if ( mappingFile.statusCode ) {
|