Compare commits
1 Commits
dependabot
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 24e2326dc4 |
95
package-lock.json
generated
95
package-lock.json
generated
@@ -16,7 +16,7 @@
|
||||
"express": "^4.18.2",
|
||||
"express-mongo-sanitize": "^2.1.0",
|
||||
"log-timestamp": "^0.3.0",
|
||||
"mongoose": "^5.13.15",
|
||||
"mongoose": "^5.12.7",
|
||||
"nodemailer": "^6.6.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -437,9 +437,9 @@
|
||||
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
|
||||
},
|
||||
"node_modules/denque": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz",
|
||||
"integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==",
|
||||
"version": "1.5.0",
|
||||
"resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz",
|
||||
"integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==",
|
||||
"engines": {
|
||||
"node": ">=0.10"
|
||||
}
|
||||
@@ -1110,14 +1110,14 @@
|
||||
}
|
||||
},
|
||||
"node_modules/mongodb": {
|
||||
"version": "3.7.3",
|
||||
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz",
|
||||
"integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==",
|
||||
"version": "3.6.6",
|
||||
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.6.tgz",
|
||||
"integrity": "sha512-WlirMiuV1UPbej5JeCMqE93JRfZ/ZzqE7nJTwP85XzjAF4rRSeq2bGCb1cjfoHLOF06+HxADaPGqT0g3SbVT1w==",
|
||||
"dependencies": {
|
||||
"bl": "^2.2.1",
|
||||
"bson": "^1.1.4",
|
||||
"denque": "^1.4.1",
|
||||
"optional-require": "^1.1.8",
|
||||
"optional-require": "^1.0.2",
|
||||
"safe-buffer": "^5.1.2"
|
||||
},
|
||||
"engines": {
|
||||
@@ -1147,32 +1147,19 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/mongodb/node_modules/optional-require": {
|
||||
"version": "1.1.8",
|
||||
"resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz",
|
||||
"integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==",
|
||||
"dependencies": {
|
||||
"require-at": "^1.0.6"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/mongoose": {
|
||||
"version": "5.13.15",
|
||||
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.15.tgz",
|
||||
"integrity": "sha512-cxp1Gbb8yUWkaEbajdhspSaKzAvsIvOtRlYD87GN/P2QEUhpd6bIvebi36T6M0tIVAMauNaK9SPA055N3PwF8Q==",
|
||||
"version": "5.12.7",
|
||||
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.12.7.tgz",
|
||||
"integrity": "sha512-BniNwACn7uflK2h+M3juvyLH5nn9JDFgnB5KE2EwWFwSrRyhSpPnCtanRKJW3OtMCJyPccMIjtGZxHNW7JfnIw==",
|
||||
"dependencies": {
|
||||
"@types/bson": "1.x || 4.0.x",
|
||||
"@types/mongodb": "^3.5.27",
|
||||
"bson": "^1.1.4",
|
||||
"kareem": "2.3.2",
|
||||
"mongodb": "3.7.3",
|
||||
"mongodb": "3.6.6",
|
||||
"mongoose-legacy-pluralize": "1.0.2",
|
||||
"mpath": "0.8.4",
|
||||
"mpath": "0.8.3",
|
||||
"mquery": "3.2.5",
|
||||
"ms": "2.1.2",
|
||||
"optional-require": "1.0.x",
|
||||
"regexp-clone": "1.0.0",
|
||||
"safe-buffer": "5.2.1",
|
||||
"sift": "13.5.2",
|
||||
@@ -1546,14 +1533,6 @@
|
||||
"resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz",
|
||||
"integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw=="
|
||||
},
|
||||
"node_modules/require-at": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz",
|
||||
"integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==",
|
||||
"engines": {
|
||||
"node": ">=4"
|
||||
}
|
||||
},
|
||||
"node_modules/rimraf": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
|
||||
@@ -1703,7 +1682,7 @@
|
||||
"node_modules/sparse-bitfield": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
|
||||
"integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
|
||||
"integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
|
||||
"optional": true,
|
||||
"dependencies": {
|
||||
"memory-pager": "^1.0.2"
|
||||
@@ -2213,9 +2192,9 @@
|
||||
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
|
||||
},
|
||||
"denque": {
|
||||
"version": "1.5.1",
|
||||
"resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz",
|
||||
"integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw=="
|
||||
"version": "1.5.0",
|
||||
"resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz",
|
||||
"integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ=="
|
||||
},
|
||||
"depd": {
|
||||
"version": "2.0.0",
|
||||
@@ -2704,43 +2683,31 @@
|
||||
}
|
||||
},
|
||||
"mongodb": {
|
||||
"version": "3.7.3",
|
||||
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz",
|
||||
"integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==",
|
||||
"version": "3.6.6",
|
||||
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.6.tgz",
|
||||
"integrity": "sha512-WlirMiuV1UPbej5JeCMqE93JRfZ/ZzqE7nJTwP85XzjAF4rRSeq2bGCb1cjfoHLOF06+HxADaPGqT0g3SbVT1w==",
|
||||
"requires": {
|
||||
"bl": "^2.2.1",
|
||||
"bson": "^1.1.4",
|
||||
"denque": "^1.4.1",
|
||||
"optional-require": "^1.1.8",
|
||||
"optional-require": "^1.0.2",
|
||||
"safe-buffer": "^5.1.2",
|
||||
"saslprep": "^1.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"optional-require": {
|
||||
"version": "1.1.8",
|
||||
"resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz",
|
||||
"integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==",
|
||||
"requires": {
|
||||
"require-at": "^1.0.6"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"mongoose": {
|
||||
"version": "5.13.15",
|
||||
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.15.tgz",
|
||||
"integrity": "sha512-cxp1Gbb8yUWkaEbajdhspSaKzAvsIvOtRlYD87GN/P2QEUhpd6bIvebi36T6M0tIVAMauNaK9SPA055N3PwF8Q==",
|
||||
"version": "5.12.7",
|
||||
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.12.7.tgz",
|
||||
"integrity": "sha512-BniNwACn7uflK2h+M3juvyLH5nn9JDFgnB5KE2EwWFwSrRyhSpPnCtanRKJW3OtMCJyPccMIjtGZxHNW7JfnIw==",
|
||||
"requires": {
|
||||
"@types/bson": "1.x || 4.0.x",
|
||||
"@types/mongodb": "^3.5.27",
|
||||
"bson": "^1.1.4",
|
||||
"kareem": "2.3.2",
|
||||
"mongodb": "3.7.3",
|
||||
"mongodb": "3.6.6",
|
||||
"mongoose-legacy-pluralize": "1.0.2",
|
||||
"mpath": "0.8.4",
|
||||
"mpath": "0.8.3",
|
||||
"mquery": "3.2.5",
|
||||
"ms": "2.1.2",
|
||||
"optional-require": "1.0.x",
|
||||
"regexp-clone": "1.0.0",
|
||||
"safe-buffer": "5.2.1",
|
||||
"sift": "13.5.2",
|
||||
@@ -2748,8 +2715,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"mpath": {
|
||||
"version": "0.8.4",
|
||||
"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz",
|
||||
"version": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz",
|
||||
"integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g=="
|
||||
},
|
||||
"ms": {
|
||||
@@ -3010,11 +2976,6 @@
|
||||
"resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz",
|
||||
"integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw=="
|
||||
},
|
||||
"require-at": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz",
|
||||
"integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g=="
|
||||
},
|
||||
"rimraf": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
|
||||
@@ -3141,7 +3102,7 @@
|
||||
"sparse-bitfield": {
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
|
||||
"integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
|
||||
"integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"memory-pager": "^1.0.2"
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
"express": "^4.18.2",
|
||||
"express-mongo-sanitize": "^2.1.0",
|
||||
"log-timestamp": "^0.3.0",
|
||||
"mongoose": "^5.13.15",
|
||||
"mongoose": "^5.12.7",
|
||||
"nodemailer": "^6.6.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
@@ -1 +1,24 @@
|
||||
const backendURL = "http://127.0.0.1:8080";
|
||||
|
||||
function setCookie(cname, cvalue, exdays) {
|
||||
const d = new Date();
|
||||
d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
|
||||
let expires = "expires=" + d.toUTCString();
|
||||
document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
|
||||
}
|
||||
|
||||
function getCookie(cname) {
|
||||
let name = cname + "=";
|
||||
let decodedCookie = decodeURIComponent(document.cookie);
|
||||
let ca = decodedCookie.split(';');
|
||||
for (let i = 0; i < ca.length; i++) {
|
||||
let c = ca[i];
|
||||
while (c.charAt(0) == ' ') {
|
||||
c = c.substring(1);
|
||||
}
|
||||
if (c.indexOf(name) == 0) {
|
||||
return c.substring(name.length, c.length);
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
@@ -1,10 +1,12 @@
|
||||
<html>
|
||||
|
||||
<head>
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
|
||||
<style>
|
||||
body {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
}
|
||||
</style>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@@ -62,11 +64,17 @@
|
||||
},
|
||||
body: JSON.stringify({ email: email, password: password })
|
||||
});
|
||||
const content = await rawResponse.text();
|
||||
const content = await rawResponse.json();
|
||||
|
||||
console.log(content);
|
||||
if (content.success) {
|
||||
setCookie("userId", content.response.userId, 1);
|
||||
setCookie("sessionId", content.response.sessionId, 1);
|
||||
window.location.replace("/manage/manageHome.html");
|
||||
|
||||
} else {
|
||||
alert("Incorrect email/password.");
|
||||
}
|
||||
})();
|
||||
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
156
public/manageCategories.html
Normal file
156
public/manageCategories.html
Normal file
@@ -0,0 +1,156 @@
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<style>
|
||||
body {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
}
|
||||
</style>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<center>
|
||||
<h1>Kno-Logic Management Portal</h1>
|
||||
<table border="black">
|
||||
<th colspan="4">
|
||||
Manage Categories
|
||||
</th>
|
||||
<tr>
|
||||
<td>
|
||||
<a href="/manage/manageHome.html">Home</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="/manage/managePosts.html">Manage Posts</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="/manage/manageCategories.html">Manage Categories</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="/manage/manageHome.html">Analytics</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<br>
|
||||
<table border="black">
|
||||
<th colspan="2">
|
||||
Add Category
|
||||
</th>
|
||||
<tr>
|
||||
<td>
|
||||
<label for="name">Category Name: </label>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="name" name="name">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<label for="color">Category Color: </label>
|
||||
</td>
|
||||
<td>
|
||||
<input type="color" id="color" name="color">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<center><button type="button" onclick="addCategory()">Add Category</button></center>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<br>
|
||||
|
||||
<table border="black" id="listTable">
|
||||
<th colspan="2">
|
||||
List Categories
|
||||
</th>
|
||||
<tr>
|
||||
<td>
|
||||
<strong>Name</strong>
|
||||
</td>
|
||||
<td>
|
||||
<strong>Color</strong>
|
||||
</td>
|
||||
</th>
|
||||
<tbody>
|
||||
|
||||
</tbody>
|
||||
|
||||
</table>
|
||||
</center>
|
||||
</body>
|
||||
|
||||
<script src="./consts.js"></script>
|
||||
|
||||
<script>
|
||||
function verifySession() {
|
||||
let userId = getCookie("userId");
|
||||
let sessionId = getCookie("sessionId");
|
||||
|
||||
(async () => {
|
||||
const rawResponse = await fetch(backendURL + '/v1/user/check-token', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({ userId: userId, sessionId: sessionId })
|
||||
});
|
||||
const content = await rawResponse.json();
|
||||
|
||||
if (!content.success) {
|
||||
window.location.replace("/manage/index.html");
|
||||
}
|
||||
})();
|
||||
}
|
||||
|
||||
function getCategories() {
|
||||
(async () => {
|
||||
const rawResponse = await fetch(backendURL + '/v1/category/all', {
|
||||
method: 'GET',
|
||||
});
|
||||
const content = await rawResponse.json();
|
||||
|
||||
var tbodyRef = document.getElementById('listTable').getElementsByTagName('tbody')[0];
|
||||
|
||||
content.response.forEach(element => {
|
||||
var newRow = tbodyRef.insertRow();
|
||||
newRow.innerHTML = `<td>${element.name}</td><td><input type='color' value='${element.color}' disabled></td>`;
|
||||
});
|
||||
})();
|
||||
}
|
||||
|
||||
function addCategory() {
|
||||
let userId = getCookie("userId");
|
||||
let sessionId = getCookie("sessionId");
|
||||
let name = document.getElementById("name").value;
|
||||
let color = document.getElementById("color").value;
|
||||
|
||||
(async () => {
|
||||
const rawResponse = await fetch(backendURL + '/v1/category/create', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({ userId: userId, sessionId: sessionId, category: { name: name, color: color } })
|
||||
});
|
||||
const content = await rawResponse.json();
|
||||
|
||||
if (content.success) {
|
||||
window.location.reload();
|
||||
} else {
|
||||
alert("Could not add category: " + content.response);
|
||||
}
|
||||
|
||||
console.log(content);
|
||||
})();
|
||||
}
|
||||
|
||||
verifySession();
|
||||
getCategories();
|
||||
</script>
|
||||
|
||||
</html>
|
||||
@@ -1,10 +1,12 @@
|
||||
<html>
|
||||
|
||||
<head>
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
|
||||
<style>
|
||||
body {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
}
|
||||
</style>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@@ -35,25 +37,28 @@
|
||||
<script src="./consts.js"></script>
|
||||
|
||||
<script>
|
||||
function login() {
|
||||
let email = document.getElementById("email").value;
|
||||
let password = document.getElementById("password").value;
|
||||
function verifySession() {
|
||||
let userId = getCookie("userId");
|
||||
let sessionId = getCookie("sessionId");
|
||||
|
||||
(async () => {
|
||||
const rawResponse = await fetch(backendURL + '/v1/user/login', {
|
||||
const rawResponse = await fetch(backendURL + '/v1/user/check-token', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({ email: email, password: password })
|
||||
body: JSON.stringify({ userId: userId, sessionId: sessionId })
|
||||
});
|
||||
const content = await rawResponse.text();
|
||||
|
||||
console.log(content);
|
||||
})();
|
||||
const content = await rawResponse.json();
|
||||
|
||||
if (!content.success) {
|
||||
window.location.replace("/manage/index.html");
|
||||
}
|
||||
})();
|
||||
}
|
||||
|
||||
verifySession();
|
||||
</script>
|
||||
|
||||
</html>
|
||||
250
public/managePosts.html
Normal file
250
public/managePosts.html
Normal file
@@ -0,0 +1,250 @@
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<style>
|
||||
body {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
}
|
||||
</style>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<center>
|
||||
<h1>Kno-Logic Management Portal</h1>
|
||||
<table border="black">
|
||||
<th colspan="4">
|
||||
Manage Posts
|
||||
</th>
|
||||
<tr>
|
||||
<td>
|
||||
<a href="/manage/manageHome.html">Home</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="/manage/managePosts.html">Manage Posts</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="/manage/manageCategories.html">Manage Categories</a>
|
||||
</td>
|
||||
<td>
|
||||
<a href="/manage/manageHome.html">Analytics</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<br>
|
||||
<table border="black">
|
||||
<th colspan="2">
|
||||
Add Post
|
||||
</th>
|
||||
<tr>
|
||||
<td>
|
||||
<label for="title">Title: </label>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="title" name="title">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<label for="description">Description: </label>
|
||||
</td>
|
||||
<td>
|
||||
<textarea id="description" name="description"></textarea>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<label for="author">Author: </label>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="author" name="author">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<label for="category">Category (hold <code>CTRL</code> to select multiple): </label>
|
||||
</td>
|
||||
<td>
|
||||
<select name="category" id="category" style="width: 100%; height: 100px;" multiple>
|
||||
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<label for="link">Link: </label>
|
||||
</td>
|
||||
<td>
|
||||
<input type="text" id="link" name="link">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<label for="date">Date: </label>
|
||||
</td>
|
||||
<td>
|
||||
<input type="date" id="date" name="date">
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="2">
|
||||
<center><button type="button" onclick="addPost()">Add Post</button></center>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<br>
|
||||
|
||||
<table border="black" id="listTable">
|
||||
<th colspan="9">
|
||||
List Posts
|
||||
</th>
|
||||
<tr>
|
||||
<td>
|
||||
<strong>Title</strong>
|
||||
</td>
|
||||
<td>
|
||||
<strong>Description</strong>
|
||||
</td>
|
||||
<td>
|
||||
<strong>Author</strong>
|
||||
</td>
|
||||
<td>
|
||||
<strong>Category</strong>
|
||||
</td>
|
||||
<td>
|
||||
<strong>Link</strong>
|
||||
</td>
|
||||
<td>
|
||||
<strong>Date</strong>
|
||||
</td>
|
||||
<td>
|
||||
<strong>Photo</strong>
|
||||
</td>
|
||||
<td>
|
||||
<strong>Edit</strong>
|
||||
</td>
|
||||
<td>
|
||||
<strong>Delete</strong>
|
||||
</td>
|
||||
</th>
|
||||
<tbody>
|
||||
|
||||
</tbody>
|
||||
|
||||
</table>
|
||||
</center>
|
||||
</body>
|
||||
|
||||
<script src="./consts.js"></script>
|
||||
|
||||
<script>
|
||||
function verifySession() {
|
||||
let userId = getCookie("userId");
|
||||
let sessionId = getCookie("sessionId");
|
||||
|
||||
(async () => {
|
||||
const rawResponse = await fetch(backendURL + '/v1/user/check-token', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({ userId: userId, sessionId: sessionId })
|
||||
});
|
||||
const content = await rawResponse.json();
|
||||
|
||||
if (!content.success) {
|
||||
window.location.replace("/manage/index.html");
|
||||
}
|
||||
})();
|
||||
}
|
||||
|
||||
function getCategories() {
|
||||
(async () => {
|
||||
const rawResponse = await fetch(backendURL + '/v1/category/all', {
|
||||
method: 'GET',
|
||||
});
|
||||
const content = await rawResponse.json();
|
||||
|
||||
var categoryRef = document.getElementById('category');
|
||||
|
||||
content.response.forEach(element => {
|
||||
categoryRef.appendChild(new Option(element.name, element._id))
|
||||
});
|
||||
})();
|
||||
}
|
||||
|
||||
function getPosts() {
|
||||
(async () => {
|
||||
const rawResponse = await fetch(backendURL + '/v1/post/all', {
|
||||
method: 'GET',
|
||||
});
|
||||
const content = await rawResponse.json();
|
||||
|
||||
console.log(content);
|
||||
|
||||
var tbodyRef = document.getElementById('listTable').getElementsByTagName('tbody')[0];
|
||||
|
||||
content.response.forEach(element => {
|
||||
var newRow = tbodyRef.insertRow();
|
||||
newRow.innerHTML = `<td>${element.title}</td><td>${element.description}</td><td>${element.author}</td><td>${element.category.toString()}</td><td>${element.link}</td><td>${element.date}</td><td>${element.photo} <br> Edit Photo</td><td>Edit</td><td>Delete</td>`;
|
||||
});
|
||||
})();
|
||||
}
|
||||
|
||||
function addPost() {
|
||||
let userId = getCookie("userId");
|
||||
let sessionId = getCookie("sessionId");
|
||||
let title = document.getElementById("title").value;
|
||||
let description = document.getElementById("description").value;
|
||||
let author = document.getElementById("author").value;
|
||||
let category = getSelectValues(document.getElementById("category"));
|
||||
let link = document.getElementById("link").value;
|
||||
let date = document.getElementById("date").value;
|
||||
|
||||
console.log(category);
|
||||
|
||||
|
||||
(async () => {
|
||||
const rawResponse = await fetch(backendURL + '/v1/post/create', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({ userId: userId, sessionId: sessionId,
|
||||
post: { title: title, description: description, author: author, category: category, link: link, date: date } })
|
||||
});
|
||||
const content = await rawResponse.json();
|
||||
|
||||
if (content.success) {
|
||||
window.location.reload();
|
||||
} else {
|
||||
alert("Could not add post: " + content.response);
|
||||
}
|
||||
})();
|
||||
}
|
||||
|
||||
function getSelectValues(select) {
|
||||
let result = [];
|
||||
let options = select && select.options;
|
||||
let opt;
|
||||
|
||||
for (let i = 0, iLen = options.length; i < iLen; i++) {
|
||||
opt = options[i];
|
||||
|
||||
if (opt.selected) {
|
||||
result.push(opt.value || opt.text);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
verifySession();
|
||||
getCategories();
|
||||
getPosts();
|
||||
</script>
|
||||
|
||||
</html>
|
||||
@@ -1,10 +1,12 @@
|
||||
<html>
|
||||
|
||||
<head>
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
|
||||
<style>
|
||||
body {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
}
|
||||
</style>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
@@ -21,7 +21,7 @@ categoryRoutes.route('/create').post((req, res) => {
|
||||
utils.account.checkSession(req.body.userId, req.body.sessionId, (isValidId) => {
|
||||
utils.account.isAdmin(req.body.userId, (isAdmin) => {
|
||||
if (isValidId && isAdmin) {
|
||||
let c = new Category(req.body);
|
||||
let c = new Category(req.body.category);
|
||||
c.save()
|
||||
.then(() => {
|
||||
res.status(200).json({ success: true, response: c });
|
||||
|
||||
@@ -21,7 +21,7 @@ postRoutes.route('/create').post((req, res) => {
|
||||
utils.account.checkSession(req.body.userId, req.body.sessionId, (isValidId) => {
|
||||
utils.account.isAdmin(req.body.userId, (isAdmin) => {
|
||||
if (isValidId && isAdmin) {
|
||||
let p = new Post(req.body);
|
||||
let p = new Post(req.body.post);
|
||||
p.date = utils.date.dateToEpoch(p.date);
|
||||
p.save()
|
||||
.then(() => {
|
||||
|
||||
@@ -243,6 +243,17 @@ userRoutes.route('/favorite/get').post((req, res) => {
|
||||
})
|
||||
})
|
||||
|
||||
userRoutes.route('/check-token').post((req, res) => {
|
||||
utils.account.checkSession(req.body.userId, req.body.sessionId, valid => {
|
||||
if (valid) {
|
||||
res.status(200).json({ success: true, response: "Valid SessionId" });
|
||||
|
||||
} else {
|
||||
res.status(401).json({ success: false, response: "Incorrect SessionId" });
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
userRoutes.route('/refresh').post((req, res) => {
|
||||
utils.account.checkRefresh(req.body.userId, req.body.refresh, valid => {
|
||||
if (valid) {
|
||||
|
||||
@@ -4,11 +4,16 @@ const bcrypt = require('bcrypt');
|
||||
|
||||
// checkSession(userId, sessionId) checks if the sessionId is valid for the user
|
||||
const checkSession = (userId, sessionId, f) => {
|
||||
let success = false;
|
||||
Session.find({ userId: userId, sessionId: sessionId }, (err, res) => {
|
||||
if (res && res.type == 0) {
|
||||
res.forEach(element => {
|
||||
if (element.type == 0 && !success) {
|
||||
success = true;
|
||||
f(true);
|
||||
return;
|
||||
}
|
||||
})
|
||||
if (!success)
|
||||
f(false);
|
||||
});
|
||||
}
|
||||
|
||||
0
utils/viewcount.js
Normal file
0
utils/viewcount.js
Normal file
Reference in New Issue
Block a user