summaryrefslogtreecommitdiff
path: root/app/src/persistence/sqlite.js
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/persistence/sqlite.js')
-rw-r--r--app/src/persistence/sqlite.js113
1 files changed, 113 insertions, 0 deletions
diff --git a/app/src/persistence/sqlite.js b/app/src/persistence/sqlite.js
new file mode 100644
index 0000000..0643678
--- /dev/null
+++ b/app/src/persistence/sqlite.js
@@ -0,0 +1,113 @@
+const sqlite3 = require('sqlite3').verbose();
+const fs = require('fs');
+const location = process.env.SQLITE_DB_LOCATION || '/etc/todos/todo.db';
+
+let db, dbAll, dbRun;
+
+function init() {
+ const dirName = require('path').dirname(location);
+ if (!fs.existsSync(dirName)) {
+ fs.mkdirSync(dirName, { recursive: true });
+ }
+
+ return new Promise((acc, rej) => {
+ db = new sqlite3.Database(location, err => {
+ if (err) return rej(err);
+
+ if (process.env.NODE_ENV !== 'test')
+ console.log(`Using sqlite database at ${location}`);
+
+ db.run(
+ 'CREATE TABLE IF NOT EXISTS todo_items (id varchar(36), name varchar(255), completed boolean)',
+ (err, result) => {
+ if (err) return rej(err);
+ acc();
+ },
+ );
+ });
+ });
+}
+
+async function teardown() {
+ return new Promise((acc, rej) => {
+ db.close(err => {
+ if (err) rej(err);
+ else acc();
+ });
+ });
+}
+
+async function getItems() {
+ return new Promise((acc, rej) => {
+ db.all('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) => {
+ db.all('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) => {
+ db.run(
+ '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) => {
+ db.run(
+ '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) => {
+ db.run('DELETE FROM todo_items WHERE id = ?', [id], err => {
+ if (err) return rej(err);
+ acc();
+ });
+ });
+}
+
+module.exports = {
+ init,
+ teardown,
+ getItems,
+ getItem,
+ storeItem,
+ updateItem,
+ removeItem,
+};