From 7e3b2606f95e085067211d0c95b7f1eaa3f5ac15 Mon Sep 17 00:00:00 2001
From: scoliono <2191476+scoliono@users.noreply.github.com>
Date: Fri, 9 Apr 2021 22:00:47 -0700
Subject: [PATCH] site updates 2021-04-09

---
 package-lock.json | 15 +++++++++
 package.json      |  1 +
 src/server.js     | 85 ++++++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 100 insertions(+), 1 deletion(-)

diff --git a/package-lock.json b/package-lock.json
index d4ed28e..5ed8d25 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2540,6 +2540,12 @@
       "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
       "dev": true
     },
+    "clone": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
+      "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+      "dev": true
+    },
     "code-point-at": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
@@ -4834,6 +4840,15 @@
       "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.0.tgz",
       "integrity": "sha512-sSHCgWfJ+Lui/u+0msF3oyCgvdkhxDbkCS6Q8uiJquzOimkJBvX6hl5aSSA7DR1XbMpdM8r7phjcF63sF4rkKg=="
     },
+    "node-cache": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz",
+      "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==",
+      "dev": true,
+      "requires": {
+        "clone": "2.x"
+      }
+    },
     "node-libs-browser": {
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
diff --git a/package.json b/package.json
index 1e9dd35..a474b47 100644
--- a/package.json
+++ b/package.json
@@ -42,6 +42,7 @@
     "@babel/preset-env": "^7.11.0",
     "babel-loader": "^8.1.0",
     "core-js": "^3.6.5",
+    "node-cache": "^5.1.2",
     "npm-run-all": "^4.1.5",
     "regenerator-runtime": "^0.13.7",
     "sapper": "^0.27.16",
diff --git a/src/server.js b/src/server.js
index 66f6479..b4b5827 100644
--- a/src/server.js
+++ b/src/server.js
@@ -17,6 +17,7 @@ import useragent from 'useragent';
 import RSS from 'rss';
 import path from 'path';
 import crypto from 'crypto';
+import NodeCache from 'node-cache';
 import Article from './models/article.js';
 import Category from './models/category.js';
 import User from './models/user.js';
@@ -25,6 +26,7 @@ import legacyRouter from './legacy/router.js';
 
 require('dotenv').config();
 const FileStore = sessionFileStore(session);
+const cache = new NodeCache();
 
 const { PORT, NODE_ENV, SESSION_SECRET, MONGODB_CONN,
         SMTP_USERNAME, SMTP_PASSWORD, SMTP_SERVER, SMTP_PORT, SMTP_RECIPIENTS } = process.env;
@@ -478,7 +480,88 @@ mainRouter
                 message: err.message
             }));
         }
-    });
+    })
+	.get('/api/meet', async function (req, res, next) {
+		if (req.query.token === '1445') {
+			const time = cache.get('lastMeetingTime');
+			res.writeHead(200, {
+				'Content-Type': 'application/json'
+			});
+			res.end(JSON.stringify({
+				LastMeetingTime: time ? time.toJSON() : undefined
+			}));
+		} else {
+			next();
+		}
+	})
+	.post('/api/meet', async function (req, res, next) {
+		if (req.body.token === '1445') {
+			const time = new Date();
+			const success = cache.set('lastMeetingTime', time, 3600);
+			if (success) {
+				res.writeHead(200, {
+					'Content-Type': 'application/json'
+				});
+				res.end(JSON.stringify({
+					LastMeetingTime: time.toJSON()
+				}));
+			} else {
+				res.writeHead(500, {
+					'Content-Type': 'application/json'
+				});
+				res.end(JSON.stringify({
+					Error: 'Failed to store meeting time in cache!'
+				}));
+			}
+		} else {
+			next();
+		}
+	})
+	.get('/api/memo', async function (req, res, next) {
+		if (req.query.token === '1445') {
+			const memos = cache.get('memos') || [];
+			res.writeHead(200, {
+				'Content-Type': 'application/json'
+			});
+			res.end(JSON.stringify(memos));
+		} else {
+			next();
+		}
+	})
+	.post('/api/memo', async function (req, res, next) {
+		if (req.body.token === '1445') {
+			const memo = req.body.message;
+			if (!memo) {
+				res.writeHead(400, {
+					'Content-Type': 'application/json'
+				});
+				res.end(JSON.stringify({
+					Error: 'You must provide a memo message'
+				}));
+			}
+			const memos = cache.get('memos') || [];
+			memos.push({
+				Time: new Date(),
+				Message: memo
+			});
+			const success = cache.set('memos', memos);
+			if (success) {
+				res.writeHead(200, {
+					'Content-Type': 'application/json'
+				});
+				res.end(JSON.stringify(memos));
+			} else {
+				res.writeHead(500, {
+					'Content-Type': 'application/json'
+				});
+				res.end(JSON.stringify({
+					Error: 'Failed to store memo in cache!'
+				}));
+			}
+		} else {
+			next();
+		}
+	});
 
 app.use(helmet())
     .use(cors())