diff --git a/src/main.py b/src/main.py index de55177..5924bd3 100644 --- a/src/main.py +++ b/src/main.py @@ -158,54 +158,62 @@ def check_seadex(request:Request, db=Depends(get_db)): return results @user_router.post("/add/anime") -def add_anime(anime: AnimeCreate, user_id: UserId, db=Depends(get_db)): - logger.info(f"[FastAPI] Received request to track anilist_id={anime.anilist_id}, user_id={user_id}") +def add_anime( + anime: AnimeCreate, + user_id: UserId, + db=Depends(get_db), + ): + logger.info("[FastAPI] Received request to track anilist_id=%s, user_id=%s", anime.anilist_id, user_id) - anime_name = get_anime_name(anime.anilist_id) - logger.debug(f"[FastAPI] Found name={anime_name} for Anilist id={anime.anilist_id}") + with db.cursor() as cursor: + cursor.execute( + "SELECT id, active FROM seadex_state WHERE anilist_id = %s", + (anime.anilist_id,), + ) + known = cursor.fetchone() + + last_updated = None + with SeaDexEntry() as seadex: + if known is None: + anime_name = get_anime_name(anime.anilist_id) + last_updated = check_for_update(seadex, anime.anilist_id) + else: + anime_name, active = known + if not active: + last_updated = check_for_update(seadex, anime.anilist_id) with db.cursor() as cursor: try: cursor.execute( - "SELECT id FROM seadex_state WHERE anilist_id = %s AND user_id = %s", - (anime.anilist_id, user_id), + "INSERT INTO seadex_state (anilist_id, anime_name, last_updated) " + "VALUES (%s, %s, %s) " + "ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID(id), active = 1, " + "last_updated = COALESCE(VALUES(last_updated), last_updated)", + (anime.anilist_id, anime_name, last_updated), ) - - if cursor.fetchone(): - logger.debug("[FastAPI] Found existing entry, updating name and setting to active") - cursor.execute( - "UPDATE seadex_state SET anime_name = %s, active = 1 " - "WHERE anilist_id = %s AND user_id=%s", - (anime_name, anime.anilist_id, user_id), - ) - db.commit() - return { - "status": "ok", - "detail": f"Updated existing entry name={anime_name}, " - f"Anilist ID={anime.anilist_id}", - } - - with SeaDexEntry() as seadex: - current = check_for_update(seadex, anime.anilist_id) - logger.debug(f"[FastAPI] Inserting new anime with last_updated={current}") + seadex_state_id = cursor.lastrowid cursor.execute( - "INSERT INTO seadex_state (anilist_id, anime_name, last_updated, user_id) " - "VALUES (%s, %s, %s, %s)", - (anime.anilist_id, anime_name, current, user_id), + "INSERT INTO seadex_state_subscriptions (user_id, seadex_state_id, custom_name) " + "VALUES (%s, %s, %s) " + "ON DUPLICATE KEY UPDATE active = 1, custom_name = VALUES(custom_name)", + (user_id, seadex_state_id, anime.custom_name or None), ) db.commit() - return { - "status": "ok", - "detail": f"Created new entry name={anime_name}, " - f"Anilist ID={anime.anilist_id}", - } - except Exception as e: db.rollback() - logger.exception(f"[FastAPI] Failed for anilist_id={anime.anilist_id}, name={anime_name}, user_id={user_id}") + logger.exception( + "[FastAPI] Failed for anilist_id=%s, name=%s, user_id=%s", + anime.anilist_id, anime_name, user_id, + ) raise HTTPException(status_code=500) from e + logger.info( + "[FastAPI] Tracking anilist_id=%s name=%r for user_id=%s (state_id=%s)", + anime.anilist_id, anime_name, user_id, seadex_state_id, + ) + return {"status": "ok", "detail": f"Tracking name={anime.custom_name or anime_name}, Anilist ID={anime.anilist_id}"} + @user_router.post("/delete/anime") def remove_anime(anime: AnimeCreate, user_id: UserId, db=Depends(get_db)): logger.info(f"[FastAPI] Received request to deactivate tracking for anilist_id={anime.anilist_id}, user_id={user_id}") diff --git a/src/models.py b/src/models.py index 73a1413..c6a4b6b 100644 --- a/src/models.py +++ b/src/models.py @@ -3,6 +3,7 @@ from pydantic import BaseModel, Field, computed_field class AnimeCreate(BaseModel): anilist_id: int = Field(gt=0) + custom_name: str | None = Field(default=None, max_length=255) class AnimeEntry(BaseModel): name: str