· 5 years ago · Jul 03, 2020, 11:26 AM
1/*************************************************************************
2 *
3 * COMPRO CONFIDENTIAL
4 * __________________
5 *
6 * [2015] - [2020] Compro Technologies Private Limited
7 * All Rights Reserved.
8 *
9 * NOTICE: All information contained herein is, and remains
10 * the property of Compro Technologies Private Limited. The
11 * intellectual and technical concepts contained herein are
12 * proprietary to Compro Technologies Private Limited and may
13 * be covered by U.S. and Foreign Patents, patents in process,
14 * and are protected by trade secret or copyright law.
15 *
16 * Dissemination of this information or reproduction of this material
17 * is strictly forbidden unless prior written permission is obtained
18 * from Compro Technologies Pvt. Ltd..
19 ***************************************************************************/
20
21
22/**********************************************************************
23 * Provides functions for getting class related data
24 ***********************************************************************/
25'use strict';
26/************************************
27* Internal npm Modules
28************************************/
29const peasConfig = require('./../../../server/config').app.peas;
30//Get App Constants
31const appConstants = require('../libs/app-constants');
32const bundleService = require('./bundle-service');
33
34const ERROR_CODES_INFO = _getErrorCodes();
35/************************************
36 * External npm Modules
37 ************************************/
38let q = require('q');
39const requestModule = require('request');
40
41// ************************************
42// * Module exports Public functions
43// ************************************
44exports.getPermissionByAccessCode = getPermissionByAccessCode;
45exports.getProductByAccessCode = getProductByAccessCode;
46exports.getBundleByAccessCode = getBundleByAccessCode;
47exports.validateAccessCodeForUser = validateAccessCodeForUser;
48exports.activateProduct = activateProduct;
49exports.activateProductBySapId = activateProductBySapId;
50exports.getUserActivations = getUserActivations;
51
52exports.getProducts = getProducts;
53exports.getEntitlements = getEntitlements;
54exports.getBatches = getBatches;
55exports.getPermissions = getPermissions;
56exports.manageProduct = manageProduct;
57exports.manageEntitlement = manageEntitlement;
58exports.manageBatch = manageBatch;
59exports.managePermission = managePermission;
60
61
62/************************************
63* Public function definitions
64************************************/
65function getPermissionByAccessCode(accessCode) {
66 var deferred = q.defer();
67
68 _authenticateUser()
69 .then(token => _getPermissionByAccessCode(accessCode, token))
70 .then(response => deferred.resolve(response))
71 .catch(error => deferred.reject(error));
72
73 return deferred.promise;
74}
75
76function getProductByAccessCode(accessCode) {
77 var deferred = q.defer();
78
79 getPermissionByAccessCode(accessCode)
80 .then(response => _getProductById(response.data.entitlement["product_id"], response.token))
81 .then(response => deferred.resolve(response))
82 .catch(error => deferred.reject(error));
83
84 return deferred.promise;
85}
86
87function getBundleByAccessCode(accessCode) {
88 var deferred = q.defer();
89
90 getPermissionByAccessCode(accessCode)
91 .then(permissionResponse => {
92 return bundleService.getBundleById(String(permissionResponse.data.entitlement_id), {})
93 .then(bundleResponse => deferred.resolve({
94 ...bundleResponse,
95 token : permissionResponse.token,
96 permission : permissionResponse.data
97 })).catch(error => deferred.reject(error));
98 }).catch(error => deferred.reject(error));
99 return deferred.promise;
100}
101
102function _getBundleForSapId(token, entitlementId) {
103 var deferred = q.defer();
104
105 bundleService.getBundleById(entitlementId, {})
106 .then(bundleResponse => {
107 deferred.resolve({
108 ...bundleResponse,
109 token : token
110 });
111
112 }).catch(error => {
113 deferred.reject(error)
114
115 });
116
117 return deferred.promise;
118}
119
120function validateAccessCodeForUser(optionParams) {
121 var deferred = q.defer();
122
123 getBundleByAccessCode(optionParams.accessCode)
124 .then(bundleResponse => {
125 return _getUserActivations({"user_id" : optionParams.user_id, "is_active" : 1, "is_paginated" : false}, bundleResponse.permission.entitlement_id, bundleResponse.token)
126 .then(userActivations => _validateAccessCode(bundleResponse.permission, bundleResponse.data, userActivations, optionParams))
127 .then(validationResponse => {
128 if(validationResponse.valid) return deferred.resolve({
129 "data" : validationResponse,
130 "token" : bundleResponse.token,
131 "bundle" : bundleResponse.data,
132 "permission" : bundleResponse.permission
133 });
134 else return deferred.reject(_createErrorResponse(validationResponse.error.code, "", "validateAccessCodeForUser", validationResponse.error));
135 }).catch((error) => deferred.reject(error));;
136 }).catch((error) => deferred.reject(error));
137
138 return deferred.promise;
139}
140
141function activateProduct(optionParams) {
142 var deferred = q.defer();
143
144 validateAccessCodeForUser(optionParams)
145 .then(validationResponse => {
146 return _activateProduct(optionParams.user_id, validationResponse.permission.id, validationResponse.permission.entitlement.metadata.Duration, validationResponse.token)
147 .then(activationResponse => {
148 activationResponse.data.bundle = validationResponse.bundle;
149 deferred.resolve(activationResponse);
150 });
151
152 }).catch(error => deferred.reject(error));
153
154 return deferred.promise;
155}
156
157function getUserActivations(optionParams) {
158 var deferred = q.defer();
159
160 _authenticateUser()
161 .then(token => {
162 optionParams.is_paginated = false;
163 return _getUserActivations(optionParams, undefined, token);
164 })
165 .then(userActivations => {
166 deferred.resolve({"data" : userActivations});
167
168 }).catch(error => deferred.reject(error));
169
170 return deferred.promise;
171}
172
173// activateProductBySapId({"SAP_ID":"abcd1234", "user_id":"2341", "type": "student"})
174// .then(function() {
175// console.log("dne");
176// });
177
178function activateProductBySapId(optionParams) {
179 var deferred = q.defer();
180
181 _activateProductbySapId(optionParams)
182 .then(activationResponse => {
183 deferred.resolve(activationResponse);
184 }).catch(error => deferred.reject(error));
185
186 return deferred.promise;
187}
188
189function _activateProductbySapId(optionParams) {
190 var deferred = q.defer();
191
192 let authToken, duration, entitlement, bundleResponse1, permission;
193
194 _authenticateUser()
195 .then(token => {
196
197 authToken = token;
198 return _getProducts({"SAP_ID": optionParams.SAP_ID}, token)
199
200 }).then(response => {
201
202 if(Array.isArray(response.data.data) && response.data.data.length==0) {
203 deferred.reject(_createErrorResponse("918", response.data.data, "activateProductBySapId"));
204 } else {
205 return _getEntitlements({"product_id" : response.data.data[0].id}, authToken);
206 }
207
208 }).then(response => {
209
210 optionParams.token = authToken;
211 optionParams.entitlementId = response.data.data[0].id;
212 duration = response.data.data[0].metadata.Duration;
213 entitlement = response.data.data[0];
214
215 return _getBundleForSapId(optionParams.token, String(optionParams.entitlementId));
216
217 }).then(bundleResponse => {
218
219 permission = {
220 "is_active" : true,
221 "limit" : 1,
222 "activations" : [],
223 "entitlement" : entitlement
224 };
225 bundleResponse1 = bundleResponse;
226 return _getUserActivations({"user_id" : optionParams.user_id, "is_active" : 1, "is_paginated" : false}, optionParams.entitlementId, optionParams.token);
227
228 }).then(userActivations => _validateAccessCode(permission, bundleResponse1.data, userActivations, optionParams))
229 .then(validationResponse => {
230
231 if(validationResponse.valid) {
232 return _createPermission(optionParams.token, optionParams.entitlementId);
233 } else {
234 return deferred.reject(_createErrorResponse(validationResponse.error.code, "", "validateAccessCodeForUser", validationResponse.error));
235 }
236 }).then(permissionResponse => {
237
238 return _activateProduct(optionParams.user_id, permissionResponse.data.data.permission.id, duration, optionParams.token)
239
240 }).then(activationResponse => {
241
242 activationResponse.data.bundle = bundleResponse1.data;
243 deferred.resolve(activationResponse);
244
245 }).catch((error) => deferred.reject(error));
246
247 return deferred.promise;
248}
249
250function getProducts(options) {
251 var deferred = q.defer();
252
253 _authenticateUser()
254 .then(token => _getProducts(options, token))
255 .then(response => deferred.resolve(response))
256 .catch(error => deferred.reject(error));
257
258 return deferred.promise;
259}
260
261function getEntitlements(options) {
262 var deferred = q.defer();
263
264 _authenticateUser()
265 .then(token => _getEntitlements(options, token))
266 .then(response => deferred.resolve(response))
267 .catch(error => deferred.reject(error));
268
269 return deferred.promise;
270}
271
272function getBatches(options) {
273 var deferred = q.defer();
274
275 _authenticateUser()
276 .then(token => _getBatches(options, token))
277 .then(response => deferred.resolve(response))
278 .catch(error => deferred.reject(error));
279
280 return deferred.promise;
281}
282
283function getPermissions(options) {
284 var deferred = q.defer();
285
286 _authenticateUser()
287 .then(token => _getPermissions(options, token))
288 .then(response => deferred.resolve(response))
289 .catch(error => deferred.reject(error));
290
291 return deferred.promise;
292}
293
294function manageProduct(options) {
295 var deferred = q.defer();
296
297 _authenticateUser()
298 .then(token => {
299 let optionParams = {
300 "token" : token,
301 "ISBN_13" : options.isbn,
302 "StaffID" : "5",
303 "Tabs" : [],
304 "CMS_Name" : options.name,
305 "CreationDate" : new Date(new Date().toString().split('GMT')[0]+' UTC').toISOString(),
306 "CMS_Setup_Complete" : "N",
307 "productId" : options.productId
308 };
309
310 let promise;
311 if(options.mode == "create") {
312 promise = _createProduct(optionParams);
313 } else if(options.mode == "update") {
314 promise = _updateProduct(optionParams);
315 } else if(options.mode == "delete") {
316 promise = _deleteProduct(optionParams);
317 }
318
319 promise.then(function(response) {
320 deferred.resolve({
321 "status" : "success",
322 "data" : response.data
323 });
324 }).catch(error => deferred.reject(error));
325
326 }).catch(error => deferred.reject(error));
327
328 return deferred.promise;
329}
330
331function manageEntitlement(optionsParams) {
332 var deferred = q.defer();
333
334 _authenticateUser()
335 .then(token => {
336 let options = {
337 "token" : token,
338 "CreationDate" : new Date(new Date().toString().split('GMT')[0]+' UTC').toISOString(),
339 "Duration" : optionsParams.duration,
340 "Visibility" : "Public",
341 "Type": "duration",
342 "QACheck": "N",
343 "EndOfYearBreakPoint": "8",
344 "EndOfYearOffset": "1",
345 "UsageMax": "1",
346 "LimitActivation": "Y",
347 "Demo": "Y",
348 "ReleaseEveryNYears": 0,
349 "StaffID": "5",
350 "Active": optionsParams.active,
351 "entitlement_type_id" : 1,
352 "product_id" : optionsParams.productId,
353 "entitlementId" : optionsParams.entitlementId
354 };
355
356 let promise;
357 if(optionsParams.mode == "create") {
358 promise = _createEntitlement(options);
359 } else if(optionsParams.mode == "update") {
360 promise = _updateEntitlement(options);
361 }
362
363 promise.then(function(response) {
364 deferred.resolve({
365 "status" : "success",
366 "data" : response.data
367 });
368 }).catch(error => deferred.reject(error));
369
370 }).catch(error => deferred.reject(error));
371
372 return deferred.promise;
373}
374
375function manageBatch(optionsParams) {
376 var deferred = q.defer();
377
378 _authenticateUser()
379 .then(token => {
380 let options = {
381 "token" : token,
382 "entitlement_id" : optionsParams.entitlementId,
383 "proof_pattern_id" : 1,
384 "admin_id" : 5,
385 "name" : optionsParams.name,
386 "total_codes": optionsParams.totalCodes,
387 "limit": optionsParams.limit,
388 "is_active": optionsParams.isActive,
389 "batchId" : optionsParams.batchId
390 };
391
392 let promise;
393 if(optionsParams.mode == "create") {
394 promise = _createBatch(options);
395 } else if(optionsParams.mode == "update") {
396 promise = _updateBatch(options);
397 }
398
399 promise.then(function(response) {
400 deferred.resolve({
401 "status" : "success",
402 "data" : response.data
403 });
404 }).catch(error => deferred.reject(error));
405
406 }).catch(error => deferred.reject(error));
407
408 return deferred.promise;
409}
410
411function managePermission(optionsParams) {
412
413 var deferred = q.defer();
414
415 _authenticateUser()
416 .then(token => {
417 let options = {
418 "token" : token,
419 "entitlement_id" : optionsParams.entitlementId,
420 "batch_id" : optionsParams.batchId,
421 "proof" : optionsParams.proof,
422 "limit": optionsParams.limit,
423 "is_active": optionsParams.isActive,
424 "expired_at" : optionsParams.expiredAt,
425 "released_at" : optionsParams.releasedAt
426 };
427
428 let promise;
429 if(optionsParams.mode == "create") {
430 promise = _createNewPermission(options);
431 }
432
433 promise.then(function(response) {
434 deferred.resolve({
435 "status" : "success",
436 "data" : response.data
437 });
438 }).catch(error => deferred.reject(error));
439
440 }).catch(error => deferred.reject(error));
441
442 return deferred.promise;
443}
444/************************************
445* Private function/variable definitions
446************************************/
447function _authenticateUser() {
448 var deferred = q.defer();
449
450 const optionParams = {
451 "url": peasConfig.domain + peasConfig.api_version + "/auth/token/generate/",
452 "method": 'POST',
453 "headers": {
454 'Content-Type': 'application/json'
455 },
456 "json" : true,
457 "body": {
458 "origin_url": peasConfig.origin_url,
459 "secret_key": peasConfig.secret_key
460 }
461 };
462
463 requestModule(optionParams, function (error, response, body) {
464
465 if (error) {
466 deferred.reject(_createErrorResponse("906", error, "_authenticateUser"));
467 } else {
468 if(typeof body === "object") {
469 deferred.resolve("Bearer " + body.data.token);
470 } else {
471 deferred.reject(_createErrorResponse("911", {response, body}, "_authenticateUser"));
472 }
473 }
474 });
475
476 return deferred.promise;
477}
478
479function _getPermissionByAccessCode(accessCode, token) {
480 var deferred = q.defer();
481
482 const optionParams = {
483 "url": peasConfig.domain + peasConfig.api_version + "/permissions?keyword=" + accessCode,
484 "method": 'GET',
485 "headers": {
486 'Authorization': token
487 }
488 };
489
490 requestModule(optionParams, function (error, response, body) {
491
492 if (error) {
493 deferred.reject(_createErrorResponse("907", error, "_getPermissionByAccessCode"));
494 } else {
495 if(_isJson(body)) {
496 let jsonBody = JSON.parse(body);
497 if(jsonBody.data && Array.isArray(jsonBody.data) && jsonBody.data.length==1) {
498 if(jsonBody.data[0].proof && jsonBody.data[0].proof == accessCode) {
499 deferred.resolve({
500 "data" : jsonBody.data[0],
501 "token" : token
502 });
503 } else {
504 deferred.reject(_createErrorResponse("907", jsonBody, "_getPermissionByAccessCode"));
505 }
506
507 } else {
508 deferred.reject(_createErrorResponse("907", jsonBody, "_getPermissionByAccessCode"));
509 }
510
511 } else {
512 deferred.reject(_createErrorResponse("911", {response, body}, "_getPermissionByAccessCode"));
513 }
514 }
515 });
516
517 return deferred.promise;
518}
519
520function _createPermission(token, entitlementId) {
521
522 var deferred = q.defer();
523
524 const optionParams = {
525 "url": peasConfig.domain + peasConfig.api_version + "/permissions",
526 "method": 'POST',
527 "headers": {
528 'Authorization': token,
529 'Content-Type': 'application/json'
530 },
531 "json" : true,
532 "body" : {
533 "entitlement_id" : entitlementId
534 }
535 };
536
537 requestModule(optionParams, function (error, response, body) {
538
539 if (error) {
540 deferred.reject(_createErrorResponse("925", error, "_createPermission"));
541 } else {
542 if(typeof body === "object") {
543 if(body.data && body.data.status==201) {
544 deferred.resolve({
545 "data" : body
546 });
547 } else {
548 deferred.reject(_createErrorResponse("925", body, "_createPermission"));
549 }
550 } else {
551 deferred.reject(_createErrorResponse("911", {response, body}, "_createPermission"));
552 }
553 }
554 });
555
556 return deferred.promise;
557}
558
559function _getProductById(productId, token) {
560 var deferred = q.defer();
561
562 const optionParams = {
563 "url": peasConfig.domain + peasConfig.api_version + "/products/" + productId,
564 "method": 'GET',
565 "headers": {
566 'Authorization': token
567 }
568 };
569
570 requestModule(optionParams, function (error, response, body) {
571
572 if (error) {
573 deferred.reject(_createErrorResponse("912", error, "_getProductById"));
574 } else {
575
576 if(_isJson(body)) {
577 let jsonBody = JSON.parse(body);
578 deferred.resolve({
579 "data" : jsonBody,
580 "token" : token
581 });
582 } else {
583 deferred.reject(_createErrorResponse("911", {response, body}, "_getProductById"));
584 }
585 }
586 });
587
588 return deferred.promise;
589}
590
591function _getUserActivations(options = {}, entitlementId, token) {
592 var deferred = q.defer();
593
594 const optionParams = {
595 "url": peasConfig.domain + peasConfig.api_version + "/activations",
596 "method": 'GET',
597 "headers": {
598 'Authorization': token
599 }
600 };
601
602 let isActive = options["is_active"]!=undefined ? options["is_active"] : undefined;
603 delete options["is_active"];
604
605 optionParams.url = _addGetParamstoUrl(optionParams.url, options);
606
607 requestModule(optionParams, function (error, response, body) {
608
609 if (error) {
610 deferred.reject(_createErrorResponse("908", error, "_getUserActivations"));
611 } else {
612 if(_isJson(body)) {
613
614 let productActivations = JSON.parse(body).data;
615 if(isActive) {
616 let currentDate = new Date();
617 productActivations = productActivations.filter((item) => {
618 let itemDate = new Date(item.ended_at);
619 if(currentDate.getTime() < itemDate.getTime()) {
620 return true;
621 }
622 });
623 }
624
625 if(entitlementId) {
626 productActivations = productActivations.filter(item => item.permission["entitlement_id"] == entitlementId);
627 }
628
629 deferred.resolve(productActivations);
630 } else {
631
632 deferred.reject(_createErrorResponse("911", {response, body}, "_getUserActivations"));
633 }
634 }
635 });
636
637 return deferred.promise;
638}
639
640
641function _validateAccessCode(permission, bundle, userActivations, optionParams) {
642
643 let validationResult = {
644 "valid" : true
645 };
646 let errorObject = {};
647
648 // Is the Access code valid
649 if(!permission["is_active"]) {
650 validationResult.valid = false;
651 errorObject.code = "905";
652 }
653
654 // Check Bundle Release date
655 if(validationResult.valid) {
656 if(!bundle["release_date"]) {
657 validationResult.valid = false;
658 errorObject.code = "914";
659 errorObject.message = "Sorry, " + bundle.umbrella_product_name + " is not available yet. Please keep your activation code safe and use it later";
660 } else if(bundle["release_date"] > (new Date).getTime()) {
661 validationResult.valid = false;
662 errorObject.code = "913";
663 let date = new Date(bundle["release_date"]);
664 let dateFormat = ((date.getMonth() > 8) ? (date.getMonth() + 1) : ('0' + (date.getMonth() + 1))) + '/' + ((date.getDate() > 9) ? date.getDate() : ('0' + date.getDate())) + '/' + date.getFullYear();
665 errorObject.message = "Sorry, " + bundle.umbrella_product_name + " is not available yet. Please keep your activation code safe and use it after " + dateFormat;
666 }
667 }
668
669 // Has the Access code already been consumed by a particular C1 (Gigya) user
670 if(validationResult.valid && permission.activations && permission.limit <= permission.activations.length) {
671 validationResult.valid = false;
672 errorObject.code = "902";
673 }
674
675 // Has the user already consumed another access code for the same product
676 if(validationResult.valid && userActivations && userActivations.length) {
677 validationResult.valid = false;
678 errorObject.code = "901";
679 }
680
681 // Is the Access code valid for Student or Teacher
682 if(validationResult.valid && bundle.type !== optionParams.type) {
683 validationResult.valid = false;
684 errorObject.code = "903";
685 }
686
687 if(!validationResult.valid) {
688 errorObject["validation-fields"] = {
689 "is_active" : permission["is_active"],
690 "release_date" : bundle["release_date"],
691 "limit" : permission.limit,
692 "activations" : (userActivations || []).length,
693 "type" : bundle.type
694 };
695 errorObject.bundle = {"id" : bundle.id, "title" : bundle.umbrella_product_name, "isbns" : bundle.products.map(({id}) => id)};
696 validationResult.error = errorObject;
697 }
698
699 return validationResult;
700}
701
702function _activateProduct(userId, permissionId, duration, token) {
703 var deferred = q.defer();
704
705 let d = new Date();
706 let activatedAt = d.getUTCFullYear().toString()+"-"+((d.getUTCMonth()+1).toString().length==2?(d.getUTCMonth()+1).toString():"0"+(d.getUTCMonth()+1).toString())+"-"+(d.getUTCDate().toString().length==2?d.getUTCDate().toString():"0"+d.getUTCDate().toString())+" "+(d.getUTCHours().toString().length==2?d.getUTCHours().toString():"0"+d.getUTCHours().toString())+":"+((parseInt((d.getUTCMinutes()/5)*5)).toString().length==2?(parseInt((d.getUTCMinutes()/5)*5)).toString():"0"+(parseInt((d.getUTCMinutes()/5)*5)).toString())+":00";
707 d= new Date(d.getTime() + duration * 24 * 60 * 60 * 1000);
708 let endedAt = d.getUTCFullYear().toString()+"-"+((d.getUTCMonth()+1).toString().length==2?(d.getUTCMonth()+1).toString():"0"+(d.getUTCMonth()+1).toString())+"-"+(d.getUTCDate().toString().length==2?d.getUTCDate().toString():"0"+d.getUTCDate().toString())+" "+(d.getUTCHours().toString().length==2?d.getUTCHours().toString():"0"+d.getUTCHours().toString())+":"+((parseInt((d.getUTCMinutes()/5)*5)).toString().length==2?(parseInt((d.getUTCMinutes()/5)*5)).toString():"0"+(parseInt((d.getUTCMinutes()/5)*5)).toString())+":00";
709
710 const optionParams = {
711 "url": peasConfig.domain_activations + peasConfig.api_version_activations + "/activations/?user_id=" + userId + "&permission_id=" + permissionId + "&ended_at=" + endedAt + "&activated_at=" + activatedAt,
712 "method": 'POST',
713 "headers": {
714 'Authorization': token
715 }
716 };
717
718 requestModule(optionParams, function (error, response, body) {
719
720 if (error) {
721 deferred.reject(_createErrorResponse("909", error, "_activateProduct"));
722 } else {
723 if(_isJson(body)) {
724 deferred.resolve({
725 "status" : "success",
726 "data" : JSON.parse(body).data
727 });
728 } else {
729 deferred.reject(_createErrorResponse("911", {response, body}, "_activateProduct"));
730 }
731 }
732 });
733 return deferred.promise;
734}
735
736function _getProducts(options = {}, token) {
737 var deferred = q.defer();
738
739 var isSingleProduct = options.productId ? true : false;
740
741 const optionsParams = {
742 "url": peasConfig.domain + peasConfig.api_version + "/products" + (options.productId ? "/"+options.productId:""),
743 "method": 'GET',
744 "headers": {
745 'Authorization': token
746 }
747 };
748
749 delete options.productId;
750
751 optionsParams.url = _addGetParamstoUrl(optionsParams.url, options);
752
753 requestModule(optionsParams, function (error, response, body) {
754
755 if (error) deferred.reject(_createErrorResponse("915", error, "_getProducts"));
756 else if(_isJson(body)) {
757 let jsonBody = JSON.parse(body);
758 if(jsonBody.data && Array.isArray(jsonBody.data)) deferred.resolve({"data" : jsonBody});
759 else {
760 if(isSingleProduct) {
761 deferred.resolve({"data": jsonBody});
762 } else {
763 deferred.reject(_createErrorResponse("915", body, "_getProducts"));
764 }
765 }
766 } else deferred.reject(_createErrorResponse("911", {response, body}, "_getProducts"));
767 });
768
769 return deferred.promise;
770}
771
772function _getEntitlements(options = {}, token) {
773 var deferred = q.defer();
774
775 const optionsParams = {
776 "url": peasConfig.domain + peasConfig.api_version + "/entitlements",
777 "method": 'GET',
778 "headers": {
779 'Authorization': token
780 }
781 };
782 optionsParams.url = _addGetParamstoUrl(optionsParams.url, options);
783
784 requestModule(optionsParams, function (error, response, body) {
785
786 if (error) deferred.reject(_createErrorResponse("916", error, "_getEntitlements"));
787 else if(_isJson(body)) {
788 let jsonBody = JSON.parse(body);
789 if(jsonBody.data && Array.isArray(jsonBody.data)) deferred.resolve({"data" : jsonBody});
790 else deferred.reject(_createErrorResponse("916", body, "_getEntitlements"));
791 } else deferred.reject(_createErrorResponse("911", {response, body}, "_getEntitlements"));
792 });
793
794 return deferred.promise;
795}
796
797function _getBatches(options = {}, token) {
798 var deferred = q.defer();
799
800 const optionsParams = {
801 "url": peasConfig.domain + peasConfig.api_version + "/batches",
802 "method": 'GET',
803 "headers": {
804 'Authorization': token
805 }
806 };
807 optionsParams.url = _addGetParamstoUrl(optionsParams.url, options);
808
809 requestModule(optionsParams, function (error, response, body) {
810
811 if (error) deferred.reject(_createErrorResponse("917", error, "_getBatches"));
812 else if(_isJson(body)) {
813 let jsonBody = JSON.parse(body);
814 if(jsonBody.data && Array.isArray(jsonBody.data)) deferred.resolve({"data" : jsonBody});
815 else deferred.reject(_createErrorResponse("917", body, "_getBatches"));
816 } else deferred.reject(_createErrorResponse("911", {response, body}, "_getBatches"));
817 });
818
819 return deferred.promise;
820}
821
822function _getPermissions(options = {}, token) {
823 var deferred = q.defer();
824
825 const optionsParams = {
826 "url": peasConfig.domain + peasConfig.api_version + "/permissions",
827 "method": 'GET',
828 "headers": {
829 'Authorization': token
830 }
831 };
832 optionsParams.url = _addGetParamstoUrl(optionsParams.url, options);
833
834 requestModule(optionsParams, function (error, response, body) {
835
836 if (error) deferred.reject(_createErrorResponse("907", error, "_getBatches"));
837 else if(_isJson(body)) {
838 let jsonBody = JSON.parse(body);
839 deferred.resolve({"data" : jsonBody});
840 } else deferred.reject(_createErrorResponse("911", {response, body}, "_getBatches"));
841 });
842
843 return deferred.promise;
844}
845
846// _createProduct({token: "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOjIsImlhdCI6MTU5MTYyMTU0NSwiZXhwIjoxNTkxNjI4NzQ1fQ.iP5Jug1YSmLO2UA18pKPJOS2X0-r-DgoGGDr0rH6VhE"});
847
848function _createProduct(options) {
849
850 var deferred = q.defer();
851
852 var form = {
853 "metadata" : JSON.stringify({
854 "ISBN_13": options.ISBN_13,
855 "Tabs": options.Tabs,
856 "StaffID": options.StaffID,
857 "CMS_Name": options.CMS_Name,
858 "CreationDate": options.CreationDate,
859 "CMS_Setup_Complete": options.CMS_Setup_Complete
860 })
861 };
862
863 var domain = peasConfig.domain;
864 var api_version = peasConfig.api_version;
865
866 const optionsParams = {
867 "url": domain + api_version + "/products",
868 "method": 'POST',
869 "headers": {
870 'Authorization': options.token
871 },
872 "form" : form
873 };
874
875 requestModule(optionsParams, function (error, response, body) {
876
877 if (error) {
878 deferred.reject(_createErrorResponse("919", error, "_createProduct"));
879 } else {
880
881 if(_isJson(body)) {
882 let jsonBody = JSON.parse(body);
883 if(jsonBody.data && jsonBody.data.status==201) {
884 deferred.resolve({
885 "status": "success",
886 "data" : jsonBody
887 });
888 } else {
889 deferred.reject(_createErrorResponse("919", error, "_createProduct"));
890 }
891 } else {
892 deferred.reject(_createErrorResponse("911", {response, body}, "_createProduct"));
893 }
894 }
895 });
896
897 return deferred.promise;
898}
899
900function _updateProduct(options) {
901
902 var deferred = q.defer();
903
904 var form = {
905 "metadata" : JSON.stringify({
906 "ISBN_13": options.ISBN_13,
907 "Tabs": options.Tabs,
908 "StaffID": options.StaffID,
909 "CMS_Name": options.CMS_Name,
910 "CreationDate": options.CreationDate,
911 "CMS_Setup_Complete": options.CMS_Setup_Complete
912 })
913 };
914
915 var formData = JSON.stringify(form);
916 var domain = peasConfig.domain;
917 var api_version = peasConfig.api_version;
918
919 const optionsParams = {
920 "url": domain + api_version + "/products/" + options.productId,
921 "method": 'PUT',
922 "headers": {
923 'Authorization': options.token
924 },
925 "form" : form
926 };
927
928 requestModule(optionsParams, function (error, response, body) {
929
930 if (error) {
931 deferred.reject(_createErrorResponse("920", error, "_updateProduct"));
932 } else {
933
934 if(_isJson(body)) {
935 let jsonBody = JSON.parse(body);
936 if(jsonBody.data && jsonBody.data.status==200) {
937 deferred.resolve({
938 "status": "success",
939 "data" : jsonBody
940 });
941 } else {
942 deferred.reject(_createErrorResponse("920", error, "_updateProduct"));
943 }
944 } else {
945 deferred.reject(_createErrorResponse("911", {response, body}, "_updateProduct"));
946 }
947 }
948 });
949
950 return deferred.promise;
951}
952
953function _deleteProduct(options) {
954 var deferred = q.defer();
955
956 var domain = peasConfig.domain;
957 var api_version = peasConfig.api_version;
958
959 const optionsParams = {
960 "url": domain + api_version + "/products/" + options.productId,
961 "method": 'DELETE',
962 "headers": {
963 'Authorization': options.token,
964 'Content-Type': 'application/json'
965 }
966 };
967
968 requestModule(optionsParams, function (error, response, body) {
969
970 if (error) {
971 deferred.reject(_createErrorResponse("921", error, "_deleteProduct"));
972 } else {
973
974 if(_isJson(body)) {
975 let jsonBody = JSON.parse(body);
976 if(jsonBody.data && jsonBody.data.status==200) {
977 deferred.resolve({
978 "status": "success",
979 "data" : jsonBody
980 });
981 } else {
982 deferred.reject(_createErrorResponse("921", error, "_deleteProduct"));
983 }
984
985 } else {
986 deferred.reject(_createErrorResponse("911", {response, body}, "_deleteProduct"));
987 }
988 }
989 });
990
991 return deferred.promise;
992}
993
994function _createEntitlement(options) {
995
996 var deferred = q.defer();
997
998 var form = {
999 "metadata" : JSON.stringify({
1000 "CreationDate" : options.CreationDate,
1001 "Duration" : options.Duration,
1002 "Visibility" : options.Visibility,
1003 "Type": options.Type,
1004 "QACheck": options.QACheck,
1005 "EndOfYearBreakPoint": options.EndOfYearBreakPoint,
1006 "EndOfYearOffset": options.EndOfYearOffset,
1007 "UsageMax": options.UsageMax,
1008 "LimitActivation": options.LimitActivation,
1009 "Demo": options.Demo,
1010 "ReleaseEveryNYears": options.ReleaseEveryNYears,
1011 "StaffID": options.StaffID,
1012 "Active": options.Active
1013 }),
1014 "entitlement_type_id" : options.entitlement_type_id,
1015 "product_id" : options.product_id
1016 };
1017
1018 var domain = peasConfig.domain;
1019 var api_version = peasConfig.api_version;
1020
1021 const optionsParams = {
1022 "url": domain + api_version + "/entitlements",
1023 "method": 'POST',
1024 "headers": {
1025 'Authorization': options.token
1026 },
1027 "form" : form
1028 };
1029
1030 requestModule(optionsParams, function (error, response, body) {
1031
1032 if (error) {
1033 deferred.reject(_createErrorResponse("922", error, "_createEntitlement"));
1034 } else {
1035
1036 if(_isJson(body)) {
1037 let jsonBody = JSON.parse(body);
1038 if(jsonBody.data && jsonBody.data.status==201) {
1039 deferred.resolve({
1040 "status": "success",
1041 "data" : jsonBody
1042 });
1043 } else {
1044 deferred.reject(_createErrorResponse("922", error, "_createEntitlement"));
1045 }
1046 } else {
1047 deferred.reject(_createErrorResponse("911", {response, body}, "_createEntitlement"));
1048 }
1049 }
1050 });
1051
1052 return deferred.promise;
1053}
1054
1055function _updateEntitlement(options) {
1056
1057 var deferred = q.defer();
1058
1059 var form = {
1060 "metadata" : JSON.stringify({
1061 "CreationDate" : options.CreationDate,
1062 "Duration" : options.Duration,
1063 "Visibility" : options.Visibility,
1064 "Type": options.Type,
1065 "QACheck": options.QACheck,
1066 "EndOfYearBreakPoint": options.EndOfYearBreakPoint,
1067 "EndOfYearOffset": options.EndOfYearOffset,
1068 "UsageMax": options.UsageMax,
1069 "LimitActivation": options.LimitActivation,
1070 "Demo": options.Demo,
1071 "ReleaseEveryNYears": options.ReleaseEveryNYears,
1072 "StaffID": options.StaffID,
1073 "Active": options.Active
1074 }),
1075 "entitlement_type_id" : options.entitlement_type_id,
1076 "product_id" : options.product_id
1077 };
1078
1079 var domain = peasConfig.domain;
1080 var api_version = peasConfig.api_version;
1081
1082 const optionsParams = {
1083 "url": domain + api_version + "/entitlements/" + options.entitlementId,
1084 "method": 'PUT',
1085 "headers": {
1086 'Authorization': options.token
1087 },
1088 "form" : form
1089 };
1090
1091 requestModule(optionsParams, function (error, response, body) {
1092
1093 if (error) {
1094 deferred.reject(_createErrorResponse("923", error, "_updateEntitlement"));
1095 } else {
1096
1097 if(_isJson(body)) {
1098 let jsonBody = JSON.parse(body);
1099 if(jsonBody.data && jsonBody.data.status==200) {
1100 deferred.resolve({
1101 "status": "success",
1102 "data" : jsonBody
1103 });
1104 } else {
1105 deferred.reject(_createErrorResponse("923", error, "_updateEntitlement"));
1106 }
1107 } else {
1108 deferred.reject(_createErrorResponse("911", {response, body}, "_updateEntitlement"));
1109 }
1110 }
1111 });
1112
1113 return deferred.promise;
1114}
1115
1116function _createBatch(options) {
1117
1118 var deferred = q.defer();
1119
1120 var form = {
1121 "entitlement_id": options.entitlement_id,
1122 "proof_pattern_id": options.proof_pattern_id,
1123 "admin_id": options.admin_id,
1124 "name": options.name,
1125 "total_codes": options.total_codes,
1126 "limit": options.limit,
1127 "is_active": options.is_active
1128 };
1129
1130 var domain = peasConfig.domain;
1131 var api_version = peasConfig.api_version;
1132
1133 const optionsParams = {
1134 "url": domain + api_version + "/batches",
1135 "method": 'POST',
1136 "headers": {
1137 'Authorization': options.token,
1138 'Content-Type': 'application/json'
1139 },
1140 "json" : true,
1141 "body" : form
1142 };
1143
1144 requestModule(optionsParams, function (error, response, body) {
1145 if (error) {
1146 deferred.reject(_createErrorResponse("924", error, "_createBatch"));
1147 } else {
1148 if(typeof body === "object") {
1149 if(body.data && body.data.status==201) {
1150 deferred.resolve({
1151 "status": "success",
1152 "data" : body
1153 });
1154 } else {
1155 deferred.reject(_createErrorResponse("924", error, "_createBatch"));
1156 }
1157 } else {
1158 deferred.reject(_createErrorResponse("911", {response, body}, "_createBatch"));
1159 }
1160
1161 }
1162 });
1163
1164 return deferred.promise;
1165}
1166
1167function _updateBatch(options) {
1168
1169 var deferred = q.defer();
1170
1171 var form = {
1172 "name" : options.name
1173 };
1174
1175 var domain = peasConfig.domain;
1176 var api_version = peasConfig.api_version;
1177
1178 const optionsParams = {
1179 "url": domain + api_version + "/batches/" + options.batchId,
1180 "method": 'PUT',
1181 "headers": {
1182 'Authorization': options.token,
1183 'Content-Type': 'application/json'
1184 },
1185 "json" : true,
1186 "body" : form
1187 };
1188
1189 requestModule(optionsParams, function (error, response, body) {
1190
1191 if (error) {
1192 deferred.reject(_createErrorResponse("925", error, "_updateBatch"));
1193 } else {
1194 if(typeof body === "object") {
1195 if(body.data && body.data.status==200) {
1196 deferred.resolve({
1197 "status": "success",
1198 "data" : body
1199 });
1200 } else {
1201 deferred.reject(_createErrorResponse("925", error, "_updateBatch"));
1202 }
1203 } else {
1204 deferred.reject(_createErrorResponse("911", {response, body}, "_updateBatch"));
1205 }
1206
1207 }
1208 });
1209
1210 return deferred.promise;
1211}
1212
1213function _createNewPermission(options) {
1214
1215 var deferred = q.defer();
1216
1217 var form = {
1218 "token" : options.token,
1219 "entitlement_id" : options.entitlement_id,
1220 "batch_id" : options.batch_id,
1221 "proof" : options.proof,
1222 "limit": options.limit,
1223 "is_active": options.is_active,
1224 "expired_at" : options.expired_at,
1225 "released_at" : options.released_at
1226 };
1227
1228 var domain = peasConfig.domain;
1229 var api_version = peasConfig.api_version;
1230
1231 const optionsParams = {
1232 "url": domain + api_version + "/permissions",
1233 "method": 'POST',
1234 "headers": {
1235 'Authorization': options.token,
1236 'Content-Type': 'application/json'
1237 },
1238 "json" : true,
1239 "body" : form
1240 };
1241
1242 requestModule(optionsParams, function (error, response, body) {
1243
1244 if (error) {
1245 deferred.reject(_createErrorResponse("926", error, "_createNewPermission"));
1246 } else {
1247 if(typeof body === "object") {
1248 if(body.data && body.data.status==201) {
1249 deferred.resolve({
1250 "status": "success",
1251 "data" : body
1252 });
1253 } else {
1254 deferred.reject(_createErrorResponse("926", error, "_createNewPermission"));
1255 }
1256 } else {
1257 deferred.reject(_createErrorResponse("911", {response, body}, "_createNewPermission"));
1258 }
1259 }
1260 });
1261
1262 return deferred.promise;
1263}
1264
1265function _getErrorCodes() {
1266 var error = {
1267 "901" : {
1268 "field" : "activations",
1269 "message" : "You have already activated this product",
1270 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1271 },
1272 "902" : {
1273 "field" : "limit",
1274 "message" : "Access Code limit has reached",
1275 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1276 },
1277 "903" : {
1278 "field" : "type",
1279 "message" : "Product is not valid for this category (User Type Mismatch)",
1280 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1281 },
1282 "904" : {
1283 "field" : "released_at",
1284 "message" : "Failure PEAS release date",
1285 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1286 },
1287 "905" : {
1288 "field" : "is_active",
1289 "message" : "Product has not active status of permission",
1290 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1291 },
1292 "906" : {
1293 "message" : "Error while authenticating User",
1294 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1295 },
1296 "907" : {
1297 "message" : "Error while fetching permissions (Incorrect Access Code)",
1298 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1299 },
1300 "908" : {
1301 "message" : "Error while fetching user activations",
1302 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1303 },
1304 "909" : {
1305 "message" : "Error while activating product",
1306 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1307 },
1308 "910" : {
1309 "message" : "Error while fetching bundle info",
1310 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1311 },
1312 "911" : {
1313 "message" : "Unable to complete PEAS API request",
1314 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_COMMUNICATION_ERROR
1315 },
1316 "912" : {
1317 "message" : "Error while fetching product info",
1318 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1319 },
1320 "913" : {
1321 "message" : "Sorry, bundle is not available yet. Please keep your activation code safe and use it later",
1322 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1323 },
1324 "914" : {
1325 "message" : "Sorry, bundle is not available yet. Please keep your activation code safe and use it later",
1326 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1327 },
1328 "915" : {
1329 "message" : "Error while fetching products",
1330 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1331 },
1332 "916" : {
1333 "message" : "Error while fetching entitlements",
1334 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1335 },
1336 "917" : {
1337 "message" : "Error while fetching batches",
1338 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1339 },
1340 "918" : {
1341 "message" : "No Product found corresponding to this SAP ID",
1342 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1343 },
1344 "919" : {
1345 "message" : "Error while creating product",
1346 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1347 },
1348 "920" : {
1349 "message" : "Error while updating product",
1350 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1351 },
1352 "921" : {
1353 "message" : "Error while deleting product",
1354 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1355 },
1356 "922" : {
1357 "message" : "Error while creating entitlement",
1358 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1359 },
1360 "923" : {
1361 "message" : "Error while updating entitlement",
1362 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1363 },
1364 "924" : {
1365 "message" : "Error while creating batch",
1366 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1367 },
1368 "925" : {
1369 "message" : "Error while updating batch",
1370 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1371 },
1372 "926" : {
1373 "message" : "Error while creating permission",
1374 "tag" : appConstants.APP.ERROR_TYPES.PEAS.PEAS_WORKFLOW_ERROR
1375 }
1376 }
1377 return error;
1378}
1379
1380function _createErrorResponse(code, error, functionName, errorObjectExtension) {
1381 var errorObject = {
1382 "status" : "error",
1383 "error" : {
1384 "code" : code,
1385 "message": ERROR_CODES_INFO[code].message,
1386 "tag" : ERROR_CODES_INFO[code].tag,
1387 "details" : error,
1388 "info" : {
1389 "fn-name" : functionName
1390 }
1391 }
1392 };
1393
1394 if(errorObjectExtension) errorObject.error = {...errorObject.error, ...errorObjectExtension};
1395
1396 return errorObject;
1397}
1398
1399function _isJson(data) {
1400 try {
1401 JSON.parse(data);
1402 } catch (e) {
1403 return false;
1404 }
1405 return true;
1406}
1407
1408function _addGetParamstoUrl(baseUrl, params) {
1409 let counter = 0;
1410 for(const key in params) {
1411 baseUrl += counter ? "&" : "?";
1412 baseUrl += key + "=" + params[key];
1413 ++counter;
1414 }
1415 return baseUrl;
1416}