diff options
Diffstat (limited to 'app/src/persistence/mysql.js')
-rw-r--r-- | app/src/persistence/mysql.js | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/app/src/persistence/mysql.js b/app/src/persistence/mysql.js new file mode 100644 index 0000000..1a8360a --- /dev/null +++ b/app/src/persistence/mysql.js @@ -0,0 +1,130 @@ +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; + + await waitPort({ host, port : 3306}); + + pool = mysql.createPool({ + connectionLimit: 5, + host, + user, + password, + database, + charset: 'utf8mb4', + }); + + return new Promise((acc, rej) => { + pool.query( + 'CREATE TABLE IF NOT EXISTS todo_items (id varchar(36), name varchar(255), completed boolean) DEFAULT CHARSET utf8mb4', + 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, +}; |