added service api

This commit is contained in:
Jyotirmoy Bandyopadhayaya 2022-05-04 11:09:41 +05:30
commit d59e70a1a8
14 changed files with 1749 additions and 0 deletions

2
server/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
node_modules
.env

43
server/app.js Normal file
View File

@ -0,0 +1,43 @@
const express = require("express");
const session = require("express-session");
const mdb = require("./config/mongodb");
const mongoStore = require("connect-mongo");
const keys = require("./config/keys");
const app = express();
const axios = require("axios");
app.use(
session({
secret: keys.sessionSecret,
resave: false,
saveUninitialized: false,
cookie: {
maxAge: 1000 * 60 * 60 * 24 * 7,
},
store: mongoStore.create({
clientPromise: mdb,
}),
})
);
// Self pinger as status updater
setInterval(() => {
const config = {
url: `http://localhost:${process.env.PORT}/status/ping/${keys.pingusername}`,
}
axios(config)
.then(function (response) {
console.log("Self Ping Completed");
})
.catch(function (error) {
console.log(error);
}
);
}, 120000);
app.use("/", require("./routes"));
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => {
console.log("API listening on port "+ PORT + "!");
});

9
server/config/keys.js Normal file
View File

@ -0,0 +1,9 @@
require("dotenv").config();
module.exports = {
mongoURI: process.env.MONGO_URI,
sessionSecret: process.env.SESSION_SECRET,
discordId: process.env.DISCORD_ID,
pingAuthKey: process.env.PING_REG_AUTH_KEY,
pingusername: process.env.USERNAME_TO_PING,
};

14
server/config/mongodb.js Normal file
View File

@ -0,0 +1,14 @@
const mongoose = require("mongoose");
const keys = require("./keys");
const db = mongoose
.connect(keys.mongoURI)
.then(() => {
console.log("Connected to MongoDB");
return mongoose.connection.getClient();
})
.catch((err) => {
console.log(err);
});
module.exports = db;

View File

@ -0,0 +1,8 @@
const apiRoot = require("../extras/root.json");
module.exports.home = async (req, res, next) => {
res.json({
message: "Welcome to the I-AM-Online Server API!",
apiRoot: apiRoot,
});
};

View File

@ -0,0 +1,116 @@
const keys = require("../config/keys");
const UserStatus = require("../models/userStatus");
const {
format
} = require("date-format-parse")
const {
customAlphabet
} = require("nanoid");
const nanoid = customAlphabet("1234567890abcdefghijklmnopqrstuvwxyz", 10);
// Not used
// module.exports.getUserStatus = async (req, res, next) => {
// const userStatus = await UserStatus.findOne({
// username: req.params.username
// });
// res.json({
// userStatus
// });
// }
module.exports.checkStatus = async (req, res, next) => {
const userStatus = await UserStatus.findOne({
username: req.params.username
});
var lastPingTs = (format(userStatus.lastSeen, "x"));
var currentTs = (format(new Date(), "x"));
// var diff = currentTs - lastPingTs;
// console.log(diff/60000);
if (currentTs - lastPingTs > 240000) {
const updateUserStatusUpdt = await UserStatus.findOneAndUpdate({
username: req.params.username
}, {
amIOnline: false,
status: {
type: "offline",
updatedBy: "i-am-online-server",
via: "web",
heartbeat: {
key: null
}
},
lastSeen: userStatus.lastSeen
});
res.json({
updateUserStatusUpdt
});
} else {
const updateUserStatusUpdt = await UserStatus.findOneAndUpdate({
username: req.params.username
}, {
amIOnline: true,
status: {
type: "online",
updatedBy: "i-am-online-client",
via: "desktop",
heartbeat: {
key: "self"
}
},
lastSeen: userStatus.lastSeen
});
res.json({
updateUserStatusUpdt
});
}
}
module.exports.reportUserStatus = async (req, res, next) => {
if(req.query.auth != keys.pingAuthKey){
return res.json({
error: "Invalid auth key"
});
}
const checkIfUserExists = await UserStatus.findOne({
username: req.params.username
});
if (checkIfUserExists) {
const updateUserStatus = await UserStatus.findOneAndUpdate({
username: req.params.username
}, {
status: {
type: "online",
updatedBy: "i-am-online-client",
via: "desktop",
heartbeat: {
key: nanoid(),
},
},
amIOnline: true,
lastSeen: new Date()
}, {
new: true
});
res.json({
updateUserStatus
});
} else {
const userStatus = new UserStatus({
username: req.params.username,
status: {
type: "online",
via: "desktop",
updatedBy: "i-am-online-client",
heartbeat: {
key: nanoid(),
},
amIOnline: true,
lastSeen: new Date()
},
});
await userStatus.save();
res.json({
userStatus
});
}
};

0
server/extras/docs.json Normal file
View File

5
server/extras/root.json Normal file
View File

@ -0,0 +1,5 @@
{
"name": "i-am-online",
"version": "1.0.0",
"description": "An API for the i-am-online service"
}

View File

@ -0,0 +1,39 @@
const mongoose = require('mongoose');
const userStatusSchema = mongoose.Schema({
username: {
type: String,
required: true
},
status: {
type: {
type: String,
enum: ['online', 'offline', 'busy', 'away'],
},
via: {
type: String,
enum: ['web', 'mobile', 'desktop'],
},
upadtedBy: {
type: String,
enum: ['discord', 'i-am-online-client'],
},
heartbeat: {
key: {
type: String,
},
}
},
lastSeen:{
type: Date,
},
amIOnline : {
type: Boolean,
}
},{
timestamps: true
});
const UserStatus = mongoose.model('UserStatus', userStatusSchema);
module.exports = UserStatus;

31
server/package.json Normal file
View File

@ -0,0 +1,31 @@
{
"name": "i-am-online-server",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"dev": "nodemon app.js",
"start": "node app.js"
},
"git": {
"url": "https://github.com/BRAVO68WEB/i-am-online"
},
"author": "BRAVO68WEB",
"license": "ISC",
"dependencies": {
"axios": "^0.26.1",
"chalk": "^4.1.0",
"connect-mongo": "^4.6.0",
"cors": "^2.8.5",
"date-format-parse": "^0.2.7",
"dotenv": "^16.0.0",
"express": "^4.17.3",
"express-session": "^1.17.2",
"helmet": "^5.0.2",
"mongoose": "^6.3.0",
"nanoid": "^3.3.2"
},
"devDependencies": {
"nodemon": "^2.0.16"
}
}

7
server/routes/home.js Normal file
View File

@ -0,0 +1,7 @@
const express = require("express");
const router = express.Router();
const controllers = require("../controllers/home");
router.get("/", controllers.home);
module.exports = router;

7
server/routes/index.js Normal file
View File

@ -0,0 +1,7 @@
const express = require("express");
const router = express.Router();
router.use("/", require("./home"));
router.use("/status", require("./status"));
module.exports = router;

8
server/routes/status.js Normal file
View File

@ -0,0 +1,8 @@
const express = require("express");
const router = express.Router();
const controllers = require("../controllers/status");
router.get("/heartbeat/:username", controllers.reportUserStatus);
router.get("/ping/:username", controllers.checkStatus);
module.exports = router;

1460
server/yarn.lock Normal file

File diff suppressed because it is too large Load Diff