931 lines
37 KiB
JavaScript

const DEFAULT_LOG_LEVELS_TO_LOG = ["debug","warn","info","error"];
const DEFAULT_LOG_AJAX_REQUESTS = true;
const DEFAULT_LOG_AJAX_REQUESTS_TO_CONSOLE = true;
const DEFAULT_LOG_AJAX_REQUESTS_TO_CONSOLE_ERROR_ONLY = true;
const DEFAULT_LOG_AJAX_REQUESTS_TO_CONSOLE_MAX_RESPONSE_CHARS = 200
///CURRENTLY THESE INDEXEDDB CONSTS ARE NOT USED, LEAVING HERE IN CASE I FIGURE OUT HOW TO WIRE THEM UP.
const DEFAULT_LOG_AJAX_REQUESTS_TO_INDEXEDDB = true;
const DEFAULT_LOG_AJAX_REQUESTS_TO_INDEXEDDB_ERROR_ONLY = true;
const DEFAULT_LOG_AJAX_REQUESTS_TO_INDEXEDDB_MAX_RESPONSE_CHARS = -1 //< 0 = log all, 0 = log none, > 0 log that # of chars
const DEFAULT_LOG_URL = 'https://usahaulerslog.solutionsmith.net/WebServices/LoggingMethods.aspx/SaveLogs';
const INTERNAL_LOG_URLS = {
DEFAULT: "https://usahaulerslogdev.solutionsmith.net/WebServices/LoggingMethods.aspx/SaveLogs",
DEV: "https://usahaulerslogdev.solutionsmith.net/WebServices/LoggingMethods.aspx/SaveLogs",
PROD: "https://usahaulerslog.solutionsmith.net/WebServices/LoggingMethods.aspx/SaveLogs"
}
const DEFAULT_LOG_CONFIG_OBJECT = {
id: 0,
defaultLogLevelsToLog: DEFAULT_LOG_LEVELS_TO_LOG,
logAjaxRequests: DEFAULT_LOG_AJAX_REQUESTS,
logAjaxRequestsToConsole: DEFAULT_LOG_AJAX_REQUESTS_TO_CONSOLE,
logAjaxRequestsToConsoleErrorOnly: DEFAULT_LOG_AJAX_REQUESTS_TO_CONSOLE_ERROR_ONLY,
logAjaxRequestsToConsoleMaxResponseChars: DEFAULT_LOG_AJAX_REQUESTS_TO_CONSOLE_MAX_RESPONSE_CHARS,
logAjaxRequestsToIndexedDB: DEFAULT_LOG_AJAX_REQUESTS_TO_INDEXEDDB,
logAjaxRequestsToIndexedDBErrorOnly: DEFAULT_LOG_AJAX_REQUESTS_TO_INDEXEDDB_ERROR_ONLY,
logAjaxRequestsToIndexedDBMaxResponseChars: DEFAULT_LOG_AJAX_REQUESTS_TO_INDEXEDDB_MAX_RESPONSE_CHARS
}
const OLD_CONSOLE_LOG = console.log;
const OLD_CONSOLE_DEBUG = console.debug;
const OLD_CONSOLE_WARN = console.warn;
const OLD_CONSOLE_INFO = console.info;
const OLD_CONSOLE_ERROR = console.error;
const USAHAULERSLOGGING_DATABASE_NAME = "usahaulerslogging";
const USAHAULERSLOGGING_DATABASE_VERSION = 1;
const INTERNAL_USAHAULERSLOGGING_USEHAULERSLOGGINGDBCONFIG_OBJECT_STORE = "usahaulersloggingdb.config";
const INTERNAL_USAHAULERSLOGGING_LOG_REFRESH_PERIOD = INTERNAL_MINUTE_MS * 5;
const INTERNAL_USAHAULERSLOGGING_LOG_OBJECT_STORE = "logs";
const INTERNAL_USAHAULERSLOGGING_LOG_INDEX_DATE = "date";
const INTERNAL_USAHAULERSLOGGING_LOG_INDEX_LEVEL = "level";
const INTERNAL_USAHAULERSLOGGING_LOG_INDEX_UPLOADED = "uploaded";
const INTERNAL_USAHAULERSLOGGING_MAXUPLOADQTY = 100
$.usaHaulersLoggingDB = {
config: DEFAULT_LOG_CONFIG_OBJECT,
shouldLogLevel: (level) => {
var config = $.usaHaulersLoggingDB.config;
if (config == null)
config = DEFAULT_LOG_CONFIG_OBJECT;
return config.defaultLogLevelsToLog.includes(level.trim().toLowerCase());
},
shouldLogAjaxRequests: function () {
var config = $.usaHaulersLoggingDB.config;
if (config == null)
config = DEFAULT_LOG_CONFIG_OBJECT;
return config.logAjaxRequests && (config.logAjaxRequestsToConsole || config.logAjaxRequestsToIndexedDB);
},
shouldLogAjaxRequestsToConsole: function () {
var config = $.usaHaulersLoggingDB.config;
if (config == null)
config = DEFAULT_LOG_CONFIG_OBJECT;
return config.logAjaxRequests && config.logAjaxRequestsToConsole;
},
shouldLogAjaxRequestsToConsoleErrorOnly: function () {
var config = $.usaHaulersLoggingDB.config;
if (config == null)
config = DEFAULT_LOG_CONFIG_OBJECT;
return config.logAjaxRequests && config.logAjaxRequestsToConsole && config.logAjaxRequestsToConsoleErrorOnly;
},
logAjaxRequestsToConsoleMaxResponseChars: function () {
var config = $.usaHaulersLoggingDB.config;
if (config == null)
config = DEFAULT_LOG_CONFIG_OBJECT;
return (config.logAjaxRequests && config.logAjaxRequestsToConsole ? config.logAjaxRequestsToConsoleMaxResponseChars : 0);
},
shouldLogAjaxRequestsToIndexedDB: function () {
var config = $.usaHaulersLoggingDB.config;
if (config == null)
config = DEFAULT_LOG_CONFIG_OBJECT;
return config.logAjaxRequests && config.logAjaxRequestsToIndexedDB && $.usaHaulersLoggingDB.dbInitialized;
},
shouldLogAjaxRequestsToIndexedDBErrorOnly: function () {
var config = $.usaHaulersLoggingDB.config;
if (config == null)
config = DEFAULT_LOG_CONFIG_OBJECT;
return config.logAjaxRequests && config.logAjaxRequestsToIndexedDB && config.logAjaxRequestsToIndexedDBErrorOnly;
},
logAjaxRequestsToIndexedDBMaxResponseChars: function () {
var config = $.usaHaulersLoggingDB.config;
if (config == null)
config = DEFAULT_LOG_CONFIG_OBJECT;
return (config.logAjaxRequests && config.logAjaxRequestsToIndexedDB ? config.logAjaxRequestsToIndexedDBMaxResponseChars : 0);
},
prepareLog: function (argumentArray) {
var LOG_PREFIX = new Date().toISOString();
var args = Array.from(argumentArray);
args.unshift(LOG_PREFIX + ": ");
return args;
},
getLogMsgFromArguments: function (argumentArray) {
if (argumentArray === undefined || argumentArray === null)
return "Unknown log request: null/undefined passed to getLogMsgFromArguments";
var args = Array.from(argumentArray);
var msg = "";
args.forEach((arg) => {
var msg1 = "";
if (arg !== undefined && arg !== null) {
if (typeof arg === 'object')
msg1 = JSON.stringify(arg);
else
msg1 = arg.toString();
if (msg.length > 0)
msg += ", ";
msg += msg1;
}
});
return msg;
},
getBoolean: function (variable) {
if ($.getBoolean)
return $.getBoolean(variable);
var vtype;
var toReturn;
if (variable != null) {
switch (typeof (variable)) {
case 'boolean':
vtype = "boolean";
return variable;
break;
case 'number':
vtype = "number";
if (variable == 0)
toReturn = false;
else toReturn = true;
break;
case 'string':
vtype = "string";
if (variable.toLowerCase() == "true" || variable.toLowerCase() == "yes")
toReturn = true;
else if (variable.toLowerCase() == "false" || variable.toLowerCase() == "no")
toReturn = false;
else if (variable.length > 0)
toReturn = true;
else if (variable.length == 0)
toReturn = false;
break;
}
return toReturn;
}
},
removeObjectMethodsForSerialization: function (obj) {
try {
return JSON.parse(JSON.stringify(obj));
}
catch (error) {
return obj;
}
}
}
console.log = console.debug = function () {
var args = $.usaHaulersLoggingDB.prepareLog(arguments);
OLD_CONSOLE_DEBUG.apply(console, args);
if ($.usaHaulersLoggingDB && $.usaHaulersLoggingDB.addLog && $.usaHaulersLoggingDB.dbInitialized && $.usaHaulersLoggingDB.shouldLogLevel("debug")) {
var msg = $.usaHaulersLoggingDB.getLogMsgFromArguments(arguments);
var dbArgs = Array.from(arguments);
$.usaHaulersLoggingDB.addLog("DEBUG", msg, dbArgs);
}
}
console.warn = function () {
var args = $.usaHaulersLoggingDB.prepareLog(arguments);
OLD_CONSOLE_WARN.apply(console, args);
if ($.usaHaulersLoggingDB && $.usaHaulersLoggingDB.addLog && $.usaHaulersLoggingDB.dbInitialized && $.usaHaulersLoggingDB.shouldLogLevel("warn")) {
var msg = $.usaHaulersLoggingDB.getLogMsgFromArguments(arguments);
var dbArgs = Array.from(arguments);
$.usaHaulersLoggingDB.addLog("WARN", msg, dbArgs);
}
}
console.info = function () {
var args = $.usaHaulersLoggingDB.prepareLog(arguments);
OLD_CONSOLE_INFO.apply(console, args);
if ($.usaHaulersLoggingDB && $.usaHaulersLoggingDB.addLog && $.usaHaulersLoggingDB.dbInitialized && $.usaHaulersLoggingDB.shouldLogLevel("info")) {
var msg = $.usaHaulersLoggingDB.getLogMsgFromArguments(arguments);
var dbArgs = Array.from(arguments);
$.usaHaulersLoggingDB.addLog("INFO", msg, dbArgs);
}
}
console.error = function () {
var args = $.usaHaulersLoggingDB.prepareLog(arguments);
OLD_CONSOLE_ERROR.apply(console, args);
if ($.usaHaulersLoggingDB && $.usaHaulersLoggingDB.addLog && $.usaHaulersLoggingDB.dbInitialized && $.usaHaulersLoggingDB.shouldLogLevel("error")) {
var msg = $.usaHaulersLoggingDB.getLogMsgFromArguments(arguments);
var dbArgs = Array.from(arguments);
$.usaHaulersLoggingDB.addLog("ERROR", msg, dbArgs);
}
}
if ($ && $.ajaxSetup) {
$(document).ready(function () {
$(document).ajaxSuccess(function (event, xhr, settings) {
if ($.usaHaulersLoggingDB.shouldLogAjaxRequests()) {
var responseText = "";
var isSuccess = true;
if (xhr.responseJson != null && xhr.responseJson.d != null && xhr.responseJson.d.success != null && !xhr.responseJson.d.success)
isSuccess = false;
if (!$.usaHaulersLoggingDB.shouldLogAjaxRequestsToConsoleErrorOnly() || !isSuccess) {
if (xhr.responseText && xhr.responseText != null) {
if ($.usaHaulersLoggingDB.logAjaxRequestsToConsoleMaxResponseChars() <= 0 || xhr.responseText.length <= $.usaHaulersLoggingDB.logAjaxRequestsToConsoleMaxResponseChars())
responseText = "response = '" + xhr.responseText + "';";
else
responseText = "responseSnippet='" + xhr.responseText.substring(0, $.usaHaulersLoggingDB.logAjaxRequestsToConsoleMaxResponseChars()) + "';";
}
}
else {
return;
}
if ($.usaHaulersLoggingDB.shouldLogAjaxRequestsToConsole()) {
if (!isSuccess)
console.debug("Ajax Success, returned success:false", {
url: settings.url,
httpMethod: settings.type,
responseText: responseText
});
else {
console.debug("Ajax Success", {
url: settings.url,
httpMethod: settings.type,
responseText: responseText
});
}
}
}
if (xhr.responseJson != null && xhr.responseJson.d != null && xhr.responseJson.d.success != null && xhr.responseJson.d.success) {
var lg_session_guid = request.getResponseHeader('lg_session_guid');
var lg_access_token = $.getBoolean(request.getResponseHeader('lg_access_token'));
var lg_application_code = $.getBoolean(request.getResponseHeader('lg_application_code'));
var lg_application_user_id = $.getBoolean(request.getResponseHeader('lg_application_user_id'));
if ($.cookie) {
$.cookie.raw = true;
$.cookie('lg_session_guid', lg_session_guid, { path: '/' });
$.cookie('lg_access_token', lg_access_token, { path: '/' });
$.cookie('lg_application_code', lg_application_code, { path: '/' });
$.cookie('lg_application_user_id', lg_application_user_id, { path: '/' });
}
}
});
$(document).ajaxError(function (event, xhr, settings) {
if ($.usaHaulersLoggingDB.shouldLogAjaxRequests()) {
var responseText = "";
if (xhr.responseText && xhr.responseText != null) {
if ($.usaHaulersLoggingDB.logAjaxRequestsToConsoleMaxResponseChars() <= 0 || xhr.responseText.length <= $.usaHaulersLoggingDB.logAjaxRequestsToConsoleMaxResponseChars())
responseText = "response = '" + xhr.responseText + "';";
else
responseText = "responseSnippet='" + xhr.responseText.substring(0, $.usaHaulersLoggingDB.logAjaxRequestsToConsoleMaxResponseChars()) + "';";
}
if ($.usaHaulersLoggingDB.shouldLogAjaxRequestsToConsole()) {
console.error("Ajax Error", {
url: settings.url,
httpMethod: settings.type,
responseText: responseText,
xhr: $.usaHaulersLoggingDB.removeObjectMethodsForSerialization(xhr),
settings: $.usaHaulersLoggingDB.removeObjectMethodsForSerialization(settings)
});
}
}
});
});
}
const INTERNAL_USAHAULERSLOGGING_ONUPGRADEDNEEDED = function (event) {
const db = event.target.result;
const transaction = event.currentTarget.transaction;
let oldVersion = event.oldVersion;
let newVersion = event.newVersion;
if (oldVersion < 1 && newVersion >= 1) {
//setup object stores
db.createObjectStore(INTERNAL_USAHAULERSLOGGING_USEHAULERSLOGGINGDBCONFIG_OBJECT_STORE, { keyPath: 'id' });
if (db.objectStoreNames.contains(INTERNAL_USAHAULERSLOGGING_LOG_OBJECT_STORE)) {
db.deleteObjectStore(INTERNAL_USAHAULERSLOGGING_LOG_OBJECT_STORE);
}
db.createObjectStore(INTERNAL_USAHAULERSLOGGING_LOG_OBJECT_STORE, { keyPath: 'id' });
//setup indexes
let store = transaction.objectStore(INTERNAL_USAHAULERSLOGGING_LOG_OBJECT_STORE);
if (store.indexNames.contains(INTERNAL_USAHAULERSLOGGING_LOG_INDEX_DATE)) {
store.deleteIndex(INTERNAL_USAHAULERSLOGGING_LOG_INDEX_DATE);
}
store.createIndex(INTERNAL_USAHAULERSLOGGING_LOG_INDEX_DATE, "date", { unique: false });
if (store.indexNames.contains(INTERNAL_USAHAULERSLOGGING_LOG_INDEX_LEVEL)) {
store.deleteIndex(INTERNAL_USAHAULERSLOGGING_LOG_INDEX_LEVEL);
}
store.createIndex(INTERNAL_USAHAULERSLOGGING_LOG_INDEX_LEVEL, "level", { unique: false });
if (store.indexNames.contains(INTERNAL_USAHAULERSLOGGING_LOG_INDEX_UPLOADED)) {
store.deleteIndex(INTERNAL_USAHAULERSLOGGING_LOG_INDEX_UPLOADED);
}
store.createIndex(INTERNAL_USAHAULERSLOGGING_LOG_INDEX_UPLOADED, "upload_status", { unique: false });
}
if (oldVersion < 2 && newVersion >= 2) {
//
}
}
$.extend($.usaHaulersLoggingDB, {
dbInitialized: false,
database: null,
initializeDB: function () {
let currentDB = this;
return new Promise(function (resolve, reject) {
if (currentDB.dbInitialized) {
resolve();
return;
}
currentDB.refreshConfigObject().then(function () {
currentDB.dbInitialized = true;
resolve();
});
});
},
createConfigObject: function () {
let currentDB = this;
var config = (!currentDB.config || currentDB.config == null ? DEFAULT_LOG_CONFIG_OBJECT : currentDB.config);
return config;
},
refreshConfigObject: function () {
let currentDB = this;
return new Promise(async function (resolve, reject) {
try {
let config = await currentDB.getObjects(INTERNAL_USAHAULERSLOGGING_USEHAULERSLOGGINGDBCONFIG_OBJECT_STORE);
let configDefault = currentDB.createConfigObject();
if (!config || config.length == 0) {
currentDB.config = configDefault;
await currentDB.persistConfigObject();
}
else {
currentDB.config = config[0];
let updatedConfig = false;
for (const prop in configDefault) {
if (prop !== "id" || currentDB.config[prop] === undefined) {
updatedConfig = true;
currentDB.config[prop] = configDefault[prop];
}
}
if (updatedConfig)
await currentDB.persistConfigObject();
}
resolve();
}
catch (error) {
reject(error);
}
});
},
persistConfigObject: function () {
let currentDB = this;
return currentDB.runTransactionReadWrite(INTERNAL_USAHAULERSLOGGING_USEHAULERSLOGGINGDBCONFIG_OBJECT_STORE, async function (transaction) {
const configStore = transaction.objectStore(INTERNAL_USAHAULERSLOGGING_USEHAULERSLOGGINGDBCONFIG_OBJECT_STORE);
configStore.put(currentDB.config);
return transaction.complete;
});
}
});
//#region basic indexeddb methods
$.extend($.usaHaulersLoggingDB, {
create: function (deleteIfExists = true) {
return new Promise(async function (resolve, reject) {
if (deleteIfExists === true) {
try {
await $.dbManager.deleteDatabase(USAHAULERSLOGGING_DATABASE_NAME);
}
catch (error) {
reject(error);
return;
}
}
try {
await $.dbManager.openDatabase(USAHAULERSLOGGING_DATABASE_NAME, USAHAULERSLOGGING_DATABASE_VERSION, INTERNAL_USAHAULERSLOGGING_ONUPGRADEDNEEDED);
}
catch (error) {
reject(error);
return;
}
resolve();
});
},
delete: function () {
let currentDB = this;
return $.dbManager.deleteDatabase(USAHAULERSLOGGING_DATABASE_NAME);
},
open: function () {
let currentDB = this;
return $.dbManager.openDatabase(USAHAULERSLOGGING_DATABASE_NAME, USAHAULERSLOGGING_DATABASE_VERSION, INTERNAL_USAHAULERSLOGGING_ONUPGRADEDNEEDED).then(
function onSuccessInternal(db) {
currentDB.database = db;
if (!currentDB.dbInitialized)
return currentDB.initializeDB();
else
return currentDB.refreshConfigObject();
},
function onErrorInternal(error) {
}
);
},
close: function () {
let currentDB = this;
return $.dbManager.closeDatabase(USAHAULERSLOGGING_DATABASE_NAME).then(
function onSuccessInternal(db) {
currentDB.database = null;
},
function onErrorInternal(error) {
}
);
},
runTransactionReadOnly: function (objectNames, transactionCode) {
let currentDB = this;
return new Promise(function (resolve, reject) {
if (transactionCode != null) {
let didOpenDB = false;
var onSuccessInternal = function () {
let transaction = currentDB.database.transaction(objectNames, "readonly");
transactionCode(transaction);
//if (didOpenDB)
// currentDB.close();
transaction.oncomplete = function (event) {
resolve();
};
transaction.onerror = function (event) {
reject(error.error);
};
//Transactions auto-commit after scope ends, cannot manually commit
};
if ($.usaHaulersLoggingDB.database == null) {
didOpenDB = true;
currentDB.open().then(
onSuccessInternal,
function onErrorInternal(error) {
reject(error);
});
}
else {
onSuccessInternal();
}
}
else {
reject("No transactionCode passed");
}
});
},
runTransactionReadWrite: function (objectNames, transactionCode) {
let currentDB = this;
return new Promise(function (resolve, reject) {
if (transactionCode != null) {
let didOpenDB = false;
var onSuccessInternal = function () {
let transaction = currentDB.database.transaction(objectNames, "readwrite");
transactionCode(transaction);
//if (didOpenDB)
// currentDB.close();
transaction.oncomplete = function (event) {
resolve();
};
transaction.onerror = function (event) {
reject(error.error);
};
//Transactions auto-commit after scope ends, cannot manually commit
};
if ($.usaHaulersLoggingDB.database == null) {
didOpenDB = true;
currentDB.open().then(
onSuccessInternal,
function onErrorInternal(error) {
reject(error);
});
}
else {
onSuccessInternal();
}
}
else {
reject("No transactionCode passed");
}
});
},
getObjects: function (objectName, query, indexes) {
let currentDB = this;
return new Promise(function (resolve, reject) {
currentDB.runTransactionReadOnly(objectName, function (transaction) {
const objectStore = transaction.objectStore(objectName);
let request = {};
if (indexes && ((typeof indexes === "string" || indexes instanceof String) == false || indexes.length > 0))
if (query
&& (typeof query === "IDBKeyRange" || query instanceof IDBKeyRange || typeof query === "string" || query instanceof String))
request = objectStore.index(indexes).getAll(query);
else
request = objectStore.index(indexes).getAll();
else
if (query
&& (typeof query === "IDBKeyRange" || query instanceof IDBKeyRange || typeof query === "string" || query instanceof String))
request = objectStore.getAll(query);
else
request = objectStore.getAll()
request.onsuccess = function () {
if (request.result !== undefined) {
objects = request.result;
resolve(objects);
}
else {
console.log("no objects found: ", objectName);
reject("no objects found: ", objectName);
}
};
request.onerror = function (error) {
console.log("Error getting objects(", objectName, ") from db: ", error);
reject(error);
};
});
});
},
getObjectsCustom: function (objectName, query, indexes, predicateBlock) {
let currentDB = this;
return new Promise(function (resolve, reject) {
currentDB.runTransactionReadOnly(objectName, function (transaction) {
const objectStore = transaction.objectStore(objectName);
let request = {};
if (indexes && ((typeof indexes === "string" || indexes instanceof String) == false || indexes.length > 0))
request = (query && ((typeof query === "string" || query instanceof String) == false || query.length > 0) ? objectStore.index(indexes).getAll(query) : objectStore.index(indexes).getAll());
else
request = (query && ((typeof query === "string" || query instanceof String) == false || query.length > 0) ? objectStore.getAll(query) : objectStore.getAll());
request.onsuccess = function () {
if (request.result !== undefined) {
let objectsUnfiltered = request.result;
let objects = [];
for (ix in objectsUnfiltered) {
if (!predicateBlock || predicateBlock(objectsUnfiltered[ix])) {
objects.push(objectsUnfiltered[ix]);
}
}
resolve(objects);
}
else {
console.log("no objects found: ", objectName);
reject("no objects found: ", objectName);
}
};
request.onerror = function (error) {
console.log("Error getting objects(", objectName, ") from db: ", error);
reject(error);
};
});
});
},
deleteAllObjects: function () {
let currentDB = this;
var error = null;
var objectNames = INTERNAL_USAHAULERSLOGGING_LOG_OBJECT_STORE;
return this.runTransactionReadWrite(objectNames, async function (transaction) {
const logStore = transaction.objectStore(INTERNAL_USAHAULERSLOGGING_LOG_OBJECT_STORE);
try {
await logStore.clear();
}
catch (error2) {
error = error2;
}
return transaction.complete;
});
if (error) {
throw error;
}
}
});
//#endregion
//ADD NON-GENERIC METHODS
$.extend($.usaHaulersLoggingDB, {
newGuid: function () {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
const r = Math.random() * 16 | 0,
v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
},
createLogObjectInternal: function (id, level, msg, args, date) {
return {
id: (id == null ? this.newGuid() : id),
version: '1.0',
url: window.location.href,
application_code: $.cookie('lg_application_code'),
application_user_id: $.cookie('lg_application_user_id'),
environment_code: $.cookie('lg_environment_code'),
level: level,
msg: msg,
arguments: args,
date: (date == null ? new Date() : date),
time: (date == null ? new Date() : date).toISOString(),
uploaded: false,
upload_status: 'Not Uploaded',
upload_date: null
}
},
createLogObject: function (level, msg, args) {
return this.createLogObjectInternal(null, level, msg, args, null);
},
addLog: async function (level, msg, args) {
let currentDB = this;
args = currentDB.removeObjectMethodsForSerialization(args);
try {
await currentDB.refreshConfigObject();
var error = null;
var log = currentDB.createLogObject(level, msg, args);
return this.runTransactionReadWrite(INTERNAL_USAHAULERSLOGGING_LOG_OBJECT_STORE, async function (transaction) {
const logStore = transaction.objectStore(INTERNAL_USAHAULERSLOGGING_LOG_OBJECT_STORE);
logStore.put(log);
return transaction.complete;
}).then(
function () {
},
function (errorInternal) {
error = errorInternal;
}
);
if (error) {
throw error;
}
}
catch (error) {
console.log(error);
throw error;
}
},
deleteLogs: async function (logs) {
let currentDB = this;
try {
await currentDB.refreshConfigObject();
var error = null;
return this.runTransactionReadWrite(INTERNAL_USAHAULERSLOGGING_LOG_OBJECT_STORE, async function (transaction) {
const logStore = transaction.objectStore(INTERNAL_USAHAULERSLOGGING_LOG_OBJECT_STORE);
logs.forEach((log) => {
logStore.delete(log.id);
});
return transaction.complete;
}).then(
function () {
},
function (errorInternal) {
error = errorInternal;
}
);
if (error) {
throw error;
}
}
catch (error) {
console.log(error);
throw error;
}
},
getLogsByLevel: async function (level, startDate, endDate) {
let currentDB = this;
let levelText = "";
if (level != undefined && level != null)
levelText = level.toUpperCase();
let query = levelText;
let indexes = INTERNAL_USAHAULERSLOGGING_LOG_INDEX_LEVEL;
let logs = await currentDB.getObjects(INTERNAL_USAHAULERSLOGGING_LOG_OBJECT_STORE, query, indexes);
let logs2 = [];
logs.forEach((log) => {
if ((startDate == null || log.date >= startDate) && (endDate == null || log.date <= endDate))
logs2.push(log);
});
logs2.sort(function (l1, l2) {
return l1.date - l2.date;
});
return logs2;
},
getLogsAll: async function (startDate, endDate) {
let currentDB = this;
let query = "";
let logs = await currentDB.getObjects(INTERNAL_USAHAULERSLOGGING_LOG_OBJECT_STORE, query);
let logs2 = [];
logs.forEach((log) => {
if ((startDate == null || log.date >= startDate) && (endDate == null || log.date <= endDate))
logs2.push(log);
});
logs2.sort(function (l1, l2) {
return l1.date - l2.date;
});
return logs2;
},
getLogsByUploaded: async function (uploaded, startDate, endDate) {
let currentDB = this;
let query = uploaded ? "Uploaded" : "Not Uploaded";
let indexes = INTERNAL_USAHAULERSLOGGING_LOG_INDEX_UPLOADED;
let logs = await currentDB.getObjects(INTERNAL_USAHAULERSLOGGING_LOG_OBJECT_STORE, query, indexes);
let logs2 = [];
logs.forEach((log) => {
if ((startDate == null || log.date >= startDate) && (endDate == null || log.date <= endDate))
logs2.push(log);
});
logs2.sort(function (l1, l2) {
return l1.date - l2.date;
});
return logs2;
},
getLogsByUploadStatus: async function (uploadStatus, startDate, endDate) {
let currentDB = this;
let query = uploadStatus
let indexes = INTERNAL_USAHAULERSLOGGING_LOG_INDEX_UPLOADED;
let logs = await currentDB.getObjects(INTERNAL_USAHAULERSLOGGING_LOG_OBJECT_STORE, query, indexes);
let logs2 = [];
logs.forEach((log) => {
if ((startDate == null || log.date >= startDate) && (endDate == null || log.date <= endDate))
logs2.push(log);
});
logs2.sort(function (l1, l2) {
return l1.date - l2.date;
});
return logs2;
},
markLogsUploaded: async function (logs) {
let currentDB = this;
try {
await currentDB.refreshConfigObject();
var error = null;
logs.forEach((log) => {
log.uploaded = true;
log.upload_status = "Uploaded";
log.upload_date = new Date();
});
return this.runTransactionReadWrite(INTERNAL_USAHAULERSLOGGING_LOG_OBJECT_STORE, async function (transaction) {
const logStore = transaction.objectStore(INTERNAL_USAHAULERSLOGGING_LOG_OBJECT_STORE);
logs.forEach((log) => {
logStore.put(log);
});
return transaction.complete;
}).then(
function () {
},
function (errorInternal) {
error = errorInternal;
}
);
if (error) {
throw error;
}
}
catch (error) {
console.error(error);
//throw error;
}
},
uploadLogs: async function () {
var currentDB = this;
try {
await currentDB.refreshConfigObject();
var logs = null;
var maxUploadQty = INTERNAL_USAHAULERSLOGGING_MAXUPLOADQTY;
if (maxUploadQty <= 0)
maxUploadQty = 999999;
do {
logs = await currentDB.getLogsByUploaded(false, maxUploadQty);
if (logs != null && logs.length > 0) {
var success = false;
//try {
success = await currentDB.uploadLogChunk(logs);
//}
//catch {
// throw;
//}
if (!success) {
console.debug("currentDB.uploadLogChunk returned false");
return false;
}
//await currentDB.markLogsUploaded(logs);
await currentDB.deleteLogs(logs);
if (logs.length < maxUploadQty)
break;
}
} while (logs != null && logs.length > 0);
return true;
}
catch (error) {
if (!(error instanceof Error))
console.error(JSON.stringify(error));
else
console.error(error);
return false;
//throw error;
}
},
getLogURL: function () {
var environmentCode = $.cookie('lg_environment_code');
if (environmentCode === null || environmentCode.trim().length == 0)
environmentCode = "DEFAULT";
environmentCode = environmentCode.toUpperCase();
var logUrl = INTERNAL_LOG_URLS[environmentCode];
if (logUrl === null || logUrl.trim().length == 0)
logUrl = INTERNAL_LOG_URLS['DEFAULT'];
return logUrl;
},
uploadLogChunk: async function (logs) {
var currentDB = this;
var success = false;
await $.ajax({
type: "POST",
url: currentDB.getLogURL(),
data: JSON.stringify({ "jsonData": JSON.stringify(logs) }),
contentType: 'application/json; charset=utf-8',
dataType: 'json',
async: true,
cache: false,
timeout: 30000,
disable_auth_token:true,
headers: {
lg_session_id: $.cookie('lg_session_guid'),
lg_access_token: $.cookie('lg_access_token')
},
success: function (value, textStatus, request) {
var json = value.hasOwnProperty("d") ? $.parseJSON(value.d) : $.parseJSON(value);
if (currentDB.getBoolean(json.success)) {
success = true;
return true;
}
success = false;
return false;
},
error: function (xhr, error, errorThrown) {
//if ((error instanceof jqXHR)
// console.error(JSON.stringify(error));
//else if (!(error instanceof Error))
// console.error(JSON.stringify(error));
//else
// console.error(error);
success = false;
return false;
}
});
return success;
}
});
//TODO: Decide what to do here. This PROBABLY should be a method call that the UI calls on page load, otherwise some calls could happen before this is done/ready. Can't put await on this method, jquery .ready queue will not wait correctly.
$(document).ready(function () {
$.usaHaulersLoggingDB.open().then(() => {
console.log("$.usaHaulersLoggingDB.open() success");
return $.usaHaulersLoggingDB.initializeDB();
})
.then(() => {
console.log("$.usaHaulersLoggingDB.initializeDB() success");
return $.usaHaulersLoggingDB.uploadLogs();
},
(error) => {
console.error(error);
});
});
$(document).ajaxSend(function (event, xhr, settings) {
if (settings.disable_auth_token) {
xhr.setRequestHeader('Auth-Token', null);
xhr.setRequestHeader('Auth-Impersonate-Guid', null);
xhr.setRequestHeader('Auth-Current-Franchise', null);
}
});