From e00bbeadde5855622d5e14d7d146a47623010280 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Thu, 27 Mar 2025 00:17:02 -0400 Subject: [PATCH] [O] Ongeki: Upsert user all --- .../samnyan/aqua/sega/ongeki/OngekiApis.kt | 1 + .../aqua/sega/ongeki/OngekiUpsertAllApi.kt | 188 ++++++ .../handler/impl/UpsertUserAllHandler.kt | 603 ------------------ 3 files changed, 189 insertions(+), 603 deletions(-) create mode 100644 src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiUpsertAllApi.kt delete mode 100644 src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/UpsertUserAllHandler.kt diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiApis.kt b/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiApis.kt index 0836cdc3..ab45470f 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiApis.kt +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiApis.kt @@ -10,6 +10,7 @@ fun OngekiController.ongekiInit() { fun List.staticLst(key: String) = mapOf("length" to size, key to this) initUser() + initUpsertAll() // Has type, but type is always 1 "GetGameEvent".static { diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiUpsertAllApi.kt b/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiUpsertAllApi.kt new file mode 100644 index 00000000..19b4b130 --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiUpsertAllApi.kt @@ -0,0 +1,188 @@ +package icu.samnyan.aqua.sega.ongeki + +import ext.invoke +import ext.mapApply +import ext.minus +import icu.samnyan.aqua.sega.ongeki.model.CodeResp +import icu.samnyan.aqua.sega.ongeki.model.OngekiUpsertUserAll +import icu.samnyan.aqua.sega.ongeki.model.UserData +import icu.samnyan.aqua.sega.ongeki.model.UserGeneralData + + +fun OngekiController.initUpsertAll() { + fun saveGeneralData(items: List, u: UserData, key: String) { + db.generalData.save(UserGeneralData().apply { + id = db.generalData.findByUserAndPropertyKey(u, key)()?.id ?: 0 + user = u + propertyKey = key + propertyValue = items.joinToString(",") + }) + } + + "UpsertUserAll" api@ { + val all: OngekiUpsertUserAll = mapper.convert(data["upsertUserAll"]!!) + + // User data + val oldUser = db.data.findByCard_ExtId(uid)() + val u: UserData = all.userData?.get(0)?.apply { + id = oldUser?.id ?: 0 + card = oldUser?.card ?: us.cardRepo.findByExtId(uid)() ?: (404 - "Card not found") + + // Set eventWatchedDate with lastPlayDate, because client doesn't update it + eventWatchedDate = oldUser?.lastPlayDate ?: "" + cmEventWatchedDate = oldUser?.lastPlayDate ?: "" + db.data.save(this) + } ?: oldUser ?: return@api null + + all.run { + // Set users + listOfNotNull( + userOption, userPlaylogList, userActivityList, userMusicDetailList, userCharacterList + ).flatten().forEach { it.user = u } + + // UserOption + userOption?.get(0)?.let { + db.option.save(it.apply { + id = db.option.findSingleByUser(u)()?.id ?: 0 }) } + + // UserEventMap + userEventMap?.let { + db.eventMap.save(it.apply { + id = db.eventMap.findSingleByUser(u)()?.id ?: 0 }) } + + // UserPlaylogList + userPlaylogList?.let { db.playlog.saveAll(it) } + + // UserSessionlogList, UserJewelboostlogLost doesn't need to be saved for a private server + + // UserActivityList + userActivityList?.let { list -> + db.activity.saveAll(list.distinctBy { it.activityId to it.kind }.mapApply { + id = db.activity.findByUserAndKindAndActivityId(u, kind, activityId)()?.id ?: 0 }) } + + // Ratings + mapOf( + "recent_rating_list" to userRecentRatingList, // This thing still need to save to solve the rating drop + "battle_point_base" to userBpBaseList, // For calculating Battle point + "rating_base_best" to userRatingBaseBestList, // This is the best rating of all charts. Best 30 + 10 after that. + "rating_base_next" to userRatingBaseNextList, + "rating_base_new_best" to userRatingBaseBestNewList, // This is the best rating of new charts. Best 15 + 10 after that. + "rating_base_new_next" to userRatingBaseNextNewList, + "rating_base_hot_best" to userRatingBaseHotList, // This is the recent best + "rating_base_hot_next" to userRatingBaseHotNextList, + + // Re:Fresh + "new_rating_base_best" to userNewRatingBaseBestList, + "new_rating_base_next_best" to userNewRatingBaseNextBestList, + "new_rating_base_new_best" to userNewRatingBaseBestNewList, + "new_rating_base_new_next_best" to userNewRatingBaseNextBestNewList, + "new_rating_base_pscore" to userNewRatingBasePScoreList, + "new_rating_base_next_pscore" to userNewRatingBaseNextPScoreList + ).forEach { (k, v) -> v?.let { saveGeneralData(it, u, k) } } + + // UserMusicDetailList + userMusicDetailList?.let { list -> + db.musicDetail.saveAll(list.distinctBy { it.musicId to it.level }.mapApply { + id = db.musicDetail.findByUserAndMusicIdAndLevel(u, musicId, level)()?.id ?: 0 }) } + + // UserCharacterList + userCharacterList?.let { list -> + db.character.saveAll(list.distinctBy { it.characterId }.mapApply { + id = db.character.findByUserAndCharacterId(u, characterId)()?.id ?: 0 }) } + + // UserCardList + userCardList?.let { list -> + db.card.saveAll(list.distinctBy { it.cardId }.mapApply { + id = db.card.findByUserAndCardId(u, cardId)()?.id ?: 0 }) } + + // UserDeckList + userDeckList?.let { list -> + db.deck.saveAll(list.distinctBy { it.deckId }.mapApply { + id = db.deck.findByUserAndDeckId(u, deckId)()?.id ?: 0 }) } + + // UserTrainingRoomList + userTrainingRoomList?.let { list -> + db.trainingRoom.saveAll(list.distinctBy { it.roomId }.mapApply { + id = db.trainingRoom.findByUserAndRoomId(u, roomId)()?.id ?: 0 }) } + + // UserStoryList + userStoryList?.let { list -> + db.story.saveAll(list.distinctBy { it.storyId }.mapApply { + id = db.story.findByUserAndStoryId(u, storyId)()?.id ?: 0 }) } + + // UserChapterList + userChapterList?.let { list -> + db.chapter.saveAll(list.distinctBy { it.chapterId }.mapApply { + id = db.chapter.findByUserAndChapterId(u, chapterId)()?.id ?: 0 }) } + + // UserMemoryChapterList + userMemoryChapterList?.let { list -> + db.memoryChapter.saveAll(list.distinctBy { it.chapterId }.mapApply { + id = db.memoryChapter.findByUserAndChapterId(u, chapterId)()?.id ?: 0 }) } + + // UserItemList + userItemList?.let { list -> + db.item.saveAll(list.distinctBy { it.itemKind to it.itemId }.mapApply { + id = db.item.findByUserAndItemKindAndItemId(u, itemKind, itemId)()?.id ?: 0 }) } + + // UserMusicItemList + userMusicItemList?.let { list -> + db.musicItem.saveAll(list.distinctBy { it.musicId }.mapApply { + id = db.musicItem.findByUserAndMusicId(u, musicId)()?.id ?: 0 }) } + + // UserLoginBonusList + userLoginBonusList?.let { list -> + db.loginBonus.saveAll(list.distinctBy { it.bonusId }.mapApply { + id = db.loginBonus.findByUserAndBonusId(u, bonusId)()?.id ?: 0 }) } + + // UserEventPointList + userEventPointList?.let { list -> + db.eventPoint.saveAll(list.distinctBy { it.eventId }.mapApply { + id = db.eventPoint.findByUserAndEventId(u, eventId)()?.id ?: 0 }) } + + // UserMissionPointList + userMissionPointList?.let { list -> + db.missionPoint.saveAll(list.distinctBy { it.eventId }.mapApply { + id = db.missionPoint.findByUserAndEventId(u, eventId)()?.id ?: 0 }) } + + // UserRatinglogList (For the highest rating of each version) + + // UserBossList + userBossList?.let { list -> + db.boss.saveAll(list.distinctBy { it.musicId }.mapApply { + id = db.boss.findByUserAndMusicId(u, musicId)()?.id ?: 0 }) } + + // UserTechCountList + userTechCountList?.let { list -> + db.techCount.saveAll(list.distinctBy { it.levelId }.mapApply { + id = db.techCount.findByUserAndLevelId(u, levelId)()?.id ?: 0 }) } + + // UserScenarioList + userScenarioList?.let { list -> + db.scenario.saveAll(list.distinctBy { it.scenarioId }.mapApply { + id = db.scenario.findByUserAndScenarioId(u, scenarioId)()?.id ?: 0 }) } + + // UserTradeItemList + userTradeItemList?.let { list -> + db.tradeItem.saveAll(list.distinctBy { it.chapterId to it.tradeItemId }.mapApply { + id = db.tradeItem.findByUserAndChapterIdAndTradeItemId(u, chapterId, tradeItemId)()?.id ?: 0 }) } + + // UserEventMusicList + userEventMusicList?.let { list -> + db.eventMusic.saveAll(list.distinctBy { it.eventId to it.type to it.musicId }.mapApply { + id = db.eventMusic.findByUserAndEventIdAndTypeAndMusicId(u, eventId, type, musicId)()?.id ?: 0 }) } + + // UserTechEventList + userTechEventList?.let { list -> + db.techEvent.saveAll(list.distinctBy { it.eventId }.mapApply { + id = db.techEvent.findByUserAndEventId(u, eventId)()?.id ?: 0 }) } + + // UserKopList + userKopList?.let { list -> + db.kop.saveAll(list.distinctBy { it.kopId to it.areaId }.mapApply { + id = db.kop.findByUserAndKopIdAndAreaId(u, kopId, areaId)()?.id ?: 0 }) } + } + + CodeResp(1, "upsertUserAll") + } +} diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/UpsertUserAllHandler.kt b/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/UpsertUserAllHandler.kt deleted file mode 100644 index adb66105..00000000 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/handler/impl/UpsertUserAllHandler.kt +++ /dev/null @@ -1,603 +0,0 @@ -package icu.samnyan.aqua.sega.ongeki.handler.impl - -import ext.logger -import icu.samnyan.aqua.sega.general.BaseHandler -import icu.samnyan.aqua.sega.general.model.response.UserRecentRating -import icu.samnyan.aqua.sega.general.service.CardService -import icu.samnyan.aqua.sega.ongeki.OngekiUserRepos -import icu.samnyan.aqua.sega.ongeki.model.* -import icu.samnyan.aqua.sega.util.jackson.BasicMapper -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.stereotype.Component - - -/** - * The handler for saving all data of a ONGEKI profile - * @author samnyan (privateamusement@protonmail.com) - */ -@Component("OngekiUserAllHandler") -class UpsertUserAllHandler @Autowired constructor( - private val mapper: BasicMapper, - private val cardService: CardService, - val db: OngekiUserRepos -) : BaseHandler { - override fun handle(request: Map): String? { - val userId = (request["userId"] as Number).toLong() - val all = mapper.convert( - request["upsertUserAll"]!!, - UpsertUserAll::class.java - ) - - // All the field should exist, no need to check now. - // UserData - val u: UserData - run { - val userData: UserData - val userOptional = db.data.findByCard_ExtId(userId) - - // UserData might be empty on later runs - if (userOptional.isEmpty && all.userData.isNullOrEmpty()) { - return null - } - - if (userOptional.isPresent) { - userData = userOptional.get() - } else { - userData = UserData() - val card = cardService.getCardByExtId(userId).orElseThrow() - userData.card = card - } - - // If new data exists, use new data. Otherwise, use old data - u = if (!all.userData.isNullOrEmpty()) all.userData!![0] else userData - - u.id = userData.id - u.card = userData.card - - // Set eventWatchedDate with lastPlayDate, because client doesn't update it - u.eventWatchedDate = userData.lastPlayDate - u.cmEventWatchedDate = userData.lastPlayDate - db.data.save(u) - } - - - // UserOption - val newUserOption = all.userOption!![0] - - val userOptionOptional = db.option.findSingleByUser(u) - val userOption = userOptionOptional.orElseGet { UserOption().apply { user = u } } - - newUserOption.id = userOption.id - newUserOption.user = userOption.user - - db.option.save(newUserOption) - - - // UserPlaylogList - val userPlaylogList = all.userPlaylogList - val newUserPlaylogList: MutableList = ArrayList() - - if (userPlaylogList != null) { - for (newUserPlaylog in userPlaylogList) { - newUserPlaylog.user = u - newUserPlaylogList.add(newUserPlaylog) - } - } - - db.playlog.saveAll(newUserPlaylogList) - - - // UserSessionlogList, UserJewelboostlogLost doesn't need to be saved for a private server - - - // UserActivityList - val userActivityList = all.userActivityList - val newUserActivityList: MutableList = ArrayList() - - if (userActivityList != null) { - for (newUserActivity in userActivityList) { - val kind = newUserActivity.kind - val id = newUserActivity.activityId - - if (kind != 0 && id != 0) { - val activityOptional = db.activity.findByUserAndKindAndActivityId(u, kind, id) - val userActivity = activityOptional.orElseGet { - UserActivity().apply { user = u } - } - - newUserActivity.id = userActivity.id - newUserActivity.user = u - newUserActivityList.add(newUserActivity) - } - } - } - newUserActivityList.sortWith { a, b -> b.sortNumber.compareTo(a.sortNumber) } - db.activity.saveAll(newUserActivityList) - - - // UserRecentRatingList - // This thing still need to save to solve the rating drop - all.userRecentRatingList?.let { this.saveRecentRatingData(it, u, "recent_rating_list") } - - /* - * The rating and battle point calculation is little bit complex. - * So I just create a UserGeneralData class to store this value - * into a csv format for convenience - */ - // UserBpBaseList (For calculating Battle point) - all.userBpBaseList?.let { this.saveRecentRatingData(it, u, "battle_point_base") } - - // This is the best rating of all charts. Best 30 + 10 after that. - // userRatingBaseBestList - all.userRatingBaseBestList?.let { this.saveRecentRatingData(it, u, "rating_base_best") } - - // userRatingBaseNextList - all.userRatingBaseNextList?.let { this.saveRecentRatingData(it, u, "rating_base_next") } - - // This is the best rating of new charts. Best 15 + 10 after that. - // New chart means same version - // userRatingBaseBestNewList - all.userRatingBaseBestNewList?.let { this.saveRecentRatingData(it, u, "rating_base_new_best") } - - // userRatingBaseNextNewList - all.userRatingBaseNextNewList?.let { this.saveRecentRatingData(it, u, "rating_base_new_next") } - - // This is the recent best - // userRatingBaseHotList - all.userRatingBaseHotList?.let { this.saveRecentRatingData(it, u, "rating_base_hot_best") } - - // userRatingBaseHotNextList - all.userRatingBaseHotNextList?.let { this.saveRecentRatingData(it, u, "rating_base_hot_next") } - - // Re:Fresh - all.userNewRatingBaseBestList?.let { this.saveFumenScoreData(it, u, "new_rating_base_best") } - all.userNewRatingBaseNextBestList?.let { this.saveFumenScoreData(it, u, "new_rating_base_next_best") } - all.userNewRatingBaseBestNewList?.let { this.saveFumenScoreData(it, u, "new_rating_base_new_best") } - all.userNewRatingBaseNextBestNewList?.let { this.saveFumenScoreData(it, u, "new_rating_base_new_next_best") } - all.userNewRatingBasePScoreList?.let { this.saveFumenScoreData(it, u, "new_rating_base_pscore") } - all.userNewRatingBaseNextPScoreList?.let { this.saveFumenScoreData(it, u, "new_rating_base_next_pscore") } - - // UserMusicDetailList - val userMusicDetailList = all.userMusicDetailList - val newUserMusicDetailList: MutableList = ArrayList() - - if (userMusicDetailList != null) { - for (newUserMusicDetail in userMusicDetailList) { - val musicId = newUserMusicDetail.musicId - val level = newUserMusicDetail.level - - val musicDetailOptional = - db.musicDetail.findByUserAndMusicIdAndLevel(u, musicId, level) - val userMusicDetail = musicDetailOptional.orElseGet { - UserMusicDetail().apply { user = u } - } - - newUserMusicDetail.id = userMusicDetail.id - newUserMusicDetail.user = u - newUserMusicDetailList.add(newUserMusicDetail) - } - } - db.musicDetail.saveAll(newUserMusicDetailList) - - - // UserCharacterList - val userCharacterList = all.userCharacterList - val newUserCharacterList: MutableList = ArrayList() - - if (userCharacterList != null) { - for (newUserCharacter in userCharacterList) { - val characterId = newUserCharacter.characterId - - val characterOptional = db.character.findByUserAndCharacterId(u, characterId) - val userCharacter = characterOptional.orElseGet { - UserCharacter().apply { user = u } - } - - newUserCharacter.id = userCharacter.id - newUserCharacter.user = u - newUserCharacterList.add(newUserCharacter) - } - } - db.character.saveAll(newUserCharacterList) - - // UserCardList - val userCardList = all.userCardList - val newUserCardList: MutableList = ArrayList() - - if (userCardList != null) { - for (newUserCard in userCardList) { - val cardId = newUserCard.cardId - - val cardOptional = db.card.findByUserAndCardId(u, cardId) - val userCard = cardOptional.orElseGet { UserCard().apply { user = u } } - - newUserCard.id = userCard.id - newUserCard.user = u - newUserCardList.add(newUserCard) - } - } - db.card.saveAll(newUserCardList) - - - // UserDeckList - val userDeckList = all.userDeckList - val newUserDeckList: MutableList = ArrayList() - - if (userDeckList != null) { - for (newUserDeck in userDeckList) { - val deckId = newUserDeck.deckId - - val deckOptional = db.deck.findByUserAndDeckId(u, deckId) - val userDeck = deckOptional.orElseGet { UserDeck().apply { user = u } } - - newUserDeck.id = userDeck.id - newUserDeck.user = u - newUserDeckList.add(newUserDeck) - } - } - db.deck.saveAll(newUserDeckList) - - - // userTrainingRoomList - val userTrainingRoomList = all.userTrainingRoomList - val newUserTrainingRoomList: MutableList = ArrayList() - - if (userTrainingRoomList != null) { - for (newUserTrainingRoom in userTrainingRoomList) { - val roomId = newUserTrainingRoom.roomId - - val trainingRoomOptional = db.trainingRoom.findByUserAndRoomId(u, roomId) - val trainingRoom = trainingRoomOptional.orElseGet { UserTrainingRoom().apply { user = u } } - - newUserTrainingRoom.id = trainingRoom.id - newUserTrainingRoom.user = u - newUserTrainingRoomList.add(newUserTrainingRoom) - } - } - db.trainingRoom.saveAll(newUserTrainingRoomList) - - - // UserStoryList - val userStoryList = all.userStoryList - val newUserStoryList: MutableList = ArrayList() - - if (userStoryList != null) { - for (newUserStory in userStoryList) { - val storyId = newUserStory.storyId - - val storyOptional = db.story.findByUserAndStoryId(u, storyId) - val userStory = storyOptional.orElseGet { UserStory().apply { user = u } } - - newUserStory.id = userStory.id - newUserStory.user = u - newUserStoryList.add(newUserStory) - } - } - db.story.saveAll(newUserStoryList) - - - // UserChapterList - val userChapterList = all.userChapterList - val newUserChapterList: MutableList = ArrayList() - - if (userChapterList != null) { - for (newUserChapter in userChapterList) { - val chapterId = newUserChapter.chapterId - - val chapterOptional = db.chapter.findByUserAndChapterId(u, chapterId) - val userChapter = chapterOptional.orElseGet { UserChapter().apply { user = u } } - - newUserChapter.id = userChapter.id - newUserChapter.user = u - newUserChapterList.add(newUserChapter) - } - } - db.chapter.saveAll(newUserChapterList) - - - // UserMemoryChapterList - val userMemoryChapterList = all.userMemoryChapterList - - if (userMemoryChapterList != null) { - val newUserMemoryChapterList: MutableList = ArrayList() - - for (newUserMemoryChapter in userMemoryChapterList) { - val chapterId = newUserMemoryChapter.chapterId - - val chapterOptional = db.memoryChapter.findByUserAndChapterId(u, chapterId) - val userChapter = chapterOptional.orElseGet { UserMemoryChapter().apply { user = u } } - - newUserMemoryChapter.id = userChapter.id - newUserMemoryChapter.user = u - newUserMemoryChapterList.add(newUserMemoryChapter) - } - db.memoryChapter.saveAll(newUserMemoryChapterList) - } - - // UserItemList - val userItemList = all.userItemList - val newUserItemList: MutableList = ArrayList() - - if (userItemList != null) { - for (newUserItem in userItemList) { - val itemKind = newUserItem.itemKind - val itemId = newUserItem.itemId - - val itemOptional = db.item.findByUserAndItemKindAndItemId(u, itemKind, itemId) - val userItem = itemOptional.orElseGet { UserItem().apply { user = u } } - - newUserItem.id = userItem.id - newUserItem.user = u - newUserItemList.add(newUserItem) - } - } - db.item.saveAll(newUserItemList) - - // UserMusicItemList - val userMusicItemList = all.userMusicItemList - val newUserMusicItemList: MutableList = ArrayList() - - if (userMusicItemList != null) { - for (newUserMusicItem in userMusicItemList) { - val musicId = newUserMusicItem.musicId - - val musicItemOptional = db.musicItem.findByUserAndMusicId(u, musicId) - val userMusicItem = musicItemOptional.orElseGet { UserMusicItem().apply { user = u } } - - newUserMusicItem.id = userMusicItem.id - newUserMusicItem.user = u - newUserMusicItemList.add(newUserMusicItem) - } - } - db.musicItem.saveAll(newUserMusicItemList) - - - // userLoginBonusList - val userLoginBonusList = all.userLoginBonusList - val newUserLoginBonusList: MutableList = ArrayList() - - if (userLoginBonusList != null) { - for (newUserLoginBonus in userLoginBonusList) { - val bonusId = newUserLoginBonus.bonusId - - val loginBonusOptional = db.loginBonus.findByUserAndBonusId(u, bonusId) - val userLoginBonus = loginBonusOptional.orElseGet { - UserLoginBonus().apply { user = u } - } - - newUserLoginBonus.id = userLoginBonus.id - newUserLoginBonus.user = u - newUserLoginBonusList.add(newUserLoginBonus) - } - } - db.loginBonus.saveAll(newUserLoginBonusList) - - - // UserEventPointList - val userEventPointList = all.userEventPointList - val newUserEventPointList: MutableList = ArrayList() - - if (userEventPointList != null) { - for (newUserEventPoint in userEventPointList) { - val eventId = newUserEventPoint.eventId - - val eventPointOptional = db.eventPoint.findByUserAndEventId(u, eventId) - val userEventPoint = eventPointOptional.orElseGet { UserEventPoint().apply { user = u } } - - newUserEventPoint.id = userEventPoint.id - newUserEventPoint.user = u - newUserEventPointList.add(newUserEventPoint) - } - } - db.eventPoint.saveAll(newUserEventPointList) - - - // UserMissionPointList - val userMissionPointList = all.userMissionPointList - val newUserMissionPointList: MutableList = ArrayList() - - if (userMissionPointList != null) { - for (newUserMissionPoint in userMissionPointList) { - val eventId = newUserMissionPoint.eventId - - val userMissionPointOptional = db.missionPoint.findByUserAndEventId(u, eventId) - val userMissionPoint = userMissionPointOptional.orElseGet { UserMissionPoint().apply { user = u } } - - newUserMissionPoint.id = userMissionPoint.id - newUserMissionPoint.user = u - newUserMissionPointList.add(newUserMissionPoint) - } - } - db.missionPoint.saveAll(newUserMissionPointList) - - // UserRatinglogList (For the highest rating of each version) - - // UserBossList - val userBossList = all.userBossList - if (userBossList != null) { - val newUserBossList: MutableList = ArrayList() - for (newUserBoss in userBossList) { - val musicId = newUserBoss.musicId - - val userBossOptional = db.boss.findByUserAndMusicId(u, musicId) - val userBoss = userBossOptional.orElseGet { - UserBoss().apply { user = u } - } - - newUserBoss.id = userBoss.id - newUserBoss.user = userBoss.user - newUserBossList.add(newUserBoss) - } - db.boss.saveAll(newUserBossList) - } - - // UserTechCountList - val userTechCountList = all.userTechCountList - if (userTechCountList != null) { - val newUserTechCountList: MutableList = ArrayList() - for (newUserTechCount in userTechCountList) { - val levelId = newUserTechCount.levelId - - val userTechCountOptional = db.techCount.findByUserAndLevelId(u, levelId) - val userTechCount = userTechCountOptional.orElseGet { UserTechCount().apply { user = u } } - - newUserTechCount.id = userTechCount.id - newUserTechCount.user = userTechCount.user - newUserTechCountList.add(newUserTechCount) - } - db.techCount.saveAll(newUserTechCountList) - } - - // UserScenarioList - val userScenarioList = all.userScenarioList - if (userScenarioList != null) { - val newUserScenarioList: MutableList = ArrayList() - for (newUserScenario in userScenarioList) { - val scenarioId = newUserScenario.scenarioId - - val userScenarioOptional = db.scenario.findByUserAndScenarioId(u, scenarioId) - val userScenario = userScenarioOptional.orElseGet { UserScenario().apply { user = u } } - - newUserScenario.id = userScenario.id - newUserScenario.user = userScenario.user - newUserScenarioList.add(newUserScenario) - } - db.scenario.saveAll(newUserScenarioList) - } - - // UserTradeItemList - val userTradeItemList = all.userTradeItemList - val newUserTradeItemList: MutableList = ArrayList() - - if (userTradeItemList != null) { - for (newUserTradeItem in userTradeItemList) { - val chapterId = newUserTradeItem.chapterId - val tradeItemId = newUserTradeItem.tradeItemId - - val tradeItemOptional = - db.tradeItem.findByUserAndChapterIdAndTradeItemId(u, chapterId, tradeItemId) - val userTradeItem = tradeItemOptional.orElseGet { UserTradeItem().apply { user = u } } - - newUserTradeItem.id = userTradeItem.id - newUserTradeItem.user = u - newUserTradeItemList.add(newUserTradeItem) - } - } - db.tradeItem.saveAll(newUserTradeItemList) - - // UserEventMusicList - val userEventMusicList = all.userEventMusicList - val newUserEventMusicList: MutableList = ArrayList() - - if (userEventMusicList != null) { - for (newUserEventMusic in userEventMusicList) { - val eventId = newUserEventMusic.eventId - val type = newUserEventMusic.type - val musicId = newUserEventMusic.musicId - - val eventMusicOptional = - db.eventMusic.findByUserAndEventIdAndTypeAndMusicId(u, eventId, type, musicId) - val userEventMusic = eventMusicOptional.orElseGet { UserEventMusic().apply { user = u } } - - newUserEventMusic.id = userEventMusic.id - newUserEventMusic.user = u - newUserEventMusicList.add(newUserEventMusic) - } - } - db.eventMusic.saveAll(newUserEventMusicList) - - // UserTechEventList - val userTechEventList = all.userTechEventList - val newUserTechEventList: MutableList = ArrayList() - - if (userTechEventList != null) { - for (newUserTechEvent in userTechEventList) { - val eventId = newUserTechEvent.eventId - - val techEventOptional = db.techEvent.findByUserAndEventId(u, eventId) - val userTechEvent = techEventOptional.orElseGet { UserTechEvent().apply { user = u } } - - newUserTechEvent.id = userTechEvent.id - newUserTechEvent.user = u - newUserTechEventList.add(newUserTechEvent) - } - } - db.techEvent.saveAll(newUserTechEventList) - - // UserKopList - val userKopList = all.userKopList - val newUserKopList: MutableList = ArrayList() - - if (userKopList != null) { - for (newUserKop in userKopList) { - val kopId = newUserKop.kopId - val areaId = newUserKop.areaId - - val kopOptional = db.kop.findByUserAndKopIdAndAreaId(u, kopId, areaId) - val userKop = kopOptional.orElseGet { UserKop().apply { user = u } } - - newUserKop.id = userKop.id - newUserKop.user = u - newUserKopList.add(newUserKop) - } - } - db.kop.saveAll(newUserKopList) - - // UserEventMap - val newUserEventMap = all.userEventMap - if (newUserEventMap != null) { - val userEventOptional = db.eventMap.findSingleByUser(u) - val userEventMap: UserEventMap = userEventOptional.orElseGet { UserEventMap().apply { user = u } } - - newUserEventMap.id = userEventMap.id - newUserEventMap.user = u - db.eventMap.save(newUserEventMap) - } - - val json = mapper.write(CodeResp(1, "upsertUserAll")) - logger.info("Response: $json") - return json - } - - private fun saveRecentRatingData(itemList: List, newUserData: UserData, key: String) { - val sb = StringBuilder() - // Convert to a string - for (item in itemList) { - sb.append(item.musicId).append(":").append(item.difficultId).append(":").append(item.score) - sb.append(",") - } - if (sb.isNotEmpty()) { sb.deleteCharAt(sb.length - 1) } - saveGeneralData(newUserData, key, sb.toString()) - } - - private fun saveFumenScoreData(itemList: List, newUserData: UserData, key: String) { - val sb = StringBuilder() - for (item in itemList) { - sb.append(item.musicId).append(":") - .append(item.difficultId).append(":") - .append(item.score).append(":") - .append(item.platinumScoreStar).append(":") - .append(item.platinumScoreMax) - sb.append(",") - } - - if (sb.isNotEmpty()) { sb.deleteCharAt(sb.length - 1) } - saveGeneralData(newUserData, key, sb.toString()) - } - - private fun saveGeneralData(newUserData: UserData, key: String, data: String) { - val uOptional = db.generalData.findByUserAndPropertyKey(newUserData, key) - val userGeneralData = uOptional.orElseGet { - UserGeneralData().apply { - user = newUserData - propertyKey = key - } - } - userGeneralData.propertyValue = data - db.generalData.save(userGeneralData) - } - - companion object { - private val logger = logger() - } -}