const express = require('express') const path = require('path') const vm = require(“vm”); const fs = require('fs'); const app = express();

// Config. const port = 3001; const db_path = 'db.js';

// Configure express. app.use(express.json()); app.use(express.static('.')); app.use('/dist', express.static('../dist'));

// Respond with React app. app.get('/', (req, res) => {

res.sendFile(path.join(__dirname, 'index.html'))

})

//// // READ ////

var load_db = () => {

const data = fs.readFileSync(db_path);
const script = new vm.Script(data);
script.runInThisContext();

return JSON.parse(db);

}

//// // WRITE ////

var save_db = (db) => {

// Save JS file to disk.
try {
  fs.writeFileSync(db_path, 'var db = ' + JSON.stringify(JSON.stringify(db)) + ';');
}
catch (err) {
  console.log("ERROR: save_db() failed to save.");
  console.error(err);
}

}

//// // DELETE. ////

// Handle controls delete request. app.post('/controls/delete', (req, res) => {

// Get execution ID that controls share.
var aid = req.body.aid;

// Get database.
db = load_db();

// Delete controls.
for (let [index, control] of db.controls.entries()) {
  if (control.aid == aid) {
    console.log("DELETE CONTROL:");
    console.log(db.controls[index]);
    db.controls.splice(index, 1);
  }
  if (control.base_id != null && control.base_id == aid) {
    console.log("DELETE:");
    console.log(db.controls[index]);
    db.controls.splice(index, 1);
  }
}

// Save database.
save_db(db)

res.status(200).send({ message: 'ok' });

})

// Handle control delete request. app.post('/control/delete', (req, res) => {

// Get control ID.
rid = req.body.rid;

// Get database.
db = load_db();

// Delete control.
for (let [index, control] of db.controls.entries()) {
  if (control.r == rid) {
    console.log("DELETE CONTROL:")
    console.log(db.controls[index]);
    db.controls.splice(index, 1);
    break;
  }
}

// Save database.
save_db(db)

res.status(200).send({ message: 'ok' });

})

//// // SERVE ////

// Listen for requests. app.listen(port, () => {

console.log(`Example app listening at http://localhost:${port}`)

})