-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdatabase.js
More file actions
186 lines (169 loc) · 6.03 KB
/
Copy pathdatabase.js
File metadata and controls
186 lines (169 loc) · 6.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
const sqlite3 = require('sqlite3').verbose();
const path = require('path');
const { app } = require('electron');
class Database {
constructor() {
const dbPath = path.join(app.getPath('userData'), 'library.db');
this.db = new sqlite3.Database(dbPath);
this.initializeDatabase();
}
initializeDatabase() {
this.db.serialize(() => {
this.db.run(`
CREATE TABLE IF NOT EXISTS books (
id INTEGER PRIMARY KEY AUTOINCREMENT,
isbn TEXT,
title TEXT NOT NULL,
author TEXT,
publisher TEXT,
publication_year INTEGER,
genre TEXT,
cover_url TEXT,
notes TEXT,
is_favorite INTEGER DEFAULT 0,
reading_status TEXT DEFAULT 'unread',
date_added DATETIME DEFAULT CURRENT_TIMESTAMP,
date_finished DATETIME,
rating INTEGER,
page_count INTEGER,
current_page INTEGER DEFAULT 0
)
`);
this.db.run(`
CREATE INDEX IF NOT EXISTS idx_title ON books(title);
`);
this.db.run(`
CREATE INDEX IF NOT EXISTS idx_author ON books(author);
`);
this.db.run(`
CREATE INDEX IF NOT EXISTS idx_reading_status ON books(reading_status);
`);
});
}
addBook(book) {
return new Promise((resolve, reject) => {
const sql = `
INSERT INTO books (isbn, title, author, publisher, publication_year, genre, cover_url, notes, is_favorite, reading_status, page_count)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`;
this.db.run(sql, [
book.isbn || null,
book.title,
book.author || null,
book.publisher || null,
book.publication_year || null,
book.genre || null,
book.cover_url || null,
book.notes || null,
book.is_favorite || 0,
book.reading_status || 'unread',
book.page_count || null
], function(err) {
if (err) reject(err);
else resolve(this.lastID);
});
});
}
updateBook(id, book) {
return new Promise((resolve, reject) => {
const sql = `
UPDATE books SET
isbn = ?, title = ?, author = ?, publisher = ?,
publication_year = ?, genre = ?, cover_url = ?, notes = ?,
is_favorite = ?, reading_status = ?, page_count = ?, current_page = ?,
date_finished = ?, rating = ?
WHERE id = ?
`;
this.db.run(sql, [
book.isbn, book.title, book.author, book.publisher,
book.publication_year, book.genre, book.cover_url, book.notes,
book.is_favorite, book.reading_status, book.page_count, book.current_page,
book.date_finished, book.rating, id
], (err) => {
if (err) reject(err);
else resolve();
});
});
}
deleteBook(id) {
return new Promise((resolve, reject) => {
this.db.run('DELETE FROM books WHERE id = ?', [id], (err) => {
if (err) reject(err);
else resolve();
});
});
}
getBook(id) {
return new Promise((resolve, reject) => {
this.db.get('SELECT * FROM books WHERE id = ?', [id], (err, row) => {
if (err) reject(err);
else resolve(row);
});
});
}
getAllBooks() {
return new Promise((resolve, reject) => {
this.db.all('SELECT * FROM books ORDER BY date_added DESC', (err, rows) => {
if (err) reject(err);
else resolve(rows);
});
});
}
searchBooks(query) {
return new Promise((resolve, reject) => {
const sql = `
SELECT * FROM books
WHERE title LIKE ? OR author LIKE ? OR genre LIKE ? OR notes LIKE ?
ORDER BY date_added DESC
`;
const searchPattern = `%${query}%`;
this.db.all(sql, [searchPattern, searchPattern, searchPattern, searchPattern], (err, rows) => {
if (err) reject(err);
else resolve(rows);
});
});
}
getFavorites() {
return new Promise((resolve, reject) => {
this.db.all('SELECT * FROM books WHERE is_favorite = 1 ORDER BY title', (err, rows) => {
if (err) reject(err);
else resolve(rows);
});
});
}
getBooksByStatus(status) {
return new Promise((resolve, reject) => {
this.db.all('SELECT * FROM books WHERE reading_status = ? ORDER BY date_added DESC', [status], (err, rows) => {
if (err) reject(err);
else resolve(rows);
});
});
}
updateReadingProgress(id, currentPage) {
return new Promise((resolve, reject) => {
this.db.run('UPDATE books SET current_page = ? WHERE id = ?', [currentPage, id], (err) => {
if (err) reject(err);
else resolve();
});
});
}
markAsFinished(id, rating) {
return new Promise((resolve, reject) => {
const sql = `
UPDATE books SET
reading_status = 'completed',
date_finished = CURRENT_TIMESTAMP,
rating = ?
WHERE id = ?
`;
this.db.run(sql, [rating, id], (err) => {
if (err) reject(err);
else resolve();
});
});
}
close() {
this.db.close();
}
}
module.exports = Database;