feat: prevent duplicate cards, merge contexts, and display star badge when word is in library
This commit is contained in:
1 parent
f52820fff6
commit
a73bdc29fd
7 files changed
+355
-24
No files matched your search
+52
-1
@@ -285,9 +285,24 @@ async def api_lookup(
|
||||
if not query_str:
|
||||
raise HTTPException(status_code=400, detail="Query term cannot be empty")
|
||||
data = await lookup_term(query_str)
|
||||
|
||||
# Check if this term already exists in user's dictionary
|
||||
with get_db() as conn:
|
||||
existing = conn.execute(
|
||||
"SELECT id, term, translation, context_sentence, tags, collection, srs_state, srs_reps FROM vocabulary_cards WHERE user_id = ? AND lower(trim(term)) = lower(trim(?))",
|
||||
(user["id"], query_str),
|
||||
).fetchone()
|
||||
if existing:
|
||||
data["in_library"] = True
|
||||
data["library_card"] = dict(existing)
|
||||
else:
|
||||
data["in_library"] = False
|
||||
data["library_card"] = None
|
||||
|
||||
return data
|
||||
|
||||
|
||||
|
||||
@app.api_route("/api/audio", methods=["GET", "HEAD"])
|
||||
async def api_audio_proxy():
|
||||
# Audio feature disabled
|
||||
@@ -386,7 +401,42 @@ async def api_get_cards(
|
||||
|
||||
@app.post("/api/cards")
|
||||
async def api_create_card(card: CardCreateRequest, user: dict = Depends(require_user)):
|
||||
clean_term = card.term.strip()
|
||||
with get_db() as conn:
|
||||
existing = conn.execute(
|
||||
"SELECT * FROM vocabulary_cards WHERE user_id = ? AND lower(trim(term)) = lower(trim(?))",
|
||||
(user["id"], clean_term),
|
||||
).fetchone()
|
||||
|
||||
if existing:
|
||||
# Word already exists in library!
|
||||
existing_row = dict(existing)
|
||||
new_ctx = (card.context_sentence or "").strip()
|
||||
old_ctx = (existing_row.get("context_sentence") or "").strip()
|
||||
updated_ctx = old_ctx
|
||||
if new_ctx and new_ctx not in old_ctx:
|
||||
updated_ctx = f"{old_ctx}\n\n{new_ctx}" if old_ctx else new_ctx
|
||||
|
||||
# Merge tags
|
||||
old_tags = set([t.strip() for t in (existing_row.get("tags") or "").split(",") if t.strip()])
|
||||
new_tags = [t.strip() for t in (card.tags or "").split(",") if t.strip()]
|
||||
for t in new_tags:
|
||||
old_tags.add(t)
|
||||
updated_tags = ", ".join(sorted(old_tags)) if old_tags else "general"
|
||||
|
||||
conn.execute(
|
||||
"""
|
||||
UPDATE vocabulary_cards
|
||||
SET context_sentence = ?, tags = ?, updated_at = CURRENT_TIMESTAMP
|
||||
WHERE id = ?
|
||||
""",
|
||||
(updated_ctx, updated_tags, existing_row["id"]),
|
||||
)
|
||||
updated_row = conn.execute("SELECT * FROM vocabulary_cards WHERE id = ?", (existing_row["id"],)).fetchone()
|
||||
res = dict(updated_row)
|
||||
res["already_exists"] = True
|
||||
return res
|
||||
|
||||
cursor = conn.execute(
|
||||
"""
|
||||
INSERT INTO vocabulary_cards (
|
||||
@@ -397,7 +447,7 @@ async def api_create_card(card: CardCreateRequest, user: dict = Depends(require_
|
||||
""",
|
||||
(
|
||||
user["id"],
|
||||
card.term.strip(),
|
||||
clean_term,
|
||||
card.translation.strip(),
|
||||
(card.context_sentence or "").strip(),
|
||||
(card.phonetic or "").strip(),
|
||||
@@ -414,6 +464,7 @@ async def api_create_card(card: CardCreateRequest, user: dict = Depends(require_
|
||||
return dict(row)
|
||||
|
||||
|
||||
|
||||
@app.put("/api/cards/{card_id}")
|
||||
async def api_update_card(card_id: int, update: CardUpdateRequest, user: dict = Depends(require_user)):
|
||||
with get_db() as conn:
|
||||
|
||||
Reference in new issue
Block a user