2020-02-06 03:04:43 +00:00
|
|
|
const waitPort = require('wait-port');
|
|
|
|
const fs = require('fs');
|
|
|
|
const mysql = require('mysql');
|
|
|
|
|
|
|
|
const {
|
|
|
|
MYSQL_HOST: HOST,
|
|
|
|
MYSQL_HOST_FILE: HOST_FILE,
|
|
|
|
MYSQL_USER: USER,
|
|
|
|
MYSQL_USER_FILE: USER_FILE,
|
|
|
|
MYSQL_PASSWORD: PASSWORD,
|
|
|
|
MYSQL_PASSWORD_FILE: PASSWORD_FILE,
|
|
|
|
MYSQL_DB: DB,
|
|
|
|
MYSQL_DB_FILE: DB_FILE,
|
|
|
|
} = process.env;
|
|
|
|
|
|
|
|
let pool;
|
|
|
|
|
|
|
|
async function init() {
|
|
|
|
const host = HOST_FILE ? fs.readFileSync(HOST_FILE) : HOST;
|
|
|
|
const user = USER_FILE ? fs.readFileSync(USER_FILE) : USER;
|
|
|
|
const password = PASSWORD_FILE ? fs.readFileSync(PASSWORD_FILE) : PASSWORD;
|
|
|
|
const database = DB_FILE ? fs.readFileSync(DB_FILE) : DB;
|
|
|
|
|
2020-06-02 22:05:29 +00:00
|
|
|
await waitPort({ host, port : 3306});
|
2020-02-06 03:04:43 +00:00
|
|
|
|
|
|
|
pool = mysql.createPool({
|
|
|
|
connectionLimit: 5,
|
|
|
|
host,
|
|
|
|
user,
|
|
|
|
password,
|
|
|
|
database,
|
|
|
|
});
|
|
|
|
|
|
|
|
return new Promise((acc, rej) => {
|
|
|
|
pool.query(
|
|
|
|
'CREATE TABLE IF NOT EXISTS todo_items (id varchar(36), name varchar(255), completed boolean)',
|
|
|
|
err => {
|
|
|
|
if (err) return rej(err);
|
|
|
|
|
|
|
|
console.log(`Connected to mysql db at host ${HOST}`);
|
|
|
|
acc();
|
|
|
|
},
|
|
|
|
);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async function teardown() {
|
|
|
|
return new Promise((acc, rej) => {
|
|
|
|
pool.end(err => {
|
|
|
|
if (err) rej(err);
|
|
|
|
else acc();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async function getItems() {
|
|
|
|
return new Promise((acc, rej) => {
|
|
|
|
pool.query('SELECT * FROM todo_items', (err, rows) => {
|
|
|
|
if (err) return rej(err);
|
|
|
|
acc(
|
|
|
|
rows.map(item =>
|
|
|
|
Object.assign({}, item, {
|
|
|
|
completed: item.completed === 1,
|
|
|
|
}),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async function getItem(id) {
|
|
|
|
return new Promise((acc, rej) => {
|
|
|
|
pool.query('SELECT * FROM todo_items WHERE id=?', [id], (err, rows) => {
|
|
|
|
if (err) return rej(err);
|
|
|
|
acc(
|
|
|
|
rows.map(item =>
|
|
|
|
Object.assign({}, item, {
|
|
|
|
completed: item.completed === 1,
|
|
|
|
}),
|
|
|
|
)[0],
|
|
|
|
);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async function storeItem(item) {
|
|
|
|
return new Promise((acc, rej) => {
|
|
|
|
pool.query(
|
|
|
|
'INSERT INTO todo_items (id, name, completed) VALUES (?, ?, ?)',
|
|
|
|
[item.id, item.name, item.completed ? 1 : 0],
|
|
|
|
err => {
|
|
|
|
if (err) return rej(err);
|
|
|
|
acc();
|
|
|
|
},
|
|
|
|
);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async function updateItem(id, item) {
|
|
|
|
return new Promise((acc, rej) => {
|
|
|
|
pool.query(
|
|
|
|
'UPDATE todo_items SET name=?, completed=? WHERE id=?',
|
|
|
|
[item.name, item.completed ? 1 : 0, id],
|
|
|
|
err => {
|
|
|
|
if (err) return rej(err);
|
|
|
|
acc();
|
|
|
|
},
|
|
|
|
);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
async function removeItem(id) {
|
|
|
|
return new Promise((acc, rej) => {
|
|
|
|
pool.query('DELETE FROM todo_items WHERE id = ?', [id], err => {
|
|
|
|
if (err) return rej(err);
|
|
|
|
acc();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
init,
|
|
|
|
teardown,
|
|
|
|
getItems,
|
|
|
|
getItem,
|
|
|
|
storeItem,
|
|
|
|
updateItem,
|
|
|
|
removeItem,
|
|
|
|
};
|