[O] Ongeki: Upsert user all

pull/134/head
Azalea 2025-03-27 00:17:02 -04:00
parent 1193192e81
commit e00bbeadde
3 changed files with 189 additions and 603 deletions

View File

@ -10,6 +10,7 @@ fun OngekiController.ongekiInit() {
fun <T> List<T>.staticLst(key: String) = mapOf("length" to size, key to this)
initUser()
initUpsertAll()
// Has type, but type is always 1
"GetGameEvent".static {

View File

@ -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<Any>, 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")
}
}

View File

@ -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, Any>): 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<UserPlaylog> = 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<UserActivity> = 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<UserMusicDetail> = 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<UserCharacter> = 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<UserCard> = 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<UserDeck> = 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<UserTrainingRoom> = 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<UserStory> = 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<UserChapter> = 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<UserMemoryChapter> = 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<UserItem> = 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<UserMusicItem> = 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<UserLoginBonus> = 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<UserEventPoint> = 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<UserMissionPoint> = 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<UserBoss> = 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<UserTechCount> = 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<UserScenario> = 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<UserTradeItem> = 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<UserEventMusic> = 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<UserTechEvent> = 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<UserKop> = 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<UserRecentRating>, 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<OngekiFumenScore>, 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()
}
}