feature: authentuication
This commit is contained in:
		@@ -1,7 +1,13 @@
 | 
				
			|||||||
const moment = require('moment');
 | 
					const moment = require('moment');
 | 
				
			||||||
 | 
					const bcrypt = require('bcryptjs');
 | 
				
			||||||
 | 
					const crypto = require("crypto");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const { insertSessions, insertSessionTracks } = require("../db/mongo/mongoSessions");
 | 
					const { insertSessions, insertSessionTracks } = require("../db/mongo/mongoSessions");
 | 
				
			||||||
 | 
					const { createUserMongo, getUserMongo } = require('../db/mongo/mongoUsers');
 | 
				
			||||||
const { getHistoricalSessions, getIvaoSessionTracks } = require("../requests/ivao/session");
 | 
					const { getHistoricalSessions, getIvaoSessionTracks } = require("../requests/ivao/session");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const saltRounds = 10;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function initSessionsData(opts) {
 | 
					async function initSessionsData(opts) {
 | 
				
			||||||
  const { callsign, userId, from, clear = false } = opts;
 | 
					  const { callsign, userId, from, clear = false } = opts;
 | 
				
			||||||
  let to = opts.to;
 | 
					  let to = opts.to;
 | 
				
			||||||
@@ -45,6 +51,39 @@ async function pause(millis) {
 | 
				
			|||||||
  await new Promise((resolve) => setTimeout(resolve, millis));
 | 
					  await new Promise((resolve) => setTimeout(resolve, millis));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function getHashedPassword(password) {
 | 
				
			||||||
 | 
					  const salt = bcrypt.genSaltSync(saltRounds);
 | 
				
			||||||
 | 
					  return bcrypt.hashSync(password, salt);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function createUser(request) {
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    const { username, password, roles, firstname, lastname, vid } = request.body;
 | 
				
			||||||
 | 
					    const hash = getHashedPassword(password);
 | 
				
			||||||
 | 
					    const id = crypto.randomBytes(16).toString("hex");
 | 
				
			||||||
 | 
					    return await createUserMongo({ id, username, hash, roles, firstname, lastname, vid });
 | 
				
			||||||
 | 
					  } catch (err) {
 | 
				
			||||||
 | 
					    console.log('err :>> ', err);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function authenticate(username, password) {
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    const user = await getUserMongo(username);
 | 
				
			||||||
 | 
					    if (bcrypt.compareSync(password, user.hash)) {
 | 
				
			||||||
 | 
					      delete user.hash;
 | 
				
			||||||
 | 
					      return user;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return undefined;
 | 
				
			||||||
 | 
					  } catch (err) {
 | 
				
			||||||
 | 
					    console.log('err :>> ', err);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = {
 | 
					module.exports = {
 | 
				
			||||||
  initSessionsData,
 | 
					  initSessionsData,
 | 
				
			||||||
 | 
					  createUser,
 | 
				
			||||||
 | 
					  authenticate,
 | 
				
			||||||
 | 
					  getHashedPassword,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -19,18 +19,23 @@ const getMongoDatabase = (client, db) => {
 | 
				
			|||||||
  return client.db(DB);
 | 
					  return client.db(DB);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const mongoExecute = async(fn, dbName = MONGO_DB) => {
 | 
					const mongoExecute = async function(fn, opts) {
 | 
				
			||||||
  let conn;
 | 
					  const { dbName, colName } = { dbName: MONGO_DB, ...opts };
 | 
				
			||||||
 | 
					  let connection;
 | 
				
			||||||
  try {
 | 
					  try {
 | 
				
			||||||
    conn = await getMongoConnection();
 | 
					    connection = await getMongoConnection();
 | 
				
			||||||
    const db = conn.db(dbName);
 | 
					    const database = connection.db(dbName);
 | 
				
			||||||
    const result = await fn(db, conn);
 | 
					    if (colName) {
 | 
				
			||||||
    return result;
 | 
					      const collection = database.collection(colName);
 | 
				
			||||||
 | 
					      return await fn({ collection, database, connection });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return await fn({ database, connection });
 | 
				
			||||||
  } catch (err) {
 | 
					  } catch (err) {
 | 
				
			||||||
 | 
					    console.log('err :>> ', err);
 | 
				
			||||||
    console.log('MOMGODB ERROR:', err.message);
 | 
					    console.log('MOMGODB ERROR:', err.message);
 | 
				
			||||||
  } finally {
 | 
					  } finally {
 | 
				
			||||||
    if (conn) {
 | 
					    if (connection) {
 | 
				
			||||||
      await conn.close();
 | 
					      await connection.close();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,8 @@
 | 
				
			|||||||
const { mongoExecute } = require("./mongoDBPool");
 | 
					const { mongoExecute } = require("./mongoDBPool");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function insertSessions(sessions, clear) {
 | 
					async function insertSessions(sessions, clear) {
 | 
				
			||||||
  return mongoExecute(async(db) => {
 | 
					  return await mongoExecute(async({ database }) => {
 | 
				
			||||||
    const sessionsCollection = db.collection('sessions');
 | 
					    const sessionsCollection = database.collection('sessions');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (clear) {
 | 
					    if (clear) {
 | 
				
			||||||
      sessionsCollection.deleteMany({});
 | 
					      sessionsCollection.deleteMany({});
 | 
				
			||||||
@@ -16,16 +16,16 @@ async function insertSessions(sessions, clear) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function insertOneSessionTracks(sessionTracks) {
 | 
					async function insertOneSessionTracks(sessionTracks) {
 | 
				
			||||||
  return mongoExecute(async(db) => {
 | 
					  return await mongoExecute(async({ database }) => {
 | 
				
			||||||
    const sessionsCollection = db.collection('sessionTracks');
 | 
					    const sessionsCollection = database.collection('sessionTracks');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    await sessionsCollection.insertOne(sessionTracks);
 | 
					    await sessionsCollection.insertOne(sessionTracks);
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function insertSessionTracks(sessionTracks, clear) {
 | 
					async function insertSessionTracks(sessionTracks, clear) {
 | 
				
			||||||
  return mongoExecute(async(db) => {
 | 
					  return await mongoExecute(async({ database }) => {
 | 
				
			||||||
    const sessionsCollection = db.collection('sessionTracks');
 | 
					    const sessionsCollection = database.collection('sessionTracks');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (clear) {
 | 
					    if (clear) {
 | 
				
			||||||
      sessionsCollection.deleteMany({});
 | 
					      sessionsCollection.deleteMany({});
 | 
				
			||||||
@@ -36,8 +36,8 @@ async function insertSessionTracks(sessionTracks, clear) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function getSessions(start, end) {
 | 
					async function getSessions(start, end) {
 | 
				
			||||||
  return mongoExecute(async(db) => {
 | 
					  return await mongoExecute(async({ database }) => {
 | 
				
			||||||
    const sessionsCollection = db.collection('sessions');
 | 
					    const sessionsCollection = database.collection('sessions');
 | 
				
			||||||
    const startDate = start + 'T00:00:00.000Z';
 | 
					    const startDate = start + 'T00:00:00.000Z';
 | 
				
			||||||
    const endDate = end + 'T23:59:59.999Z';
 | 
					    const endDate = end + 'T23:59:59.999Z';
 | 
				
			||||||
    const result = await sessionsCollection.aggregate([{
 | 
					    const result = await sessionsCollection.aggregate([{
 | 
				
			||||||
@@ -71,9 +71,9 @@ async function getSessions(start, end) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function getSessionTracks(sessionId) {
 | 
					async function getSessionTracks(sessionId) {
 | 
				
			||||||
  return mongoExecute(
 | 
					  return await mongoExecute(
 | 
				
			||||||
    async(db) => {
 | 
					    async({ database }) => {
 | 
				
			||||||
      const tracksCollection = db.collection('sessionTracks');
 | 
					      const tracksCollection = database.collection('sessionTracks');
 | 
				
			||||||
      const tracks = await tracksCollection.findOne({ sessionId });
 | 
					      const tracks = await tracksCollection.findOne({ sessionId });
 | 
				
			||||||
      return tracks;
 | 
					      return tracks;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -81,8 +81,8 @@ async function getSessionTracks(sessionId) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function updateSessionTracks(tracks) {
 | 
					async function updateSessionTracks(tracks) {
 | 
				
			||||||
  return mongoExecute(async(db) => {
 | 
					  return await mongoExecute(async({ database }) => {
 | 
				
			||||||
    const tracksCollection = db.collection('sessionTracks');
 | 
					    const tracksCollection = database.collection('sessionTracks');
 | 
				
			||||||
    await tracksCollection.updateOne({ _id: tracks._id }, { $set: { calculatedTime: tracks.calculatedTime } });
 | 
					    await tracksCollection.updateOne({ _id: tracks._id }, { $set: { calculatedTime: tracks.calculatedTime } });
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										29
									
								
								app/db/mongo/mongoUsers.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								app/db/mongo/mongoUsers.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
				
			|||||||
 | 
					const { mongoExecute } = require('./mongoDBPool');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function createUserMongo({ id, username, hash, roles = [], firstname, lastname, vid }) {
 | 
				
			||||||
 | 
					  return await mongoExecute(async({ database }) => {
 | 
				
			||||||
 | 
					    const usersCol = database.collection('users');
 | 
				
			||||||
 | 
					    const createdOn = new Date();
 | 
				
			||||||
 | 
					    await usersCol.insertOne({
 | 
				
			||||||
 | 
					      id,
 | 
				
			||||||
 | 
					      username,
 | 
				
			||||||
 | 
					      hash,
 | 
				
			||||||
 | 
					      createdOn,
 | 
				
			||||||
 | 
					      roles,
 | 
				
			||||||
 | 
					      firstname,
 | 
				
			||||||
 | 
					      lastname,
 | 
				
			||||||
 | 
					      vid
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async function getUserMongo(username) {
 | 
				
			||||||
 | 
					  return await mongoExecute(async({ collection }) => {
 | 
				
			||||||
 | 
					    return await collection.findOne({ username });
 | 
				
			||||||
 | 
					  }, { colName: 'users' })
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module.exports = {
 | 
				
			||||||
 | 
					  createUserMongo,
 | 
				
			||||||
 | 
					  getUserMongo,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
@@ -1,7 +1,35 @@
 | 
				
			|||||||
const express = require('express');
 | 
					const express = require('express');
 | 
				
			||||||
const { initSessionsData } = require('../controllers/adminController');
 | 
					const passport = require('passport')
 | 
				
			||||||
 | 
					const LocalStrategy = require('passport-local');
 | 
				
			||||||
 | 
					const { initSessionsData, createUser, authenticate } = require('../controllers/adminController');
 | 
				
			||||||
const router = express.Router();
 | 
					const router = express.Router();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					passport.use(new LocalStrategy(async function verify(username, password, cb) {
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    const user = await authenticate(username, password);
 | 
				
			||||||
 | 
					    delete user._id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (user) {
 | 
				
			||||||
 | 
					      return cb(null, user);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return cb(null, false, { message: 'Incorrect username or password.' });
 | 
				
			||||||
 | 
					  } catch (err) {
 | 
				
			||||||
 | 
					    return cb(null, false, { message: 'Incorrect username or password.' });
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					passport.serializeUser(function(user, cb) {
 | 
				
			||||||
 | 
					  process.nextTick(function() {
 | 
				
			||||||
 | 
					    const { id, username, roles, firstname, lastname, vid } = user;
 | 
				
			||||||
 | 
					    cb(null, { id, username, roles, firstname, lastname, vid });
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					passport.deserializeUser(function(user, cb) {
 | 
				
			||||||
 | 
					  process.nextTick(function() {
 | 
				
			||||||
 | 
					    return cb(null, user);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
router.get('/init-sessions', async(req, res) => {
 | 
					router.get('/init-sessions', async(req, res) => {
 | 
				
			||||||
@@ -13,4 +41,31 @@ router.get('/init-sessions', async(req, res) => {
 | 
				
			|||||||
  }
 | 
					  }
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					router.post('/user/create', async(req, res) => {
 | 
				
			||||||
 | 
					  await createUser(req);
 | 
				
			||||||
 | 
					  res.status(201);
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					router.post('/user/authenticate',
 | 
				
			||||||
 | 
					  passport.authenticate('local'),
 | 
				
			||||||
 | 
					  function(req, res) {
 | 
				
			||||||
 | 
					    console.log('req.user :>> ', req.isAuthenticated(), req.user);
 | 
				
			||||||
 | 
					    res.json(req.user);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					router.get('/user/alive',
 | 
				
			||||||
 | 
					  function(req, res) {
 | 
				
			||||||
 | 
					    console.log('req.user :>> ', req.isAuthenticated());
 | 
				
			||||||
 | 
					    res.status(200).json(req.user);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					router.get('/user/logout', function(req, res, next) {
 | 
				
			||||||
 | 
					  req.logout(function(err) {
 | 
				
			||||||
 | 
					    if (err) { return next(err); }
 | 
				
			||||||
 | 
					    req.session.destroy();
 | 
				
			||||||
 | 
					    res.status(200).send();
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = router;
 | 
					module.exports = router;
 | 
				
			||||||
@@ -43,7 +43,6 @@ router.get('/sessions/all/now', async(req, res) => {
 | 
				
			|||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
router.get('/flightplans/latest', async(req, res) => {
 | 
					router.get('/flightplans/latest', async(req, res) => {
 | 
				
			||||||
  console.log('object :>> ', '/flightplans/latest');
 | 
					 | 
				
			||||||
  try {
 | 
					  try {
 | 
				
			||||||
    const data = await getLatestsFlightPlans();
 | 
					    const data = await getLatestsFlightPlans();
 | 
				
			||||||
    res.status(200).json(data);
 | 
					    res.status(200).json(data);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										66
									
								
								index.js
									
									
									
									
									
								
							
							
						
						
									
										66
									
								
								index.js
									
									
									
									
									
								
							@@ -4,44 +4,84 @@ require('./app/tasks/sync')();
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const express = require("express");
 | 
					const express = require("express");
 | 
				
			||||||
const bodyParser = require("body-parser");
 | 
					const bodyParser = require("body-parser");
 | 
				
			||||||
 | 
					const cookieParser = require('cookie-parser');
 | 
				
			||||||
const cors = require("cors");
 | 
					const cors = require("cors");
 | 
				
			||||||
const helmet = require("helmet");
 | 
					const helmet = require("helmet");
 | 
				
			||||||
 | 
					const session = require('express-session');
 | 
				
			||||||
 | 
					const passport = require('passport');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const RedisStore = require("connect-redis")(session);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const ivaoRoutes = require('./app/routes/ivao');
 | 
					const ivaoRoutes = require('./app/routes/ivao');
 | 
				
			||||||
const ltsRoutes = require('./app/routes/lts');
 | 
					const ltsRoutes = require('./app/routes/lts');
 | 
				
			||||||
const adminRoutes = require('./app/routes/admin');
 | 
					const adminRoutes = require('./app/routes/admin');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const app = express();
 | 
					const app = express();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// const whitelist = process.env.HOSTS_WHITELIST ? process.env.HOSTS_WHITELIST.split(',') : [];
 | 
					const whitelist = process.env.HOSTS_WHITELIST ? process.env.HOSTS_WHITELIST.split(',') : [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// parse application/json
 | 
					// parse application/json
 | 
				
			||||||
app.use(bodyParser.json());
 | 
					app.use(bodyParser.json());
 | 
				
			||||||
 | 
					app.use(cookieParser());
 | 
				
			||||||
// parse application/x-www-form-urlencoded
 | 
					// parse application/x-www-form-urlencoded
 | 
				
			||||||
app.use(bodyParser.urlencoded({ extended: true }));
 | 
					app.use(bodyParser.urlencoded({ extended: true }));
 | 
				
			||||||
 | 
					var corsOptions = {
 | 
				
			||||||
// var corsOptions = {
 | 
					  origin: function(origin, callback) {
 | 
				
			||||||
//   origin: function(origin, callback) {
 | 
					    if (whitelist.indexOf(origin) !== -1) {
 | 
				
			||||||
//     if (whitelist.indexOf(origin) !== -1) {
 | 
					      callback(null, true)
 | 
				
			||||||
//       callback(null, true)
 | 
					    } else {
 | 
				
			||||||
//     } else {
 | 
					      callback(new Error('Not allowed by CORS'))
 | 
				
			||||||
//       callback(new Error('Not allowed by CORS'))
 | 
					    }
 | 
				
			||||||
//     }
 | 
					  },
 | 
				
			||||||
//   }
 | 
					  credentials: true
 | 
				
			||||||
// };
 | 
					};
 | 
				
			||||||
// use cors options
 | 
					// use cors options
 | 
				
			||||||
app.use(cors());
 | 
					app.use(cors(corsOptions));
 | 
				
			||||||
app.use(helmet.referrerPolicy({
 | 
					app.use(helmet.referrerPolicy({
 | 
				
			||||||
  policy: ["origin", "unsafe-url"],
 | 
					  policy: ["origin", "unsafe-url"],
 | 
				
			||||||
}));
 | 
					}));
 | 
				
			||||||
app.use(express.static('assets'));
 | 
					app.use(express.static('assets'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const { createClient } = require("redis");
 | 
				
			||||||
 | 
					const redisClient = createClient({
 | 
				
			||||||
 | 
					  socket: {
 | 
				
			||||||
 | 
					    host: process.env.REDIS_HOST,
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  legacyMode: true
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					redisClient.connect().catch(console.error);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					app.use(session({
 | 
				
			||||||
 | 
					  secret: '94e353a57052a1bc1808a2010d74f8a5',
 | 
				
			||||||
 | 
					  resave: false,
 | 
				
			||||||
 | 
					  saveUninitialized: false,
 | 
				
			||||||
 | 
					  store: new RedisStore({ client: redisClient }),
 | 
				
			||||||
 | 
					  cookie: {
 | 
				
			||||||
 | 
					    secure: false,
 | 
				
			||||||
 | 
					    maxAge: 1000 * 60 * 60 * 24
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}));
 | 
				
			||||||
 | 
					app.use(passport.authenticate('session'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// routes
 | 
					// routes
 | 
				
			||||||
app.use('/api/v1/ivao', ivaoRoutes);
 | 
					app.use('/api/v1/ivao', ivaoRoutes);
 | 
				
			||||||
app.use('/api/v1', ltsRoutes);
 | 
					app.use('/api/v1', ltsRoutes);
 | 
				
			||||||
app.use('/api/v1/admin', adminRoutes);
 | 
					app.use('/api/v1/admin', adminRoutes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// app.use(function(req, res, next) {
 | 
				
			||||||
 | 
					//   var msgs = req.session.messages || [];
 | 
				
			||||||
 | 
					//   res.locals.messages = msgs;
 | 
				
			||||||
 | 
					//   res.locals.hasMessages = !!msgs.length;
 | 
				
			||||||
 | 
					//   req.session.messages = [];
 | 
				
			||||||
 | 
					//   next();
 | 
				
			||||||
 | 
					// });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// app.use(passport.initialize());
 | 
				
			||||||
 | 
					// app.use(passport.session());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// listening port
 | 
					// listening port
 | 
				
			||||||
const PORT = process.env.PORT || 3000;
 | 
					const PORT = process.env.PORT || 3000;
 | 
				
			||||||
app.listen(PORT, () => {
 | 
					app.listen(PORT, () => {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										265
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										265
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -10,15 +10,22 @@
 | 
				
			|||||||
      "license": "ISC",
 | 
					      "license": "ISC",
 | 
				
			||||||
      "dependencies": {
 | 
					      "dependencies": {
 | 
				
			||||||
        "axios": "^1.2.2",
 | 
					        "axios": "^1.2.2",
 | 
				
			||||||
 | 
					        "bcryptjs": "^2.4.3",
 | 
				
			||||||
        "body-parser": "^1.20.1",
 | 
					        "body-parser": "^1.20.1",
 | 
				
			||||||
 | 
					        "connect-redis": "^6.1.3",
 | 
				
			||||||
 | 
					        "cookie-parser": "^1.4.6",
 | 
				
			||||||
        "cors": "^2.8.5",
 | 
					        "cors": "^2.8.5",
 | 
				
			||||||
        "dotenv": "^16.0.3",
 | 
					        "dotenv": "^16.0.3",
 | 
				
			||||||
        "express": "^4.18.2",
 | 
					        "express": "^4.18.2",
 | 
				
			||||||
 | 
					        "express-session": "^1.17.3",
 | 
				
			||||||
        "helmet": "^6.0.1",
 | 
					        "helmet": "^6.0.1",
 | 
				
			||||||
        "moment": "^2.29.4",
 | 
					        "moment": "^2.29.4",
 | 
				
			||||||
        "mongodb": "^4.13.0",
 | 
					        "mongodb": "^4.13.0",
 | 
				
			||||||
        "node": "^19.3.0",
 | 
					        "node": "^19.3.0",
 | 
				
			||||||
        "node-cron": "^3.0.2",
 | 
					        "node-cron": "^3.0.2",
 | 
				
			||||||
 | 
					        "oauth2orize": "^1.11.1",
 | 
				
			||||||
 | 
					        "passport": "^0.6.0",
 | 
				
			||||||
 | 
					        "passport-local": "^1.0.0",
 | 
				
			||||||
        "promise-mysql": "^5.2.0",
 | 
					        "promise-mysql": "^5.2.0",
 | 
				
			||||||
        "redis": "^4.5.1"
 | 
					        "redis": "^4.5.1"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
@@ -1458,6 +1465,11 @@
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
      ]
 | 
					      ]
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/bcryptjs": {
 | 
				
			||||||
 | 
					      "version": "2.4.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/bignumber.js": {
 | 
					    "node_modules/bignumber.js": {
 | 
				
			||||||
      "version": "9.0.0",
 | 
					      "version": "9.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
 | 
				
			||||||
@@ -1701,6 +1713,14 @@
 | 
				
			|||||||
      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
 | 
					      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
 | 
				
			||||||
      "dev": true
 | 
					      "dev": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/connect-redis": {
 | 
				
			||||||
 | 
					      "version": "6.1.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-6.1.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-aaNluLlAn/3JPxRwdzw7lhvEoU6Enb+d83xnokUNhC9dktqBoawKWL+WuxinxvBLTz6q9vReTnUDnUslaz74aw==",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">=12"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/content-disposition": {
 | 
					    "node_modules/content-disposition": {
 | 
				
			||||||
      "version": "0.5.4",
 | 
					      "version": "0.5.4",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
 | 
				
			||||||
@@ -1728,6 +1748,26 @@
 | 
				
			|||||||
        "node": ">= 0.6"
 | 
					        "node": ">= 0.6"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/cookie-parser": {
 | 
				
			||||||
 | 
					      "version": "1.4.6",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "cookie": "0.4.1",
 | 
				
			||||||
 | 
					        "cookie-signature": "1.0.6"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 0.8.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/cookie-parser/node_modules/cookie": {
 | 
				
			||||||
 | 
					      "version": "0.4.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 0.6"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/cookie-signature": {
 | 
					    "node_modules/cookie-signature": {
 | 
				
			||||||
      "version": "1.0.6",
 | 
					      "version": "1.0.6",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
 | 
				
			||||||
@@ -2101,6 +2141,32 @@
 | 
				
			|||||||
        "node": ">= 0.10.0"
 | 
					        "node": ">= 0.10.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/express-session": {
 | 
				
			||||||
 | 
					      "version": "1.17.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "cookie": "0.4.2",
 | 
				
			||||||
 | 
					        "cookie-signature": "1.0.6",
 | 
				
			||||||
 | 
					        "debug": "2.6.9",
 | 
				
			||||||
 | 
					        "depd": "~2.0.0",
 | 
				
			||||||
 | 
					        "on-headers": "~1.0.2",
 | 
				
			||||||
 | 
					        "parseurl": "~1.3.3",
 | 
				
			||||||
 | 
					        "safe-buffer": "5.2.1",
 | 
				
			||||||
 | 
					        "uid-safe": "~2.1.5"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 0.8.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/express-session/node_modules/cookie": {
 | 
				
			||||||
 | 
					      "version": "0.4.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 0.6"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/fast-deep-equal": {
 | 
					    "node_modules/fast-deep-equal": {
 | 
				
			||||||
      "version": "3.1.3",
 | 
					      "version": "3.1.3",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
 | 
				
			||||||
@@ -2888,6 +2954,23 @@
 | 
				
			|||||||
        "node": ">=0.10.0"
 | 
					        "node": ">=0.10.0"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/oauth2orize": {
 | 
				
			||||||
 | 
					      "version": "1.11.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/oauth2orize/-/oauth2orize-1.11.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-9dSx/Gwm0J2Rvj4RH9+h7iXVnRXZ6biwWRgb2dCeQhCosODS0nYdM9I/G7BUGsjbgn0pHjGcn1zcCRtzj2SlRA==",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "debug": "2.x.x",
 | 
				
			||||||
 | 
					        "uid2": "0.0.x",
 | 
				
			||||||
 | 
					        "utils-merge": "1.x.x"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 0.4.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "type": "github",
 | 
				
			||||||
 | 
					        "url": "https://github.com/sponsors/jaredhanson"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/object-assign": {
 | 
					    "node_modules/object-assign": {
 | 
				
			||||||
      "version": "4.1.1",
 | 
					      "version": "4.1.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
 | 
				
			||||||
@@ -2915,6 +2998,14 @@
 | 
				
			|||||||
        "node": ">= 0.8"
 | 
					        "node": ">= 0.8"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/on-headers": {
 | 
				
			||||||
 | 
					      "version": "1.0.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 0.8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/once": {
 | 
					    "node_modules/once": {
 | 
				
			||||||
      "version": "1.4.0",
 | 
					      "version": "1.4.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
 | 
				
			||||||
@@ -2991,6 +3082,42 @@
 | 
				
			|||||||
        "node": ">= 0.8"
 | 
					        "node": ">= 0.8"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/passport": {
 | 
				
			||||||
 | 
					      "version": "0.6.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "passport-strategy": "1.x.x",
 | 
				
			||||||
 | 
					        "pause": "0.0.1",
 | 
				
			||||||
 | 
					        "utils-merge": "^1.0.1"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 0.4.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "funding": {
 | 
				
			||||||
 | 
					        "type": "github",
 | 
				
			||||||
 | 
					        "url": "https://github.com/sponsors/jaredhanson"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/passport-local": {
 | 
				
			||||||
 | 
					      "version": "1.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "passport-strategy": "1.x.x"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 0.4.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/passport-strategy": {
 | 
				
			||||||
 | 
					      "version": "1.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 0.4.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/path-exists": {
 | 
					    "node_modules/path-exists": {
 | 
				
			||||||
      "version": "4.0.0",
 | 
					      "version": "4.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
 | 
				
			||||||
@@ -3023,6 +3150,11 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
 | 
				
			||||||
      "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
 | 
					      "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/pause": {
 | 
				
			||||||
 | 
					      "version": "0.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/picomatch": {
 | 
					    "node_modules/picomatch": {
 | 
				
			||||||
      "version": "2.3.1",
 | 
					      "version": "2.3.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
 | 
				
			||||||
@@ -3125,6 +3257,14 @@
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
      ]
 | 
					      ]
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/random-bytes": {
 | 
				
			||||||
 | 
					      "version": "1.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==",
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 0.8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/range-parser": {
 | 
					    "node_modules/range-parser": {
 | 
				
			||||||
      "version": "1.2.1",
 | 
					      "version": "1.2.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
 | 
				
			||||||
@@ -3600,6 +3740,22 @@
 | 
				
			|||||||
        "node": ">= 0.6"
 | 
					        "node": ">= 0.6"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/uid-safe": {
 | 
				
			||||||
 | 
					      "version": "2.1.5",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "random-bytes": "~1.0.0"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "engines": {
 | 
				
			||||||
 | 
					        "node": ">= 0.8"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "node_modules/uid2": {
 | 
				
			||||||
 | 
					      "version": "0.0.4",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "node_modules/undefsafe": {
 | 
					    "node_modules/undefsafe": {
 | 
				
			||||||
      "version": "2.0.5",
 | 
					      "version": "2.0.5",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
 | 
				
			||||||
@@ -4901,6 +5057,11 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
 | 
				
			||||||
      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
 | 
					      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "bcryptjs": {
 | 
				
			||||||
 | 
					      "version": "2.4.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-V/Hy/X9Vt7f3BbPJEi8BdVFMByHi+jNXrYkW3huaybV/kQ0KJg0Y6PkEMbn+zeT+i+SiKZ/HMqJGIIt4LZDqNQ=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "bignumber.js": {
 | 
					    "bignumber.js": {
 | 
				
			||||||
      "version": "9.0.0",
 | 
					      "version": "9.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
 | 
				
			||||||
@@ -5075,6 +5236,11 @@
 | 
				
			|||||||
      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
 | 
					      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
 | 
				
			||||||
      "dev": true
 | 
					      "dev": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "connect-redis": {
 | 
				
			||||||
 | 
					      "version": "6.1.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-6.1.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-aaNluLlAn/3JPxRwdzw7lhvEoU6Enb+d83xnokUNhC9dktqBoawKWL+WuxinxvBLTz6q9vReTnUDnUslaz74aw=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "content-disposition": {
 | 
					    "content-disposition": {
 | 
				
			||||||
      "version": "0.5.4",
 | 
					      "version": "0.5.4",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
 | 
				
			||||||
@@ -5093,6 +5259,22 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
 | 
				
			||||||
      "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
 | 
					      "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "cookie-parser": {
 | 
				
			||||||
 | 
					      "version": "1.4.6",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "cookie": "0.4.1",
 | 
				
			||||||
 | 
					        "cookie-signature": "1.0.6"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "cookie": {
 | 
				
			||||||
 | 
					          "version": "0.4.1",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA=="
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "cookie-signature": {
 | 
					    "cookie-signature": {
 | 
				
			||||||
      "version": "1.0.6",
 | 
					      "version": "1.0.6",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
 | 
				
			||||||
@@ -5377,6 +5559,28 @@
 | 
				
			|||||||
        "vary": "~1.1.2"
 | 
					        "vary": "~1.1.2"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "express-session": {
 | 
				
			||||||
 | 
					      "version": "1.17.3",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.3.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "cookie": "0.4.2",
 | 
				
			||||||
 | 
					        "cookie-signature": "1.0.6",
 | 
				
			||||||
 | 
					        "debug": "2.6.9",
 | 
				
			||||||
 | 
					        "depd": "~2.0.0",
 | 
				
			||||||
 | 
					        "on-headers": "~1.0.2",
 | 
				
			||||||
 | 
					        "parseurl": "~1.3.3",
 | 
				
			||||||
 | 
					        "safe-buffer": "5.2.1",
 | 
				
			||||||
 | 
					        "uid-safe": "~2.1.5"
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					      "dependencies": {
 | 
				
			||||||
 | 
					        "cookie": {
 | 
				
			||||||
 | 
					          "version": "0.4.2",
 | 
				
			||||||
 | 
					          "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
 | 
				
			||||||
 | 
					          "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "fast-deep-equal": {
 | 
					    "fast-deep-equal": {
 | 
				
			||||||
      "version": "3.1.3",
 | 
					      "version": "3.1.3",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
 | 
				
			||||||
@@ -5947,6 +6151,16 @@
 | 
				
			|||||||
      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
 | 
					      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
 | 
				
			||||||
      "dev": true
 | 
					      "dev": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "oauth2orize": {
 | 
				
			||||||
 | 
					      "version": "1.11.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/oauth2orize/-/oauth2orize-1.11.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-9dSx/Gwm0J2Rvj4RH9+h7iXVnRXZ6biwWRgb2dCeQhCosODS0nYdM9I/G7BUGsjbgn0pHjGcn1zcCRtzj2SlRA==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "debug": "2.x.x",
 | 
				
			||||||
 | 
					        "uid2": "0.0.x",
 | 
				
			||||||
 | 
					        "utils-merge": "1.x.x"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "object-assign": {
 | 
					    "object-assign": {
 | 
				
			||||||
      "version": "4.1.1",
 | 
					      "version": "4.1.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
 | 
				
			||||||
@@ -5965,6 +6179,11 @@
 | 
				
			|||||||
        "ee-first": "1.1.1"
 | 
					        "ee-first": "1.1.1"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "on-headers": {
 | 
				
			||||||
 | 
					      "version": "1.0.2",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "once": {
 | 
					    "once": {
 | 
				
			||||||
      "version": "1.4.0",
 | 
					      "version": "1.4.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
 | 
				
			||||||
@@ -6020,6 +6239,29 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
 | 
				
			||||||
      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
 | 
					      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "passport": {
 | 
				
			||||||
 | 
					      "version": "0.6.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "passport-strategy": "1.x.x",
 | 
				
			||||||
 | 
					        "pause": "0.0.1",
 | 
				
			||||||
 | 
					        "utils-merge": "^1.0.1"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "passport-local": {
 | 
				
			||||||
 | 
					      "version": "1.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "passport-strategy": "1.x.x"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "passport-strategy": {
 | 
				
			||||||
 | 
					      "version": "1.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "path-exists": {
 | 
					    "path-exists": {
 | 
				
			||||||
      "version": "4.0.0",
 | 
					      "version": "4.0.0",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
 | 
				
			||||||
@@ -6043,6 +6285,11 @@
 | 
				
			|||||||
      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
 | 
				
			||||||
      "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
 | 
					      "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "pause": {
 | 
				
			||||||
 | 
					      "version": "0.0.1",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "picomatch": {
 | 
					    "picomatch": {
 | 
				
			||||||
      "version": "2.3.1",
 | 
					      "version": "2.3.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
 | 
				
			||||||
@@ -6110,6 +6357,11 @@
 | 
				
			|||||||
      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
 | 
					      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
 | 
				
			||||||
      "dev": true
 | 
					      "dev": true
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "random-bytes": {
 | 
				
			||||||
 | 
					      "version": "1.0.0",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "range-parser": {
 | 
					    "range-parser": {
 | 
				
			||||||
      "version": "1.2.1",
 | 
					      "version": "1.2.1",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
 | 
				
			||||||
@@ -6460,6 +6712,19 @@
 | 
				
			|||||||
        "mime-types": "~2.1.24"
 | 
					        "mime-types": "~2.1.24"
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
 | 
					    "uid-safe": {
 | 
				
			||||||
 | 
					      "version": "2.1.5",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
 | 
				
			||||||
 | 
					      "requires": {
 | 
				
			||||||
 | 
					        "random-bytes": "~1.0.0"
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    "uid2": {
 | 
				
			||||||
 | 
					      "version": "0.0.4",
 | 
				
			||||||
 | 
					      "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz",
 | 
				
			||||||
 | 
					      "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA=="
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
    "undefsafe": {
 | 
					    "undefsafe": {
 | 
				
			||||||
      "version": "2.0.5",
 | 
					      "version": "2.0.5",
 | 
				
			||||||
      "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
 | 
					      "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,15 +12,22 @@
 | 
				
			|||||||
  "license": "ISC",
 | 
					  "license": "ISC",
 | 
				
			||||||
  "dependencies": {
 | 
					  "dependencies": {
 | 
				
			||||||
    "axios": "^1.2.2",
 | 
					    "axios": "^1.2.2",
 | 
				
			||||||
 | 
					    "bcryptjs": "^2.4.3",
 | 
				
			||||||
    "body-parser": "^1.20.1",
 | 
					    "body-parser": "^1.20.1",
 | 
				
			||||||
 | 
					    "connect-redis": "^6.1.3",
 | 
				
			||||||
 | 
					    "cookie-parser": "^1.4.6",
 | 
				
			||||||
    "cors": "^2.8.5",
 | 
					    "cors": "^2.8.5",
 | 
				
			||||||
    "dotenv": "^16.0.3",
 | 
					    "dotenv": "^16.0.3",
 | 
				
			||||||
    "express": "^4.18.2",
 | 
					    "express": "^4.18.2",
 | 
				
			||||||
 | 
					    "express-session": "^1.17.3",
 | 
				
			||||||
    "helmet": "^6.0.1",
 | 
					    "helmet": "^6.0.1",
 | 
				
			||||||
    "moment": "^2.29.4",
 | 
					    "moment": "^2.29.4",
 | 
				
			||||||
    "mongodb": "^4.13.0",
 | 
					    "mongodb": "^4.13.0",
 | 
				
			||||||
    "node": "^19.3.0",
 | 
					    "node": "^19.3.0",
 | 
				
			||||||
    "node-cron": "^3.0.2",
 | 
					    "node-cron": "^3.0.2",
 | 
				
			||||||
 | 
					    "oauth2orize": "^1.11.1",
 | 
				
			||||||
 | 
					    "passport": "^0.6.0",
 | 
				
			||||||
 | 
					    "passport-local": "^1.0.0",
 | 
				
			||||||
    "promise-mysql": "^5.2.0",
 | 
					    "promise-mysql": "^5.2.0",
 | 
				
			||||||
    "redis": "^4.5.1"
 | 
					    "redis": "^4.5.1"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
@@ -28,4 +35,4 @@
 | 
				
			|||||||
    "eslint": "^8.31.0",
 | 
					    "eslint": "^8.31.0",
 | 
				
			||||||
    "nodemon": "^2.0.20"
 | 
					    "nodemon": "^2.0.20"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										21
									
								
								test.js
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								test.js
									
									
									
									
									
								
							@@ -6,6 +6,8 @@ const data = require('./testData/short.json');
 | 
				
			|||||||
const { analize, getShortStates, getAirTime } = require('./app/controllers/trackerAnalizer');
 | 
					const { analize, getShortStates, getAirTime } = require('./app/controllers/trackerAnalizer');
 | 
				
			||||||
const { getSessions, getSessionTracks, updateSessionTracks } = require('./app/db/mongo/mongoSessions');
 | 
					const { getSessions, getSessionTracks, updateSessionTracks } = require('./app/db/mongo/mongoSessions');
 | 
				
			||||||
const { getIvaoPilotsNow } = require('./app/requests/ivao/session');
 | 
					const { getIvaoPilotsNow } = require('./app/requests/ivao/session');
 | 
				
			||||||
 | 
					const { createUserMongo } = require('./app/db/mongo/mongoUsers');
 | 
				
			||||||
 | 
					const { getHashedPassword } = require('./app/controllers/adminController');
 | 
				
			||||||
// const { getHistoricalSessions, getSessionTracks } = require('./app/requests/ivao/session');
 | 
					// const { getHistoricalSessions, getSessionTracks } = require('./app/requests/ivao/session');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -45,7 +47,24 @@ async function recalculateTime() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async function f() {
 | 
					async function f() {
 | 
				
			||||||
  console.log((await getIvaoPilotsNow(true)).length);
 | 
					
 | 
				
			||||||
 | 
					  const crypto = require('crypto');
 | 
				
			||||||
 | 
					  await createUserMongo({
 | 
				
			||||||
 | 
					    id: crypto.randomBytes(16).toString("hex"),
 | 
				
			||||||
 | 
					    username: 'admin',
 | 
				
			||||||
 | 
					    hash: getHashedPassword('nevada98'),
 | 
				
			||||||
 | 
					    roles: ['admin']
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  await createUserMongo({
 | 
				
			||||||
 | 
					    id: crypto.randomBytes(16).toString("hex"),
 | 
				
			||||||
 | 
					    username: 'capcabal',
 | 
				
			||||||
 | 
					    hash: getHashedPassword('Kpitan123'),
 | 
				
			||||||
 | 
					    roles: ['cabal'],
 | 
				
			||||||
 | 
					    firstname: 'Carlos',
 | 
				
			||||||
 | 
					    lastname: 'Cabal',
 | 
				
			||||||
 | 
					    vid: 665507
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
f();
 | 
					f();
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user