From ca159cc89738dae51f45210617cbb6f39c98de4b Mon Sep 17 00:00:00 2001 From: Amy Date: Fri, 26 Nov 2021 20:40:44 -0500 Subject: [PATCH 1/9] Add @types/sqlite3 --- package-lock.json | 19 +++++++++++++++++++ package.json | 1 + types.d.ts | 9 ++++++++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 6f19b30..9b6d939 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "devDependencies": { "@types/node": "16.11.6", "@types/react": "17.0.33", + "@types/sqlite3": "^3.1.7", "@typescript-eslint/eslint-plugin": "^5.2.0", "@typescript-eslint/parser": "^5.2.0", "eslint": "7.32.0", @@ -1171,6 +1172,15 @@ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", "dev": true }, + "node_modules/@types/sqlite3": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/sqlite3/-/sqlite3-3.1.7.tgz", + "integrity": "sha512-8FHV/8Uzd7IwdHm5mvmF2Aif4aC/gjrt4axWD9SmfaxITnOjtOhCbOSTuqv/VbH1uq0QrwlaTj9aTz3gmR6u4w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.2.0.tgz", @@ -10714,6 +10724,15 @@ "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", "dev": true }, + "@types/sqlite3": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/sqlite3/-/sqlite3-3.1.7.tgz", + "integrity": "sha512-8FHV/8Uzd7IwdHm5mvmF2Aif4aC/gjrt4axWD9SmfaxITnOjtOhCbOSTuqv/VbH1uq0QrwlaTj9aTz3gmR6u4w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@typescript-eslint/eslint-plugin": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.2.0.tgz", diff --git a/package.json b/package.json index e093d21..9404127 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "devDependencies": { "@types/node": "16.11.6", "@types/react": "17.0.33", + "@types/sqlite3": "^3.1.7", "@typescript-eslint/eslint-plugin": "^5.2.0", "@typescript-eslint/parser": "^5.2.0", "eslint": "7.32.0", diff --git a/types.d.ts b/types.d.ts index b923af7..6b866e6 100644 --- a/types.d.ts +++ b/types.d.ts @@ -1 +1,8 @@ -declare module "sqlite3"; +declare module "sqlite3" { + import { sqlite3 } from "@types/sqlite3"; + import sqlite3 from "sqlite3"; + + const sqlite3: sqlite3; + + export default sqlite3; +} -- 2.39.2 From 9b6d405ce5a4ef2e08afdcb2a0019a795a2877bb Mon Sep 17 00:00:00 2001 From: Amy Date: Fri, 26 Nov 2021 20:41:35 -0500 Subject: [PATCH 2/9] Add vscode settings --- .vscode/extensions.json | 6 ++++++ .vscode/settings.json | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..89b34e3 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "dbaeumer.vscode-eslint", + "humao.rest-client", + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..4221fda --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,41 @@ +{ + "typescript.tsdk": "node_modules/typescript/lib", + "eslint.format.enable": true, + "eslint.codeActionsOnSave.mode": "all", + "[css]": { + "editor.suggest.insertMode": "replace", + "gitlens.codeLens.scopes": ["document"], + "editor.formatOnSave": true + }, + "[javascript]": { + "editor.formatOnSave": false, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + } + }, + "[javascriptreact]": { + "editor.formatOnSave": false, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + } + }, + "[typescript]": { + "editor.formatOnSave": false, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + } + }, + "[typescriptreact]": { + "editor.formatOnSave": false, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": true + } + }, + "python.linting.pylintEnabled": true, + "python.linting.enabled": true, + "files.exclude": { + "node_modules": true + }, + "editor.tabSize": 2, + "files.eol": "\n", +} -- 2.39.2 From 12d2ce1a0de9f11ad793a5a9887f2287e03d72dc Mon Sep 17 00:00:00 2001 From: Amy Date: Sat, 27 Nov 2021 21:04:42 -0500 Subject: [PATCH 3/9] Delete types.d.ts --- types.d.ts | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 types.d.ts diff --git a/types.d.ts b/types.d.ts deleted file mode 100644 index 6b866e6..0000000 --- a/types.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -declare module "sqlite3" { - import { sqlite3 } from "@types/sqlite3"; - import sqlite3 from "sqlite3"; - - const sqlite3: sqlite3; - - export default sqlite3; -} -- 2.39.2 From 3f3eee108c29ddd8229b6b8f3d05da97713ecab8 Mon Sep 17 00:00:00 2001 From: Amy Date: Mon, 15 Nov 2021 23:45:32 -0500 Subject: [PATCH 4/9] Add basic getAllBooks API --- pages/api/books.ts | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 pages/api/books.ts diff --git a/pages/api/books.ts b/pages/api/books.ts new file mode 100644 index 0000000..0fb1562 --- /dev/null +++ b/pages/api/books.ts @@ -0,0 +1,26 @@ +import { NextApiRequest, NextApiResponse } from "next"; +import sqlite3 from "sqlite3"; + +const DATABASE_PATH = "catalogue.db"; + +export default async function getAllBooks( + request: NextApiRequest, + response: NextApiResponse +) { + const database = new sqlite3.Database(DATABASE_PATH, sqlite3.OPEN_READONLY); + + database.all( + "SELECT title, authors, isbn FROM books", + (error, rows: SimpleBook[]) => { + response.status(200).json(rows); + } + ); + + database.close(); +} + +export interface SimpleBook { + authors: string; + isbn: string; + title: string; +} -- 2.39.2 From 79c759075fbd20f6892a434118387b95359b2af8 Mon Sep 17 00:00:00 2001 From: Amy Date: Mon, 15 Nov 2021 23:46:25 -0500 Subject: [PATCH 5/9] Add basic error checking --- pages/api/books.ts | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/pages/api/books.ts b/pages/api/books.ts index 0fb1562..1a127f9 100644 --- a/pages/api/books.ts +++ b/pages/api/books.ts @@ -3,18 +3,30 @@ import sqlite3 from "sqlite3"; const DATABASE_PATH = "catalogue.db"; -export default async function getAllBooks( +export default function getAllBooks( request: NextApiRequest, response: NextApiResponse ) { + if (request.method !== "GET") { + response.status(405); + return; + } + const database = new sqlite3.Database(DATABASE_PATH, sqlite3.OPEN_READONLY); - database.all( - "SELECT title, authors, isbn FROM books", - (error, rows: SimpleBook[]) => { - response.status(200).json(rows); - } - ); + try { + database.all( + "SELECT title, authors, isbn FROM books", + (error: Error | null, rows: SimpleBook[]) => { + if (error) { + throw error; + } + response.status(200).json(rows); + } + ); + } catch (error) { + response.status(500); + } database.close(); } -- 2.39.2 From 324ba1efdec3e90549eb26b7a661e38864e425ae Mon Sep 17 00:00:00 2001 From: Amy Date: Sat, 27 Nov 2021 22:54:46 -0500 Subject: [PATCH 6/9] Refactor getAllBooks into promisified non-API function --- {pages/api => lib}/books.ts | 23 +++++++---------------- pages/index.tsx | 22 +++++++++++++++++----- 2 files changed, 24 insertions(+), 21 deletions(-) rename {pages/api => lib}/books.ts (54%) diff --git a/pages/api/books.ts b/lib/books.ts similarity index 54% rename from pages/api/books.ts rename to lib/books.ts index 1a127f9..92db791 100644 --- a/pages/api/books.ts +++ b/lib/books.ts @@ -1,34 +1,25 @@ -import { NextApiRequest, NextApiResponse } from "next"; import sqlite3 from "sqlite3"; const DATABASE_PATH = "catalogue.db"; -export default function getAllBooks( - request: NextApiRequest, - response: NextApiResponse -) { - if (request.method !== "GET") { - response.status(405); - return; - } - +export async function getAllBooks() { const database = new sqlite3.Database(DATABASE_PATH, sqlite3.OPEN_READONLY); - try { + const books = new Promise((resolve, reject) => { database.all( "SELECT title, authors, isbn FROM books", (error: Error | null, rows: SimpleBook[]) => { if (error) { - throw error; + reject(error); } - response.status(200).json(rows); + resolve(rows); } ); - } catch (error) { - response.status(500); - } + }); database.close(); + + return books; } export interface SimpleBook { diff --git a/pages/index.tsx b/pages/index.tsx index cf73651..f1972f9 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -1,8 +1,20 @@ -import type { NextPage } from "next"; import React from "react"; -const Home: NextPage = () => { - return
I am a book
; -}; +import { getAllBooks, SimpleBook } from "../lib/books"; -export default Home; +export default function Home(props: Props) { + console.log(props.books); + return
I am a book
; +} + +interface Props { + books: SimpleBook[]; +} + +export async function getServerSideProps() { + return { + props: { + books: await getAllBooks(), + }, + }; +} -- 2.39.2 From ef96244b8e1196ec10cf45260855f81a68d3dc01 Mon Sep 17 00:00:00 2001 From: Amy Date: Sat, 27 Nov 2021 23:19:19 -0500 Subject: [PATCH 7/9] Add temporary display for listing books --- pages/index.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/pages/index.tsx b/pages/index.tsx index f1972f9..e283020 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -3,8 +3,17 @@ import React from "react"; import { getAllBooks, SimpleBook } from "../lib/books"; export default function Home(props: Props) { - console.log(props.books); - return
I am a book
; + return ( +
    + {props.books.map((book, idx) => { + return ( +
  1. + {book.title}; {book.authors}; {book.isbn} +
  2. + ); + })} +
+ ); } interface Props { -- 2.39.2 From 5d98b8ef8ea8e21405edfe15c05d90b6e1ffc515 Mon Sep 17 00:00:00 2001 From: Amy Date: Tue, 22 Feb 2022 22:07:56 -0500 Subject: [PATCH 8/9] Handle books without title, authors, isbn --- lib/books.ts | 9 +++++---- pages/index.tsx | 8 ++++---- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/books.ts b/lib/books.ts index 92db791..0ba0964 100644 --- a/lib/books.ts +++ b/lib/books.ts @@ -7,7 +7,7 @@ export async function getAllBooks() { const books = new Promise((resolve, reject) => { database.all( - "SELECT title, authors, isbn FROM books", + "SELECT id, title, authors, isbn FROM books WHERE deleted = 0", (error: Error | null, rows: SimpleBook[]) => { if (error) { reject(error); @@ -23,7 +23,8 @@ export async function getAllBooks() { } export interface SimpleBook { - authors: string; - isbn: string; - title: string; + id: number; + title: string | null; + authors: string | null; + isbn: string | null; } diff --git a/pages/index.tsx b/pages/index.tsx index e283020..d64c66e 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -4,15 +4,15 @@ import { getAllBooks, SimpleBook } from "../lib/books"; export default function Home(props: Props) { return ( -
    +
      {props.books.map((book, idx) => { return ( -
    • - {book.title}; {book.authors}; {book.isbn} +
    • + {book.id}; {book.title}; {book.authors}; {book.isbn}
    • ); })} -
+ ); } -- 2.39.2 From b4e216c0be8ac8b9f6001ce3c400be4725a33718 Mon Sep 17 00:00:00 2001 From: Amy Date: Tue, 22 Feb 2022 22:12:31 -0500 Subject: [PATCH 9/9] Update array key --- pages/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/index.tsx b/pages/index.tsx index d64c66e..46c3461 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -7,7 +7,7 @@ export default function Home(props: Props) {
    {props.books.map((book, idx) => { return ( -
  • +
  • {book.id}; {book.title}; {book.authors}; {book.isbn}
  • ); -- 2.39.2