Include new database management endpoints
This commit is contained in:
parent
847def6d39
commit
677857ae43
374
server/app.js
374
server/app.js
@ -36,25 +36,36 @@ let allowCrossDomain = function(req, res, next) {
|
|||||||
}
|
}
|
||||||
app.use(allowCrossDomain);
|
app.use(allowCrossDomain);
|
||||||
|
|
||||||
const db =
|
var db =
|
||||||
new Pool({
|
new Pool({
|
||||||
user: 'postgres',
|
user: 'postgres',
|
||||||
password: '',
|
password: '',
|
||||||
host: 'postgres',
|
host: 'postgres',
|
||||||
database: 'divar',
|
database: 'ngsplanner',
|
||||||
port: 5432,
|
port: 5432,
|
||||||
})
|
})
|
||||||
|
|
||||||
const db2 =
|
var db2 =
|
||||||
new Pool({
|
new Pool({
|
||||||
user: 'postgres',
|
user: 'postgres',
|
||||||
password: '',
|
password: '',
|
||||||
host: 'postgres',
|
host: 'postgres',
|
||||||
database: 'ngsplanner2',
|
database: 'ngsplanner2',
|
||||||
port: 5432,
|
port: 5432,
|
||||||
})
|
})
|
||||||
|
|
||||||
const ENDPOINTDATA=[
|
var db3 =
|
||||||
|
new Pool({
|
||||||
|
user: 'postgres',
|
||||||
|
password: '',
|
||||||
|
host: 'postgres',
|
||||||
|
database: '',
|
||||||
|
port: 5432,
|
||||||
|
})
|
||||||
|
|
||||||
|
const PREFIX="/ngsplanner"
|
||||||
|
|
||||||
|
const ENDPOINTDATA=[
|
||||||
{
|
{
|
||||||
endpoint:"class",
|
endpoint:"class",
|
||||||
requiredfields:["name"],
|
requiredfields:["name"],
|
||||||
@ -91,6 +102,12 @@ const ENDPOINTDATA=[
|
|||||||
optionalfields:["icon"],
|
optionalfields:["icon"],
|
||||||
excludedfields:[] //Fields to not output in GET.
|
excludedfields:[] //Fields to not output in GET.
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
endpoint:"photon_art",
|
||||||
|
requiredfields:["name","weapon_type_id","potency","dps"],
|
||||||
|
optionalfields:["power_distribution","pp","frames"],
|
||||||
|
excludedfields:[] //Fields to not output in GET.
|
||||||
|
},
|
||||||
{
|
{
|
||||||
endpoint:"armor",
|
endpoint:"armor",
|
||||||
requiredfields:["name","rarity","level_req","def"],
|
requiredfields:["name","rarity","level_req","def"],
|
||||||
@ -133,6 +150,18 @@ const ENDPOINTDATA=[
|
|||||||
optionalfields:["variance","mel_dmg","rng_dmg","tec_dmg","crit_rate","crit_dmg","pp_cost_reduction","active_pp_recovery","natural_pp_recovery","dmg_res","popularity","editors_choice"],
|
optionalfields:["variance","mel_dmg","rng_dmg","tec_dmg","crit_rate","crit_dmg","pp_cost_reduction","active_pp_recovery","natural_pp_recovery","dmg_res","popularity","editors_choice"],
|
||||||
excludedfields:[] //Fields to not output in GET.
|
excludedfields:[] //Fields to not output in GET.
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
endpoint:"class_skill",
|
||||||
|
requiredfields:["name","class_id"],
|
||||||
|
optionalfields:["icon","description"],
|
||||||
|
excludedfields:[] //Fields to not output in GET.
|
||||||
|
},
|
||||||
|
{
|
||||||
|
endpoint:"class_skill_data",
|
||||||
|
requiredfields:["name","class_skill_id","level"],
|
||||||
|
optionalfields:["dependency","effect","duration","cooldown","damage_taken","pa_potency","conditional_buff","pp_recovery","property","all_damage_buff","active_pp_recovery","status_ailment_accum","status_ailment_duration","pp_consumption","max_hp_decrease","natural_pp_recovery","added_pp","pb_gauge_fortification"],
|
||||||
|
excludedfields:[] //Fields to not output in GET.
|
||||||
|
},
|
||||||
{
|
{
|
||||||
endpoint:"augment",
|
endpoint:"augment",
|
||||||
requiredfields:["augment_type_id","name"],
|
requiredfields:["augment_type_id","name"],
|
||||||
@ -145,6 +174,12 @@ const ENDPOINTDATA=[
|
|||||||
optionalfields:["icon"],
|
optionalfields:["icon"],
|
||||||
excludedfields:[] //Fields to not output in GET.
|
excludedfields:[] //Fields to not output in GET.
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
endpoint:"enemy_data",
|
||||||
|
requiredfields:["level","def","atk"],
|
||||||
|
optionalfields:[],
|
||||||
|
excludedfields:[] //Fields to not output in GET.
|
||||||
|
},
|
||||||
{
|
{
|
||||||
endpoint:"food",
|
endpoint:"food",
|
||||||
requiredfields:["name"],
|
requiredfields:["name"],
|
||||||
@ -175,11 +210,238 @@ const ENDPOINTDATA=[
|
|||||||
optionalfields:["old_value"],
|
optionalfields:["old_value"],
|
||||||
excludedfields:[] //Fields to not output in GET.
|
excludedfields:[] //Fields to not output in GET.
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
function CreateDynamicEndpoints() {
|
app.get(PREFIX+"/databases",(req,res)=>{
|
||||||
ENDPOINTDATA.map((endpoint)=>{
|
db.query('select * from pg_database where datname like \'ngsplanner%\' order by datname desc limit 100')
|
||||||
app.get("/ngsplanner/"+endpoint.endpoint,(req,res)=>{
|
.then((data)=>{
|
||||||
|
res.status(200).json(data.rows)
|
||||||
|
})
|
||||||
|
.catch((err)=>{
|
||||||
|
res.status(500).send(err.message)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
app.post(PREFIX+"/databases/restorefrombackup",(req,res)=>{
|
||||||
|
if (req.body.database) {
|
||||||
|
db3.query('select * from pg_database where datname=$1',[req.body.database])
|
||||||
|
.then((data)=>{
|
||||||
|
if (data.rows.length>0) {
|
||||||
|
db.end(()=>{})
|
||||||
|
return db3.query('select pg_terminate_backend (pid) from pg_stat_activity where pg_stat_activity.datname=\'ngsplanner\'')
|
||||||
|
} else {
|
||||||
|
throw "Could not find requested database "+req.body.database
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then(()=>{
|
||||||
|
return db3.query('drop database ngsplanner')
|
||||||
|
})
|
||||||
|
.then(()=>{
|
||||||
|
return db3.query('create database ngsplanner with template '+req.body.database)
|
||||||
|
})
|
||||||
|
.then(()=>{
|
||||||
|
db = new Pool({
|
||||||
|
user: 'postgres',
|
||||||
|
password: '',
|
||||||
|
host: 'postgres',
|
||||||
|
database: 'ngsplanner',
|
||||||
|
port: 5432,
|
||||||
|
})
|
||||||
|
res.status(200).send("Done!")
|
||||||
|
})
|
||||||
|
.catch((err)=>{
|
||||||
|
console.log(err.message)
|
||||||
|
res.status(500).send(err.message)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
res.status(500).send("Invalid data!")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.post(PREFIX+"/databases/testtolive",(req,res)=>{
|
||||||
|
db.end(()=>{})
|
||||||
|
db2.end(()=>{})
|
||||||
|
db3.query('select pg_terminate_backend (pid) from pg_stat_activity where pg_stat_activity.datname=\'ngsplanner\' or pg_stat_activity.datname=\'ngsplanner2\'')
|
||||||
|
.then(()=>{
|
||||||
|
return db3.query('drop database ngsplanner')
|
||||||
|
})
|
||||||
|
.then(()=>{
|
||||||
|
return db3.query('create database ngsplanner with template ngsplanner2')
|
||||||
|
})
|
||||||
|
.then(()=>{
|
||||||
|
db = new Pool({
|
||||||
|
user: 'postgres',
|
||||||
|
password: '',
|
||||||
|
host: 'postgres',
|
||||||
|
database: 'ngsplanner',
|
||||||
|
port: 5432,
|
||||||
|
})
|
||||||
|
db2 = new Pool({
|
||||||
|
user: 'postgres',
|
||||||
|
password: '',
|
||||||
|
host: 'postgres',
|
||||||
|
database: 'ngsplanner2',
|
||||||
|
port: 5432,
|
||||||
|
})
|
||||||
|
res.status(200).send("Done!")
|
||||||
|
})
|
||||||
|
.catch((err)=>{
|
||||||
|
console.log(err.message)
|
||||||
|
res.status(500).send(err.message)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
app.post(PREFIX+"/databases/livetotest",(req,res)=>{
|
||||||
|
db.end(()=>{})
|
||||||
|
db2.end(()=>{})
|
||||||
|
db3.query('select pg_terminate_backend (pid) from pg_stat_activity where pg_stat_activity.datname=\'ngsplanner\' or pg_stat_activity.datname=\'ngsplanner2\'')
|
||||||
|
.then(()=>{
|
||||||
|
return db3.query('drop database ngsplanner2')
|
||||||
|
})
|
||||||
|
.then(()=>{
|
||||||
|
return db3.query('create database ngsplanner2 with template ngsplanner')
|
||||||
|
})
|
||||||
|
.then(()=>{
|
||||||
|
db = new Pool({
|
||||||
|
user: 'postgres',
|
||||||
|
password: '',
|
||||||
|
host: 'postgres',
|
||||||
|
database: 'ngsplanner',
|
||||||
|
port: 5432,
|
||||||
|
})
|
||||||
|
db2 = new Pool({
|
||||||
|
user: 'postgres',
|
||||||
|
password: '',
|
||||||
|
host: 'postgres',
|
||||||
|
database: 'ngsplanner2',
|
||||||
|
port: 5432,
|
||||||
|
})
|
||||||
|
res.status(200).send("Done!")
|
||||||
|
})
|
||||||
|
.catch((err)=>{
|
||||||
|
res.status(500).send(err.message)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
app.post(PREFIX+"/databases/backup",(req,res)=>{
|
||||||
|
db.end(()=>{})
|
||||||
|
var date = new Date()
|
||||||
|
db3.query('select pg_terminate_backend (pid) from pg_stat_activity where pg_stat_activity.datname=\'ngsplanner\'')
|
||||||
|
.then(()=>{
|
||||||
|
return db3.query('create database ngsplanner'+String(date.getFullYear()).padStart(4,'0')+String(date.getMonth()).padStart(2,'0')+String(date.getDate()).padStart(2,'0')+String(date.getHours()).padStart(2,'0')+String(date.getMinutes()).padStart(2,'0')+String(date.getSeconds()).padStart(2,'0')+' with template ngsplanner')
|
||||||
|
})
|
||||||
|
.then(()=>{
|
||||||
|
db = new Pool({
|
||||||
|
user: 'postgres',
|
||||||
|
password: '',
|
||||||
|
host: 'postgres',
|
||||||
|
database: 'ngsplanner',
|
||||||
|
port: 5432,
|
||||||
|
})
|
||||||
|
res.status(200).send("Done!")
|
||||||
|
})
|
||||||
|
.catch((err)=>{
|
||||||
|
res.status(500).send(err.message)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
function CreateDynamicEndpoints() {
|
||||||
|
ENDPOINTDATA.forEach((endpoint)=>{
|
||||||
|
app.get(PREFIX+"/"+endpoint.endpoint,(req,res)=>{
|
||||||
|
if (endpoint.requiredfields.includes("name")) {
|
||||||
|
db.query('select distinct on (name) name,* from '+endpoint.endpoint+' order by name,id desc')
|
||||||
|
.then((data)=>{
|
||||||
|
res.status(200).json({fields:data.fields,rows:data.rows})
|
||||||
|
})
|
||||||
|
.catch((err)=>{
|
||||||
|
res.status(500).send(err.message)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
db.query('select * from '+endpoint.endpoint+" order by id desc")
|
||||||
|
.then((data)=>{
|
||||||
|
res.status(200).json({fields:data.fields,rows:data.rows})
|
||||||
|
})
|
||||||
|
.catch((err)=>{
|
||||||
|
res.status(500).send(err.message)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.post(PREFIX+"/"+endpoint.endpoint,async(req,res)=>{
|
||||||
|
var allExist=true
|
||||||
|
endpoint.requiredfields.forEach((field)=>{
|
||||||
|
if (!(field in req.body)) {
|
||||||
|
allExist=false;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (!allExist) {
|
||||||
|
res.status(300).send("Required fields are: "+endpoint.requiredfields.filter((field)=>!(field in req.body)).join(','))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var combinedfields = [...endpoint.requiredfields,...endpoint.optionalfields,...endpoint.excludedfields]
|
||||||
|
//console.log(combinedfields)
|
||||||
|
var all_filled_fields=combinedfields.filter((field)=>(field in req.body))
|
||||||
|
var requiresInsert=true
|
||||||
|
if (endpoint.requiredfields.includes("name")) {
|
||||||
|
await db.query('update '+endpoint.endpoint+' set '+all_filled_fields.map((field,i)=>field+"=$"+(i+1)).join(",")+' where name=$'+(all_filled_fields.length+1)+' returning *',[...all_filled_fields.map((field)=>req.body[field]),req.body["name"]])
|
||||||
|
.then((data)=>{
|
||||||
|
if (data.rows.length===0) {
|
||||||
|
requiresInsert=true
|
||||||
|
} else {
|
||||||
|
requiresInsert=false
|
||||||
|
res.status(200).json(data.rows)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((err)=>{
|
||||||
|
res.status(500).send(err.message)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if (requiresInsert) {
|
||||||
|
db.query('insert into '+endpoint.endpoint+"("+all_filled_fields.join(',')+") values("+all_filled_fields.map((field,i)=>"$"+(i+1)).join(",")+") returning *",all_filled_fields.map((field)=>req.body[field]))
|
||||||
|
.then((data)=>{
|
||||||
|
res.status(200).json(data.rows)
|
||||||
|
})
|
||||||
|
.catch((err)=>{
|
||||||
|
res.status(500).send(err.message)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.patch(PREFIX+"/"+endpoint.endpoint,(req,res)=>{
|
||||||
|
if (req.body.id) {
|
||||||
|
var combinedfields = [...endpoint.requiredfields,...endpoint.optionalfields,...endpoint.excludedfields]
|
||||||
|
//console.log(combinedfields)
|
||||||
|
var all_filled_fields=combinedfields.filter((field)=>(field in req.body))
|
||||||
|
|
||||||
|
db.query('update '+endpoint.endpoint+' set '+all_filled_fields.map((field,i)=>field+"=$"+(i+1)).join(",")+" where id=$"+(all_filled_fields.length+1)+" returning *",[...all_filled_fields.map((field)=>req.body[field]),req.body.id])
|
||||||
|
.then((data)=>{
|
||||||
|
res.status(200).json(data.rows)
|
||||||
|
})
|
||||||
|
.catch((err)=>{
|
||||||
|
res.status(500).send(err.message)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
res.status(300).send("Invalid query!")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.delete(PREFIX+"/"+endpoint.endpoint,(req,res)=>{
|
||||||
|
if (req.body.id) {
|
||||||
|
db.query('delete from '+endpoint.endpoint+' where id=$1 returning *',[req.body.id])
|
||||||
|
.then((data)=>{
|
||||||
|
res.status(200).json(data.rows)
|
||||||
|
})
|
||||||
|
.catch((err)=>{
|
||||||
|
res.status(500).send(err.message)
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
res.status(300).send("Invalid query!")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
app.get(PREFIX+"/test/"+endpoint.endpoint,(req,res)=>{
|
||||||
if (endpoint.requiredfields.includes("name")) {
|
if (endpoint.requiredfields.includes("name")) {
|
||||||
db2.query('select distinct on (name) name,* from '+endpoint.endpoint+' order by name,id desc')
|
db2.query('select distinct on (name) name,* from '+endpoint.endpoint+' order by name,id desc')
|
||||||
.then((data)=>{
|
.then((data)=>{
|
||||||
@ -200,7 +462,7 @@ function CreateDynamicEndpoints() {
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
app.post("/ngsplanner/"+endpoint.endpoint,(req,res)=>{
|
app.post(PREFIX+"/test/"+endpoint.endpoint,(req,res)=>{
|
||||||
|
|
||||||
var allExist=true
|
var allExist=true
|
||||||
endpoint.requiredfields.forEach((field)=>{
|
endpoint.requiredfields.forEach((field)=>{
|
||||||
@ -226,7 +488,7 @@ function CreateDynamicEndpoints() {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
app.patch("/ngsplanner/"+endpoint.endpoint,(req,res)=>{
|
app.patch(PREFIX+"/test/"+endpoint.endpoint,(req,res)=>{
|
||||||
if (req.body.id) {
|
if (req.body.id) {
|
||||||
var combinedfields = [...endpoint.requiredfields,...endpoint.optionalfields,...endpoint.excludedfields]
|
var combinedfields = [...endpoint.requiredfields,...endpoint.optionalfields,...endpoint.excludedfields]
|
||||||
//console.log(combinedfields)
|
//console.log(combinedfields)
|
||||||
@ -244,7 +506,7 @@ function CreateDynamicEndpoints() {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
app.delete("/ngsplanner/"+endpoint.endpoint,(req,res)=>{
|
app.delete(PREFIX+"/test/"+endpoint.endpoint,(req,res)=>{
|
||||||
if (req.body.id) {
|
if (req.body.id) {
|
||||||
db2.query('delete from '+endpoint.endpoint+' where id=$1 returning *',[req.body.id])
|
db2.query('delete from '+endpoint.endpoint+' where id=$1 returning *',[req.body.id])
|
||||||
.then((data)=>{
|
.then((data)=>{
|
||||||
@ -258,7 +520,87 @@ function CreateDynamicEndpoints() {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function CleanUp(arr,vals){
|
||||||
|
return arr.map((arrVal)=>{
|
||||||
|
vals.forEach((val)=>{
|
||||||
|
arrVal[val]=undefined
|
||||||
|
})
|
||||||
|
return arrVal
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
app.get(PREFIX+'/data',async(req,res)=>{
|
||||||
|
var finalresult = {}
|
||||||
|
var promises = []
|
||||||
|
for (var endpoint of ENDPOINTDATA) {
|
||||||
|
if (endpoint.requiredfields.includes("name")) {
|
||||||
|
await db.query('select * from (select distinct on (name) name,* from '+endpoint.endpoint+' order by name,id desc)t order by id asc')
|
||||||
|
.then((data)=>{
|
||||||
|
finalresult[endpoint.endpoint]={}
|
||||||
|
data.rows.forEach((val)=>{finalresult[endpoint.endpoint][val.name]=val})
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
await db.query('select * from '+endpoint.endpoint+" order by id desc")
|
||||||
|
.then((data)=>{
|
||||||
|
finalresult[endpoint.endpoint]=data.rows
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res.status(200).json(finalresult)
|
||||||
|
})
|
||||||
|
|
||||||
|
app.get(PREFIX+'/test/data',async(req,res)=>{
|
||||||
|
var finalresult = {}
|
||||||
|
var promises = []
|
||||||
|
for (var endpoint of ENDPOINTDATA) {
|
||||||
|
if (endpoint.requiredfields.includes("name")) {
|
||||||
|
await db2.query('select distinct on (name) name,* from '+endpoint.endpoint+' order by name,id desc')
|
||||||
|
.then((data)=>{
|
||||||
|
finalresult[endpoint.endpoint]={}
|
||||||
|
data.rows.forEach((val)=>{finalresult[endpoint.endpoint][val.name]=val})
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
await db2.query('select * from '+endpoint.endpoint+" order by id desc")
|
||||||
|
.then((data)=>{
|
||||||
|
finalresult[endpoint.endpoint]=data.rows
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res.status(200).json(finalresult)
|
||||||
|
})
|
||||||
|
|
||||||
|
app.get(PREFIX+'/dataid',async(req,res)=>{
|
||||||
|
var finalresult = {}
|
||||||
|
var promises = []
|
||||||
|
for (var endpoint of ENDPOINTDATA) {
|
||||||
|
await db.query('select * from '+endpoint.endpoint+' order by id asc')
|
||||||
|
.then((data)=>{
|
||||||
|
finalresult[endpoint.endpoint]={}
|
||||||
|
data.rows.forEach((val)=>{finalresult[endpoint.endpoint][val.id]=val})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
res.status(200).json(finalresult)
|
||||||
|
})
|
||||||
|
|
||||||
|
app.get(PREFIX+'/test/dataid',async(req,res)=>{
|
||||||
|
var finalresult = {}
|
||||||
|
var promises = []
|
||||||
|
for (var endpoint of ENDPOINTDATA) {
|
||||||
|
await db2.query('select * from '+endpoint.endpoint+' order by id asc')
|
||||||
|
.then((data)=>{
|
||||||
|
finalresult[endpoint.endpoint]={}
|
||||||
|
data.rows.forEach((val)=>{finalresult[endpoint.endpoint][val.id]=val})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
res.status(200).json(finalresult)
|
||||||
|
})
|
||||||
|
|
||||||
|
//Generates our table schema:
|
||||||
|
ENDPOINTDATA.forEach((endpoint)=>{
|
||||||
|
console.log(endpoint.endpoint+":\n\t"+endpoint.requiredfields.join('\t')+(endpoint.optionalfields.length>0?"\t":"")+endpoint.optionalfields.join("\t"))
|
||||||
|
})
|
||||||
|
|
||||||
/*const db2 =
|
/*const db2 =
|
||||||
new Pool({
|
new Pool({
|
||||||
|
Loading…
x
Reference in New Issue
Block a user