notherbase-fs 1.1.42 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,27 +1,12 @@
1
- const { user, connectionSuccess } = require("../models");
1
+ const { connectionSuccess } = require("../models");
2
2
 
3
3
  const authCheck = async function authCheck(req, res, next){
4
4
  if (connectionSuccess) {
5
- try {
6
- if (req.session.currentUser) {
7
- const foundAccount = await user.findById(req.session.currentUser);
8
-
9
- if (foundAccount) {
10
- req.session.currentUserFull = foundAccount;
11
- next();
12
- }
13
- else {
14
- req.session.currentUserFull = null;
15
- res.redirect("/the-front");
16
- }
17
- }
18
- else{
19
- res.redirect("/the-front");
20
- }
5
+ if (req.session.currentUser) {
6
+ next();
21
7
  }
22
- catch(err) {
23
- console.log("database error");
24
- console.log(err);
8
+ else {
9
+ res.redirect("/the-front");
25
10
  }
26
11
  }
27
12
  else {
@@ -31,6 +31,7 @@ let complete = function complete(explorerBuild) {
31
31
  externalStyles: [],
32
32
  localScripts: [],
33
33
  serverScripts: [],
34
+ requiredItems: [],
34
35
  needsKey: "",
35
36
  dropOff: "",
36
37
  ...detail.options
@@ -74,6 +75,13 @@ let complete = function complete(explorerBuild) {
74
75
  }));
75
76
  }
76
77
 
78
+ let foundItemIDs = [];
79
+ for (let m = 0; m < detail.options.requiredItems.length; m++) {
80
+ let foundItem = await item.findOne({name: detail.options.requiredItems[m]});
81
+
82
+ foundItemIDs.push(foundItem._id);
83
+ }
84
+
77
85
  let context = {
78
86
  siteTitle: "NotherBase",
79
87
  user: req.session.currentUserFull,
@@ -82,6 +90,7 @@ let complete = function complete(explorerBuild) {
82
90
  main: detail.options.main,
83
91
  localScripts: detail.options.localScripts,
84
92
  serverScriptReturns: serverScriptReturns,
93
+ itemIDs: foundItemIDs,
85
94
  pov: req.query.pov,
86
95
  inventory: foundInventory,
87
96
  query: req.query
@@ -121,8 +130,9 @@ let complete = function complete(explorerBuild) {
121
130
  user: null,
122
131
  styles: [`${dir}/${explorerBuild.void}/styles/void`],
123
132
  externalStyles: [],
124
- scripts: [],
133
+ localScripts: [],
125
134
  inventory: null,
135
+ itemIDs: [],
126
136
  main: `${dir}/${explorerBuild.void}/index`
127
137
  });
128
138
  });
@@ -7,7 +7,7 @@ const { inventory, item, connectionSuccess } = require("../models");
7
7
  router.get("/", async function(req, res) {
8
8
  if (connectionSuccess) {
9
9
  try {
10
- if (req.session.currentUserFull) {
10
+ if (req.session.currentUser) {
11
11
  let foundInventory = await inventory.findOne({user: req.session.currentUser}).populate("items.item");
12
12
 
13
13
  res.status(200).send({ foundInventory: foundInventory });
@@ -74,10 +74,8 @@ router.post("/", async function(req, res) {
74
74
 
75
75
  if (!holding) {
76
76
  if (req.body.change.amount > 0) {
77
- let foundItem = await item.findById(req.body.change.item);
78
-
79
77
  foundInventory.items.push({
80
- item: foundItem._id,
78
+ item: req.body.change.item,
81
79
  amount: req.body.change.amount
82
80
  });
83
81
 
@@ -1,13 +1,15 @@
1
- const { inventory, connectionSuccess } = require("../models");
1
+ const { user, inventory, connectionSuccess } = require("../models");
2
2
 
3
3
  let router = require("express").Router();
4
4
  let dir = "";
5
5
 
6
+
6
7
  let front = function front(detail) {
7
8
  detail.options = {
8
9
  styles: [],
9
10
  externalStyles: [],
10
11
  localScripts: [],
12
+ requiredItems: [],
11
13
  needsKey: "",
12
14
  dropOff: "",
13
15
  ...detail.options
@@ -28,11 +30,18 @@ let front = function front(detail) {
28
30
  return script;
29
31
  });
30
32
 
31
- detail.options.main = "index";
32
- if (detail.name !== "") detail.options.main = detail.name;
33
- detail.options.main = `${dir}/views/${detail.options.main}`;
34
-
35
33
  router.get(`/${detail.name}`, async function(req, res) {
34
+ detail.options.main = "index";
35
+ if (detail.name !== "") detail.options.main = detail.name;
36
+ detail.options.main = `${dir}/views/${detail.options.main}`;
37
+
38
+ let foundItemIDs = [];
39
+ for (let m = 0; m < detail.options.requiredItems.length; m++) {
40
+ let foundItem = await item.findOne({name: detail.options.requiredItems[m]});
41
+
42
+ foundItemIDs.push(foundItem._id);
43
+ }
44
+
36
45
  let context = {
37
46
  siteTitle: "NotherBase | The Front",
38
47
  user: null,
@@ -40,18 +49,17 @@ let front = function front(detail) {
40
49
  externalStyles: detail.options.externalStyles,
41
50
  main: detail.options.main,
42
51
  localScripts: detail.options.localScripts,
52
+ itemIDs: foundItemIDs,
43
53
  inventory: null,
44
54
  query: req.query
45
55
  }
46
56
 
47
57
  if (connectionSuccess) {
48
- context.user = req.session.currentUserFull;
49
-
50
58
  try {
51
- const foundInventory = await inventory.findOne({ user: req.session.currentUser }).populate("items.item");
52
- context.inventory = foundInventory;
59
+ context.user = await user.findById(req.session.currentUser);
60
+ context.inventory = await inventory.findOne({ user: req.session.currentUser }).populate("items.item");
53
61
 
54
- if (detail.options.needsKey !== "" && foundInventory) {
62
+ if (detail.options.needsKey !== "" && context.inventory) {
55
63
  let hasKey = false;
56
64
 
57
65
  for (let i = 0; i < foundInventory.items.length; i++) {
@@ -1,15 +1,173 @@
1
1
  const express = require("express");
2
2
  const router = express.Router();
3
3
  const bcrypt = require("bcrypt");
4
+ const nodemailer = require("nodemailer");
4
5
 
5
6
  // Import my Data
6
- const { user, inventory } = require("../models");
7
+ const { user, inventory, sendMail } = require("../models");
7
8
 
8
9
  const authCheck = require("./authCheck");
9
10
 
11
+ let getAttributes = async function getAttributes(userID) {
12
+ try {
13
+ let foundUser = await user.findById(userID, 'attributes');
14
+
15
+ if (!foundUser.attributes || foundUser.attributes == {}) {
16
+ foundUser.attributes = {
17
+ translation: 0,
18
+ strength: 0,
19
+ agility: 0,
20
+ defense: 0
21
+ }
22
+
23
+ await foundUser.save();
24
+ }
25
+
26
+ return foundUser;
27
+ }
28
+ catch (err) {
29
+ console.log(err);
30
+ return null;
31
+ }
32
+ }
33
+
34
+ router.get("/basic", async function(req, res) {
35
+ try {
36
+ if (req.session.currentUser) {
37
+ let foundUser = await user.findById(req.session.currentUser, 'username email');
38
+
39
+ res.status(200).send(foundUser);
40
+ }
41
+ else {
42
+ res.status(401).send("Please login first!");
43
+ }
44
+ }
45
+ catch(err) {
46
+ console.log(err);
47
+ res.status(500).end();
48
+ }
49
+ });
50
+
51
+ router.get("/logout", authCheck, async function(req, res) {
52
+ try {
53
+ await req.session.destroy();
54
+
55
+ res.redirect(`/`);
56
+ }
57
+ catch {
58
+ console.log(err);
59
+ }
60
+ });
61
+
62
+ router.get("/all", async function(req, res) {
63
+ try {
64
+ let foundUsers = await user.find({}, 'username coin home authLevels location attributes');
65
+
66
+ res.status(200).send({ foundUsers: foundUsers });
67
+ }
68
+ catch(err) {
69
+ res.status(500).end();
70
+ console.log(err);
71
+ }
72
+ });
73
+
74
+ router.get("/password-reset", async function(req, res) {
75
+ try {
76
+ let foundUser = await user.findOne({ email: req.query.email });
77
+
78
+ if (foundUser) {
79
+ foundUser.reset.token = Math.floor(Math.random() * 9999);
80
+ foundUser.reset.exp = Date.now() + (1000 * 60 * 30);
81
+
82
+ await foundUser.save();
83
+
84
+ sendMail.passwordReset(req.query.email, foundUser.reset.token);
85
+
86
+ res.status(200).send("Reset link sent!");
87
+ }
88
+ else {
89
+ res.status(401).send("Failed: user not found!");
90
+ }
91
+ }
92
+ catch(err) {
93
+ console.log(err);
94
+
95
+ res.status(500).send("Update Failed: Database error!");
96
+ }
97
+ });
98
+
99
+ router.post("/password-reset/:token", async function(req, res) {
100
+ try {
101
+ const foundUser = await user.findOne({ "reset.token": req.params.token });
102
+
103
+ if (foundUser) {
104
+ if (foundUser.reset.exp > Date.now()) {
105
+ if (req.body.password !== req.body.confirmation) res.status(400).send("Passwords must match!");
106
+ else {
107
+ foundUser.reset = {};
108
+
109
+ const salt = await bcrypt.genSalt(10);
110
+ const hash = await bcrypt.hash(req.body.password, salt);
111
+
112
+ foundUser.password = hash;
113
+ await foundUser.save();
114
+
115
+ res.status(200).send("Password changed successfully!");
116
+ }
117
+ }
118
+ else res.status(498).send("Reset token expired!");
119
+ }
120
+ else {
121
+ res.status(404).send("Reset token not valid!");
122
+ }
123
+ }
124
+ catch(err) {
125
+ console.log(err);
126
+
127
+ res.status(500).send("Internal Server Error!");
128
+ }
129
+ });
130
+
131
+ router.get("/attributes", async function(req, res) {
132
+ try {
133
+ if (req.session.currentUser) {
134
+ let foundUser = await getAttributes(req.session.currentUser);
135
+
136
+ res.status(200).send(foundUser.attributes);
137
+ }
138
+ else {
139
+ res.status(401).send("Please login first!");
140
+ }
141
+ }
142
+ catch(err) {
143
+ res.status(500).end();
144
+ console.log(err);
145
+ }
146
+ });
147
+
148
+ router.get("/attributes/check", authCheck, async function(req, res) {
149
+ try {
150
+ if (req.session.currentUser) {
151
+ let foundUser = await getAttributes(req.session.currentUser);
152
+
153
+ if (foundUser.attributes[req.query.check] >= parseInt(req.query.against)) {
154
+ res.status(200).send("Pass");
155
+ }
156
+ else res.status(200).send("Fail");
157
+ }
158
+ else {
159
+ res.status(401).send("Please login first!");
160
+ }
161
+ }
162
+ catch(err) {
163
+ res.status(500).end();
164
+ console.log(err);
165
+ }
166
+ });
167
+
10
168
  router.post("/register", async function(req, res) {
11
169
  try {
12
- const foundAccount = await user.findOne({ username: req.body.username });
170
+ let foundAccount = await user.findOne({ username: req.body.username });
13
171
 
14
172
  if (!foundAccount) {
15
173
  const salt = await bcrypt.genSalt(10);
@@ -18,10 +176,17 @@ router.post("/register", async function(req, res) {
18
176
  let qAuth = await user.create({
19
177
  username: req.body.username,
20
178
  password: hash,
21
- email: "temp@example.com",
179
+ email: req.body.email,
22
180
  coin: 0,
23
181
  home: "/",
24
- authLevels: [ "Basic" ]
182
+ authLevels: [ "Basic" ],
183
+ location: "/the-front",
184
+ attributes: {
185
+ translation: 0,
186
+ strength: 0,
187
+ agility: 0,
188
+ defense: 0
189
+ }
25
190
  });
26
191
 
27
192
  await inventory.create({
@@ -44,12 +209,11 @@ router.post("/register", async function(req, res) {
44
209
 
45
210
  router.post("/login", async function(req, res) {
46
211
  try {
47
- const foundAccount = await user.findOne({ username: req.body.username });
212
+ const foundAccount = await user.findOne({ email: req.body.email });
48
213
 
49
214
  if (foundAccount) {
50
215
  if (await bcrypt.compare(req.body.password, foundAccount.password)) {
51
216
  req.session.currentUser = foundAccount._id;
52
- req.session.currentUserFull = foundAccount;
53
217
 
54
218
  res.status(200).send("Login successful!");
55
219
  }
@@ -58,7 +222,7 @@ router.post("/login", async function(req, res) {
58
222
  }
59
223
  }
60
224
  else {
61
- res.status(401).send("Login Failed: username not found!");
225
+ res.status(401).send("Login Failed: Email not found!");
62
226
  }
63
227
  }
64
228
  catch(err) {
@@ -68,41 +232,171 @@ router.post("/login", async function(req, res) {
68
232
  }
69
233
  });
70
234
 
71
- router.get("/logout", authCheck, async function(req, res) {
235
+ router.post("/email", async function(req, res) {
72
236
  try {
73
- await req.session.destroy();
237
+ if (req.session.currentUser) {
238
+ let foundAccount = await user.findOne({ email: req.body.email });
74
239
 
75
- res.redirect(`/`);
240
+ if (!foundAccount) {
241
+ let foundUser = await user.findById(req.session.currentUser);
242
+
243
+ if (foundUser) {
244
+ foundUser.email = req.body.email;
245
+ await foundUser.save();
246
+
247
+ res.status(200).send("Update successful!");
248
+ }
249
+ else {
250
+ res.status(401).send("Update Failed: user not found!");
251
+ }
252
+ }
253
+ else {
254
+ res.status(401).send("Update Failed: email already in use!");
255
+ }
256
+ }
257
+ else {
258
+ res.status(401).send("Please login first!");
259
+ }
76
260
  }
77
- catch {
261
+ catch(err) {
78
262
  console.log(err);
263
+
264
+ res.status(500).send("Update Failed: Database error!");
79
265
  }
80
266
  });
81
267
 
82
- router.get("/all", authCheck, async function(req, res) {
268
+ router.post("/username", async function(req, res) {
83
269
  try {
84
- let foundUsers = await user.find({}, 'username coin home authLevels location');
270
+ if (req.session.currentUser) {
271
+ let foundAccount = await user.findOne({ username: req.body.username });
85
272
 
86
- res.status(200).send({ foundUsers: foundUsers });
273
+ if (!foundAccount) {
274
+ let foundUser = await user.findById(req.session.currentUser);
275
+
276
+ if (foundUser) {
277
+ foundUser.username = req.body.username;
278
+ await foundUser.save();
279
+
280
+ res.status(200).send("Update successful!");
281
+ }
282
+ else {
283
+ res.status(401).send("Update Failed: user not found!");
284
+ }
285
+ }
286
+ else {
287
+ res.status(401).send("Update Failed: username taken!");
288
+ }
289
+ }
290
+ else {
291
+ res.status(401).send("Please login first!");
292
+ }
87
293
  }
88
294
  catch(err) {
89
- res.status(500).end();
90
295
  console.log(err);
296
+
297
+ res.status(500).send("Update Failed: Database error!");
91
298
  }
92
299
  });
93
300
 
94
- router.delete("/", authCheck, async function(req, res) {
301
+ router.post("/password", async function(req, res) {
302
+ try {
303
+ if (req.session.currentUser) {
304
+ let foundUser = await user.findById(req.session.currentUser);
305
+
306
+ if (foundUser) {
307
+ const salt = await bcrypt.genSalt(10);
308
+ const hash = await bcrypt.hash(req.body.password, salt);
309
+ foundUser.password = hash;
310
+ await foundUser.save();
311
+
312
+ res.status(200).send("Update successful!");
313
+ }
314
+ else {
315
+ res.status(401).send("Update Failed: user not found!");
316
+ }
317
+ }
318
+ else {
319
+ res.status(401).send("Please login first!");
320
+ }
321
+ }
322
+ catch(err) {
323
+ console.log(err);
324
+
325
+ res.status(500).send("Update Failed: Database error!");
326
+ }
327
+ });
328
+
329
+ router.post("/attributes", async function(req, res) {
95
330
  try {
96
- const found = await user.findByIdAndDelete(req.session.currentUser);
331
+ if (req.session.currentUser) {
332
+ let foundUser = await getAttributes(req.session.currentUser);
97
333
 
98
- if (!found) console.log("Could not find account. No deletion!");
334
+ if (foundUser) {
335
+ foundUser.attributes[req.body.change] = parseInt(req.body.to);
336
+ await foundUser.save();
99
337
 
100
- await req.session.destroy();
338
+ res.status(200).send("AttUp successful!");
339
+ }
340
+ else {
341
+ res.status(401).send("AttUp Failed: user not found!");
342
+ }
343
+ }
344
+ else {
345
+ res.status(401).send("Please login first!");
346
+ }
347
+ }
348
+ catch(err) {
349
+ console.log(err);
350
+
351
+ res.status(500).send("AttUp Failed: Database error!");
352
+ }
353
+ });
101
354
 
102
- res.redirect("/");
355
+ router.post("/attributes/increment", async function(req, res) {
356
+ try {
357
+ if (req.session.currentUser) {
358
+ let foundUser = await getAttributes(req.session.currentUser);
359
+
360
+ if (foundUser) {
361
+ if (foundUser.attributes[req.body.change] < req.body.max) {
362
+ foundUser.attributes[req.body.change]++;
363
+ await foundUser.save();
364
+ res.status(200).send({ newLevel: foundUser.attributes[req.body.change] });
365
+ }
366
+ else {
367
+ res.status(304).send({ newLevel: foundUser.attributes[req.body.change] });
368
+ }
369
+ }
370
+ else {
371
+ res.status(401).send("AttUp Failed: user not found!");
372
+ }
373
+ }
374
+ else {
375
+ res.status(401).send("Please login first!");
376
+ }
377
+ }
378
+ catch(err) {
379
+ console.log(err);
380
+
381
+ res.status(500).send("AttUp Failed: Database error!");
382
+ }
383
+ });
384
+
385
+ router.delete("/", authCheck, async function(req, res) {
386
+ try {
387
+ if (req.session.currentUser) {
388
+ await user.findByIdAndDelete(req.session.currentUser);
389
+ await req.session.destroy();
390
+
391
+ res.redirect("/");
392
+ }
393
+ else {
394
+ res.status(401).send("Please login first!");
395
+ }
103
396
  }
104
397
  catch {
105
398
  console.log(err);
399
+ res.status(500).send("Delete Failed: Database error!");
106
400
  }
107
401
  });
108
402
 
package/models/index.js CHANGED
@@ -5,5 +5,6 @@ module.exports = {
5
5
  user: require("./user"),
6
6
  contact: require("./contact"),
7
7
  inventory: require("./inventory"),
8
- game: require("./game")
8
+ game: require("./game"),
9
+ sendMail: require("./send-mail")
9
10
  }
@@ -0,0 +1,26 @@
1
+ const nodemailer = require("nodemailer");
2
+
3
+ const passwordReset = async (toEmail, resetToken) => {
4
+ var transporter = nodemailer.createTransport({
5
+ service: 'gmail',
6
+ auth: {
7
+ user: process.env.NOREPLY,
8
+ pass: process.env.NOREPLYPW
9
+ }
10
+ });
11
+
12
+ var mailOptions = {
13
+ from: process.env.NOREPLY,
14
+ to: toEmail,
15
+ subject: 'Password Reset for NotherBase',
16
+ html: `<h1>Your One-Time Password Reset Code: ${resetToken}<h1>`
17
+ };
18
+
19
+ transporter.sendMail(mailOptions, function(error, info){
20
+ if (error) console.log(error);
21
+ });
22
+ };
23
+
24
+ module.exports = {
25
+ passwordReset: passwordReset
26
+ };
package/models/user.js CHANGED
@@ -9,7 +9,17 @@ const user = mongoose.model('users',
9
9
  coin: Number,
10
10
  home: String,
11
11
  authLevels: [ String ],
12
- location: String
12
+ location: String,
13
+ attributes: {
14
+ translation: Number,
15
+ strength: Number,
16
+ agility: Number,
17
+ defense: Number
18
+ },
19
+ reset: {
20
+ token: Number,
21
+ exp: Number
22
+ }
13
23
  })
14
24
  );
15
25
 
package/package.json CHANGED
@@ -1,10 +1,12 @@
1
1
  {
2
2
  "name": "notherbase-fs",
3
- "version": "1.1.42",
3
+ "version": "1.2.2",
4
4
  "description": "Functions to help make developing for NotherBase easier.",
5
5
  "main": "index.js",
6
6
  "scripts": {
7
- "test": "nodemon test.js"
7
+ "test": "nodemon test.js",
8
+ "gmail-auth": "node gmail-auth.js",
9
+ "gmail-token": "node gmail-token.js"
8
10
  },
9
11
  "repository": {
10
12
  "type": "git",
@@ -23,8 +25,10 @@
23
25
  "ejs": "^3.1.6",
24
26
  "express": "^4.17.1",
25
27
  "express-session": "^1.17.2",
28
+ "googleapis": "^100.0.0",
26
29
  "method-override": "^3.0.0",
27
30
  "mongoose": "^6.1.7",
31
+ "nodemailer": "^6.7.5",
28
32
  "serve-favicon": "^2.5.0",
29
33
  "socket.io": "^4.4.1"
30
34
  }
@@ -0,0 +1,41 @@
1
+ .content#account {
2
+ padding: 10px;
3
+ }
4
+
5
+ .content#account hr {
6
+ margin: 10px 0;
7
+ }
8
+
9
+ .content#account #info {
10
+ text-align: center;
11
+ width: 100%;
12
+ margin-top: 40px;
13
+ }
14
+
15
+ .content#account .setting {
16
+ background: var(--darkBgColor);
17
+ padding: 25px;
18
+ border-radius: 5px;
19
+ display: flex;
20
+ justify-content: center;
21
+ text-align: center;
22
+ flex-wrap: wrap;
23
+ }
24
+
25
+ .content#account p {
26
+ width: 100%;
27
+ }
28
+
29
+ .content#account button {
30
+ width: 40%;
31
+ }
32
+
33
+ .content#account .edit {
34
+ background: var(--darkWoodColor);
35
+ padding: 25px;
36
+ border-radius: 5px;
37
+ display: flex;
38
+ justify-content: center;
39
+ text-align: center;
40
+ flex-wrap: wrap;
41
+ }