summaryrefslogtreecommitdiff
path: root/app/src/persistence/mysql.js
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/persistence/mysql.js')
-rw-r--r--app/src/persistence/mysql.js130
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,
+};