diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/UpsertUserAllHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/UpsertUserAllHandler.java deleted file mode 100644 index d9f3b2e6..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/UpsertUserAllHandler.java +++ /dev/null @@ -1,350 +0,0 @@ -package icu.samnyan.aqua.sega.chusan.handler; - -import com.fasterxml.jackson.core.JsonProcessingException; -import icu.samnyan.aqua.sega.general.BaseHandler; -import icu.samnyan.aqua.sega.chusan.dao.userdata.UserCMissionProgressRepository; -import icu.samnyan.aqua.sega.chusan.dao.userdata.UserCMissionRepository; -import icu.samnyan.aqua.sega.chusan.model.request.UpsertUserAll; -import icu.samnyan.aqua.sega.chusan.model.response.CodeResp; -import icu.samnyan.aqua.sega.chusan.model.userdata.*; -import icu.samnyan.aqua.sega.chusan.service.*; -import icu.samnyan.aqua.sega.general.model.Card; -import icu.samnyan.aqua.sega.general.model.response.UserRecentRating; -import icu.samnyan.aqua.sega.general.service.CardService; -import icu.samnyan.aqua.sega.util.jackson.StringMapper; -import lombok.AllArgsConstructor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -import java.nio.charset.StandardCharsets; -import java.time.LocalDateTime; -import java.util.*; - -/** - * The handler for save user data. Only send in the end of the session. - * - * @author samnyan (privateamusement@protonmail.com) - */ -@AllArgsConstructor -@Component("ChusanUpsertUserAllHandler") -public class UpsertUserAllHandler implements BaseHandler { - - private static final Logger logger = LoggerFactory.getLogger(UpsertUserAllHandler.class); - - private final StringMapper mapper; - - private final CardService cardService; - - private final UserDataService userDataService; - private final UserCharacterService userCharacterService; - private final UserGameOptionService userGameOptionService; - private final UserMapAreaService userMapService; - private final UserItemService userItemService; - private final UserMusicDetailService userMusicDetailService; - private final UserActivityService userActivityService; - private final UserPlaylogService userPlaylogService; - private final UserChargeService userChargeService; - private final UserCourseService userCourseService; - private final UserDuelService userDuelService; - private final UserGeneralDataService userGeneralDataService; - private final UserLoginBonusService userLoginBonusService; - private final UserCMissionRepository userCMissionRepository; - private final UserCMissionProgressRepository userCMissionProgressRepository; - - - @Override - public String handle(Map request) throws JsonProcessingException { - String userId = (String) request.get("userId"); - UpsertUserAll upsertUserAll = mapper.convert(request.get("upsertUserAll"), UpsertUserAll.class); - - // Not all field will be sent. Check if they are exist first. - - Chu3UserData newUserData; - // UserData - if (upsertUserAll.getUserData() == null) { - return null; - } else { - newUserData = upsertUserAll.getUserData().get(0); - - Chu3UserData userData = userDataService.getUserByExtId(userId).orElseGet(() -> { - var data = new Chu3UserData(); - Card card = cardService.getCardByExtId(userId).orElseThrow(); - data.setCard(card); - return data; - }); - - newUserData.setId(userData.getId()); - newUserData.setCard(userData.getCard()); - - // Decode Username - String userName = new String(newUserData.getUserName() - .getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); - - newUserData.setUserName(userName); - newUserData.setUserNameEx(""); - userDataService.saveAndFlushUserData(newUserData); - } - - // userGameOption - if (upsertUserAll.getUserGameOption() != null) { - UserGameOption newUserGameOption = upsertUserAll.getUserGameOption().get(0); - - Optional userGameOptionOptional = userGameOptionService.getByUser(newUserData); - - UserGameOption userGameOption = userGameOptionOptional.orElseGet(() -> new UserGameOption(newUserData)); - - newUserGameOption.setId(userGameOption.getId()); - newUserGameOption.setUser(userGameOption.getUser()); - - userGameOptionService.save(newUserGameOption); - } - - // userMapList - if (upsertUserAll.getUserMapAreaList() != null) { - List userMapList = upsertUserAll.getUserMapAreaList(); - Map newUserMapMap = new HashMap<>(); - - userMapList.forEach(newUserMap -> { - int mapId = newUserMap.getMapAreaId(); - UserMap userMap; - Optional userMapOptional = userMapService.getByUserAndMapAreaId(newUserData, mapId); - userMap = userMapOptional.orElseGet(() -> new UserMap(newUserData)); - - newUserMap.setId(userMap.getId()); - newUserMap.setUser(userMap.getUser()); - - newUserMapMap.put(mapId, newUserMap); - }); - userMapService.saveAll(newUserMapMap.values()); - } - - // userCharacterList - if (upsertUserAll.getUserCharacterList() != null) { - List userCharacterList = upsertUserAll.getUserCharacterList(); - Map newCharacterMap = new HashMap<>(); - - userCharacterList.forEach(newUserCharacter -> { - int characterId = newUserCharacter.getCharacterId(); - - Optional userCharacterOptional = userCharacterService.getByUserAndCharacterId(newUserData, characterId); - UserCharacter userCharacter = userCharacterOptional.orElseGet(() -> new UserCharacter(newUserData)); - - newUserCharacter.setId(userCharacter.getId()); - newUserCharacter.setUser(userCharacter.getUser()); - - newCharacterMap.put(characterId, newUserCharacter); - }); - userCharacterService.saveAll(newCharacterMap.values()); - } - - // userItemList - if (upsertUserAll.getUserItemList() != null) { - List userItemList = upsertUserAll.getUserItemList(); - Map newUserItemMap = new HashMap<>(); - - userItemList.forEach(newUserItem -> { - int itemId = newUserItem.getItemId(); - int itemKind = newUserItem.getItemKind(); - - - Optional userItemOptional = userItemService.getByUserAndItemIdAndKind(newUserData, itemId, itemKind); - UserItem userItem = userItemOptional.orElseGet(() -> new UserItem(newUserData)); - - newUserItem.setId(userItem.getId()); - newUserItem.setUser(userItem.getUser()); - - newUserItemMap.put(itemId + "-" + itemKind, newUserItem); - }); - userItemService.saveAll(newUserItemMap.values()); - } - - // userMusicDetailList - if (upsertUserAll.getUserMusicDetailList() != null) { - - List userMusicDetailList = upsertUserAll.getUserMusicDetailList(); - Map newUserMusicDetailMap = new HashMap<>(); - - userMusicDetailList.forEach(newUserMusicDetail -> { - int musicId = newUserMusicDetail.getMusicId(); - int level = newUserMusicDetail.getLevel(); - - Optional userMusicDetailOptional = userMusicDetailService.getByUserAndMusicIdAndLevel(newUserData, musicId, level); - UserMusicDetail userMusicDetail = userMusicDetailOptional.orElseGet(() -> new UserMusicDetail(newUserData)); - - newUserMusicDetail.setId(userMusicDetail.getId()); - newUserMusicDetail.setUser(userMusicDetail.getUser()); - - newUserMusicDetailMap.put(musicId + "-" + level, newUserMusicDetail); - }); - userMusicDetailService.saveAll(newUserMusicDetailMap.values()); - } - - // userActivityList - if (upsertUserAll.getUserActivityList() != null) { - List userActivityList = upsertUserAll.getUserActivityList(); - List newUserActivityList = new LinkedList<>(); - - userActivityList.forEach(newUserActivity -> { - // No need to rename to activityId. jackson auto handle that - int activityId = newUserActivity.getActivityId(); - int kind = newUserActivity.getKind(); - - Optional userActivityOptional = userActivityService.getByUserAndActivityIdAndKind(newUserData, activityId, kind); - UserActivity userActivity = userActivityOptional.orElseGet(() -> new UserActivity(newUserData)); - - newUserActivity.setId(userActivity.getId()); - newUserActivity.setUser(userActivity.getUser()); - - newUserActivityList.add(newUserActivity); - }); - userActivityService.saveAll(newUserActivityList); - } - - // userRecentRatingList - if(upsertUserAll.getUserRecentRatingList() != null) { - List userRecentRatingList = upsertUserAll.getUserRecentRatingList(); - - StringBuilder sb = new StringBuilder(); - userRecentRatingList.forEach(userRecentRating -> { - sb.append(userRecentRating.getMusicId()).append(":"); - sb.append(userRecentRating.getDifficultId()).append(":"); - sb.append(userRecentRating.getScore()).append(","); - }); - if(sb.length() > 0) { - sb.deleteCharAt(sb.length() - 1); - } - UserGeneralData userGeneralData = userGeneralDataService.getByUserAndKey(newUserData, "recent_rating_list") - .orElseGet(() -> new UserGeneralData(newUserData, "recent_rating_list")); - userGeneralData.setPropertyValue(sb.toString()); - userGeneralDataService.save(userGeneralData); - } - - // userChargeList - if (upsertUserAll.getUserChargeList() != null) { - List userChargeList = upsertUserAll.getUserChargeList(); - List newUserChargeList = new ArrayList<>(); - - userChargeList.forEach(newUserCharge -> { - int chargeId = newUserCharge.getChargeId(); - - Optional userChargeOptional = userChargeService.getByUserAndChargeId(newUserData, chargeId); - UserCharge userCharge = userChargeOptional.orElseGet(() -> new UserCharge(newUserData)); - - newUserCharge.setId(userCharge.getId()); - newUserCharge.setUser(userCharge.getUser()); - - newUserChargeList.add(newUserCharge); - }); - userChargeService.saveAll(newUserChargeList); - } - - // userPlaylogList - if (upsertUserAll.getUserPlaylogList() != null) { - List userPlaylogList = upsertUserAll.getUserPlaylogList(); - List newUserPlaylogList = new ArrayList<>(); - - userPlaylogList.forEach(newUserPlaylog -> { - newUserPlaylog.setUser(newUserData); - - newUserPlaylogList.add(newUserPlaylog); - }); - if (newUserPlaylogList.size() > 0) userPlaylogService.saveAll(newUserPlaylogList); - } - - - // userCourseList - if (upsertUserAll.getUserCourseList() != null) { - List userCourseList = upsertUserAll.getUserCourseList(); - - userCourseList.forEach(newUserCourse -> { - int courseId = newUserCourse.getCourseId(); - - Optional userCourseOptional = userCourseService.getByUserAndCourseId(newUserData, courseId); - UserCourse userCourse = userCourseOptional.orElseGet(() -> new UserCourse(newUserData)); - - newUserCourse.setId(userCourse.getId()); - newUserCourse.setUser(userCourse.getUser()); - - userCourseService.save(newUserCourse); - }); - } - - // userDuelList - if (upsertUserAll.getUserDuelList() != null) { - List userDuelList = upsertUserAll.getUserDuelList(); - Map newUserDuelMap = new HashMap<>(); - - userDuelList.forEach(newUserDuel -> { - int duelId = newUserDuel.getDuelId(); - - Optional userDuelOptional = userDuelService.getByUserAndDuelId(newUserData, duelId); - UserDuel userDuel = userDuelOptional.orElseGet(() -> new UserDuel(newUserData)); - - newUserDuel.setId(userDuel.getId()); - newUserDuel.setUser(userDuel.getUser()); - - newUserDuelMap.put(duelId, newUserDuel); - }); - userDuelService.saveAll(newUserDuelMap.values()); - } - - if (upsertUserAll.getUserLoginBonusList() != null){ - List> userLoginBonusList = upsertUserAll.getUserLoginBonusList(); - Map newUserLoginBonusMap = new HashMap<>(); - - userLoginBonusList.forEach(newUserLoginBonus -> { - int loginBonusPresetId = Integer.parseInt((String) newUserLoginBonus.get("presetId")); - Optional userLoginBonusOptional = userLoginBonusService.getUserLoginBonus(Integer.parseInt(userId), loginBonusPresetId); - UserLoginBonus userLoginBonus = userLoginBonusOptional.orElseGet(UserLoginBonus::new); - userLoginBonus.setLastUpdateDate(LocalDateTime.now()); - userLoginBonus.setWatched(true); - newUserLoginBonusMap.put(loginBonusPresetId, userLoginBonus); - }); - userLoginBonusService.saveAll(newUserLoginBonusMap.values()); - } - - // userCMissionList - if (upsertUserAll.getUserCMissionList() != null){ - List> userCMissionList = upsertUserAll.getUserCMissionList(); - userCMissionList.forEach(userCMission -> { - int missionId = Integer.parseInt((String) userCMission.get("missionId")); - int point = Integer.parseInt((String) userCMission.get("point")); - List> userCMissionProgressList = (List>) userCMission.get("userCMissionProgressList"); - userCMissionRepository.findByUser_Card_ExtIdAndMissionId(Long.parseLong(userId), missionId).ifPresentOrElse(userCMission1 -> { - userCMission1.setPoint(point); - userCMissionRepository.save(userCMission1); - }, () -> { - UserCMission userCMission1 = new UserCMission(); - userCMission1.setMissionId(missionId); - userCMission1.setPoint(point); - userCMission1.setUser(newUserData); - userCMissionRepository.save(userCMission1); - }); - - userCMissionProgressList.forEach(userCMissionProgress -> { - int order = Integer.parseInt((String) userCMissionProgress.get("order")); - int progress = Integer.parseInt((String) userCMissionProgress.get("progress")); - int stage = Integer.parseInt((String) userCMissionProgress.get("stage")); - userCMissionProgressRepository.findByUser_Card_ExtIdAndMissionIdAndOrder(Long.parseLong(userId), missionId, order).ifPresentOrElse(userCMissionProgress1 -> { - userCMissionProgress1.setProgress(progress); - userCMissionProgress1.setStage(stage); - userCMissionProgressRepository.save(userCMissionProgress1); - }, () -> { - UserCMissionProgress userCMissionProgress1 = new UserCMissionProgress(); - userCMissionProgress1.setMissionId(missionId); - userCMissionProgress1.setOrder(order); - userCMissionProgress1.setProgress(progress); - userCMissionProgress1.setStage(stage); - userCMissionProgress1.setUser(newUserData); - userCMissionProgressRepository.save(userCMissionProgress1); - }); - }); - }); - } - - String json = mapper.write(new CodeResp(1)); - logger.info("Response: " + json); - return json; - } -} diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/UpsertUserAllHandler.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/UpsertUserAllHandler.kt new file mode 100644 index 00000000..e3969c37 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/UpsertUserAllHandler.kt @@ -0,0 +1,143 @@ +package icu.samnyan.aqua.sega.chusan.handler + +import ext.* +import icu.samnyan.aqua.sega.chusan.model.Chu3Repos +import icu.samnyan.aqua.sega.chusan.model.request.UpsertUserAll +import icu.samnyan.aqua.sega.chusan.model.userdata.UserCMission +import icu.samnyan.aqua.sega.chusan.model.userdata.UserCMissionProgress +import icu.samnyan.aqua.sega.chusan.model.userdata.UserGeneralData +import icu.samnyan.aqua.sega.chusan.model.userdata.UserLoginBonus +import icu.samnyan.aqua.sega.general.BaseHandler +import icu.samnyan.aqua.sega.general.dao.CardRepository +import icu.samnyan.aqua.sega.general.model.response.UserRecentRating +import icu.samnyan.aqua.sega.util.jackson.StringMapper +import lombok.AllArgsConstructor +import org.springframework.stereotype.Component +import java.nio.charset.StandardCharsets +import java.time.LocalDateTime + +/** + * The handler for save user data. Only send in the end of the session. + * + * @author samnyan (privateamusement@protonmail.com) + */ +@AllArgsConstructor +@Component("ChusanUpsertUserAllHandler") +class UpsertUserAllHandler( + val mapper: StringMapper, + val rp: Chu3Repos, + val cardRepo: CardRepository, +) : BaseHandler { + val logger = logger() + + override fun handle(request: Map): Any? { + val ext = request["userId"]?.long ?: return null + val req = mapper.convert(request["upsertUserAll"], UpsertUserAll::class.java) + + req.run { + // UserData + val oldUser = rp.userData.findByCard_ExtId(ext)() + val u = (userData?.get(0) ?: return null).apply { + id = oldUser?.id ?: 0 + card = oldUser?.card ?: cardRepo.findByExtId(ext).expect("Card not found") + userName = String(userName.toByteArray(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8) + userNameEx = "" + }.also { rp.userData.saveAndFlush(it) } + + // Set users + listOfNotNull( + userPlaylogList, userGameOption, userMapAreaList, userCharacterList, userItemList, + userMusicDetailList, userActivityList, userChargeList, userCourseList, userDuelList, + ).flatten().forEach { it.user = u } + + // Ratings + fun Iterable.str() = joinToString(",") { "${it.musicId}:${it.difficultId}:${it.score}" } + + ls( + userRecentRatingList to "recent_rating_list", userRatingBaseList to "rating_base_list", + userRatingBaseHotList to "rating_hot_list", userRatingBaseNextList to "rating_next_list", + ).filter { it.first != null }.forEach { (list, key) -> + val d = rp.userGeneralData.findByUserAndPropertyKey(u, key)() + ?: UserGeneralData().apply { user = u; propertyKey = key } + rp.userGeneralData.save(d.apply { propertyValue = list!!.str() }) + } + + // Playlog + userPlaylogList?.let { rp.userPlaylog.saveAll(it) } + + // List data + userGameOption?.get(0)?.let { obj -> + rp.userGameOption.saveAndFlush(obj.apply { + id = rp.userGameOption.findSingleByUser(u)()?.id ?: 0 }) } + + userMapAreaList?.let { list -> + rp.userMap.saveAll(list.distinctBy { it.mapAreaId }.mapApply { + id = rp.userMap.findByUserAndMapAreaId(u, mapAreaId)?.id ?: 0 }) } + + userCharacterList?.let { list -> + rp.userCharacter.saveAll(list.distinctBy { it.characterId }.mapApply { + id = rp.userCharacter.findByUserAndCharacterId(u, characterId)?.id ?: 0 }) } + + userItemList?.let { list -> + rp.userItem.saveAll(list.distinctBy { it.itemId to it.itemKind }.mapApply { + id = rp.userItem.findByUserAndItemIdAndItemKind(u, itemId, itemKind)?.id ?: 0 }) } + + userMusicDetailList?.let { list -> + rp.userMusicDetail.saveAll(list.distinctBy { it.musicId to it.level }.mapApply { + id = rp.userMusicDetail.findByUserAndMusicIdAndLevel(u, musicId, level)?.id ?: 0 }) } + + userActivityList?.let { list -> + rp.userActivity.saveAll(list.distinctBy { it.activityId to it.kind }.mapApply { + id = rp.userActivity.findByUserAndActivityIdAndKind(u, activityId, kind)?.id ?: 0 }) } + + userChargeList?.let { list -> + rp.userCharge.saveAll(list.distinctBy { it.chargeId }.mapApply { + id = rp.userCharge.findByUserAndChargeId(u, chargeId)()?.id ?: 0 }) } + + userCourseList?.let { list -> + rp.userCourse.saveAll(list.distinctBy { it.courseId }.mapApply { + id = rp.userCourse.findByUserAndCourseId(u, courseId)?.id ?: 0 }) } + + userDuelList?.let { list -> + rp.userDuel.saveAll(list.distinctBy { it.duelId }.mapApply { + id = rp.userDuel.findByUserAndDuelId(u, duelId)?.id ?: 0 }) } + + // Need testing + userLoginBonusList?.let { list -> + rp.userLoginBonus.saveAll(list.distinctBy { it["presetId"] as String }.map { + val id = it["presetId"]!!.int + (rp.userLoginBonus.findLoginBonus(ext.int, 1, id)() ?: UserLoginBonus()).apply { + user = u.id.toInt() + presetId = id + lastUpdateDate = LocalDateTime.now() + isWatched = true + } + }) + } + + req.userCMissionList?.forEach { d -> + (rp.userCMission.findByUser_Card_ExtIdAndMissionId(ext, d.missionId)() + ?: UserCMission().apply { + missionId = d.missionId + user = u + } + ).apply { point = d.point }.also { rp.userCMission.save(it) } + + d.userCMissionProgressList?.forEach inner@ { p -> + (rp.userCMissionProgress.findByUser_Card_ExtIdAndMissionIdAndOrder(ext, d.missionId, p.order)() + ?: UserCMissionProgress().apply { + missionId = d.missionId + order = p.order + user = u + } + ).apply { + progress = p.progress + stage = p.stage + }.also { rp.userCMissionProgress.save(it) } + } + } + } + + return """{"returnCode":1}""" + } +}