MeteoriteH/Back/routes/persistence.js

320 lines
7.2 KiB
JavaScript

const express = require("express")
const router = express.Router()
const bodyParser = require("body-parser")
const games = require("./../model/games.js")
require("dotenv").config()
const RCC_HOST = process.env.RCC_HOST
router.use(bodyParser.text({ limit: "100mb" }))
router.use(async function (req, res, next) {
var ip =
req.headers["cf-connecting-ip"] ||
req.socket.remoteAddress.replace(/^.*:/, "")
console.log(ip)
if (ip === RCC_HOST || ip == "::ffff:" + RCC_HOST) {
return next()
}
return res.status(403)
})
router.post("/getV2", async (req, res) => {
const placeid = req.query.placeId
const scope = req.query.scope
const game = await games.findOne({ idofgame: placeid }).lean()
if (!game.datastore) {
return res.json({
data: [
{
Key: {
Scope: req.body.qkeys[0],
Target: "KEY",
Key: req.body.qkeys[1],
},
Value: "nil",
},
],
})
}
const datastore = JSON.parse(game.datastore)
// first make sure database exists then make sure scope exists finally make sure key exists inside scope
if (
datastore[req.body.qkeys[2]] &&
datastore[req.body.qkeys[2]][req.body.qkeys[0]] &&
datastore[req.body.qkeys[2]][req.body.qkeys[0]][req.body.qkeys[1]]
) {
// 2 = database name
// 1 = Key name
// 0 = scope
var wow = {
data: [
{
Key: {
Scope: req.body.qkeys[0],
Target: "KEY",
Key: req.body.qkeys[1],
},
Value: datastore[req.body.qkeys[2]][req.body.qkeys[0]][
req.body.qkeys[1]
].value,
},
],
}
//console.log(req.body)
console.dir(wow, { depth: null })
return res.json(wow)
}
return res.json({
data: [
{
Key: {
Scope: req.body.qkeys[0],
Target: "KEY",
Key: req.body.qkeys[1],
},
Value: "nil",
},
],
})
})
router.post("/set", async (req, res) => {
const placeid = req.query.placeId
const game = await games.findOne({ idofgame: placeid }).lean()
if (!game) {
return res.sendStatus(404)
}
let currentdatastore
if (!game.datastore) {
try {
await games.updateOne(
{ idofgame: placeid },
{
$set: {
datastore: JSON.stringify({
[req.query.key]: {
[req.query.scope]: {
[req.query.target]: {
value: req.body.value,
},
},
type: req.query.type,
},
}),
},
},
function (err, doc) {
//console.log(err)
},
)
} catch {}
return res.json({
data: [
{
Key: {
Scope: req.query.key,
Target: "KEY",
Key: [req.query.target],
},
Value: req.body.value,
},
],
})
}
currentdatastore = JSON.parse(game.datastore)
if (currentdatastore[req.query.key]) {
// if database name already exists
console.log("1")
if (currentdatastore[req.query.key][[req.query.scope]]) {
// if database scope already exists
console.log("2")
if (
currentdatastore[req.query.key][req.query.scope][
req.query.target
]
) {
// key already stored overwrite it
console.log("3")
currentdatastore[req.query.key][req.query.scope][
req.query.target
] = { value: req.body.value }
} else {
console.log("4")
currentdatastore[req.query.key][req.query.scope][
req.query.target
] = { value: req.body.value } // database scope exists but key doesn't so generate it
}
} else {
currentdatastore[req.query.key][req.query.scope] = {
[req.query.target]: { value: req.body.value },
} // scope doesn't exist
}
} else {
currentdatastore[req.query.key] = {
[req.query.scope]: {
[req.query.target]: { value: req.body.value },
},
type: req.query.type,
} // database doesn't exist make sure to pass database type as well
}
try {
await games.updateOne(
{ idofgame: placeid },
{
$set: {
datastore: JSON.stringify(currentdatastore),
},
},
function (err, doc) {
//console.log(err)
},
)
} catch {}
//console.log(req.body)
res.json({
data: [
{
Key: {
Scope: req.query.key,
Target: "KEY",
Key: [req.query.target],
},
Value: req.body.value,
},
],
})
})
router.post("/increment", async (req, res) => {
const placeid = req.query.placeId
const game = await games.findOne({ idofgame: placeid }).lean()
if (!game) {
return res.sendStatus(404)
}
let currentdatastore
if (!game.datastore) {
res.json({ data: {} })
}
currentdatastore = JSON.parse(game.datastore)
if (
currentdatastore[req.query.key] &&
currentdatastore[req.query.key][req.query.scope] &&
currentdatastore[req.query.key][req.query.scope][req.query.target]
) {
let value = parseFloat(
currentdatastore[req.query.key][req.query.scope][req.query.target]
.value,
)
if (!isNaN(parseFloat(value)) === true) {
// is number
let newvalue = (value += parseFloat(req.query.value))
currentdatastore[req.query.key][req.query.scope][
req.query.target
].value = newvalue.toString()
try {
await games.updateOne(
{ idofgame: placeid },
{
$set: {
datastore: JSON.stringify(currentdatastore),
},
},
function (err, doc) {
//console.log(err)
},
)
} catch {}
//console.log(req.body)
return res.json({
data: [
{
Key: {
Scope: req.query.key,
Target: "KEY",
Key: [req.query.target],
},
Value: parseFloat(
currentdatastore[req.query.key][req.query.scope][
req.query.target
].value,
),
},
],
})
}
}
res.json({ data: {} })
})
router.post("/getSortedValues", async (req, res) => {
const placeid = req.query.placeId
const game = await games.findOne({ idofgame: placeid }).lean()
if (!game) {
return res.sendStatus(404)
}
if (!game.datastore) {
return res.json({ data: { Entries: [], ExclusiveStartKey: null } })
}
const datastore = JSON.parse(game.datastore)
// first make sure database exists then make sure scope exists
if (datastore[req.query.key] && datastore[req.query.key][req.query.scope]) {
function paginate(array, page_size, page_number) {
// human-readable page numbers usually start with 1, so we reduce 1 in the first argument
return array.slice(
(page_number - 1) * page_size,
page_number * page_size,
)
}
let wow = { data: { Entries: [], ExclusiveStartKey: null } }
//console.log(datastore[req.query.key][req.query.scope])
const pageNumber = req.query.exclusiveStartKey ?? 1
for (const [key, value] of Object.entries(
datastore[req.query.key][req.query.scope],
)) {
wow.data.Entries.push({ Target: key, Value: value.value })
}
if (req.query.ascending === "False") {
// descending order
wow.data.Entries.sort((a, b) => a.Value - b.Value).reverse()
} else {
//ascending
wow.data.Entries.sort((a, b) => a.Value - b.Value)
}
wow.data.Entries = paginate(
wow.data.Entries,
req.query.pageSize,
pageNumber,
)
if (
Object.entries(datastore[req.query.key][req.query.scope]).length >
pageNumber * req.query.pageSize
) {
// if the next page exists fill the exclusivestartkey
wow.data.ExclusiveStartKey = (parseFloat(pageNumber) + 1).toString()
}
//console.log(req.body)
//console.dir(wow,{ depth: null })
return res.json(wow)
}
return res.json({ data: { Entries: [], ExclusiveStartKey: null } })
})
module.exports = router