tango-app-api-audit 1.0.55 → 1.0.57

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/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
 
2
2
 
3
3
  import { auditRouter } from './src/routes/audit.routes.js';
4
- import { auditMetricsRouter } from './src/routes/auditMetrics.routes.js';
4
+ import { auditDocs } from './src/docs/audit.docs.js';
5
5
 
6
- export { auditRouter, auditMetricsRouter };
6
+ export { auditRouter, auditDocs };
7
7
 
8
8
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tango-app-api-audit",
3
- "version": "1.0.55",
3
+ "version": "1.0.57",
4
4
  "description": "audit & audit metrics apis",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -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,
@@ -2698,6 +2699,152 @@ export async function overAllAuditSummary( req, res ) {
2698
2699
  }
2699
2700
  }
2700
2701
 
2702
+ export async function reTrigger( req, res ) {
2703
+ try {
2704
+ const openSearch = JSON.parse( process.env.OPENSEARCH );
2705
+ const inputData = req.body;
2706
+ const sqs = JSON.parse( process.env.SQS );
2707
+ const query ={
2708
+ storeId: inputData.storeId,
2709
+ fileDate: inputData.fileDate,
2710
+ zoneName: inputData.zoneName,
2711
+ };
2712
+ const getQueueName = await findOneClient( { clientId: req.audit.clientId }, { 'auditConfigs': 1 } );
2713
+ const queueName = inputData.moduleType == 'zone' ? getQueueName?.auditConfigs?.zoneQueueName : getQueueName?.auditConfigs?.trafficQueueName;
2714
+ if ( !getQueueName || queueName == '' ) {
2715
+ return res.sendError( 'queueName does not create', 400 );
2716
+ }
2717
+ switch ( inputData.triggerType ) {
2718
+ case 'queue':
2719
+ const msg = {
2720
+ store_id: inputData.storeId,
2721
+ zone_id: inputData.zoneName,
2722
+ curr_date: inputData.fileDate,
2723
+ audit_type: inputData.auditType,
2724
+ total_count: inputData.totalCount,
2725
+ };
2726
+
2727
+ const sqsProduceQueue = {
2728
+ QueueUrl: `${sqs.url}${queueName}`,
2729
+ MessageBody: JSON.stringify( msg ),
2730
+ };
2731
+ const sqsQueue = await sendMessageToQueue( sqsProduceQueue.QueueUrl, sqsProduceQueue.MessageBody );
2732
+ if ( sqsQueue?.errorCode ) {
2733
+ const error = sqsQueue?.errorMsg;
2734
+ const code = sqsQueue?.errorCode;
2735
+ return res.sendError( error, code );
2736
+ } else {
2737
+ if ( req.audit.status !== 'completed' ) {
2738
+ const userRecord ={
2739
+ auditStatus: 'skipped',
2740
+ isDraft: false,
2741
+ };
2742
+ const query ={
2743
+ storeId: inputData.storeId,
2744
+ zoneName: inputData.zoneName,
2745
+ fileDate: inputData.fileDate,
2746
+ auditStatus: req.audit.status,
2747
+
2748
+ };
2749
+ await updateOneUserAudit( query, userRecord );
2750
+ }
2751
+
2752
+ const storeRecord ={
2753
+ status: req.audit.status !== 'completed' ? 'skipped': 'not_assign',
2754
+ };
2755
+
2756
+ await updateOneStoreAudit( query, storeRecord );
2757
+ const logData = {
2758
+ userId: req.user._id,
2759
+ userName: req.user.userName,
2760
+ logType: 'audit',
2761
+ logSubType: 'reTrigger',
2762
+ logData: {
2763
+ beforeCount: inputData.totalCount,
2764
+ afterCount: '',
2765
+ fileDate: inputData.fileDate,
2766
+ auditType: inputData.auditType,
2767
+ storeId: inputData.storeId,
2768
+ zoneName: inputData.zoneName,
2769
+ moduleType: inputData.moduleType,
2770
+ queueName: queueName,
2771
+ message: inputData.comments,
2772
+ triggerBy: req.user.userName,
2773
+ triggerId: req.user._id,
2774
+ triggerType: inputData.triggerType,
2775
+ },
2776
+ };
2777
+ await insertOpenSearchData( openSearch.activityLog, logData );
2778
+ }
2779
+ break;
2780
+ case 'user':
2781
+ const assignUser = await findOneUser( { _id: new mongoose.Types.ObjectId( inputData.userId ) } );
2782
+ const assignUserRecord = {
2783
+ storeId: inputData.storeId,
2784
+ clientId: req.audit.clientId,
2785
+ zoneName: inputData.zoneName,
2786
+ fileDate: inputData.fileDate,
2787
+ moduleType: inputData.moduleType,
2788
+ fileDateISO: dayjs( new Date( ( inputData.fileDate ).split( '-' ).reverse().join( '-' ) ) ).format(),
2789
+ auditType: inputData.auditType,
2790
+ fileCount: inputData.beforeCount,
2791
+ queueName: queueName,
2792
+ userId: inputData.userId,
2793
+ userName: assignUser.userName,
2794
+ };
2795
+ await createAssignAudit( assignUserRecord );
2796
+
2797
+ if ( req.audit.status !== 'completed' ) {
2798
+ const userRecord ={
2799
+ auditStatus: 'skipped',
2800
+ isDraft: false,
2801
+ };
2802
+ const query ={
2803
+ storeId: inputData.storeId,
2804
+ zoneName: inputData.zoneName,
2805
+ fileDate: inputData.fileDate,
2806
+ auditStatus: req.audit.status,
2807
+
2808
+ };
2809
+ await updateOneUserAudit( query, userRecord );
2810
+ }
2811
+
2812
+ const storeRecord ={
2813
+ status: req.audit.status !== 'completed' ? 'skipped': 'assigned',
2814
+ };
2815
+
2816
+ await updateOneStoreAudit( query, storeRecord );
2817
+ const logData = {
2818
+ userId: req.user._id,
2819
+ userName: req.user.userName,
2820
+ logType: 'audit',
2821
+ logSubType: 'reTrigger',
2822
+ logData: {
2823
+ beforeCount: inputData.totalCount,
2824
+ afterCount: '',
2825
+ fileDate: inputData.fileDate,
2826
+ auditType: inputData.auditType,
2827
+ storeId: inputData.storeId,
2828
+ zoneName: inputData.zoneName,
2829
+ moduleType: inputData.moduleType,
2830
+ queueName: queueName,
2831
+ message: inputData.comments,
2832
+ triggerBy: req.user.userName,
2833
+ triggerId: req.user._id,
2834
+ triggerType: inputData.triggerType,
2835
+ },
2836
+ };
2837
+ await insertOpenSearchData( openSearch.activityLog, logData );
2838
+ }
2839
+
2840
+ return res.sendSuccess( { result: 'The File has been Re Trigger Succesfully' } );
2841
+ } catch ( error ) {
2842
+ const err = error.message;
2843
+ logger.error( { error: error, message: req.body } );
2844
+ return res.sendError( err, 500 );
2845
+ }
2846
+ }
2847
+
2701
2848
  export async function overViewCard( req, res ) {
2702
2849
  try {
2703
2850
  const inputData = req.body;
@@ -1,155 +1,9 @@
1
- import { insertOpenSearchData, logger, sendMessageToQueue } from 'tango-app-api-middleware';
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;
@@ -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 } 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' ],
@@ -1,5 +1,5 @@
1
1
  import j2s from 'joi-to-swagger';
2
- import { auditImageValidSchema, getAuditImagesSchema, reTriggerValidSchema } from '../dtos/auditMetrics.dtos.js';
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' ],
@@ -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(),
@@ -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,8 @@
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 } from '../dtos/audit.dtos.js';
6
6
 
7
7
  export const auditRouter = express.Router();
8
8
 
@@ -26,6 +26,7 @@ auditRouter.post( '/metrics/store-metrics', isAllowedSessionHandler, validate( s
26
26
  auditRouter.post( '/metrics/user-metrics', isAllowedSessionHandler, validate( userMetricsValid ), userMetrics );
27
27
  auditRouter.post( '/metrics/overview-table', isAllowedSessionHandler, validate( overViewTableValid ), overViewTable );
28
28
  auditRouter.post( '/metrics/overall-audit-summary', isAllowedSessionHandler, validate( overAllAuditSummaryValid ), overAllAuditSummary );
29
+ auditRouter.post( '/metrics/re-trigger', isAllowedSessionHandler, validate( reTriggerValid ), isAuditDocumentExist, isAuditInputFolderExist, reTrigger );
29
30
 
30
31
 
31
32
  // 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, reTrigger } from '../controllers/auditMetrics.controllers.js';
5
- import { auditImageValid, reTriggerValid, viewLogValid } from '../dtos/auditMetrics.dtos.js';
6
- import { isAuditDocumentExist, isAuditInputFolderExist } from '../validation/audit.validation.js';
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 ) {