From 30add58a3f0ff03d1026ec50eb6b4a8ef6900ff0 Mon Sep 17 00:00:00 2001 From: mdazharaw Date: Thu, 16 Apr 2020 00:40:31 +0800 Subject: [PATCH 1/9] Able to generate todo list. MVP done. --- index.js | 87 ++++++++++++++++++++++++++++++++++++++--------- package-lock.json | 5 +++ package.json | 19 +++++++++++ 3 files changed, 95 insertions(+), 16 deletions(-) create mode 100644 package-lock.json create mode 100644 package.json diff --git a/index.js b/index.js index 3907d3b5..71e363e8 100644 --- a/index.js +++ b/index.js @@ -1,36 +1,91 @@ -console.log("works!!", process.argv[2]); +// console.log("works!!", process.argv[2]); const pg = require('pg'); const configs = { - user: 'akira', - host: '127.0.0.1', - database: 'todo', - port: 5432, + user: 'Azhar', + host: '127.0.0.1', + database: 'todo', + port: 5432, }; const client = new pg.Client(configs); let queryDoneCallback = (err, result) => { - if (err) { - console.log("query error", err.message); - } else { - console.log("result", result.rows ); - } - client.end(); + if (err) { + console.log("query error", err.message); + } else { + // console.log("result", result.rows ); + let queryText = 'SELECT * FROM items'; + client.query(queryText, (err, res) => { + if (err) { + //Throw connection terminated error + if(err.message != "Connection terminated"){ + console.log("query error", err.message); + } + } else { + // iterate through all of your results: + var outList = ""; + for (let i = 0; i < res.rows.length; i++) { + var record = res.rows[i]; + if (record.done == false) { + var string = `${i + 1}. [ ] ${record.name}\n`; + outList += string; + } else { + var string = `${i + 1}. [X] ${record.name}\n`; + outList += string; + } + } + console.log(outList); + } + client.end(); + + }); + } + }; +var inputString = function () { + var stringArr = process.argv; + var remove = stringArr.splice(0, 3); + // console.log(remove); + var outString = ""; + for (id in stringArr) { + outString += stringArr[id]; + outString += " "; + } + return outString; +} + let clientConnectionCallback = (err) => { - if( err ){ - console.log( "error", err.message ); + if (err) { + console.log("error", err.message); } + var command = process.argv[2]; + switch (command) { + case 'add': + let text = "INSERT INTO items (name,done) VALUES ($1,$2) RETURNING id"; + var input = inputString(); + input = input.trim(); + var inputArr = []; + if (input.includes(", ")) { + inputArr = input.split(", ") + } else { + inputArr = [input]; + } + for (id in inputArr) { + const values = [inputArr[id], "f"]; + client.query(text, values, queryDoneCallback); + } + + break; - let text = "INSERT INTO todo (name) VALUES ($1) RETURNING id"; + default: + break; + } - const values = ["hello"]; - client.query(text, values, queryDoneCallback); }; client.connect(clientConnectionCallback); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..0904a14b --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "cli-todo-sql", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..d82deb25 --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "cli-todo-sql", + "version": "1.0.0", + "description": "![https://i.giphy.com/media/26ufnwz3wDUli7GU0/giphy.webp](https://i.giphy.com/media/26ufnwz3wDUli7GU0/giphy.webp)", + "main": "index.js", + "scripts": { + "test": "node index.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/mdazharaw/cli-todo-sql.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/mdazharaw/cli-todo-sql/issues" + }, + "homepage": "https://github.com/mdazharaw/cli-todo-sql#readme" +} From 7c014ca3e9a707d7d362e34f013e76156a8e64db Mon Sep 17 00:00:00 2001 From: mdazharaw Date: Thu, 16 Apr 2020 01:01:51 +0800 Subject: [PATCH 2/9] Updated with show function --- index.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/index.js b/index.js index 71e363e8..f707c169 100644 --- a/index.js +++ b/index.js @@ -29,10 +29,10 @@ let queryDoneCallback = (err, result) => { for (let i = 0; i < res.rows.length; i++) { var record = res.rows[i]; if (record.done == false) { - var string = `${i + 1}. [ ] ${record.name}\n`; + var string = `${i + 1}. [ ] - ${record.name}\n`; outList += string; } else { - var string = `${i + 1}. [X] ${record.name}\n`; + var string = `${i + 1}. [X] - ${record.name}\n`; outList += string; } } @@ -78,9 +78,11 @@ let clientConnectionCallback = (err) => { const values = [inputArr[id], "f"]; client.query(text, values, queryDoneCallback); } - break; - + case "show": + let queryText = 'SELECT * FROM items'; + client.query(queryText, queryDoneCallback); + break; default: break; } From f72a98a02b91600f45b14099969d9cb57b76f594 Mon Sep 17 00:00:00 2001 From: mdazharaw Date: Thu, 16 Apr 2020 08:34:36 +0800 Subject: [PATCH 3/9] Added mark as done --- index.js | 57 +++++++++++++++++++++++++++++++++++++++++++--------- package.json | 2 +- 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/index.js b/index.js index f707c169..155f4ac7 100644 --- a/index.js +++ b/index.js @@ -8,7 +8,6 @@ const configs = { database: 'todo', port: 5432, }; - const client = new pg.Client(configs); let queryDoneCallback = (err, result) => { @@ -16,26 +15,27 @@ let queryDoneCallback = (err, result) => { console.log("query error", err.message); } else { // console.log("result", result.rows ); - let queryText = 'SELECT * FROM items'; + let queryText = 'SELECT * FROM items ORDER BY id ASC'; client.query(queryText, (err, res) => { if (err) { //Throw connection terminated error - if(err.message != "Connection terminated"){ + if (err.message != "Connection terminated") { console.log("query error", err.message); } } else { // iterate through all of your results: - var outList = ""; + var outList = "\n"; for (let i = 0; i < res.rows.length; i++) { var record = res.rows[i]; if (record.done == false) { var string = `${i + 1}. [ ] - ${record.name}\n`; outList += string; - } else { + } else if (record.done == true) { var string = `${i + 1}. [X] - ${record.name}\n`; outList += string; } } + outList += "\n"; console.log(outList); } client.end(); @@ -65,7 +65,7 @@ let clientConnectionCallback = (err) => { var command = process.argv[2]; switch (command) { case 'add': - let text = "INSERT INTO items (name,done) VALUES ($1,$2) RETURNING id"; + let addQuery = "INSERT INTO items (name,done) VALUES ($1,$2) RETURNING id"; var input = inputString(); input = input.trim(); var inputArr = []; @@ -76,12 +76,51 @@ let clientConnectionCallback = (err) => { } for (id in inputArr) { const values = [inputArr[id], "f"]; - client.query(text, values, queryDoneCallback); + client.query(addQuery, values, queryDoneCallback); } break; case "show": - let queryText = 'SELECT * FROM items'; - client.query(queryText, queryDoneCallback); + let showQuery = 'SELECT * FROM items'; + client.query(showQuery, (err, res) => { + if (err) { + console.log("query error", err.message); + + } else { + // iterate through all of your results: + if(res.rows.length==0){ + console.log("\nNo items to show\n"); + client.end(); + }else{ + client.query(showQuery,queryDoneCallback); + } + } + }) + break; + case "done": + let idMap = {}; + let queryText = 'SELECT * FROM items ORDER BY id ASC'; + client.query(queryText, (err, res) => { + if (err) { + console.log("query error", err.message); + } else { + // iterate through all of your results: + for (let i = 0; i < res.rows.length; i++) { + var record = res.rows[i]; + idMap[`${i + 1}`] = record.id; + } + let doneQuery = "UPDATE items SET done= 't' WHERE id = $1"; + var input = parseInt(inputString()); + var mappedId = idMap[`${input}`]; + // console.log(idMap); + // console.log(mappedId); + if (mappedId != isNaN) { + const value = [mappedId]; + client.query(doneQuery, value, queryDoneCallback); + } + } + }) + + break; default: break; diff --git a/package.json b/package.json index d82deb25..e1f97ff8 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "![https://i.giphy.com/media/26ufnwz3wDUli7GU0/giphy.webp](https://i.giphy.com/media/26ufnwz3wDUli7GU0/giphy.webp)", "main": "index.js", "scripts": { - "test": "node index.js" + "test": "node index.js add go shopping, feed dog, swim practice, code app, meet gabriel, eat bak kut teh" }, "repository": { "type": "git", From 0603dab5b34ab27b2f73e7c3936b121fa93ceef1 Mon Sep 17 00:00:00 2001 From: mdazharaw Date: Thu, 16 Apr 2020 09:03:47 +0800 Subject: [PATCH 4/9] Added test scripts and archive function --- index.js | 45 +++++++++++++++++++++++++++++++++++++-------- package.json | 4 +++- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/index.js b/index.js index 155f4ac7..840914eb 100644 --- a/index.js +++ b/index.js @@ -84,14 +84,14 @@ let clientConnectionCallback = (err) => { client.query(showQuery, (err, res) => { if (err) { console.log("query error", err.message); - + } else { // iterate through all of your results: - if(res.rows.length==0){ + if (res.rows.length == 0) { console.log("\nNo items to show\n"); client.end(); - }else{ - client.query(showQuery,queryDoneCallback); + } else { + client.query(showQuery, queryDoneCallback); } } }) @@ -119,14 +119,43 @@ let clientConnectionCallback = (err) => { } } }) - - + break; + case "reset": + let resetQuery = "UPDATE items SET done= 'f' WHERE id > 1"; + client.query(resetQuery, queryDoneCallback); + break; + case "empty": + let emptyQuery = "TRUNCATE TABLE items"; + console.log("\nNo items to show"); + client.query(emptyQuery, queryDoneCallback); + break; + case "archive": + let idMap2 = {}; + let queryText2 = 'SELECT * FROM items ORDER BY id ASC'; + client.query(queryText2, (err, res) => { + if (err) { + console.log("query error", err.message); + } else { + // iterate through all of your results: + for (let i = 0; i < res.rows.length; i++) { + var record = res.rows[i]; + idMap2[`${i + 1}`] = record.id; + } + let deleteQuery = "DELETE FROM items WHERE id = $1"; + var input = parseInt(inputString()); + var mappedId = idMap2[`${input}`]; + // console.log(idMap); + // console.log(mappedId); + if (mappedId != isNaN) { + const value = [mappedId]; + client.query(deleteQuery, value, queryDoneCallback); + } + } + }) break; default: break; } - - }; client.connect(clientConnectionCallback); diff --git a/package.json b/package.json index e1f97ff8..a963fd02 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,9 @@ "description": "![https://i.giphy.com/media/26ufnwz3wDUli7GU0/giphy.webp](https://i.giphy.com/media/26ufnwz3wDUli7GU0/giphy.webp)", "main": "index.js", "scripts": { - "test": "node index.js add go shopping, feed dog, swim practice, code app, meet gabriel, eat bak kut teh" + "fill": "node index.js add go shopping, feed dog, swim practice, code app, meet gabriel, eat bak kut teh", + "reset": "node index.js reset", + "empty": "node index.js empty" }, "repository": { "type": "git", From ca1d879391900b90ca9b13824b877b91e54e982d Mon Sep 17 00:00:00 2001 From: mdazharaw Date: Thu, 16 Apr 2020 09:04:02 +0800 Subject: [PATCH 5/9] Updated --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index 840914eb..0acefceb 100644 --- a/index.js +++ b/index.js @@ -129,7 +129,7 @@ let clientConnectionCallback = (err) => { console.log("\nNo items to show"); client.query(emptyQuery, queryDoneCallback); break; - case "archive": + case "archive": let idMap2 = {}; let queryText2 = 'SELECT * FROM items ORDER BY id ASC'; client.query(queryText2, (err, res) => { From 2df6aa8717261d70c80e9bf24d5c024640a3412f Mon Sep 17 00:00:00 2001 From: mdazharaw Date: Thu, 16 Apr 2020 09:48:09 +0800 Subject: [PATCH 6/9] Added updated_at --- index.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index 0acefceb..28b3e07c 100644 --- a/index.js +++ b/index.js @@ -31,7 +31,11 @@ let queryDoneCallback = (err, result) => { var string = `${i + 1}. [ ] - ${record.name}\n`; outList += string; } else if (record.done == true) { - var string = `${i + 1}. [X] - ${record.name}\n`; + var string = `${i + 1}. [X] - ${record.name}`; + if (record.updated_at != null) { + string += ` | updated_at: ${record.updated_at}\n`; + } + else { string += "\n" } outList += string; } } @@ -108,7 +112,7 @@ let clientConnectionCallback = (err) => { var record = res.rows[i]; idMap[`${i + 1}`] = record.id; } - let doneQuery = "UPDATE items SET done= 't' WHERE id = $1"; + let doneQuery = "UPDATE items SET done= 't', updated_at = current_timestamp WHERE id = $1" var input = parseInt(inputString()); var mappedId = idMap[`${input}`]; // console.log(idMap); @@ -121,7 +125,7 @@ let clientConnectionCallback = (err) => { }) break; case "reset": - let resetQuery = "UPDATE items SET done= 'f' WHERE id > 1"; + let resetQuery = "UPDATE items SET done= 'f', updated_at = NULL WHERE id > 1"; client.query(resetQuery, queryDoneCallback); break; case "empty": From 2a285dc2738aaa182ea3f94e439b497d093e3b88 Mon Sep 17 00:00:00 2001 From: mdazharaw Date: Thu, 16 Apr 2020 09:51:36 +0800 Subject: [PATCH 7/9] Update date format --- index.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index 28b3e07c..055faf9f 100644 --- a/index.js +++ b/index.js @@ -33,7 +33,8 @@ let queryDoneCallback = (err, result) => { } else if (record.done == true) { var string = `${i + 1}. [X] - ${record.name}`; if (record.updated_at != null) { - string += ` | updated_at: ${record.updated_at}\n`; + var date = formatDateTime(record.updated_at); + string += ` | updated_at: ${date}\n`; } else { string += "\n" } outList += string; @@ -163,3 +164,9 @@ let clientConnectionCallback = (err) => { }; client.connect(clientConnectionCallback); + +function formatDateTime(date) { + var formatDate = date.toLocaleDateString(); + var formatTime = date.toLocaleTimeString(); + return `${formatDate} ${formatTime}`; +} \ No newline at end of file From bececc61980f5daa1822c5a9e56539b26ba96762 Mon Sep 17 00:00:00 2001 From: mdazharaw Date: Thu, 16 Apr 2020 09:58:28 +0800 Subject: [PATCH 8/9] Add default invalid command case --- index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/index.js b/index.js index 055faf9f..164f7a67 100644 --- a/index.js +++ b/index.js @@ -159,6 +159,8 @@ let clientConnectionCallback = (err) => { }) break; default: + console.log("Invalid command, try again") + client.end(); break; } }; From 0c4f3920305a5b77cd2bdb84b77ff52c8e5d7505 Mon Sep 17 00:00:00 2001 From: mdazharaw Date: Thu, 16 Apr 2020 10:03:38 +0800 Subject: [PATCH 9/9] Added comments --- index.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/index.js b/index.js index 164f7a67..1a4edc5b 100644 --- a/index.js +++ b/index.js @@ -10,6 +10,7 @@ const configs = { }; const client = new pg.Client(configs); +// Shows todo list once any query finishes let queryDoneCallback = (err, result) => { if (err) { console.log("query error", err.message); @@ -50,6 +51,7 @@ let queryDoneCallback = (err, result) => { }; +// Reads arguments into string var inputString = function () { var stringArr = process.argv; var remove = stringArr.splice(0, 3); @@ -62,13 +64,18 @@ var inputString = function () { return outString; } +// Main function that runs upon connection let clientConnectionCallback = (err) => { if (err) { console.log("error", err.message); } + // Command type var command = process.argv[2]; + + // Processing commands switch (command) { + // Able to add multiple strings, delimited by ',' case 'add': let addQuery = "INSERT INTO items (name,done) VALUES ($1,$2) RETURNING id"; var input = inputString(); @@ -84,6 +91,8 @@ let clientConnectionCallback = (err) => { client.query(addQuery, values, queryDoneCallback); } break; + + // Triggers list to be displayed, or show no items if list is empty case "show": let showQuery = 'SELECT * FROM items'; client.query(showQuery, (err, res) => { @@ -101,6 +110,8 @@ let clientConnectionCallback = (err) => { } }) break; + + // Marks item as done, adds date time updated case "done": let idMap = {}; let queryText = 'SELECT * FROM items ORDER BY id ASC'; @@ -125,15 +136,21 @@ let clientConnectionCallback = (err) => { } }) break; + + // Resets all items to not done case "reset": let resetQuery = "UPDATE items SET done= 'f', updated_at = NULL WHERE id > 1"; client.query(resetQuery, queryDoneCallback); break; + + // Resets list to being empty case "empty": let emptyQuery = "TRUNCATE TABLE items"; console.log("\nNo items to show"); client.query(emptyQuery, queryDoneCallback); break; + + // Removes list item from list case "archive": let idMap2 = {}; let queryText2 = 'SELECT * FROM items ORDER BY id ASC'; @@ -158,6 +175,8 @@ let clientConnectionCallback = (err) => { } }) break; + + // For invalid commands default: console.log("Invalid command, try again") client.end(); @@ -167,6 +186,7 @@ let clientConnectionCallback = (err) => { client.connect(clientConnectionCallback); +// Function to format date time value function formatDateTime(date) { var formatDate = date.toLocaleDateString(); var formatTime = date.toLocaleTimeString();