90 lines
2.4 KiB
JavaScript
90 lines
2.4 KiB
JavaScript
const express = require('express');
|
|
const router = express.Router();
|
|
var driver = require('../../graph_db');
|
|
const pool = require('../../db');
|
|
var crypto = require('crypto');
|
|
const { promisify } = require('util');
|
|
const { sanitizePersonInput } = require('../../middleware/sanitize_person_input');
|
|
const { strictInput } = require('../../middleware/strict_input');
|
|
|
|
const scrypt = promisify(crypto.scrypt);
|
|
|
|
async function insert_db( name, username, email, password ) {
|
|
const salt = crypto.randomBytes(16).toString('hex');
|
|
const derivedKey = await scrypt(password, salt, 64);
|
|
const hashed_password = `${salt}:${derivedKey.toString('hex')}`;
|
|
|
|
try {
|
|
const { rows } = await pool.query(
|
|
'INSERT INTO people (name, username, email, password) VALUES ($1, $2, $3, $4) RETURNING id',
|
|
[name, username, email, hashed_password]
|
|
);
|
|
|
|
return rows[0].id;
|
|
}
|
|
catch (err) {
|
|
console.error('database query failed', {
|
|
message: err.message,
|
|
code: err.code,
|
|
detail: err.detail,
|
|
hint: err.hint,
|
|
stack: err.stack,
|
|
});
|
|
throw err;
|
|
}
|
|
};
|
|
|
|
async function insert_graph_db( name, username, db_id ) {
|
|
try {
|
|
await driver.executeQuery(
|
|
'CREATE (p:Person {db_id: $db_id, name: $name, username: $username})',
|
|
{ db_id, name, username },
|
|
{ database: process.env.GRAPH_DB_NAME }
|
|
);
|
|
}
|
|
catch (err) {
|
|
console.error('database query failed', {
|
|
message: err.message,
|
|
code: err.code,
|
|
detail: err.detail,
|
|
hint: err.hint,
|
|
stack: err.stack,
|
|
});
|
|
throw err;
|
|
}
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
async function create_people(req, res) {
|
|
const person = req.person;
|
|
let db_id;
|
|
|
|
try {
|
|
db_id = await insert_db(
|
|
person.name,
|
|
person.username,
|
|
person.email,
|
|
person.password
|
|
);
|
|
}
|
|
catch (err) {
|
|
res.status(500).send('Data was not pushed to database, request failed');
|
|
return;
|
|
}
|
|
|
|
try {
|
|
await insert_graph_db(person.name, person.username, db_id);
|
|
res.status(201).json({ id: db_id });
|
|
}
|
|
catch (err) {
|
|
res.status(500).send('Data was not pushed to graph database, request failed');
|
|
}
|
|
};
|
|
|
|
|
|
router.post('/', strictInput({ body: ['name', 'username', 'email', 'password'] }), sanitizePersonInput, create_people);
|
|
module.exports = router;
|