diff options
Diffstat (limited to 'app/src/persistence/sqlite.js')
-rw-r--r-- | app/src/persistence/sqlite.js | 113 |
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, +}; |