tango-app-api-analysis-traffic 3.0.0-alpha.5 → 3.0.0-alpha.50

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,6 +1,9 @@
1
1
 
2
2
 
3
3
  import { analysisTrafficRouter } from './src/routes/traffic.routes.js';
4
+ import { mobileTrafficAnalysisRouter } from './src/routes/mobileTraffic.routes.js';
5
+ import { nobDocs } from './src/docs/nob.docs.js';
6
+ import nobRouter from './src/routes/nob.routes.js';
4
7
 
5
- export { analysisTrafficRouter };
8
+ export { analysisTrafficRouter, mobileTrafficAnalysisRouter, nobDocs, nobRouter };
6
9
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tango-app-api-analysis-traffic",
3
- "version": "3.0.0-alpha.5",
3
+ "version": "3.0.0-alpha.50",
4
4
  "description": "Traffic Analysis",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -14,14 +14,17 @@
14
14
  "license": "ISC",
15
15
  "dependencies": {
16
16
  "aws-sdk": "^2.1665.0",
17
+ "dayjs": "^1.11.13",
17
18
  "dotenv": "^16.4.5",
18
19
  "express": "^4.19.2",
19
20
  "handlebars": "^4.7.8",
21
+ "joi-to-swagger": "^6.2.0",
20
22
  "lodash": "^4.17.21",
21
23
  "mongodb": "^6.8.0",
22
24
  "nodemon": "^3.1.4",
23
- "tango-api-schema": "^2.0.131",
24
- "tango-app-api-middleware": "^3.1.26",
25
+ "swagger-ui-express": "^5.0.1",
26
+ "tango-api-schema": "2.2.6",
27
+ "tango-app-api-middleware": "3.1.43-alpha.10",
25
28
  "winston": "^3.13.1",
26
29
  "winston-daily-rotate-file": "^5.0.0"
27
30
  },
@@ -0,0 +1,485 @@
1
+ import { logger } from 'tango-app-api-middleware';
2
+ import * as clientService from '../services/clients.services.js';
3
+ import {
4
+ findOneStore,
5
+ } from '../services/stores.service.js';
6
+
7
+
8
+ async function LamdaServiceCall( url, data ) {
9
+ try {
10
+ const requestOptions = {
11
+ method: 'POST',
12
+ headers: {
13
+ 'Content-Type': 'application/json',
14
+ },
15
+ body: JSON.stringify( data ),
16
+ };
17
+ const response = await fetch( url, requestOptions );
18
+ if ( !response.ok ) {
19
+ throw new Error( `Response status: ${response.status}` );
20
+
21
+ return false;
22
+ }
23
+ const json = await response.json();
24
+ return json;
25
+ } catch ( error ) {
26
+ logger.error( { error: error, message: data, function: 'LamdaServiceCall' } );
27
+ return false;
28
+ }
29
+ }
30
+
31
+ // ///// V1 API's ///////
32
+ export const cardsFunnelV1 = async ( req, res ) => {
33
+ try {
34
+ let reqestData = req.body;
35
+ let getClientData = await getClientConfig( reqestData.clientId );
36
+ if ( !getClientData ) {
37
+ return res.sendError( 'Invalid Client Id', 400 );
38
+ }
39
+ reqestData.featureConfigs = getClientData.featureConfigs;
40
+ reqestData.currency = getClientData.paymentInvoice?.currencyType || 'INR';
41
+ reqestData.revenue = getClientData.averageTransactionValue || '0';
42
+ let LamdaURL = 'https://55mojecvuvtphucgsalx5jtyki0untzp.lambda-url.ap-south-1.on.aws/';
43
+ let resultData = await LamdaServiceCall( LamdaURL, reqestData );
44
+ if ( resultData ) {
45
+ if ( resultData.status_code == '200' ) {
46
+ return res.sendSuccess( resultData );
47
+ } else {
48
+ return res.sendError( 'No Content', 204 );
49
+ }
50
+ } else {
51
+ return res.sendError( 'No Content', 204 );
52
+ }
53
+ } catch ( error ) {
54
+ logger.error( { error: error, message: req.query, function: 'cardsFunnelV1' } );
55
+ return res.sendError( { error: error }, 500 );
56
+ }
57
+ };
58
+
59
+ export const cardsGraphsV1 = async ( req, res ) => {
60
+ try {
61
+ let reqestData = req.body;
62
+ let getClientData = await getClientConfig( reqestData.clientId );
63
+ if ( !getClientData ) {
64
+ return res.sendError( 'Invalid Client Id', 400 );
65
+ }
66
+ reqestData.featureConfigs = getClientData.featureConfigs;
67
+ let LamdaURL = 'https://xvsz4gd4erdlmvhv33hhyot3ui0xzitq.lambda-url.ap-south-1.on.aws/';
68
+ let resultData = await LamdaServiceCall( LamdaURL, reqestData );
69
+ if ( resultData ) {
70
+ if ( resultData.status_code == '200' ) {
71
+ return res.sendSuccess( resultData );
72
+ } else {
73
+ return res.sendError( 'No Content', 204 );
74
+ }
75
+ } else {
76
+ return res.sendError( 'No Content', 204 );
77
+ }
78
+ } catch ( error ) {
79
+ logger.error( { error: error, message: req.query, function: 'cardsFunnelV1' } );
80
+ return res.sendError( { error: error }, 500 );
81
+ }
82
+ };
83
+
84
+ export const recapVideoV1 = async ( req, res ) => {
85
+ try {
86
+ let reqestData = req.body;
87
+ let getClientData = await getClientConfig( reqestData.clientId );
88
+ if ( !getClientData ) {
89
+ return res.sendError( 'Invalid Client Id', 400 );
90
+ }
91
+ reqestData.featureConfigs = getClientData.featureConfigs;
92
+ let LamdaURL = 'https://u7xzph4jkl72sbefz2xx5rjw540rocck.lambda-url.ap-south-1.on.aws/';
93
+ let resultData = await LamdaServiceCall( LamdaURL, reqestData );
94
+ if ( resultData ) {
95
+ if ( resultData.status_code == '200' ) {
96
+ return res.sendSuccess( resultData );
97
+ } else {
98
+ return res.sendError( 'No Content', 204 );
99
+ }
100
+ } else {
101
+ return res.sendError( 'No Content', 204 );
102
+ }
103
+ } catch ( error ) {
104
+ logger.error( { error: error, message: req.query, function: 'cardsFunnelV1' } );
105
+ return res.sendError( { error: error }, 500 );
106
+ }
107
+ };
108
+
109
+ export const densityDwellV1 = async ( req, res ) => {
110
+ try {
111
+ let reqestData = req.body;
112
+ reqestData.hourFormat = 12;
113
+ let getClientData = await getClientConfig( reqestData.clientId );
114
+ if ( !getClientData ) {
115
+ return res.sendError( 'Invalid Client Id', 400 );
116
+ }
117
+ reqestData.featureConfigs = getClientData.featureConfigs;
118
+ let LamdaURL = 'https://wh2d4dkgsao5kbwpjxbmchcjja0cxjhv.lambda-url.ap-south-1.on.aws/';
119
+ let resultData = await LamdaServiceCall( LamdaURL, reqestData );
120
+ if ( resultData ) {
121
+ if ( resultData.status_code == '200' ) {
122
+ return res.sendSuccess( resultData );
123
+ } else {
124
+ return res.sendError( 'No Content', 204 );
125
+ }
126
+ } else {
127
+ return res.sendError( 'No Content', 204 );
128
+ }
129
+ } catch ( error ) {
130
+ logger.error( { error: error, message: req.query, function: 'cardsFunnelV1' } );
131
+ return res.sendError( { error: error }, 500 );
132
+ }
133
+ };
134
+
135
+ export const overallCardsV1 = async ( req, res ) => {
136
+ try {
137
+ let reqestData = req.body;
138
+ let getClientData = await getClientConfig( reqestData.clientId );
139
+ if ( !getClientData ) {
140
+ return res.sendError( 'Invalid Client Id', 400 );
141
+ }
142
+ reqestData.featureConfigs = getClientData.featureConfigs;
143
+ reqestData.currency = getClientData.paymentInvoice?.currencyType || 'inr';
144
+ reqestData.revenue = getClientData.averageTransactionValue || '0';
145
+ let LamdaURL = 'https://dugu3ghkgalnpaydf2wdjp37240pzcmy.lambda-url.ap-south-1.on.aws/';
146
+ let resultData = await LamdaServiceCall( LamdaURL, reqestData );
147
+ if ( resultData ) {
148
+ if ( resultData.status_code == '200' ) {
149
+ return res.sendSuccess( resultData );
150
+ } else {
151
+ return res.sendError( 'No Content', 204 );
152
+ }
153
+ } else {
154
+ return res.sendError( 'No Content', 204 );
155
+ }
156
+ } catch ( error ) {
157
+ logger.error( { error: error, message: req.query, function: 'cardsFunnelV1' } );
158
+ return res.sendError( { error: error }, 500 );
159
+ }
160
+ };
161
+
162
+ export const overallChartV1 = async ( req, res ) => {
163
+ try {
164
+ let reqestData = req.body;
165
+ let getClientData = await getClientConfig( reqestData.clientId );
166
+ if ( !getClientData ) {
167
+ return res.sendError( 'Invalid Client Id', 400 );
168
+ }
169
+ reqestData.featureConfigs = getClientData.featureConfigs;
170
+ let LamdaURL = 'https://wtcllrsyec4iwkx6sg7xi2b7se0seawx.lambda-url.ap-south-1.on.aws/';
171
+ let resultData = await LamdaServiceCall( LamdaURL, reqestData );
172
+ if ( resultData ) {
173
+ if ( resultData.status_code == '200' ) {
174
+ return res.sendSuccess( resultData );
175
+ } else {
176
+ return res.sendError( 'No Content', 204 );
177
+ }
178
+ } else {
179
+ return res.sendError( 'No Content', 204 );
180
+ }
181
+ } catch ( error ) {
182
+ logger.error( { error: error, message: req.query, function: 'cardsFunnelV1' } );
183
+ return res.sendError( { error: error }, 500 );
184
+ }
185
+ };
186
+
187
+ export const singleStoreChartV1 = async ( req, res ) => {
188
+ try {
189
+ let reqestData = req.body;
190
+ let getClientData = await getClientConfig( reqestData.clientId );
191
+ if ( !getClientData ) {
192
+ return res.sendError( 'Invalid Client Id', 400 );
193
+ }
194
+ reqestData.featureConfigs = getClientData.featureConfigs;
195
+ let LamdaURL = 'https://j2mqa4qhmku3e7htuptsjvpumi0qkhkf.lambda-url.ap-south-1.on.aws/';
196
+ let resultData = await LamdaServiceCall( LamdaURL, reqestData );
197
+ if ( resultData ) {
198
+ if ( resultData.status_code == '200' ) {
199
+ return res.sendSuccess( resultData );
200
+ } else {
201
+ return res.sendError( 'No Content', 204 );
202
+ }
203
+ } else {
204
+ return res.sendError( 'No Content', 204 );
205
+ }
206
+ } catch ( error ) {
207
+ logger.error( { error: error, message: req.query, function: 'cardsFunnelV1' } );
208
+ return res.sendError( { error: error }, 500 );
209
+ }
210
+ };
211
+
212
+ export const demographicChartV1 = async ( req, res ) => {
213
+ try {
214
+ let reqestData = req.body;
215
+ let getClientData = await getClientConfig( reqestData.clientId );
216
+ if ( !getClientData ) {
217
+ return res.sendError( 'Invalid Client Id', 400 );
218
+ }
219
+ reqestData.featureConfigs = getClientData.featureConfigs;
220
+ let LamdaURL = 'https://7mslk3sde3m663mrgmwlc4rfou0alphk.lambda-url.ap-south-1.on.aws/';
221
+ let resultData = await LamdaServiceCall( LamdaURL, reqestData );
222
+ if ( resultData ) {
223
+ if ( resultData.status_code == '200' ) {
224
+ return res.sendSuccess( resultData );
225
+ } else {
226
+ return res.sendError( 'No Content', 204 );
227
+ }
228
+ } else {
229
+ return res.sendError( 'No Content', 204 );
230
+ }
231
+ } catch ( error ) {
232
+ logger.error( { error: error, message: req.query, function: 'cardsFunnelV1' } );
233
+ return res.sendError( { error: error }, 500 );
234
+ }
235
+ };
236
+
237
+ export const buyerChartV1 = async ( req, res ) => {
238
+ try {
239
+ let reqestData = req.body;
240
+ let getClientData = await getClientConfig( reqestData.clientId );
241
+ if ( !getClientData ) {
242
+ return res.sendError( 'Invalid Client Id', 400 );
243
+ }
244
+ reqestData.featureConfigs = getClientData.featureConfigs;
245
+ let LamdaURL = 'https://2i76wug6swytd7fej3d2fvd2xa0ujxhz.lambda-url.ap-south-1.on.aws/';
246
+ let resultData = await LamdaServiceCall( LamdaURL, reqestData );
247
+ if ( resultData ) {
248
+ if ( resultData.status_code == '200' ) {
249
+ return res.sendSuccess( resultData );
250
+ } else {
251
+ return res.sendError( 'No Content', 204 );
252
+ }
253
+ } else {
254
+ return res.sendError( 'No Content', 204 );
255
+ }
256
+ } catch ( error ) {
257
+ logger.error( { error: error, message: req.query, function: 'cardsFunnelV1' } );
258
+ return res.sendError( { error: error }, 500 );
259
+ }
260
+ };
261
+
262
+ export const footfallDirectoryFoldersV1 = async ( req, res ) => {
263
+ try {
264
+ let reqestData = req.body;
265
+ reqestData.hourFormat = 12;
266
+ let getClientData = await getClientConfig( reqestData.clientId );
267
+ if ( !getClientData ) {
268
+ return res.sendError( 'Invalid Client Id', 400 );
269
+ }
270
+ reqestData.featureConfigs = getClientData.featureConfigs;
271
+ let LamdaURL = 'https://waxlhd7lfdlmyrkrdyv77najka0ayihq.lambda-url.ap-south-1.on.aws/';
272
+ let resultData = await LamdaServiceCall( LamdaURL, reqestData );
273
+ if ( resultData ) {
274
+ if ( resultData.status_code == '200' ) {
275
+ return res.sendSuccess( resultData );
276
+ } else {
277
+ return res.sendError( 'No Content', 204 );
278
+ }
279
+ } else {
280
+ return res.sendError( 'No Content', 204 );
281
+ }
282
+ } catch ( error ) {
283
+ logger.error( { error: error, message: req.query, function: 'cardsFunnelV1' } );
284
+ return res.sendError( { error: error }, 500 );
285
+ }
286
+ };
287
+
288
+ export const footfallDirectoryV1 = async ( req, res ) => {
289
+ try {
290
+ let reqestData = req.body;
291
+ let getClientData = await getClientConfig( reqestData.clientId );
292
+ if ( !getClientData ) {
293
+ return res.sendError( 'Invalid Client Id', 400 );
294
+ }
295
+ reqestData.featureConfigs = getClientData.featureConfigs;
296
+ let LamdaURL = 'https://waxlhd7lfdlmyrkrdyv77najka0ayihq.lambda-url.ap-south-1.on.aws/';
297
+ let resultData = await LamdaServiceCall( LamdaURL, reqestData );
298
+ if ( resultData ) {
299
+ if ( resultData.status_code == '200' ) {
300
+ return res.sendSuccess( resultData );
301
+ } else {
302
+ return res.sendError( 'No Content', 204 );
303
+ }
304
+ } else {
305
+ return res.sendError( 'No Content', 204 );
306
+ }
307
+ } catch ( error ) {
308
+ logger.error( { error: error, message: req.query, function: 'cardsFunnelV1' } );
309
+ return res.sendError( { error: error }, 500 );
310
+ }
311
+ };
312
+
313
+ export const storeOperationV1 = async ( req, res ) => {
314
+ try {
315
+ let reqestData = req.body;
316
+ let getClientData = await getClientConfig( reqestData.clientId );
317
+ if ( !getClientData ) {
318
+ return res.sendError( 'Invalid Client Id', 400 );
319
+ }
320
+ reqestData.featureConfigs = getClientData.featureConfigs;
321
+ let LamdaURL = 'https://mezoc2jy25t73v6eit57s3px6i0hxkwk.lambda-url.ap-south-1.on.aws/';
322
+ let resultData = await LamdaServiceCall( LamdaURL, reqestData );
323
+ if ( resultData ) {
324
+ if ( resultData.status_code == '200' ) {
325
+ return res.sendSuccess( resultData );
326
+ } else {
327
+ return res.sendError( 'No Content', 204 );
328
+ }
329
+ } else {
330
+ return res.sendError( 'No Content', 204 );
331
+ }
332
+ } catch ( error ) {
333
+ logger.error( { error: error, message: req.query, function: 'cardsFunnelV1' } );
334
+ return res.sendError( { error: error }, 500 );
335
+ }
336
+ };
337
+
338
+ export const zoneDwellTimeSplitV1 = async ( req, res ) => {
339
+ try {
340
+ let reqestData = req.body;
341
+ let getClientData = await getClientConfig( reqestData.clientId );
342
+ if ( !getClientData ) {
343
+ return res.sendError( 'Invalid Client Id', 400 );
344
+ }
345
+ reqestData.featureConfigs = getClientData.featureConfigs;
346
+ let LamdaURL = 'https://7tfzazsi6lcejnjdzijv7bwg7y0yxhdx.lambda-url.ap-south-1.on.aws/';
347
+ let resultData = await LamdaServiceCall( LamdaURL, reqestData );
348
+ if ( resultData ) {
349
+ if ( resultData.status_code == '200' ) {
350
+ return res.sendSuccess( resultData );
351
+ } else {
352
+ return res.sendError( 'No Content', 204 );
353
+ }
354
+ } else {
355
+ return res.sendError( 'No Content', 204 );
356
+ }
357
+ } catch ( error ) {
358
+ logger.error( { error: error, message: req.query, function: 'trafficCards' } );
359
+ return res.sendError( { error: error }, 500 );
360
+ }
361
+ };
362
+
363
+ export async function isAllowedClient( req, res, next ) {
364
+ try {
365
+ let reqestData = req.body;
366
+ let getUserEmail = req.user.email;
367
+ let getUserType = req.user.userType;
368
+ let getClientId = req.user.clientId;
369
+ let getRole = req.user.role;
370
+
371
+ if ( getUserType == 'tango' ) {
372
+ if ( getRole == 'superadmin' ) {
373
+ next();
374
+ } else {
375
+ const assignedQuery = {
376
+ userEmail: getUserEmail,
377
+ assignedType: 'client',
378
+ assignedValue: reqestData.clientId,
379
+ };
380
+ const getAssignedType = await findOneUserAssignedStore( assignedQuery );
381
+ if ( getAssignedType ) {
382
+ next();
383
+ } else {
384
+ return res.sendError( 'Client Not Assigned', 400 );
385
+ }
386
+ }
387
+ } else if ( getUserType == 'client' ) {
388
+ if ( getClientId == reqestData.clientId ) {
389
+ next();
390
+ } else {
391
+ return res.sendError( 'Client Not Assigned', 400 );
392
+ }
393
+ } else {
394
+ return res.sendError( 'Client Not Assigned', 400 );
395
+ }
396
+ } catch ( error ) {
397
+ logger.error( { error: error, function: 'isAllowedClient' } );
398
+ return res.sendError( error, 500 );
399
+ }
400
+ }
401
+
402
+
403
+ export const getMySubscription = async ( req, res ) => {
404
+ try {
405
+ let reqestData = req.body;
406
+ let getClientData = await clientService.findOne( { clientId: reqestData.clientId }, { planDetails: 1 } );
407
+ if ( getClientData ) {
408
+ if ( getClientData.planDetails && getClientData.planDetails.product && getClientData.planDetails.product.length>0 ) {
409
+ let clientSubscription = {};
410
+ let clientProducts = {
411
+ tangoTraffic: false,
412
+ tangoZone: false,
413
+ tangoTrax: false,
414
+ };
415
+ clientSubscription.subscriptionType = getClientData.planDetails.subscriptionType;
416
+ let actualProduct = getClientData.planDetails.product;
417
+ for ( let clientIndex = 0; clientIndex < actualProduct.length; clientIndex++ ) {
418
+ if ( actualProduct[clientIndex].productName == 'tangoTraffic' ) {
419
+ clientProducts.tangoTraffic = true;
420
+ }
421
+ if ( actualProduct[clientIndex].productName == 'tangoZone' ) {
422
+ clientProducts.tangoZone = true;
423
+ }
424
+ if ( actualProduct[clientIndex].tangoTrax == 'tangoTrax' ) {
425
+ clientProducts.tangoTrax = true;
426
+ }
427
+ }
428
+ clientSubscription.product = clientProducts;
429
+ let storeSubscription = {};
430
+ let storeProducts = {
431
+ tangoTraffic: false,
432
+ tangoZone: false,
433
+ tangoTrax: false,
434
+ };
435
+
436
+ if ( reqestData.storeId && reqestData.storeId.length>0 ) {
437
+ let getStoreData = await findOneStore( { clientId: reqestData.clientId, storeId: { $in: reqestData.storeId[0] } }, { product: 1 } );
438
+ if ( getStoreData ) {
439
+ for ( let storeIndex = 0; storeIndex < getStoreData.product.length; storeIndex++ ) {
440
+ if ( getStoreData.product[storeIndex] == 'tangoTraffic' ) {
441
+ storeProducts.tangoTraffic = true;
442
+ }
443
+
444
+ if ( getStoreData.product[storeIndex] == 'tangoZone' ) {
445
+ storeProducts.tangoZone = true;
446
+ }
447
+
448
+ if ( getStoreData.product[storeIndex] == 'tangoTrax' ) {
449
+ storeProducts.tangoTrax = true;
450
+ }
451
+ }
452
+ storeSubscription.product = storeProducts;
453
+ } else {
454
+ storeSubscription.product = [];
455
+ }
456
+ } else {
457
+ storeSubscription.product = [];
458
+ }
459
+
460
+ let resultData = { clientSubscription, storeSubscription };
461
+ return res.sendSuccess( resultData );
462
+ } else {
463
+ return res.sendError( 'Not Subscribe', 400 );
464
+ }
465
+ } else {
466
+ return res.sendError( 'Invalid Client Id', 400 );
467
+ }
468
+ } catch ( error ) {
469
+ logger.error( { error: error, message: req.query, function: 'getMySubscription' } );
470
+ return res.sendError( { error: error }, 500 );
471
+ }
472
+ };
473
+
474
+ async function getClientConfig( clientId ) {
475
+ try {
476
+ let getClientData = await clientService.findOne( { clientId: clientId }, { 'paymentInvoice.currencyType': 1, 'averageTransactionValue': 1, 'featureConfigs.billableCalculation': 1, 'featureConfigs.missedOpportunityCalculation': 1, 'featureConfigs.conversionCalculation': 1, 'featureConfigs.open': 1, 'featureConfigs.close': 1 } );
477
+ if ( !getClientData ) {
478
+ return false;
479
+ }
480
+ return getClientData;
481
+ } catch ( error ) {
482
+ logger.error( { error: error, message: data, function: 'getClientConfig' } );
483
+ return false;
484
+ }
485
+ }