UNPKG

kwikid-components

Version:
667 lines 86.3 kB
import { checkObjectKeyExists, isNotEmptyArray } from "kwikid-toolkit"; import { Injectable } from "@angular/core"; import * as i0 from "@angular/core"; import * as i1 from "../../services/api.service"; export class KwikIDLoginService { constructor(apiService) { this.apiService = apiService; this.backend = {}; this.secureApis = {}; this.utilityFlags = {}; } checkIfEncryptAPI(API_KEY) { var _a, _b, _c, _d, _e; if ((_b = (_a = this.utilityFlags) === null || _a === void 0 ? void 0 : _a.secureAllApis) === null || _b === void 0 ? void 0 : _b.encrypt) { return true; } if (isNotEmptyArray((_c = this === null || this === void 0 ? void 0 : this.secureApis) === null || _c === void 0 ? void 0 : _c.encrypt) && ((_e = (_d = this === null || this === void 0 ? void 0 : this.secureApis) === null || _d === void 0 ? void 0 : _d.encrypt) === null || _e === void 0 ? void 0 : _e.includes(API_KEY))) { return true; } return false; } checkIfDecryptAPI(API_KEY) { var _a, _b, _c, _d, _e; if ((_b = (_a = this.utilityFlags) === null || _a === void 0 ? void 0 : _a.secureAllApis) === null || _b === void 0 ? void 0 : _b.decrypt) { return true; } if (isNotEmptyArray((_c = this === null || this === void 0 ? void 0 : this.secureApis) === null || _c === void 0 ? void 0 : _c.decrypt) && ((_e = (_d = this === null || this === void 0 ? void 0 : this.secureApis) === null || _d === void 0 ? void 0 : _d.decrypt) === null || _e === void 0 ? void 0 : _e.includes(API_KEY))) { return true; } return false; } checkIfVerifySignature(API_KEY) { var _a, _b, _c, _d, _e; if ((_b = (_a = this.utilityFlags) === null || _a === void 0 ? void 0 : _a.secureAllApis) === null || _b === void 0 ? void 0 : _b.verifySignature) { return true; } if (isNotEmptyArray((_c = this === null || this === void 0 ? void 0 : this.secureApis) === null || _c === void 0 ? void 0 : _c.verifySignature) && ((_e = (_d = this === null || this === void 0 ? void 0 : this.secureApis) === null || _d === void 0 ? void 0 : _d.verifySignature) === null || _e === void 0 ? void 0 : _e.includes(API_KEY))) { return true; } return false; } setConfig(config) { this.backend = config === null || config === void 0 ? void 0 : config.backend; this.secureApis = config === null || config === void 0 ? void 0 : config.secureApis; this.utilityFlags = config === null || config === void 0 ? void 0 : config.utilityFlags; } userLogin(data) { return new Promise((resolve) => { var _a; const API_KEY = "USER_LOGIN"; const requestBody = { phone_number: localStorage.getItem("mobile"), username: localStorage.getItem("user_id"), extras: (_a = JSON.parse(localStorage.getItem("user_info"))) !== null && _a !== void 0 ? _a : data === null || data === void 0 ? void 0 : data.user_info }; const url = this.backend.loginUrls[API_KEY]; this.apiService .post(url, requestBody, { headers: { auth: localStorage.getItem("token"), "Access-Control-Allow-Origin": "*", "Content-Type": "application/json" } }, this.checkIfEncryptAPI(API_KEY), this.checkIfDecryptAPI(API_KEY), this.checkIfVerifySignature(API_KEY)) .subscribe((res) => { resolve({ success: true, api_response: res }); }, (err) => { resolve({ success: false, api_response: err }); }); }); } sendUserOtp(formData, data) { return new Promise((resolve) => { var _a, _b, _c; const API_KEY = "USER_SEND_OTP"; const requestBody = { phone_number: (_a = formData.mobile) !== null && _a !== void 0 ? _a : localStorage.getItem("mobile"), user_id: (_b = formData.user_id) !== null && _b !== void 0 ? _b : localStorage.getItem("user_id"), extras: (_c = JSON.parse(localStorage.getItem("user_info"))) !== null && _c !== void 0 ? _c : data === null || data === void 0 ? void 0 : data.user_info, session_id: localStorage.getItem("session_id") }; const url = this.backend.loginUrls[API_KEY]; this.apiService .post(url, requestBody, { headers: { auth: localStorage.getItem("token"), "Access-Control-Allow-Origin": "*", "Content-Type": "application/json" } }, this.checkIfEncryptAPI(API_KEY), this.checkIfDecryptAPI(API_KEY), this.checkIfVerifySignature(API_KEY)) .subscribe((res) => { if (res && (res === null || res === void 0 ? void 0 : res.success)) { resolve({ success: true, api_response: res }); } else if (checkObjectKeyExists(res, "msg")) { resolve({ success: false, message: res.msg, type: "POPUP", api_response: res }); } else if (checkObjectKeyExists(res, "message")) { resolve({ success: false, message: res.message, type: "POPUP", api_response: res }); } else { const message = "Something went wrong, Please try again later!"; resolve({ success: false, message, type: "POPUP", api_response: res }); } }, (err) => { if ((err === null || err === void 0 ? void 0 : err.msg) && (err === null || err === void 0 ? void 0 : err.msg.includes("MAX_RETRIES"))) { resolve({ success: false, message: "7", type: "PAGE", api_response: err }); } else if ((err === null || err === void 0 ? void 0 : err.msg) && !(err === null || err === void 0 ? void 0 : err.msg.includes("MAX_RETRIES"))) { resolve({ success: false, message: err.msg, type: "POPUP", api_response: err }); } else if ((err === null || err === void 0 ? void 0 : err.message) && (err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) { resolve({ success: false, message: "Token Expired, Restarting Portal.", type: "RELOAD", api_response: err }); } else if ((err === null || err === void 0 ? void 0 : err.message) && !(err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) { resolve({ success: false, message: err.message, type: "POPUP", api_response: err }); } else { const message = "Something went wrong, Please try again later!"; resolve({ success: false, message, type: "POPUP", api_response: err }); } }); }); } verifyUserOtp(formData, data) { return new Promise((resolve) => { var _a; const API_KEY = "USER_VERIFY_OTP"; const requestBody = { phone_number: localStorage.getItem("mobile"), user_id: localStorage.getItem("user_id"), otp: formData.otp, dedupe: this.utilityFlags.dedupeMobileOtp, extras: (_a = JSON.parse(localStorage.getItem("user_info"))) !== null && _a !== void 0 ? _a : data === null || data === void 0 ? void 0 : data.user_info, session_id: localStorage.getItem("session_id") }; const url = this.backend.loginUrls[API_KEY]; this.apiService .post(url, requestBody, { headers: { auth: localStorage.getItem("token"), "Access-Control-Allow-Origin": "*", "Content-Type": "application/json" } }, this.checkIfEncryptAPI(API_KEY), this.checkIfDecryptAPI(API_KEY), this.checkIfVerifySignature(API_KEY)) .subscribe((res) => { if (res && (res === null || res === void 0 ? void 0 : res.verified)) { resolve({ success: true, api_response: res }); } else if (checkObjectKeyExists(res, "msg")) { resolve({ success: false, message: res.msg, type: "POPUP", api_response: res }); } else if (checkObjectKeyExists(res, "message")) { resolve({ success: false, message: res.message, type: "POPUP", api_response: res }); } else { const message = "Something went wrong, Please try again later!"; resolve({ success: false, message, type: "POPUP", api_response: res }); } }, (err) => { if ((err === null || err === void 0 ? void 0 : err.msg) && (err === null || err === void 0 ? void 0 : err.msg.includes("OTP Not Verified"))) { resolve({ success: false, message: "Invalid OTP Entered!", type: "POPUP", api_response: err }); } else if ((err === null || err === void 0 ? void 0 : err.msg) && !(err === null || err === void 0 ? void 0 : err.msg.includes("OTP Not Verified"))) { resolve({ success: false, message: err.msg, type: "POPUP", api_response: err }); } else if ((err === null || err === void 0 ? void 0 : err.message) && (err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) { resolve({ success: false, message: "Token Expired, Restarting Portal.", type: "RELOAD", api_response: err }); } else if ((err === null || err === void 0 ? void 0 : err.message) && !(err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) { resolve({ success: false, message: err.message, type: "POPUP", api_response: err }); } else { const message = "Something went wrong, Please try again later!"; resolve({ success: false, message, type: "POPUP", api_response: err }); } }); }); } agentLogin(formData, data) { return new Promise((resolve) => { var _a; const API_KEY = "AGENT_LOGIN"; const requestBody = { agent_id: formData.username, agent_password: formData.password, agent_data_needed: true, concurrent_auditor: false, domain_name: localStorage.getItem("domain"), extras: (_a = JSON.parse(localStorage.getItem("user_info"))) !== null && _a !== void 0 ? _a : data === null || data === void 0 ? void 0 : data.user_info }; const url = this.backend.loginUrls[API_KEY]; this.apiService .post(url, requestBody, { headers: { auth: localStorage.getItem("token"), "Access-Control-Allow-Origin": "*", "Content-Type": "application/json" } }, this.checkIfEncryptAPI(API_KEY), this.checkIfDecryptAPI(API_KEY), this.checkIfVerifySignature(API_KEY)) .subscribe((res) => { var _a, _b; if (res && (res === null || res === void 0 ? void 0 : res.success)) { resolve({ success: true, api_response: res }); } else if (checkObjectKeyExists(res, "msg")) { resolve({ success: false, message: res.msg, type: "POPUP", api_response: res }); } else if (checkObjectKeyExists(res, "message")) { resolve({ success: false, message: res.message, type: "POPUP", api_response: res }); } else { const message = (_b = (_a = this.utilityFlags) === null || _a === void 0 ? void 0 : _a.loginErrorMsg) !== null && _b !== void 0 ? _b : "Something went wrong, Please try again later!"; resolve({ success: false, message, type: "POPUP", api_response: res }); } }, (err) => { var _a, _b; if (err === null || err === void 0 ? void 0 : err.msg) { resolve({ success: false, message: err.msg, type: "POPUP", api_response: err }); } else if ((err === null || err === void 0 ? void 0 : err.message) && (err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) { resolve({ success: false, message: "Token Expired, Restarting Portal.", type: "RELOAD", api_response: err }); } else if ((err === null || err === void 0 ? void 0 : err.message) && !(err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) { resolve({ success: false, message: err.message, type: "POPUP", api_response: err }); } else { const message = (_b = (_a = this.utilityFlags) === null || _a === void 0 ? void 0 : _a.loginErrorMsg) !== null && _b !== void 0 ? _b : "Something went wrong, Please try again later!"; resolve({ success: false, message, type: "POPUP", api_response: err }); } }); }); } sendAgentOtp(formData, data) { return new Promise((resolve) => { var _a; const API_KEY = "AGENT_SEND_OTP"; const requestBody = { agent_id: formData.username, extras: (_a = JSON.parse(localStorage.getItem("user_info"))) !== null && _a !== void 0 ? _a : data === null || data === void 0 ? void 0 : data.user_info }; const url = this.backend.loginUrls[API_KEY]; this.apiService .post(url, requestBody, { headers: { auth: localStorage.getItem("token"), "Access-Control-Allow-Origin": "*", "Content-Type": "application/json" } }, this.checkIfEncryptAPI(API_KEY), this.checkIfDecryptAPI(API_KEY), this.checkIfVerifySignature(API_KEY)) .subscribe((res) => { if (res && (res === null || res === void 0 ? void 0 : res.success)) { resolve({ success: true, api_response: res }); } else if (checkObjectKeyExists(res, "msg")) { resolve({ success: false, message: res.msg, type: "POPUP", api_response: res }); } else if (checkObjectKeyExists(res, "message")) { resolve({ success: false, message: res.message, type: "POPUP", api_response: res }); } else { const message = "Something went wrong, Please try again later!"; resolve({ success: false, message, type: "POPUP", api_response: res }); } }, (err) => { if ((err === null || err === void 0 ? void 0 : err.msg) && (err === null || err === void 0 ? void 0 : err.msg.includes("MAX_RETRIES"))) { resolve({ success: false, message: "7", type: "PAGE", api_response: err }); } else if ((err === null || err === void 0 ? void 0 : err.msg) && !(err === null || err === void 0 ? void 0 : err.msg.includes("MAX_RETRIES"))) { resolve({ success: false, message: err.msg, type: "POPUP", api_response: err }); } else if ((err === null || err === void 0 ? void 0 : err.message) && (err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) { resolve({ success: false, message: "Token Expired, Restarting Portal.", type: "RELOAD", api_response: err }); } else if ((err === null || err === void 0 ? void 0 : err.message) && !(err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) { resolve({ success: false, message: err.message, type: "POPUP", api_response: err }); } else { const message = "Something went wrong, Please try again later!"; resolve({ success: false, message, type: "POPUP", api_response: err }); } }); }); } verifyAgentOtp(formData, data) { return new Promise((resolve) => { var _a; const API_KEY = "AGENT_VERIFY_OTP"; const requestBody = { agent_id: localStorage.getItem("agent_id"), domain_name: localStorage.getItem("domain"), otp: formData.otp, extras: (_a = JSON.parse(localStorage.getItem("user_info"))) !== null && _a !== void 0 ? _a : data === null || data === void 0 ? void 0 : data.user_info }; const url = this.backend.loginUrls[API_KEY]; this.apiService .post(url, requestBody, { headers: { auth: localStorage.getItem("token"), "Access-Control-Allow-Origin": "*", "Content-Type": "application/json" } }, this.checkIfEncryptAPI(API_KEY), this.checkIfDecryptAPI(API_KEY), this.checkIfVerifySignature(API_KEY)) .subscribe((res) => { if (res && (res === null || res === void 0 ? void 0 : res.verified)) { resolve({ success: true, api_response: res }); } else if (checkObjectKeyExists(res, "msg")) { resolve({ success: false, message: res.msg, type: "POPUP", api_response: res }); } else if (checkObjectKeyExists(res, "message")) { resolve({ success: false, message: res.message, type: "POPUP", api_response: res }); } else { const message = "Something went wrong, Please try again later!"; resolve({ success: false, message, type: "POPUP", api_response: res }); } }, (err) => { if ((err === null || err === void 0 ? void 0 : err.msg) && (err === null || err === void 0 ? void 0 : err.msg.includes("OTP Not Verified"))) { resolve({ success: false, message: "Invalid OTP Entered!", type: "POPUP", api_response: err }); } else if ((err === null || err === void 0 ? void 0 : err.msg) && !(err === null || err === void 0 ? void 0 : err.msg.includes("OTP Not Verified"))) { resolve({ success: false, message: err.msg, type: "POPUP", api_response: err }); } else if ((err === null || err === void 0 ? void 0 : err.message) && (err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) { resolve({ success: false, message: "Token Expired, Restarting Portal.", type: "RELOAD", api_response: err }); } else if ((err === null || err === void 0 ? void 0 : err.message) && !(err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) { resolve({ success: false, message: err.message, type: "POPUP", api_response: err }); } else { const message = "Something went wrong, Please try again later!"; resolve({ success: false, message, type: "POPUP", api_response: err }); } }); }); } changeAgentPassword(formData, data) { return new Promise((resolve) => { const API_KEY = "AGENT_CHANGE_PASSWORD"; const agent_id = localStorage.getItem("agent_id"); const formdata = new FormData(); formdata.append("old_password", formData.old_password); formdata.append("new_password", formData.new_password); formdata.append("repeat_password", formData.repeat_password); formdata.append("isEncrypted", "0"); const url = `${this.backend.loginUrls[API_KEY]}/${agent_id}`; this.apiService .post(url, formdata, { headers: { auth: localStorage.getItem("token"), "Access-Control-Allow-Origin": "*", "Content-Type": "application/json" } }, this.checkIfEncryptAPI(API_KEY), this.checkIfDecryptAPI(API_KEY), this.checkIfVerifySignature(API_KEY)) .subscribe((res) => { if (res && ((res === null || res === void 0 ? void 0 : res.status) == 200 || (res === null || res === void 0 ? void 0 : res.success))) { resolve({ success: true, message: "Password Updated Successfully. Please Login Again!", type: "RELOAD", api_response: res }); } else if (checkObjectKeyExists(res, "msg")) { resolve({ success: false, message: res.msg, type: "POPUP", api_response: res }); } else if (checkObjectKeyExists(res, "message")) { resolve({ success: false, message: res.message, type: "POPUP", api_response: res }); } else { const message = "Something went wrong, Please try again later!"; resolve({ success: false, message, type: "POPUP", api_response: res }); } }, (err) => { if (err === null || err === void 0 ? void 0 : err.msg) { resolve({ success: false, message: err.msg, type: "POPUP", api_response: err }); } else if ((err === null || err === void 0 ? void 0 : err.message) && (err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) { resolve({ success: false, message: "Token Expired, Restarting Portal.", type: "RELOAD", api_response: err }); } else if ((err === null || err === void 0 ? void 0 : err.message) && !(err === null || err === void 0 ? void 0 : err.message.includes("Token has expired"))) { resolve({ success: false, message: err.message, type: "POPUP", api_response: err }); } else { const message = "Something went wrong, Please try again later!"; resolve({ success: false, message, type: "POPUP", api_response: err }); } }); }); } } /** @nocollapse */ KwikIDLoginService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDLoginService, deps: [{ token: i1.KwikIDApiService }], target: i0.ɵɵFactoryTarget.Injectable }); /** @nocollapse */ KwikIDLoginService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDLoginService, providedIn: "root" }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: KwikIDLoginService, decorators: [{ type: Injectable, args: [{ providedIn: "root" }] }], ctorParameters: function () { return [{ type: i1.KwikIDApiService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2t3aWtpZC1jb21wb25lbnRzL3NyYy9saWIvcGFnZXMvbG9naW4vbG9naW4uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBTTNDLE1BQU0sT0FBTyxrQkFBa0I7SUFDN0IsWUFBb0IsVUFBNEI7UUFBNUIsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFFaEQsWUFBTyxHQUFRLEVBQUUsQ0FBQztRQUVsQixlQUFVLEdBQVEsRUFBRSxDQUFDO1FBRXJCLGlCQUFZLEdBQVEsRUFBRSxDQUFDO0lBTjRCLENBQUM7SUFRcEQsaUJBQWlCLENBQUMsT0FBTzs7UUFDdkIsSUFBSSxNQUFBLE1BQUEsSUFBSSxDQUFDLFlBQVksMENBQUUsYUFBYSwwQ0FBRSxPQUFPLEVBQUU7WUFDN0MsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELElBQ0UsZUFBZSxDQUFDLE1BQUEsSUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLFVBQVUsMENBQUUsT0FBTyxDQUFDO2FBQzFDLE1BQUEsTUFBQSxJQUFJLGFBQUosSUFBSSx1QkFBSixJQUFJLENBQUUsVUFBVSwwQ0FBRSxPQUFPLDBDQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQSxFQUM1QztZQUNBLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxPQUFPOztRQUN2QixJQUFJLE1BQUEsTUFBQSxJQUFJLENBQUMsWUFBWSwwQ0FBRSxhQUFhLDBDQUFFLE9BQU8sRUFBRTtZQUM3QyxPQUFPLElBQUksQ0FBQztTQUNiO1FBQ0QsSUFDRSxlQUFl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