tango-app-api-audit 3.4.0-alpha.14 → 3.4.0-alpha.16

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tango-app-api-audit",
3
- "version": "3.4.0-alpha.14",
3
+ "version": "3.4.0-alpha.16",
4
4
  "description": "audit & audit metrics apis",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -950,18 +950,55 @@ export async function getAuditFile( req, res ) {
950
950
  break;
951
951
 
952
952
  case 'inprogress':
953
-
954
- msg ={
955
- storeId: userDetails[0].storeId,
956
- fileDate: userDetails[0].fileDate,
957
- moduleType: userDetails[0].moduleType,
958
- tempId: userDetails[0].tempId,
959
- question: userDetails[0].question,
960
- fileDetails: userDetails[0].fileDetails,
961
- inputBucketName: userDetails[0].inputBucketName,
962
- questionType: userDetails[0].questionType,
963
- streamName: userDetails[0].streamName,
964
- };
953
+ let query = {};
954
+ switch ( inputData.moduleType ) {
955
+ case 'unattended-customer':
956
+ query ={
957
+ storeId: userDetails[0].storeId,
958
+ fileDate: userDetails[0].fileDate,
959
+ tempId: userDetails[0].tempId,
960
+ moduleType: userDetails[0].moduleType,
961
+ };
962
+ break;
963
+ case 'left-in-middle':
964
+ query ={
965
+ storeId: userDetails[0].storeId,
966
+ fileDate: userDetails[0].fileDate,
967
+ question: userDetails[0].question,
968
+ moduleType: userDetails[0].moduleType,
969
+ };
970
+ break;
971
+ case 'uniform-detection':
972
+ query ={
973
+ storeId: userDetails[0].storeId,
974
+ fileDate: userDetails[0].fileDate,
975
+ moduleType: userDetails[0].moduleType,
976
+ };
977
+ break;
978
+ case 'mobile-detection':
979
+ query ={
980
+ storeId: userDetails[0].storeId,
981
+ fileDate: userDetails[0].fileDate,
982
+ moduleType: userDetails[0].moduleType,
983
+ };
984
+ break;
985
+ case 'camera-angle-change':
986
+ query ={
987
+ storeId: userDetails[0].storeId,
988
+ fileDate: userDetails[0].fileDate,
989
+ streamName: userDetails[0].streamName,
990
+ moduleType: userDetails[0].moduleType,
991
+ };
992
+ break;
993
+ default:
994
+ return res.sendError( 'Please give valid modueType', 400 );
995
+ }
996
+ logger.info( { query: query } );
997
+ const traxInfo = await findOneTraxAuditData( query );
998
+ if ( !traxInfo ) {
999
+ return res.sendError( 'The sorce record not found', 400 );
1000
+ }
1001
+ msg =traxInfo?.sqs?.Body;
965
1002
  break;
966
1003
 
967
1004
  default:
@@ -1186,6 +1223,175 @@ export async function getAuditFile( req, res ) {
1186
1223
  }
1187
1224
  }
1188
1225
 
1226
+ export async function getUpdatedFile( req, res ) {
1227
+ try {
1228
+ const openSearch = JSON.parse( process.env.OPENSEARCH );
1229
+ const inputData = req.query;
1230
+ const msg = req?.TraxData?.sqs?.Body;
1231
+ logger.info( { msg: msg } );
1232
+ let result =[];
1233
+ switch ( inputData.moduleType ) {
1234
+ case 'camera-angle-change':
1235
+ const actualParams ={
1236
+ Bucket: msg.inputBucketName,
1237
+ Key: msg.actual,
1238
+ };
1239
+ const changedParams ={
1240
+ Bucket: msg.inputBucketName,
1241
+ Key: msg.changed,
1242
+ };
1243
+
1244
+ const [ isActualExists, isChangedExists ] = await Promise.all( [ checkFileExist( actualParams ), checkFileExist( changedParams ) ] );
1245
+ result =[
1246
+ {
1247
+ actualCameraImage: isActualExists? await signedUrl( { Bucket: msg.inputBucketName,
1248
+ file_path: msg.actual } ) :'',
1249
+ },
1250
+ {
1251
+ changedCameraImage: isChangedExists? await signedUrl( { Bucket: msg.inputBucketName,
1252
+ file_path: msg.changed } ) : '',
1253
+ },
1254
+ ];
1255
+ break;
1256
+ case 'unattended-customer':
1257
+ for ( let i =0; i< msg.fileDetails.length; i++ ) {
1258
+ const files = [];
1259
+ const params ={
1260
+ Bucket: msg.inputBucketName,
1261
+ file_path: msg?.fileDetails[i]?.folderPath,
1262
+ MaxKeys: 1000,
1263
+ };
1264
+ const list = await listFileByPath( params );
1265
+ const folderPath = list.data;
1266
+ logger.info( { folderPath: list, params: params, list: list } );
1267
+ if ( folderPath?.length ) {
1268
+ for ( let i = 0; i < folderPath.length; i++ ) {
1269
+ // const img = folderPath[i].Key.split( '/' );
1270
+ // const image = img[3].split( '.' );
1271
+ // const indexes = image[0].split( '_' );
1272
+ const signedParams ={
1273
+ Bucket: msg.inputBucketName,
1274
+ file_path: folderPath[i].Key,
1275
+ };
1276
+ const data = await signedUrl( signedParams );
1277
+
1278
+ files.push(
1279
+ data,
1280
+ );
1281
+ }
1282
+ } else {
1283
+ logger.error( {
1284
+ error: { folderPath: folderPath },
1285
+ function: `getAuditFile - ${inputData.moduleType}`,
1286
+ message: 'Bucket image data not availale',
1287
+ } );
1288
+ return res.sendError( 'Bucket is Empty', 204 );
1289
+ }
1290
+ result.push( {
1291
+ type: msg.fileDetails[i].type,
1292
+ file: files,
1293
+ } );
1294
+ }
1295
+ break;
1296
+ case 'left-in-middle':
1297
+ for ( let i =0; i< msg.fileDetails.length; i++ ) {
1298
+ const files = [];
1299
+ const params ={
1300
+ Bucket: msg.inputBucketName,
1301
+ file_path: msg?.fileDetails[i]?.folderPath,
1302
+ MaxKeys: 1000,
1303
+ };
1304
+ const list = await listFileByPath( params );
1305
+ const folderPath = list.data;
1306
+ logger.info( { folderPath: list, params: params, list: list } );
1307
+ if ( folderPath?.length ) {
1308
+ for ( let i = 0; i < folderPath.length; i++ ) {
1309
+ // const img = folderPath[i].Key.split( '/' );
1310
+ // const image = img[3].split( '.' );
1311
+ // const indexes = image[0].split( '_' );
1312
+ const signedParams ={
1313
+ Bucket: msg.inputBucketName,
1314
+ file_path: folderPath[i].Key,
1315
+ };
1316
+ const data = await signedUrl( signedParams );
1317
+
1318
+ files.push(
1319
+ data,
1320
+ );
1321
+ }
1322
+ } else {
1323
+ logger.error( {
1324
+ error: { folderPath: folderPath },
1325
+ function: `getAuditFile - ${inputData.moduleType}`,
1326
+ message: 'Bucket image data not availale',
1327
+ } );
1328
+ return res.sendError( 'Bucket is Empty', 204 );
1329
+ }
1330
+ result.push( {
1331
+ type: msg.fileDetails[i].type,
1332
+ file: files,
1333
+ } );
1334
+ }
1335
+ break;
1336
+ default:
1337
+ return res.sendError( 'Please given valid moduleType', 400 );
1338
+ }
1339
+
1340
+ const userdata = await findOneUser( { _id: req.user._id } );
1341
+ const storeQuery = {
1342
+ storeId: inputData.storeId,
1343
+ };
1344
+ const storeFields = {
1345
+ 'storeName': 1,
1346
+ 'storeProfile.address': 1,
1347
+ 'clientId': 1,
1348
+ };
1349
+ const storeInfo = await findOneStore( storeQuery, storeFields );
1350
+
1351
+ const logData = {
1352
+ userId: req.user._id,
1353
+ userName: userdata.name,
1354
+ logType: 'audit',
1355
+ logSubType: 'auditStart',
1356
+ data: {
1357
+ fileDate: msg.fileDate,
1358
+ storeId: msg.storeId,
1359
+ clientId: storeInfo?.clientId,
1360
+ tempId: msg.tempId,
1361
+ value: msg.value,
1362
+ fileDetails: msg.fileDetails,
1363
+ moduleType: inputData.moduleType,
1364
+ question: msg.question,
1365
+ questionType: msg.questionType,
1366
+ streamName: msg.streamName,
1367
+ actaulImage: msg.actual,
1368
+ changedImage: msg.changed,
1369
+ },
1370
+ createdAt: new Date(),
1371
+ };
1372
+ await insertOpenSearchData( openSearch.auditLog, logData );
1373
+
1374
+ return res.sendSuccess( {
1375
+ result: result,
1376
+ storeId: msg.storeId,
1377
+ storeName: storeInfo?.storeName,
1378
+ address: storeInfo?.address,
1379
+ customerId: msg.tempId,
1380
+ moduleType: inputData.moduleType,
1381
+ value: inputData.moduleType == 'left-in-middle'? 'Employee Left in Middle ' : ( inputData.moduleType ).split( '-' ).join( ' ' ),
1382
+ fileDate: msg.fileDate,
1383
+ question: msg.question,
1384
+ questionType: msg.questionType,
1385
+ streamName: msg.streamName,
1386
+ auditId: inputData.auditId,
1387
+ } );
1388
+ } catch ( error ) {
1389
+ const err = error.message || 'Internal Server Error';
1390
+ logger.error( { error: error, data: req.query, function: 'getUpdatedFile' } );
1391
+ return res.sendError( err, 500 );
1392
+ }
1393
+ }
1394
+
1189
1395
  export async function saveBinary( req, res ) {
1190
1396
  try {
1191
1397
  const inputData = req.body;
@@ -2332,11 +2538,10 @@ export async function userMetrics( req, res ) {
2332
2538
  userId: 1,
2333
2539
  fileDate: 1,
2334
2540
  startTime: 1,
2541
+ endTime: 1,
2335
2542
  beforeCount: 1,
2336
2543
  moduleType: 1,
2337
2544
  afterCount: 1,
2338
- checkIntime: 1,
2339
- checkOutTime: 1,
2340
2545
  totalCompletedFiles: { $cond: [ { $eq: [ '$auditStatus', 'completed' ] }, 1, 0 ] },
2341
2546
  beforeCount: 1,
2342
2547
  afterCount: { $cond: [ { $eq: [ '$auditStatus', 'completed' ] }, '$afterCount', 0 ] },
@@ -2749,8 +2954,6 @@ export async function pendingSummaryTable( req, res ) {
2749
2954
  result.forEach( ( element ) => {
2750
2955
  const temp = {
2751
2956
  'Store ID': element.storeId,
2752
- 'Result': element.answer,
2753
- 'userComments': element.userComments,
2754
2957
  'File Date': element.fileDate,
2755
2958
  'Product Type': element.value,
2756
2959
  'Audit Type': element.auditType,
@@ -2762,16 +2965,13 @@ export async function pendingSummaryTable( req, res ) {
2762
2965
  switch ( inputData.moduleType ) {
2763
2966
  case 'camera-angle-change':
2764
2967
  temp['stream Name'] = element.streamName;
2765
- temp['User Comments'] = element.userCommands;
2766
2968
  break;
2767
2969
  case 'unattended-customer':
2768
2970
  temp['Customer ID'] = element.tempId;
2769
2971
  temp['Question'] = element.question;
2770
- temp['User Comments'] = element.userCommands;
2771
2972
  break;
2772
2973
  case 'left-in-middle':
2773
2974
  temp['Question'] = element.question;
2774
- temp['User Comments'] = element.userCommands;
2775
2975
  break;
2776
2976
  case 'mobile-detection':
2777
2977
  temp['Before Count'] = element.beforeCount;
@@ -1,5 +1,5 @@
1
1
  import j2s from 'joi-to-swagger';
2
- import { getFileSchema, userAuditHistorySchema, workSpaceSchema, saveSchema, clientMetricsSchema, storeMetricsSchema, userMetricsSchema, pendingSummaryTableSchema, overAllAuditSummarySchema, overviewTableSchema, summarySplitSchema } from '../dtos/traxAudit.dtos.js';
2
+ import { getFileSchema, userAuditHistorySchema, workSpaceSchema, saveSchema, clientMetricsSchema, storeMetricsSchema, userMetricsSchema, pendingSummaryTableSchema, overAllAuditSummarySchema, overviewTableSchema, summarySplitSchema, getUpdatedFileSchema } from '../dtos/traxAudit.dtos.js';
3
3
 
4
4
  export const traxAuditDocs = {
5
5
 
@@ -43,6 +43,64 @@ export const traxAuditDocs = {
43
43
  },
44
44
  },
45
45
  },
46
+ '/v3/trax-audit/get-updated-file': {
47
+ get: {
48
+ tags: [ 'Trax Audit' ],
49
+ description: 'Get a file via queue message',
50
+ operationId: 'get-updated-file',
51
+ parameters: [
52
+ {
53
+ in: 'query',
54
+ name: 'storeId',
55
+ scema: j2s( getUpdatedFileSchema ).swagger,
56
+ require: true,
57
+ },
58
+ {
59
+ in: 'query',
60
+ name: 'fileDate',
61
+ scema: j2s( getUpdatedFileSchema ).swagger,
62
+ require: true,
63
+ },
64
+ {
65
+ in: 'query',
66
+ name: 'moduleType',
67
+ scema: j2s( getUpdatedFileSchema ).swagger,
68
+ require: true,
69
+ },
70
+ {
71
+ in: 'query',
72
+ name: 'auditId',
73
+ scema: j2s( getUpdatedFileSchema ).swagger,
74
+ require: true,
75
+ },
76
+ {
77
+ in: 'query',
78
+ name: 'streamName',
79
+ scema: j2s( getUpdatedFileSchema ).swagger,
80
+ require: false,
81
+ },
82
+ {
83
+ in: 'query',
84
+ name: 'question',
85
+ scema: j2s( getUpdatedFileSchema ).swagger,
86
+ require: false,
87
+ },
88
+ {
89
+ in: 'query',
90
+ name: 'tempId',
91
+ scema: j2s( getUpdatedFileSchema ).swagger,
92
+ require: false,
93
+ },
94
+ ],
95
+ responses: {
96
+ 200: { description: 'Successful' },
97
+ 401: { description: 'Unauthorized User' },
98
+ 422: { description: 'Field Error' },
99
+ 500: { description: 'Server Error' },
100
+ 204: { description: 'Not Found' },
101
+ },
102
+ },
103
+ },
46
104
 
47
105
  '/v3/trax-audit/work-space': {
48
106
  post: {
@@ -12,6 +12,22 @@ export const getFileValid = {
12
12
  query: getFileSchema,
13
13
  };
14
14
 
15
+ export const getUpdatedFileSchema = joi.object(
16
+ {
17
+ fileDate: joi.string().required(),
18
+ storeId: joi.string().required(),
19
+ moduleType: joi.string().required(),
20
+ question: joi.string().optional(),
21
+ tempId: joi.number().optional(),
22
+ streamName: joi.string().optional(),
23
+ auditId: joi.string().required(),
24
+ },
25
+ );
26
+
27
+ export const getUpdatedFileValid = {
28
+ query: getUpdatedFileSchema,
29
+ };
30
+
15
31
  export const getDetectionFileSchema = joi.object( {
16
32
  queueName: joi.string().required(),
17
33
  nextId: joi.string().optional().allow( '' ),
@@ -1,9 +1,9 @@
1
1
  import { Router } from 'express';
2
2
  import { isAllowedSessionHandler, validate } from 'tango-app-api-middleware';
3
- import { getDetectionFileValid, getFileValid, userAuditHistoryValid, workSpaceValid, saveValid, clientMetricsValid, storeMetricsValid, userMetricsValid, pendingSummaryTableValid, overAllAuditSummaryValid, summarySplitValid, overviewTableValid } from '../dtos/traxAudit.dtos.js';
3
+ import { getDetectionFileValid, getFileValid, userAuditHistoryValid, workSpaceValid, saveValid, clientMetricsValid, storeMetricsValid, userMetricsValid, pendingSummaryTableValid, overAllAuditSummaryValid, summarySplitValid, overviewTableValid, getUpdatedFileValid } from '../dtos/traxAudit.dtos.js';
4
4
  import { isExistsQueue } from '../validation/audit.validation.js';
5
- import { clientMetrics, getAuditFile, getDetectionAuditFile, overAllAuditSummary, overviewTable, pendingSummaryTable, saveBinary, storeMetrics, summarySplit, userAuditHistory, userMetrics, workSpace } from '../controllers/traxAudit.controllers.js';
6
- import { validateBinaryAudit } from '../validation/traxAuditValidation.js';
5
+ import { clientMetrics, getAuditFile, getDetectionAuditFile, getUpdatedFile, overAllAuditSummary, overviewTable, pendingSummaryTable, saveBinary, storeMetrics, summarySplit, userAuditHistory, userMetrics, workSpace } from '../controllers/traxAudit.controllers.js';
6
+ import { isTraxAuditDocumentExist, validateBinaryAudit } from '../validation/traxAuditValidation.js';
7
7
 
8
8
  export const traxAuditRouter = Router();
9
9
 
@@ -18,6 +18,7 @@ traxAuditRouter.post( '/work-space', isAllowedSessionHandler, validate( workSpac
18
18
 
19
19
  // Y/n
20
20
  traxAuditRouter.get( '/get-file', isAllowedSessionHandler, validate( getFileValid ), isExistsQueue, getAuditFile );
21
+ traxAuditRouter.get( '/get-updated-file', isAllowedSessionHandler, validate( getUpdatedFileValid ), isTraxAuditDocumentExist, getUpdatedFile );
21
22
  traxAuditRouter.post( '/save-binary-audit', isAllowedSessionHandler, validate( saveValid ), validateBinaryAudit, saveBinary );
22
23
 
23
24
  // metrcis
@@ -1,6 +1,7 @@
1
1
  import { logger } from 'tango-app-api-middleware';
2
2
  import { findOneBinaryAudit, updateOneBinaryAuditModel } from '../service/binaryAudit.service.js';
3
3
  import { findOneUserEmpDetection } from '../service/userEmpDetection.service.js';
4
+ import { findOneTraxAuditData } from '../service/traxAuditData.service.js';
4
5
 
5
6
  export async function validateUserEmpDetection( req, res, next ) {
6
7
  try {
@@ -55,3 +56,63 @@ export async function validateBinaryAudit( req, res, next ) {
55
56
  return res.sendError( err, 500 );
56
57
  }
57
58
  }
59
+
60
+ export async function isTraxAuditDocumentExist( req, res, next ) {
61
+ try {
62
+ const inputData = req.query;
63
+ let query = {};
64
+ switch ( inputData.moduleType ) {
65
+ case 'unattended-customer':
66
+ query ={
67
+ storeId: inputData.storeId,
68
+ fileDate: inputData.fileDate,
69
+ tempId: inputData.tempId,
70
+ moduleType: inputData.moduleType,
71
+ };
72
+ break;
73
+ case 'left-in-middle':
74
+ query ={
75
+ storeId: inputData.storeId,
76
+ fileDate: inputData.fileDate,
77
+ question: inputData.question,
78
+ moduleType: inputData.moduleType,
79
+ };
80
+ break;
81
+ case 'uniform-detection':
82
+ query ={
83
+ storeId: inputData.storeId,
84
+ fileDate: inputData.fileDate,
85
+ moduleType: inputData.moduleType,
86
+ };
87
+ break;
88
+ case 'mobile-detection':
89
+ query ={
90
+ storeId: inputData.storeId,
91
+ fileDate: inputData.fileDate,
92
+ moduleType: inputData.moduleType,
93
+ };
94
+ break;
95
+ case 'camera-angle-change':
96
+ query ={
97
+ storeId: inputData.storeId,
98
+ fileDate: inputData.fileDate,
99
+ streamName: inputData.streamName,
100
+ moduleType: inputData.moduleType,
101
+ };
102
+ break;
103
+ default:
104
+ return res.sendError( 'Please give valid modueType', 400 );
105
+ }
106
+ const auditInfo = await findOneTraxAuditData( query );
107
+ if ( auditInfo ) {
108
+ req.TraxData = auditInfo;
109
+ return next();
110
+ } else {
111
+ return res.sendError( 'No Inserted Record', 400 );
112
+ }
113
+ } catch ( error ) {
114
+ const err = error.message || 'Internal Server Error';
115
+ logger.error( { error: error, message: req.body, function: 'isTraxAuditDocumentExist' } );
116
+ return res.sendError( err, 500 );
117
+ }
118
+ }