newtbot c234aa3616 Add nodemailer configuration and console.log statement
Update formAJAX function to log data from the server
Add getUserByEmail and checkEmail functions
Update profile.ejs to require login
Update addSensorData function to emit new sensor data
Update api.css with styling changes
Update token route to generate and send token email
Update authChecker middleware to allow user and token routes
2024-01-27 04:52:02 +08:00

296 lines
6.6 KiB
JavaScript

var app = {};
app.util = (function (app) {
function getUrlParameter(name) {
name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var regex = new RegExp("[\\?&]" + name + "=([^&#]*)");
var results = regex.exec(location.search);
return results === null
? ""
: decodeURIComponent(results[1].replace(/\+/g, " "));
}
function actionMessage(message, $target, type, callback) {
message = message || "";
$target = $target.closest("div.iot-card").find(".actionMessage");
type = type || "info";
callback = callback || function () {};
if ($target.html() === message) return;
if ($target.html()) {
$target.slideUp("fast", function () {
$target.html("");
$target.removeClass(function (index, className) {
return (className.match(/(^|\s)bg-\S+/g) || []).join(" ");
});
if (message) return actionMessage(message, $target, type, callback);
$target.hide();
});
} else {
if (type) $target.addClass("bg-" + type);
$target.html(message).slideDown("fast");
}
setTimeout(callback, 10);
}
$.fn.serializeObject = function () {
var arr = $(this).serializeArray(),
obj = {};
for (var i = 0; i < arr.length; i++) {
if (obj[arr[i].name] === undefined) {
obj[arr[i].name] = arr[i].value;
} else {
if (!(obj[arr[i].name] instanceof Array)) {
obj[arr[i].name] = [obj[arr[i].name]];
}
obj[arr[i].name].push(arr[i].value);
}
}
return obj;
};
return {
getUrlParameter: getUrlParameter,
actionMessage: actionMessage,
};
})(app);
app.api = (function (app) {
var baseURL = "/api/v0/";
function post(url, data, callback) {
$.ajax({
type: "POST",
url: baseURL + url,
headers: {
//register will getr undefined token
//login will get valid token
"auth-token": app.auth.getToken(),
},
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
dataType: "json",
complete: function (res, text) {
callback(
text !== "success" ? res.statusText : null,
JSON.parse(res.responseText),
res.status
);
},
});
}
function put(url, data, callback) {
$.ajax({
type: "PUT",
url: baseURL + url,
headers: {
"auth-token": app.auth.getToken(),
},
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
dataType: "json",
complete: function (res, text) {
callback(
text !== "success" ? res.statusText : null,
JSON.parse(res.responseText),
res.status
);
},
});
}
function remove(url, callback, callback2) {
if (!$.isFunction(callback)) callback = callback2;
$.ajax({
type: "delete",
url: baseURL + url,
headers: {
"auth-token": app.auth.getToken(),
},
contentType: "application/json; charset=utf-8",
dataType: "json",
complete: function (res, text) {
callback(
text !== "success" ? res.statusText : null,
JSON.parse(res.responseText),
res.status
);
},
});
}
function get(url, callback) {
$.ajax({
type: "GET",
url: baseURL + url,
headers: {
"auth-token": app.auth.getToken(),
},
contentType: "application/json; charset=utf-8",
dataType: "json",
complete: function (res, text) {
callback(
text !== "success" ? res.statusText : null,
JSON.parse(res.responseText),
res.status
);
},
});
}
return { post: post, get: get, put: put, delete: remove };
})(app);
//socket.io
//socket.io
app.socket = (function (app) {
//need to replace with domain name of server when published
var socket = io();
socket.on("disconnect", () => {
console.log("disconnected");
});
socket.on('connect', ()=>{
console.info('WS connected');
})
socket.io.on("reconnect", () => {
console.log("reconnected");
});
socket.io.on("connect_error", (err) => {
console.log(err);
});
return socket;
})(app);
//sensor data
app.sensordata = (function (app) {
})(app);
app.auth = (function (app) {
var user = {};
function setToken(token) {
localStorage.setItem("APIToken", token);
}
function getToken() {
return localStorage.getItem("APIToken");
}
function isLoggedIn(callback) {
if (getToken()) {
return app.api.get("user/me", function (error, data) {
if (!error) app.auth.user = data;
return callback(error, data);
});
} else {
callback(true);
}
}
function logOut(callback) {
console.log("Logging out");
$.ajax({
type: "DELETE",
url: "/api/v0/user/logout",
headers: {
"auth-token": app.auth.getToken(),
},
contentType: "application/json; charset=utf-8",
dataType: "json",
complete: function (res, text) {
callback(
text !== "success" ? res.statusText : null,
JSON.parse(res.responseText),
res.status
);
},
});
localStorage.removeItem("APIToken");
callback();
}
function forceLogin() {
app.auth.isLoggedIn(function (error, isLoggedIn) {
if (error || !isLoggedIn) {
app.auth.logOut(function () {
location.replace(`/login`);
});
}
});
}
function logInRedirect() {
window.location.href =
//window.location.href = location.href.replace(location.origin+'/login', '') || '/'
location.href.replace(location.replace(`/login`)) || "/";
}
function homeRedirect() {
//window.location.href = location.href.replace(location.replace(`/`)) || "/";
location.replace(`/`);
}
function profileRedirect() {
location.replace(`/profile`);
}
return {
getToken: getToken,
setToken: setToken,
isLoggedIn: isLoggedIn,
logOut: logOut,
forceLogin,
logInRedirect,
homeRedirect,
profileRedirect,
};
})(app);
app.user = (function (app) {
//delete profile
function deleteProfile() {
app.api.delete("user/delete", function (error, data) {
if (error) {
app.util.actionMessage(error.message, $("#deleteProfile"), "danger");
} else {
app.auth.logOut(function () {
location.replace(`/login`);
});
}
});
}
return {
deleteProfile,
};
})(app);
//ajax form submit and pass to api
function formAJAX(btn, del) {
event.preventDefault(); // avoid to execute the actual submit of the form.
var $form = $(btn).closest("[action]"); // gets the 'form' parent
var formData = $form.find("[name]").serializeObject(); // builds query formDataing
var method = $form.attr("method") || "post";
app.util.actionMessage("Loading...", $form, "info");
//console.log('Data being sent to', $form.attr('action'), formData)
app.api[method]($form.attr("action"), formData, function (error, data) {
console.log('Data back from the server', error, data)
app.util.actionMessage(data.message, $form, error ? "danger" : "success"); //re-populate table
if (!error) {
$form.trigger("reset");
eval($form.attr("evalAJAX")); //gets JS to run after completion
}
});
}