Merge pull request 'mai2: support unfavoriting music' (#225) from ppc/artemis:mai2_favorites into develop

Reviewed-on: Hay1tsme/artemis#225
This commit is contained in:
2025-08-09 06:00:47 +00:00
2 changed files with 34 additions and 22 deletions

View File

@ -258,9 +258,9 @@ class Mai2DX(Mai2Base):
if kind_id is not None: if kind_id is not None:
await self.data.item.put_favorite(user_id, kind_id, fav["itemIdList"]) await self.data.item.put_favorite(user_id, kind_id, fav["itemIdList"])
if "userFavoritemusicList" in upsert and len(upsert["userFavoritemusicList"]) > 0: # added in BUDDiES+
for fav in upsert["userFavoritemusicList"]: if "isNewFavoritemusicList" in upsert and upsert["isNewFavoritemusicList"] != "" and "userFavoritemusicList" in upsert:
await self.data.item.add_fav_music(user_id, fav["id"], fav["orderId"]) await self.data.item.put_fav_music(user_id, ((fav["id"], fav["orderId"]) for fav in upsert["userFavoritemusicList"]))
if ( if (
"userFriendSeasonRankingList" in upsert "userFriendSeasonRankingList" in upsert

View File

@ -1,7 +1,8 @@
from collections.abc import Iterable
from datetime import datetime from datetime import datetime
from typing import Dict, List, Optional 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.dialects.mysql import insert
from sqlalchemy.engine import Row from sqlalchemy.engine import Row
from sqlalchemy.schema import ForeignKey from sqlalchemy.schema import ForeignKey
@ -550,25 +551,36 @@ class Mai2ItemData(BaseData):
if result: if result:
return result.fetchall() return result.fetchall()
async def add_fav_music(self, user_id: int, music_id: int, order_id: Optional[int] = None) -> Optional[int]: async def put_fav_music(self, user_id: int, fav_list: Iterable[tuple[int, Optional[int]]]) -> Optional[int]:
sql = insert(fav_music).values( row_count = 0
user = user_id, processed_music_ids = []
musicId = music_id,
orderId = order_id 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) return row_count + result.rowcount
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}!")
async def put_card( async def put_card(
self, self,