summaryrefslogtreecommitdiff
path: root/src/lib/db/index.ts
diff options
context:
space:
mode:
authorpolwex <polwex@sortug.com>2025-05-21 17:13:11 +0700
committerpolwex <polwex@sortug.com>2025-05-21 17:13:11 +0700
commit7abf2227438362ad30820ee236405ec1b57a40b6 (patch)
tree41c2eb60befef7d665c8cd6feebb91cdf4536934 /src/lib/db/index.ts
parent9192e6c7747fd2d3f6a6c5c07d886a0982b53f11 (diff)
m
Diffstat (limited to 'src/lib/db/index.ts')
-rw-r--r--src/lib/db/index.ts82
1 files changed, 54 insertions, 28 deletions
diff --git a/src/lib/db/index.ts b/src/lib/db/index.ts
index b43edc3..fcfab57 100644
--- a/src/lib/db/index.ts
+++ b/src/lib/db/index.ts
@@ -44,7 +44,7 @@ class DatabaseHandler {
name: string;
expiry: number;
};
- console.log("cokifetch", { coki, res });
+ // console.log("cokifetch", { coki, res });
return res;
}
setCookie(coki: string, user: number, expiry: number) {
@@ -329,18 +329,24 @@ class DatabaseHandler {
}
// SELECT l.id, l.text, cards.text, cards.note FROM cards_lessons cl LEFT JOIN lessons l ON l.id = cl.lesson_id LEFT JOIN cards ON cards.id = cl.card_id ORDER BY l.id ASC LIMIT 20 OFFSET 0;
- fetchLesson(
- userId: number,
- lessonId: number,
- count?: number,
- page?: number,
- ): Result<DeckResponse> {
+ fetchLesson({
+ userId,
+ lessonId,
+ count,
+ page,
+ random,
+ }: {
+ userId: number;
+ lessonId: number;
+ count?: number;
+ page?: number;
+ random?: boolean;
+ }): Result<DeckResponse> {
const p = page ? page : 1;
const size = count ? count : PAGE_SIZE;
const offset = getDBOffset(p, size);
const tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);
- console.log(tomorrow.getTime());
const queryString = `
SELECT
l.name, l.description, ll.lang as llang, cards.text, cards.note, cards.id as cid,
@@ -351,7 +357,9 @@ class DatabaseHandler {
up.next_review_date,
up.last_reviewed,
up.is_mastered,
+ e.id as eid,
e.*,
+ (CASE WHEN bm.word_id IS NULL THEN 0 ELSE 1 END) as is_bookmarked,
(SELECT
json_group_array(json_object(
'pos', pos,
@@ -371,31 +379,28 @@ class DatabaseHandler {
JOIN cards ON cards.id = cl.card_id
JOIN cards_expressions ce ON cards.id = ce.card_id
JOIN expressions e ON e.id = ce.expression_id
- LEFT JOIN user_progress up ON up.card_id = cards.id AND up.user_id = ?
- WHERE l.id = ? AND (up.next_review_date IS NULL OR up.next_review_date < ?)
- ORDER BY cards.id, e.id
- LIMIT ? OFFSET ?;
+ LEFT JOIN user_progress up ON up.card_id = cards.id AND up.user_id = ?1
+ LEFT JOIN bookmarks bm ON bm.word_id = e.id AND bm.user_id = ?1
+ WHERE l.id = ?2 AND (up.next_review_date IS NULL OR up.next_review_date < ?3)
+ ${
+ random
+ ? // ? "AND e.id IN (SELECT id FROM expressions ORDER BY RANDOM() LIMIT ?4 OFFSET ?5)"
+ // "AND e.rowid > (ABS(RANDOM()) % (SELECT max(rowid) FROM expressions)) LIMIT ?4 OFFSET ?5"
+ "ORDER BY RANDOM() LIMIT ?4 OFFSET ?5"
+ : "ORDER BY cards.id, e.id LIMIT ?4 OFFSET ?5"
+ };
`;
- // const queryString = `
- // SELECT
- // l.id, l.name, l.description, l.lang, cards.text, cards.note, cards.id as cid,
- // spelling, ipa, frequency, e.id as eid,
- // GROUP_CONCAT(wc.category, ',') AS category
- // FROM cards_lessons cl
- // JOIN lessons l ON l.id = cl.lesson_id
- // JOIN cards ON cards.id = cl.card_id
- // JOIN cards_expressions ce ON cards.id = ce.card_id
- // JOIN expressions e ON e.id = ce.expression_id
- // JOIN word_categories wc ON wc.word_id = e.id
- // WHERE l.id = ?
- // LIMIT ? OFFSET ?;
- // `;
+ // SELECT * FROM expressions e
+ // WHERE e.rowid > (
+ // ABS(RANDOM()) % (SELECT max(rowid) FROM expressions)
+ // )
+ // LIMIT 10;
const query = this.db.query(queryString);
const res = query.all(userId, lessonId, tomorrow.getTime(), size, offset);
- console.log(res.length);
+ // console.log("cards", res.length);
if (res.length === 0) return { error: "Lesson not found" };
const row: any = res[0];
- // console.log({ row });
+ console.log({ row });
const lesson = {
id: lessonId,
name: row.name,
@@ -415,6 +420,7 @@ class DatabaseHandler {
return { ...s, senses, related, forms };
});
const expression = {
+ isBookmarked: row.is_bookmarked > 0,
ipa: JSON.parse(row.ipa),
prosody: JSON.parse(row.prosody),
syllables: row.syllables,
@@ -673,6 +679,26 @@ class DatabaseHandler {
const res = query.run({ wordId, category });
return res.lastInsertRowid;
}
+ addBookmark(userId: number, wordId: number | bigint, notes?: string) {
+ const queryString = `
+ INSERT OR IGNORE
+ INTO bookmarks(user_id, word_id, created, notes)
+ VALUES(?, ?, ?, ?)
+ `;
+ const query = this.db.query(queryString);
+ const res = query.run(userId, wordId, Date.now(), notes || null);
+ return res.lastInsertRowid;
+ }
+ delBookmark(userId: number, wordId: number | bigint) {
+ const queryString = `
+ DELETE
+ FROM bookmarks
+ WHERE word_id = ? AND user_id = ?
+ `;
+ const query = this.db.query(queryString);
+ const res = query.run(wordId, userId);
+ return res;
+ }
addThaiSyl(params: {
spelling: string;
tone: number;