From 2d61646307493fd2be89e01dc37b9ad044f0e379 Mon Sep 17 00:00:00 2001 From: ppc Date: Wed, 6 Aug 2025 18:04:40 +0100 Subject: [PATCH] support removing favourite music entires --- titles/mai2/dx.py | 6 ++--- titles/mai2/schema/item.py | 50 +++++++++++++++++++++++--------------- 2 files changed, 34 insertions(+), 22 deletions(-) diff --git a/titles/mai2/dx.py b/titles/mai2/dx.py index 9b8b547..498aabb 100644 --- a/titles/mai2/dx.py +++ b/titles/mai2/dx.py @@ -258,9 +258,9 @@ class Mai2DX(Mai2Base): if kind_id is not None: await self.data.item.put_favorite(user_id, kind_id, fav["itemIdList"]) - if "userFavoritemusicList" in upsert and len(upsert["userFavoritemusicList"]) > 0: - for fav in upsert["userFavoritemusicList"]: - await self.data.item.add_fav_music(user_id, fav["id"], fav["orderId"]) + # added in BUDDiES+ + if "isNewFavoritemusicList" in upsert and upsert["isNewFavoritemusicList"] != "" and "userFavoritemusicList" in upsert: + await self.data.item.put_fav_music(user_id, ((fav["id"], fav["orderId"]) for fav in upsert["userFavoritemusicList"])) if ( "userFriendSeasonRankingList" in upsert diff --git a/titles/mai2/schema/item.py b/titles/mai2/schema/item.py index 8639ae5..bb35756 100644 --- a/titles/mai2/schema/item.py +++ b/titles/mai2/schema/item.py @@ -1,7 +1,8 @@ +from collections.abc import Iterable from datetime import datetime from typing import Dict, List, Optional -from sqlalchemy import Column, Table, UniqueConstraint, and_, or_ +from sqlalchemy import Column, Table, UniqueConstraint, and_, or_, not_ from sqlalchemy.dialects.mysql import insert from sqlalchemy.engine import Row from sqlalchemy.schema import ForeignKey @@ -550,25 +551,36 @@ class Mai2ItemData(BaseData): if result: return result.fetchall() - async def add_fav_music(self, user_id: int, music_id: int, order_id: Optional[int] = None) -> Optional[int]: - sql = insert(fav_music).values( - user = user_id, - musicId = music_id, - orderId = order_id - ) + async def put_fav_music(self, user_id: int, fav_list: Iterable[tuple[int, Optional[int]]]) -> Optional[int]: + row_count = 0 + processed_music_ids = [] + + for music_id, order_id in fav_list: + sql = insert(fav_music).values( + user = user_id, + musicId = music_id, + orderId = order_id + ) + + conflict = sql.on_duplicate_key_update(orderId = order_id) + result = await self.execute(conflict) + + processed_music_ids.append(music_id) + + if not result: + self.logger.error(f"Failed to add music {music_id} as favorite for user {user_id}!") + continue + + row_count += result.rowcount + + clear_stale_entries_stmt = fav_music.delete(and_(fav_music.c.user == user_id, not_(fav_music.c.musicId.in_(processed_music_ids)))) + result = await self.execute(clear_stale_entries_stmt) + + if result is None: + self.logger.error(f"Failed to clear stale favorite music entries for user {user_id}!") + return None - conflict = sql.on_duplicate_key_update(orderId = order_id) - - result = await self.execute(conflict) - if result: - return result.lastrowid - - self.logger.error(f"Failed to add music {music_id} as favorite for user {user_id}!") - - async def remove_fav_music(self, user_id: int, music_id: int) -> None: - result = await self.execute(fav_music.delete(and_(fav_music.c.user == user_id, fav_music.c.musicId == music_id))) - if not result: - self.logger.error(f"Failed to remove music {music_id} as favorite for user {user_id}!") + return row_count + result.rowcount async def put_card( self,