Get details for one book (#14)

Closes #3

Co-authored-by: Jared He <66887902+jaredjhe@users.noreply.github.com>
Reviewed-on: #14
Reviewed-by: Amy <a258wang@csclub.uwaterloo.ca>
main
Jared He 8 months ago
parent 2a308e1f37
commit 2040c63311
  1. 40
      lib/books.ts
  2. 25
      pages/index.tsx
  3. 2
      tsconfig.json

@ -2,6 +2,29 @@ import sqlite3 from "sqlite3";
const DATABASE_PATH = "catalogue.db";
export async function getBook(id: number): Promise<DetailedBook> {
const database = new sqlite3.Database(DATABASE_PATH, sqlite3.OPEN_READONLY);
const sql =
"SELECT isbn, lccn, title, subtitle, authors, edition, publisher, publish_year, publish_month, publish_location, pages, pagination, weight, last_updated FROM books WHERE id = ? AND deleted = 0";
const book: Promise<DetailedBook> = new Promise((resolve, reject) => {
database.get(sql, [id], (err: Error | null, book: DetailedBook) => {
if (err) {
reject(err);
}
if (book) {
resolve(book);
} else {
reject(new Error("Not a valid id"));
}
});
});
database.close();
return book;
}
export async function getAllBooks() {
const database = new sqlite3.Database(DATABASE_PATH, sqlite3.OPEN_READONLY);
@ -22,6 +45,23 @@ export async function getAllBooks() {
return books;
}
export interface DetailedBook {
isbn: string | null;
lccn: string | null;
title: string | null;
authors: string | null;
edition: string | null;
publisher: string | null;
publish_year: string | null;
publish_month: string | null;
publish_location: string | null;
pages: string | null;
pagination: string | null;
weight: string | null;
last_updated: Date | null;
deleted: boolean | null;
}
export interface SimpleBook {
id: number;
title: string | null;

@ -1,28 +1,33 @@
import React from "react";
import { getAllBooks, SimpleBook } from "../lib/books";
import { getBook, getAllBooks, DetailedBook, SimpleBook } from "../lib/books";
export default function Home(props: Props) {
return (
<ul>
{props.books.map((book, idx) => {
return (
<li key={`${idx}_${book.id}`}>
{book.id}; {book.title}; {book.authors}; {book.isbn}
</li>
);
})}
</ul>
<div>
<ul>
{props.books.map((book, idx) => {
return (
<li key={`${idx}_${book.id}`}>
{book.id}; {book.title}; {book.authors}; {book.isbn}
</li>
);
})}
</ul>
<p>{props.book.title}</p>
</div>
);
}
interface Props {
book: DetailedBook;
books: SimpleBook[];
}
export async function getServerSideProps() {
return {
props: {
book: await getBook(44),
books: await getAllBooks(),
},
};

@ -3,7 +3,7 @@
/* Basic Options */
"incremental": true,
"target": "ES6",
"module": "esnext",
"module": "CommonJS",
"moduleResolution": "node",
"lib": ["dom", "dom.iterable", "esnext"],
"sourceMap": true,

Loading…
Cancel
Save