From 3a8616e2255641fd8faef252aa6d0fe90c81ee12 Mon Sep 17 00:00:00 2001 From: Azalea <22280294+hykilpikonna@users.noreply.github.com> Date: Sat, 30 Mar 2024 23:52:29 -0400 Subject: [PATCH] [+] Generalize data import for chusan --- src/main/java/ext/Ext.kt | 5 +- src/main/java/ext/Json.kt | 6 +- .../v2/ApiChuniV2PlayerDataController.java | 46 ++--- .../sega/chuni/v2/external/Chu3DataExport.kt | 10 +- .../maimai2/external/Maimai2DataExport.kt | 7 +- .../icu/samnyan/aqua/net/CardController.kt | 4 +- .../aqua/net/games/GameApiController.kt | 2 +- .../aqua/net/games/ImportController.kt | 168 ++++++++++++------ .../samnyan/aqua/net/games/ImportHelper.kt | 46 +++++ .../java/icu/samnyan/aqua/net/games/Models.kt | 8 +- .../samnyan/aqua/net/games/chu3/Chu3Import.kt | 21 ++- .../icu/samnyan/aqua/net/games/chu3/Chusan.kt | 6 +- .../samnyan/aqua/net/games/mai2/Mai2Import.kt | 22 ++- .../samnyan/aqua/net/games/mai2/Maimai2.kt | 87 +-------- .../chusan/handler/CMGetUserDataHandler.java | 6 +- .../handler/CMGetUserPreviewHandler.java | 6 +- .../handler/CMUpsertUserGachaHandler.java | 6 +- .../CMUpsertUserPrintSubtractHandler.java | 6 +- .../sega/chusan/handler/GameLoginHandler.java | 6 +- .../chusan/handler/GetUserDataHandler.java | 6 +- .../chusan/handler/GetUserPreviewHandler.java | 6 +- .../chusan/handler/UpsertUserAllHandler.java | 7 +- .../handler/UpsertUserChargelogHandler.java | 4 +- .../samnyan/aqua/sega/chusan/model/Repos.kt | 53 +++--- .../chusan/model/request/UpsertUserAll.java | 2 +- .../chusan/model/request/UpsertUserGacha.java | 4 +- .../{UserData.java => Chu3UserData.java} | 4 +- .../chusan/model/userdata/UserActivity.java | 4 +- .../chusan/model/userdata/UserCMission.java | 2 +- .../model/userdata/UserCMissionProgress.java | 2 +- .../model/userdata/UserCardPrintState.java | 4 +- .../chusan/model/userdata/UserCharacter.java | 4 +- .../chusan/model/userdata/UserCharge.java | 4 +- .../chusan/model/userdata/UserCourse.java | 4 +- .../sega/chusan/model/userdata/UserDuel.java | 4 +- .../sega/chusan/model/userdata/UserGacha.java | 4 +- .../chusan/model/userdata/UserGameOption.java | 4 +- .../model/userdata/UserGeneralData.java | 4 +- .../sega/chusan/model/userdata/UserItem.java | 4 +- .../chusan/model/userdata/UserMapArea.java | 4 +- .../model/userdata/UserMusicDetail.java | 4 +- .../chusan/model/userdata/UserPlaylog.java | 4 +- .../chusan/service/UserActivityService.java | 4 +- .../chusan/service/UserCharacterService.java | 4 +- .../chusan/service/UserChargeService.java | 4 +- .../chusan/service/UserCourseService.java | 4 +- .../sega/chusan/service/UserDataService.java | 12 +- .../sega/chusan/service/UserDuelService.java | 4 +- .../sega/chusan/service/UserGachaService.java | 4 +- .../chusan/service/UserGameOptionService.java | 4 +- .../service/UserGeneralDataService.java | 4 +- .../sega/chusan/service/UserItemService.java | 4 +- .../chusan/service/UserMapAreaService.java | 6 +- .../service/UserMusicDetailService.java | 4 +- .../samnyan/aqua/sega/maimai2/model/Repos.kt | 38 ++-- .../maimai2/model/userdata/Mai2UserDetail.kt | 4 +- .../maimai2/model/userdata/UserEntities.kt | 5 +- .../sega/ongeki/model/userdata/UserData.java | 4 +- .../aqua/sega/wacca/model/db/WaccaUser.kt | 4 +- 59 files changed, 390 insertions(+), 333 deletions(-) create mode 100644 src/main/java/icu/samnyan/aqua/net/games/ImportHelper.kt rename src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/{UserData.java => Chu3UserData.java} (98%) diff --git a/src/main/java/ext/Ext.kt b/src/main/java/ext/Ext.kt index d6a2e40d..27cd7b3f 100644 --- a/src/main/java/ext/Ext.kt +++ b/src/main/java/ext/Ext.kt @@ -33,6 +33,7 @@ typealias RB = RequestBody typealias RH = RequestHeader typealias PV = PathVariable typealias API = RequestMapping +typealias Var = KMutableProperty1 typealias Str = String typealias Bool = Boolean typealias JavaSerializable = java.io.Serializable @@ -50,13 +51,13 @@ annotation class SettingField(val name: Str, val desc: Str) // Reflection @Suppress("UNCHECKED_CAST") -fun KClass.vars() = memberProperties.mapNotNull { it as? KMutableProperty1 } +fun KClass.vars() = memberProperties.mapNotNull { it as? Var } fun KClass.varsMap() = vars().associateBy { it.name } fun KClass.getters() = java.methods.filter { it.name.startsWith("get") } fun KClass.gettersMap() = getters().associateBy { it.name.removePrefix("get").decapitalize() } infix fun KCallable<*>.returns(type: KClass<*>) = returnType.jvmErasure.isSubclassOf(type) @Suppress("UNCHECKED_CAST") -fun KMutableProperty1.setCast(obj: C, value: String) = set(obj, when (returnType.classifier) { +fun Var.setCast(obj: C, value: String) = set(obj, when (returnType.classifier) { String::class -> value Int::class -> value.toInt() Boolean::class -> value.toBoolean() diff --git a/src/main/java/ext/Json.kt b/src/main/java/ext/Json.kt index 8ba8f722..c93ccc80 100644 --- a/src/main/java/ext/Json.kt +++ b/src/main/java/ext/Json.kt @@ -35,11 +35,11 @@ val JACKSON = jacksonObjectMapper().apply { inline fun ObjectMapper.parse(str: Str) = readValue(str, T::class.java) inline fun ObjectMapper.parse(map: Map<*, *>) = convertValue(map, T::class.java) // TODO: https://stackoverflow.com/q/78197784/7346633 -inline fun Str.parseJackson() = if (contains("null")) { +fun Str.parseJackson(cls: Class) = if (contains("null")) { val map = JACKSON.parse>(this) - JACKSON.convertValue(map.recursiveNotNull(), T::class.java) + JACKSON.convertValue(map.recursiveNotNull(), cls) } -else JACKSON.readValue(this, T::class.java) +else JACKSON.readValue(this, cls) fun T.toJson() = JACKSON.writeValueAsString(this) inline fun String.json() = try { diff --git a/src/main/java/icu/samnyan/aqua/api/controller/sega/game/chuni/v2/ApiChuniV2PlayerDataController.java b/src/main/java/icu/samnyan/aqua/api/controller/sega/game/chuni/v2/ApiChuniV2PlayerDataController.java index 94edee81..188ba783 100644 --- a/src/main/java/icu/samnyan/aqua/api/controller/sega/game/chuni/v2/ApiChuniV2PlayerDataController.java +++ b/src/main/java/icu/samnyan/aqua/api/controller/sega/game/chuni/v2/ApiChuniV2PlayerDataController.java @@ -81,64 +81,64 @@ public class ApiChuniV2PlayerDataController { } @PutMapping("profile/username") - public UserData updateName(@RequestBody Map request) { - UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); + public Chu3UserData updateName(@RequestBody Map request) { + Chu3UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); profile.setUserName((String) request.get("userName")); return userDataService.saveUserData(profile); } @PutMapping("profile/romversion") - public UserData updateRomVersion(@RequestBody Map request) { - UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); + public Chu3UserData updateRomVersion(@RequestBody Map request) { + Chu3UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); profile.setLastRomVersion((String) request.get("romVersion")); return userDataService.saveUserData(profile); } @PutMapping("profile/dataversion") - public UserData updateDataVersion(@RequestBody Map request) { - UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); + public Chu3UserData updateDataVersion(@RequestBody Map request) { + Chu3UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); profile.setLastDataVersion((String) request.get("dataVersion")); return userDataService.saveUserData(profile); } @PutMapping("profile/plate") - public UserData updatePlate(@RequestBody Map request) { - UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); + public Chu3UserData updatePlate(@RequestBody Map request) { + Chu3UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); profile.setNameplateId((Integer) request.get("nameplateId")); return userDataService.saveUserData(profile); } @PutMapping("profile/frame") - public UserData updateFrame(@RequestBody Map request) { - UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); + public Chu3UserData updateFrame(@RequestBody Map request) { + Chu3UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); profile.setFrameId((Integer) request.get("frameId")); return userDataService.saveUserData(profile); } @PutMapping("profile/trophy") - public UserData updateTrophy(@RequestBody Map request) { - UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); + public Chu3UserData updateTrophy(@RequestBody Map request) { + Chu3UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); profile.setTrophyId((Integer) request.get("trophyId")); return userDataService.saveUserData(profile); } @PutMapping("profile/mapicon") - public UserData updateMapIcon(@RequestBody Map request) { - UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); + public Chu3UserData updateMapIcon(@RequestBody Map request) { + Chu3UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); profile.setMapIconId((Integer) request.get("mapiconId")); return userDataService.saveUserData(profile); } @PutMapping("profile/sysvoice") - public UserData updateSystemVoice(@RequestBody Map request) { - UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); + public Chu3UserData updateSystemVoice(@RequestBody Map request) { + Chu3UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); profile.setVoiceId((Integer) request.get("voiceId")); return userDataService.saveUserData(profile); } @PutMapping("profile/avatar") - public UserData updateAvatar(@RequestBody Map request) { - UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); + public Chu3UserData updateAvatar(@RequestBody Map request) { + Chu3UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); int category = (Integer) request.get("category"); switch (category) { case 1: @@ -169,7 +169,7 @@ public class ApiChuniV2PlayerDataController { @PutMapping("profile/privacy") public ResponseEntity updatePrivacy(@RequestBody Map request) { - UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); + Chu3UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); UserGameOption option = userGameOptionService.getByUser(profile).orElseThrow(); int privacy = (Integer) request.get("privacy"); if (privacy != 1 && privacy != 0) { @@ -300,7 +300,7 @@ public class ApiChuniV2PlayerDataController { @PutMapping("song/{id}/favorite") public void updateSongFavorite(@RequestParam String aimeId, @PathVariable String id) { - UserData profile = userDataService.getUserByExtId(aimeId).orElseThrow(); + Chu3UserData profile = userDataService.getUserByExtId(aimeId).orElseThrow(); UserGeneralData userGeneralData = userGeneralDataService.getByUserAndKey(profile, "favorite_music") .orElseGet(() -> new UserGeneralData(profile, "favorite_music")); List favoriteSongs = new LinkedList(Arrays.asList(userGeneralData.getPropertyValue().split(","))); @@ -329,7 +329,7 @@ public class ApiChuniV2PlayerDataController { @PostMapping("character") public ResponseEntity updateCharacter(@RequestBody Map request) { - UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); + Chu3UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); Integer characterId = (Integer) request.get("characterId"); Optional characterOptional = userCharacterService.getByUserAndCharacterId(profile, characterId); UserCharacter character; @@ -371,7 +371,7 @@ public class ApiChuniV2PlayerDataController { @PostMapping("item") public ResponseEntity updateItem(@RequestBody Map request) { - UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); + Chu3UserData profile = userDataService.getUserByExtId((String) request.get("aimeId")).orElseThrow(); Integer itemId = (Integer) request.get("itemId"); Integer itemKind = (Integer) request.get("itemKind"); Optional itemOptional = userItemService.getByUserAndItemIdAndKind(profile, itemId,itemKind); @@ -446,7 +446,7 @@ public class ApiChuniV2PlayerDataController { card = cardService.registerByAccessCode(exUser.getAccessCode()); } - UserData userData = mapper.convert(exUser, new TypeReference<>() { + Chu3UserData userData = mapper.convert(exUser, new TypeReference<>() { }); userData.setCard(card); userDataService.saveAndFlushUserData(userData); diff --git a/src/main/java/icu/samnyan/aqua/api/model/resp/sega/chuni/v2/external/Chu3DataExport.kt b/src/main/java/icu/samnyan/aqua/api/model/resp/sega/chuni/v2/external/Chu3DataExport.kt index ed0397ce..aba39d6c 100644 --- a/src/main/java/icu/samnyan/aqua/api/model/resp/sega/chuni/v2/external/Chu3DataExport.kt +++ b/src/main/java/icu/samnyan/aqua/api/model/resp/sega/chuni/v2/external/Chu3DataExport.kt @@ -1,10 +1,11 @@ package icu.samnyan.aqua.api.model.resp.sega.chuni.v2.external +import icu.samnyan.aqua.net.games.IExportClass import icu.samnyan.aqua.sega.chusan.model.userdata.* data class Chu3DataExport( - var gameId: String = "SDHD", - var userData: UserData, + override var gameId: String = "SDHD", + override var userData: Chu3UserData, var userGameOption: UserGameOption, var userActivityList: List, var userCharacterList: List, @@ -16,7 +17,8 @@ data class Chu3DataExport( var userMusicDetailList: List, var userPlaylogList: List, var userLoginBonusList: List, -) { - constructor() : this("SDHD", UserData(), UserGameOption(), ArrayList(), ArrayList(), ArrayList(), ArrayList(), ArrayList(), ArrayList(), ArrayList(), ArrayList(), ArrayList(), ArrayList()) +): IExportClass { + constructor() : this("SDHD", + Chu3UserData(), UserGameOption(), ArrayList(), ArrayList(), ArrayList(), ArrayList(), ArrayList(), ArrayList(), ArrayList(), ArrayList(), ArrayList(), ArrayList()) } diff --git a/src/main/java/icu/samnyan/aqua/api/model/resp/sega/maimai2/external/Maimai2DataExport.kt b/src/main/java/icu/samnyan/aqua/api/model/resp/sega/maimai2/external/Maimai2DataExport.kt index 6bd4356e..4fac9419 100644 --- a/src/main/java/icu/samnyan/aqua/api/model/resp/sega/maimai2/external/Maimai2DataExport.kt +++ b/src/main/java/icu/samnyan/aqua/api/model/resp/sega/maimai2/external/Maimai2DataExport.kt @@ -1,9 +1,10 @@ package icu.samnyan.aqua.api.model.resp.sega.maimai2.external +import icu.samnyan.aqua.net.games.IExportClass import icu.samnyan.aqua.sega.maimai2.model.userdata.* data class Maimai2DataExport( - var userData: Mai2UserDetail, + override var userData: Mai2UserDetail, var userExtend: Mai2UserExtend, var userOption: Mai2UserOption, var userUdemae: Mai2UserUdemae, @@ -20,8 +21,8 @@ data class Maimai2DataExport( var userMapList: List, var userMusicDetailList: List, var userPlaylogList: List, - var gameId: String = "SDEZ", -) { + override var gameId: String = "SDEZ", +): IExportClass { constructor() : this(Mai2UserDetail(), Mai2UserExtend(), Mai2UserOption(), Mai2UserUdemae(), mutableListOf(), mutableListOf(), mutableListOf(), mutableListOf(), mutableListOf(), mutableListOf(), mutableListOf(), mutableListOf(), mutableListOf(), mutableListOf(), mutableListOf(), mutableListOf(), diff --git a/src/main/java/icu/samnyan/aqua/net/CardController.kt b/src/main/java/icu/samnyan/aqua/net/CardController.kt index 132564a2..261d896c 100644 --- a/src/main/java/icu/samnyan/aqua/net/CardController.kt +++ b/src/main/java/icu/samnyan/aqua/net/CardController.kt @@ -4,7 +4,7 @@ import ext.* import icu.samnyan.aqua.net.components.JWT import icu.samnyan.aqua.net.db.AquaUserServices import icu.samnyan.aqua.net.games.GenericUserDataRepo -import icu.samnyan.aqua.net.games.IGenericUserData +import icu.samnyan.aqua.net.games.IUserData import icu.samnyan.aqua.net.utils.AquaNetProps import icu.samnyan.aqua.net.utils.SUCCESS import icu.samnyan.aqua.sega.chusan.model.Chu3UserDataRepo @@ -116,7 +116,7 @@ class CardController( * * Assumption: The card is already linked to the user. */ -suspend fun migrateCard(repo: GenericUserDataRepo, card: Card): Bool +suspend fun migrateCard(repo: GenericUserDataRepo, card: Card): Bool { // Check if data already exists in the user's ghost card async { repo.findByCard(card.aquaUser!!.ghostCard) }?.let { diff --git a/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt b/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt index eb53b7a3..73831eaa 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt @@ -8,7 +8,7 @@ import org.slf4j.LoggerFactory import kotlin.jvm.optionals.getOrNull import kotlin.reflect.KClass -abstract class GameApiController(name: String, userDataClass: KClass) { +abstract class GameApiController(name: String, userDataClass: KClass) { val musicMapping = resJson>("/meta/$name/music.json") ?.mapKeys { it.key.toInt() } ?: emptyMap() val logger = LoggerFactory.getLogger(javaClass) diff --git a/src/main/java/icu/samnyan/aqua/net/games/ImportController.kt b/src/main/java/icu/samnyan/aqua/net/games/ImportController.kt index 818ca0f8..56a58bac 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/ImportController.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/ImportController.kt @@ -1,14 +1,20 @@ package icu.samnyan.aqua.net.games -import com.fasterxml.jackson.core.JsonParser -import com.fasterxml.jackson.databind.DeserializationContext -import com.fasterxml.jackson.databind.JsonDeserializer -import com.fasterxml.jackson.databind.module.SimpleModule import ext.* -import java.lang.reflect.Field +import icu.samnyan.aqua.net.db.AquaNetUser +import icu.samnyan.aqua.net.db.AquaUserServices +import icu.samnyan.aqua.net.utils.AquaNetProps +import icu.samnyan.aqua.net.utils.SUCCESS +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.data.repository.NoRepositoryBean +import org.springframework.transaction.PlatformTransactionManager +import org.springframework.transaction.support.TransactionTemplate +import java.time.LocalDateTime +import java.util.* +import kotlin.io.path.Path +import kotlin.io.path.writeText import kotlin.reflect.KClass -import kotlin.reflect.KMutableProperty1 -import kotlin.reflect.KProperty1 // Import class with renaming data class ImportClass( @@ -17,18 +23,114 @@ data class ImportClass( val name: String = type.simpleName!!.removePrefix("Mai2").lowercase() ) -abstract class ImportController( - val exportFields: Map>, - val renameTable: Map> +interface IUserEntity { + var id: Long + var user: UserModel +} + +interface IExportClass { + var gameId: String + var userData: UserModel +} + +@NoRepositoryBean +interface IUserRepo: JpaRepository { + fun findByUser(user: UserModel): List + fun findSingleByUser(user: UserModel): Optional +} + +/** + * Import controller for a game + * + * @param game: 4-letter Game ID + * @param exportFields: Mapping of type names to variables in the export model + * (e.g. "Mai2UserCharacter" -> Mai2DataExport::userCharacterList) + * @param exportRepos: Mapping of variables to repositories that can be used to find the data + * @param artemisRenames: Mapping of Artemis table names to import classes + */ +abstract class ImportController, UserModel: IUserData>( + val game: String, + val exportClass: KClass, + val exportFields: Map>, + val exportRepos: Map, IUserRepo>, + val artemisRenames: Map>, ) { - abstract fun createEmpty(): T + abstract fun createEmpty(): ExportModel + abstract val userDataRepo: GenericUserDataRepo + + @Autowired lateinit var us: AquaUserServices + @Autowired lateinit var netProps: AquaNetProps + @Autowired lateinit var transManager: PlatformTransactionManager + val trans by lazy { TransactionTemplate(transManager) } init { - renameTable.values.forEach { + artemisRenames.values.forEach { if (it.name !in exportFields) error("Code error! Export fields incomplete: missing ${it.name}") } } + val listRepos = exportRepos.filter { it.key returns List::class } + val singleRepos = exportRepos.filter { !(it.key returns List::class) } + + fun export(u: AquaNetUser) = createEmpty().apply { + gameId = game + userData = userDataRepo.findByCard(u.ghostCard) ?: (404 - "User not found") + exportRepos.forEach { (f, u) -> + if (f returns List::class) f.set(this, u.findByUser(userData)) + else u.findSingleByUser(userData)()?.let { f.set(this, it) } + } + } + + @API("export") + fun exportUserData(@RP token: Str) = us.jwt.auth(token) { u -> + log.info("Exporting user data for ${u.auId}") + export(u) + } + + @Suppress("UNCHECKED_CAST") + @API("import") + fun importUserData(@RP token: Str, @RB json: Str) = us.jwt.auth(token) { u -> + val export = json.parseJackson(exportClass.java) + if (!export.gameId.equals(game, true)) 400 - "Invalid game ID" + + val lists = listRepos.toList().associate { (f, r) -> r to f.get(export) as List> }.vNotNull() + val singles = singleRepos.toList().associate { (f, r) -> r to f.get(export) as IUserEntity }.vNotNull() + + // Validate new user data + // Check that all ids are 0 (this should be true since all ids are @JsonIgnore) + if (export.userData.id != 0L) 400 - "User ID must be 0" + lists.values.flatten().forEach { if (it.id != 0L) 400 - "ID must be 0" } + singles.values.forEach { if (it.id != 0L) 400 - "ID must be 0" } + + // Set user card + export.userData.card = u.ghostCard + + // Check existing data + userDataRepo.findByCard(u.ghostCard)?.also { gu -> + // Store a backup of the old data + val fl = "mai2-backup-${u.auId}-${LocalDateTime.now().urlSafeStr()}.json" + (Path(netProps.importBackupPath) / fl).writeText(export(u).toJson()) + + // Delete the old data (After migration v1000.7, all user-linked entities have ON DELETE CASCADE) + log.info("Mai2 Import: Deleting old data for user ${u.auId}") + userDataRepo.delete(gu) + userDataRepo.flush() + } + + trans.execute { + // Insert new data + val nu = userDataRepo.save(export.userData) + // Set user fields + lists.values.flatten().forEach { it.user = nu } + singles.values.forEach { it.user = nu } + // Save new data + singles.forEach { (repo, single) -> (repo as IUserRepo).save(single) } + lists.forEach { (repo, list) -> (repo as IUserRepo).saveAll(list) } + } + + SUCCESS + } + /** * Read an artemis SQL dump file and return Aqua JSON */ @@ -52,7 +154,7 @@ abstract class ImportController( // For each insert statement, we will try to parse the values statements.forEachIndexed fi@{ i, insert -> // Try to map tables - val tb = renameTable[insert.table] ?: return@fi warn("Unknown table ${insert.table} in insert $i") + val tb = artemisRenames[insert.table] ?: return@fi warn("Unknown table ${insert.table} in insert $i") val field = exportFields[tb.name]!! val obj = tb.mapTo(insert.mapping) @@ -77,43 +179,7 @@ abstract class ImportController( return JACKSON_ARTEMIS.convertValue(dict, type.java) } + + val log = logger() } } - -// Read SQL dump and convert to dictionary -val insertPattern = """INSERT INTO\s+(\w+)\s*\(([^)]+)\)\s*VALUES\s*\(([^)]+)\);""".toRegex() -data class SqlInsert(val table: String, val mapping: Map) -fun String.asSqlInsert(): SqlInsert { - val match = insertPattern.matchEntire(this) ?: error("Does not match insert pattern") - val (table, rawCols, rawVals) = match.destructured - val cols = rawCols.split(',').map { it.trim(' ', '"') } - - // Parse values with proper quote handling - val vals = mutableListOf() - var startI = 0 - var insideQuote = false - rawVals.forEachIndexed { i, c -> - if (c == ',' && !insideQuote) { - vals.add(rawVals.substring(startI, i).trim(' ', '"')) - startI = i + 1 - } else if (c == '"') insideQuote = !insideQuote - } - - assert(cols.size == vals.size) { "Column and value count mismatch" } - return SqlInsert(table, cols.zip(vals).toMap()) -} - -@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") -val JSON_INT_LIST_STR = SimpleModule().addDeserializer(List::class.java, object : JsonDeserializer>() { - override fun deserialize(parser: JsonParser, context: DeserializationContext) = - try { - val text = parser.text.trim('[', ']') - if (text.isEmpty()) emptyList() - else text.split(',').map { it.trim().toInt() } as List - } catch (e: Exception) { - 400 - "Invalid list value ${parser.text}: $e" } -}) - -val JACKSON_ARTEMIS = JACKSON.copy().apply { - registerModule(JSON_INT_LIST_STR) -} diff --git a/src/main/java/icu/samnyan/aqua/net/games/ImportHelper.kt b/src/main/java/icu/samnyan/aqua/net/games/ImportHelper.kt new file mode 100644 index 00000000..39b6651a --- /dev/null +++ b/src/main/java/icu/samnyan/aqua/net/games/ImportHelper.kt @@ -0,0 +1,46 @@ +package icu.samnyan.aqua.net.games + +import com.fasterxml.jackson.core.JsonParser +import com.fasterxml.jackson.databind.DeserializationContext +import com.fasterxml.jackson.databind.JsonDeserializer +import com.fasterxml.jackson.databind.module.SimpleModule +import ext.JACKSON +import ext.minus + +// Read SQL dump and convert to dictionary +val insertPattern = """INSERT INTO\s+(\w+)\s*\(([^)]+)\)\s*VALUES\s*\(([^)]+)\);""".toRegex() +data class SqlInsert(val table: String, val mapping: Map) +fun String.asSqlInsert(): SqlInsert { + val match = insertPattern.matchEntire(this) ?: error("Does not match insert pattern") + val (table, rawCols, rawVals) = match.destructured + val cols = rawCols.split(',').map { it.trim(' ', '"') } + + // Parse values with proper quote handling + val vals = mutableListOf() + var startI = 0 + var insideQuote = false + rawVals.forEachIndexed { i, c -> + if (c == ',' && !insideQuote) { + vals.add(rawVals.substring(startI, i).trim(' ', '"')) + startI = i + 1 + } else if (c == '"') insideQuote = !insideQuote + } + + assert(cols.size == vals.size) { "Column and value count mismatch" } + return SqlInsert(table, cols.zip(vals).toMap()) +} + +@Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN", "UNCHECKED_CAST") +val JSON_INT_LIST_STR = SimpleModule().addDeserializer(List::class.java, object : JsonDeserializer>() { + override fun deserialize(parser: JsonParser, context: DeserializationContext) = + try { + val text = parser.text.trim('[', ']') + if (text.isEmpty()) emptyList() + else text.split(',').map { it.trim().toInt() } as List + } catch (e: Exception) { + 400 - "Invalid list value ${parser.text}: $e" } +}) + +val JACKSON_ARTEMIS = JACKSON.copy().apply { + registerModule(JSON_INT_LIST_STR) +} \ No newline at end of file diff --git a/src/main/java/icu/samnyan/aqua/net/games/Models.kt b/src/main/java/icu/samnyan/aqua/net/games/Models.kt index 0cb9cbb3..a6ac4538 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/Models.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/Models.kt @@ -1,7 +1,6 @@ package icu.samnyan.aqua.net.games import com.fasterxml.jackson.annotation.JsonIgnore -import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.databind.annotation.JsonSerialize import ext.JACKSON @@ -16,8 +15,6 @@ import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.Query import org.springframework.data.repository.NoRepositoryBean import java.util.* -import kotlin.reflect.full.memberProperties -import kotlin.reflect.jvm.isAccessible data class TrendOut(val date: String, val rating: Int, val plays: Int) @@ -81,7 +78,8 @@ data class GenericItemMeta( ) // Here are some interfaces to generalize across multiple games -interface IGenericUserData { +interface IUserData { + val id: Long val userName: String val playerRating: Int val highestRating: Int @@ -124,7 +122,7 @@ open class UserDataEntity : BaseEntity() { } @NoRepositoryBean -interface GenericUserDataRepo : JpaRepository { +interface GenericUserDataRepo : JpaRepository { fun findByCard(card: Card): T? fun findByCard_ExtId(extId: Long): Optional @Query("select count(*) from #{#entityName} where playerRating > :rating") diff --git a/src/main/java/icu/samnyan/aqua/net/games/chu3/Chu3Import.kt b/src/main/java/icu/samnyan/aqua/net/games/chu3/Chu3Import.kt index 1f507c1b..1eb5229d 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/chu3/Chu3Import.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/chu3/Chu3Import.kt @@ -1,22 +1,36 @@ package icu.samnyan.aqua.net.games.chu3 import ext.API +import ext.returns import ext.vars import icu.samnyan.aqua.api.model.resp.sega.chuni.v2.external.Chu3DataExport import icu.samnyan.aqua.net.games.ImportClass import icu.samnyan.aqua.net.games.ImportController +import icu.samnyan.aqua.sega.chusan.model.Chu3Repos +import icu.samnyan.aqua.sega.chusan.model.Chu3UserLinked import icu.samnyan.aqua.sega.chusan.model.userdata.* import org.springframework.web.bind.annotation.RestController +import kotlin.reflect.full.declaredMembers @RestController @API("api/v2/game/chu3") -class Chu3Import : ImportController( +class Chu3Import( + val repos: Chu3Repos, +) : ImportController( + "SDHD", Chu3DataExport::class, exportFields = Chu3DataExport::class.vars().associateBy { var name = it.name if (name == "userMapList") name = "userMapAreaList" name.replace("List", "").lowercase() }, - renameTable = mapOf( + exportRepos = Chu3DataExport::class.vars() + .filter { f -> f.name !in setOf("gameId", "userData") } + .associateWith { Chu3Repos::class.declaredMembers + .filter { f -> f returns Chu3UserLinked::class } + .firstOrNull { f -> f.name == it.name || f.name == it.name.replace("List", "") } + ?.call(repos) as Chu3UserLinked<*>? ?: error("No matching field found for ${it.name}") + }, + artemisRenames = mapOf( "chuni_item_character" to ImportClass(UserCharacter::class), "chuni_item_duel" to ImportClass(UserDuel::class), "chuni_item_item" to ImportClass(UserItem::class, mapOf("isValid" to "valid")), @@ -24,7 +38,7 @@ class Chu3Import : ImportController( "chuni_item_map_area" to ImportClass(UserMapArea::class), "chuni_profile_activity" to ImportClass(UserActivity::class, mapOf("activityId" to "id")), "chuni_profile_charge" to ImportClass(UserCharge::class), - "chuni_profile_data" to ImportClass(UserData::class, mapOf("user" to null, "version" to null, "isNetMember" to null)), + "chuni_profile_data" to ImportClass(Chu3UserData::class, mapOf("user" to null, "version" to null, "isNetMember" to null)), "chuni_profile_option" to ImportClass(UserGameOption::class, mapOf("version" to null)), "chuni_score_best" to ImportClass(UserMusicDetail::class), "chuni_score_playlog" to ImportClass(UserPlaylog::class), @@ -35,4 +49,5 @@ class Chu3Import : ImportController( ) ) { override fun createEmpty() = Chu3DataExport() + override val userDataRepo = repos.userData } \ No newline at end of file diff --git a/src/main/java/icu/samnyan/aqua/net/games/chu3/Chusan.kt b/src/main/java/icu/samnyan/aqua/net/games/chu3/Chusan.kt index 03bfb22b..25676eec 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/chu3/Chusan.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/chu3/Chusan.kt @@ -8,7 +8,7 @@ import icu.samnyan.aqua.net.db.AquaUserServices import icu.samnyan.aqua.net.games.* import icu.samnyan.aqua.net.utils.* import icu.samnyan.aqua.sega.chusan.model.* -import icu.samnyan.aqua.sega.chusan.model.userdata.UserData +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData import org.springframework.web.bind.annotation.RestController @RestController @@ -18,7 +18,7 @@ class Chusan( override val playlogRepo: Chu3UserPlaylogRepo, override val userDataRepo: Chu3UserDataRepo, val userGeneralDataRepository: Chu3UserGeneralDataRepo, -): GameApiController("chu3", UserData::class) { +): GameApiController("chu3", Chu3UserData::class) { override suspend fun trend(@RP username: Str): List = us.cardByName(username) { card -> findTrend(playlogRepo.findByUserCardExtId(card.extId) .map { TrendLog(it.playDate.toString(), it.playerRating) }) @@ -27,7 +27,7 @@ class Chusan( // Only show > AAA rank override val shownRanks = chu3Scores.filter { it.first >= 95 * 10000 } - override val settableFields: Map Unit> by lazy { mapOf( + override val settableFields: Map Unit> by lazy { mapOf( "userName" to { u, v -> u.setUserName(v) if (!v.all { it in USERNAME_CHARS }) { 400 - "Invalid character in username" } }, diff --git a/src/main/java/icu/samnyan/aqua/net/games/mai2/Mai2Import.kt b/src/main/java/icu/samnyan/aqua/net/games/mai2/Mai2Import.kt index ec575411..19fb3fde 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/mai2/Mai2Import.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/mai2/Mai2Import.kt @@ -1,20 +1,34 @@ package icu.samnyan.aqua.net.games.mai2 import ext.API +import ext.returns import ext.vars import icu.samnyan.aqua.api.model.resp.sega.maimai2.external.Maimai2DataExport import icu.samnyan.aqua.net.games.ImportClass import icu.samnyan.aqua.net.games.ImportController +import icu.samnyan.aqua.sega.maimai2.model.Mai2Repos +import icu.samnyan.aqua.sega.maimai2.model.Mai2UserLinked import icu.samnyan.aqua.sega.maimai2.model.userdata.* import org.springframework.web.bind.annotation.RestController +import kotlin.reflect.full.declaredMembers @RestController @API("api/v2/game/mai2") -class Mai2Import : ImportController( +class Mai2Import( + val repos: Mai2Repos, +) : ImportController( + "SDEZ", Maimai2DataExport::class, exportFields = Maimai2DataExport::class.vars().associateBy { it.name.replace("List", "").lowercase() }, - renameTable = mapOf( + exportRepos = Maimai2DataExport::class.vars() + .filter { f -> f.name !in setOf("gameId", "userData") } + .associateWith { Mai2Repos::class.declaredMembers + .filter { f -> f returns Mai2UserLinked::class } + .firstOrNull { f -> f.name == it.name || f.name == it.name.replace("List", "") } + ?.call(repos) as Mai2UserLinked<*>? ?: error("No matching field found for ${it.name}") + }, + artemisRenames = mapOf( "mai2_item_character" to ImportClass(Mai2UserCharacter::class), "mai2_item_charge" to ImportClass(Mai2UserCharge::class), "mai2_item_friend_season_ranking" to ImportClass(Mai2UserFriendSeasonRanking::class), @@ -30,10 +44,8 @@ class Mai2Import : ImportController( "mai2_profile_option" to ImportClass(Mai2UserOption::class, mapOf("version" to null)), "mai2_score_best" to ImportClass(Mai2UserMusicDetail::class), "mai2_score_course" to ImportClass(Mai2UserCourse::class), - // "mai2_profile_ghost" to ImportClass(UserGhost::class), - // "mai2_profile_rating" to ImportClass(UserRating::class), - // "mai2_profile_region" to ImportClass(UserRegion::class), ) ) { override fun createEmpty() = Maimai2DataExport() + override val userDataRepo = repos.userData } \ No newline at end of file diff --git a/src/main/java/icu/samnyan/aqua/net/games/mai2/Maimai2.kt b/src/main/java/icu/samnyan/aqua/net/games/mai2/Maimai2.kt index 8106b4a8..64fda1bc 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/mai2/Maimai2.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/mai2/Maimai2.kt @@ -1,23 +1,13 @@ package icu.samnyan.aqua.net.games.mai2 import ext.* -import icu.samnyan.aqua.api.model.resp.sega.maimai2.external.Maimai2DataExport -import icu.samnyan.aqua.net.db.AquaNetUser import icu.samnyan.aqua.net.db.AquaUserServices import icu.samnyan.aqua.net.games.* import icu.samnyan.aqua.net.utils.* import icu.samnyan.aqua.sega.maimai2.model.* -import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserDetail -import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserEntity -import org.springframework.transaction.PlatformTransactionManager -import org.springframework.transaction.support.TransactionTemplate +import icu.samnyan.aqua.sega.maimai2.model.userdata.* import org.springframework.web.bind.annotation.RestController -import java.time.LocalDateTime import java.util.* -import kotlin.io.path.Path -import kotlin.io.path.writeText -import kotlin.reflect.KMutableProperty1 -import kotlin.reflect.full.declaredMembers @RestController @API("api/v2/game/mai2") @@ -25,13 +15,8 @@ class Maimai2( override val us: AquaUserServices, override val playlogRepo: Mai2UserPlaylogRepo, override val userDataRepo: Mai2UserDataRepo, - val userGeneralDataRepository: Mai2UserGeneralDataRepo, val repos: Mai2Repos, - val netProps: AquaNetProps, - transManager: PlatformTransactionManager ): GameApiController("mai2", Mai2UserDetail::class) { - val trans = TransactionTemplate(transManager) - override suspend fun trend(@RP username: Str): List = us.cardByName(username) { card -> findTrend(playlogRepo.findByUserCardExtId(card.extId) .map { TrendLog(it.playDate, it.afterRating) }) @@ -46,7 +31,7 @@ class Maimai2( ) } override suspend fun userSummary(@RP username: Str) = us.cardByName(username) { card -> - val extra = userGeneralDataRepository.findByUser_Card_ExtId(card.extId) + val extra = repos.userGeneralData.findByUser_Card_ExtId(card.extId) .associate { it.propertyKey to it.propertyValue } val ratingComposition = mapOf( @@ -56,72 +41,4 @@ class Maimai2( genericUserSummary(card, ratingComposition) } - - // Use reflection to get all properties in Mai2Repos with matching names in Maimai2DataExport - val exportFields: Map, UserLinked<*>> = Maimai2DataExport::class.vars() - .filter { f -> f.name !in setOf("gameId", "userData") } - .associateWith { Mai2Repos::class.declaredMembers - .filter { f -> f returns UserLinked::class } - .firstOrNull { f -> f.name == it.name || f.name == it.name.replace("List", "") } - ?.call(repos) as UserLinked<*>? ?: error("No matching field found for ${it.name}") - } - - val listFields = exportFields.filter { it.key returns List::class } - val singleFields = exportFields.filter { !(it.key returns List::class) } - - fun export(u: AquaNetUser) = Maimai2DataExport().apply { - gameId = "SDEZ" - userData = repos.userData.findByCard(u.ghostCard) ?: (404 - "User not found") - exportFields.forEach { (f, u) -> - if (f returns List::class) f.set(this, u.findByUser(userData)) - else u.findSingleByUser(userData)()?.let { f.set(this, it) } - } - } - - @API("export") - fun exportAllUserData(@RP token: Str) = us.jwt.auth(token) { u -> export(u) } - - @Suppress("UNCHECKED_CAST") - @API("import") - fun importUserData(@RP token: Str, @RB json: Str) = us.jwt.auth(token) { u -> - val export = json.parseJackson() - if (!export.gameId.equals("SDEZ", true)) 400 - "Invalid game ID" - - val lists = listFields.toList().associate { (f, r) -> r to f.get(export) as List }.vNotNull() - val singles = singleFields.toList().associate { (f, r) -> r to f.get(export) as Mai2UserEntity }.vNotNull() - - // Validate new user data - // Check that all ids are 0 (this should be true since all ids are @JsonIgnore) - if (export.userData.id != 0L) 400 - "User ID must be 0" - lists.values.flatten().forEach { if (it.id != 0L) 400 - "ID must be 0" } - singles.values.forEach { if (it.id != 0L) 400 - "ID must be 0" } - - // Set user card - export.userData.card = u.ghostCard - - // Check existing data - repos.userData.findByCard(u.ghostCard)?.also { gu -> - // Store a backup of the old data - val fl = "mai2-backup-${u.auId}-${LocalDateTime.now().urlSafeStr()}.json" - (Path(netProps.importBackupPath) / fl).writeText(export(u).toJson()) - - // Delete the old data (After migration v1000.7, all user-linked entities have ON DELETE CASCADE) - logger.info("Mai2 Import: Deleting old data for user ${u.auId}") - repos.userData.delete(gu) - repos.userData.flush() - } - - trans.execute { - // Insert new data - val nu = repos.userData.save(export.userData) - // Set user fields - lists.values.flatten().forEach { it.user = nu } - singles.values.forEach { it.user = nu } - // Save new data - singles.forEach { (repo, single) -> (repo as UserLinked).save(single) } - lists.forEach { (repo, list) -> (repo as UserLinked).saveAll(list) } - } - - SUCCESS - } } \ No newline at end of file diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMGetUserDataHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMGetUserDataHandler.java index f744fc2f..ddda3ced 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMGetUserDataHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMGetUserDataHandler.java @@ -3,7 +3,7 @@ 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.model.response.data.UserEmoney; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import icu.samnyan.aqua.sega.chusan.service.UserDataService; import icu.samnyan.aqua.sega.util.jackson.BasicMapper; import org.slf4j.Logger; @@ -36,12 +36,12 @@ public class CMGetUserDataHandler implements BaseHandler { @Override public String handle(Map request) throws JsonProcessingException { String userId = String.valueOf(request.get("userId")); - Optional userDataOptional = userDataService.getUserByExtId(userId); + Optional userDataOptional = userDataService.getUserByExtId(userId); if (userDataOptional.isPresent()) { Map resultMap = new LinkedHashMap<>(); resultMap.put("userId", userId); - UserData user = userDataOptional.get(); + Chu3UserData user = userDataOptional.get(); UserEmoney userEmoney = new UserEmoney(); user.setUserEmoney(userEmoney); diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMGetUserPreviewHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMGetUserPreviewHandler.java index 44b51609..0289f41e 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMGetUserPreviewHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMGetUserPreviewHandler.java @@ -2,7 +2,7 @@ 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.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import icu.samnyan.aqua.sega.chusan.service.UserDataService; import icu.samnyan.aqua.sega.util.jackson.BasicMapper; import org.slf4j.Logger; @@ -38,11 +38,11 @@ public class CMGetUserPreviewHandler implements BaseHandler { String userId = String.valueOf(request.get("userId")); String segaIdAuthKey = String.valueOf(request.get("segaIdAuthKey")); - Optional userDataOptional = userDataService.getUserByExtId(userId); + Optional userDataOptional = userDataService.getUserByExtId(userId); if (userDataOptional.isPresent()) { Map resultMap = new LinkedHashMap<>(); - UserData user = userDataOptional.get(); + Chu3UserData user = userDataOptional.get(); resultMap.put("userName", user.getUserName()); resultMap.put("level", user.getLevel()); diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMUpsertUserGachaHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMUpsertUserGachaHandler.java index 3f747d2d..bd78b8ca 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMUpsertUserGachaHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMUpsertUserGachaHandler.java @@ -7,7 +7,7 @@ import icu.samnyan.aqua.sega.general.BaseHandler; import icu.samnyan.aqua.sega.chusan.model.gamedata.GameGachaCard; import icu.samnyan.aqua.sega.chusan.model.request.UpsertUserGacha; import icu.samnyan.aqua.sega.chusan.model.userdata.UserCardPrintState; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import icu.samnyan.aqua.sega.chusan.model.userdata.UserGacha; import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem; import icu.samnyan.aqua.sega.chusan.service.UserDataService; @@ -53,9 +53,9 @@ public class CMUpsertUserGachaHandler implements BaseHandler { UpsertUserGacha upsertUserGacha = mapper.convert(request.get("cmUpsertUserGacha"), UpsertUserGacha.class); List userCardPrintStateList = new ArrayList<>(); - UserData userData; + Chu3UserData userData; - Optional userOptional = userDataService.getUserByExtId(userId); + Optional userOptional = userDataService.getUserByExtId(userId); if (userOptional.isPresent()) { userData = userOptional.get(); } else { diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMUpsertUserPrintSubtractHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMUpsertUserPrintSubtractHandler.java index 9455a053..0899e20d 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMUpsertUserPrintSubtractHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/CMUpsertUserPrintSubtractHandler.java @@ -5,7 +5,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import icu.samnyan.aqua.sega.chusan.model.Chu3UserCardPrintStateRepo; import icu.samnyan.aqua.sega.general.BaseHandler; import icu.samnyan.aqua.sega.chusan.model.userdata.UserCardPrintState; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem; import icu.samnyan.aqua.sega.chusan.service.UserDataService; import icu.samnyan.aqua.sega.chusan.service.UserItemService; @@ -43,9 +43,9 @@ public class CMUpsertUserPrintSubtractHandler implements BaseHandler { UserCardPrintState userCardPrintState = mapper.convert(request.get("userCardPrintState"), UserCardPrintState.class); List userItemList = mapper.convert(request.get("userItemList"), new TypeReference>() {}); - UserData userData; + Chu3UserData userData; - Optional userOptional = userDataService.getUserByExtId(userId); + Optional userOptional = userDataService.getUserByExtId(userId); if (userOptional.isPresent()) { userData = userOptional.get(); } else { diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GameLoginHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GameLoginHandler.java index 21664fc6..e94dfb33 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GameLoginHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GameLoginHandler.java @@ -5,7 +5,7 @@ import icu.samnyan.aqua.sega.general.BaseHandler; import icu.samnyan.aqua.sega.chusan.model.gamedata.GameLoginBonus; import icu.samnyan.aqua.sega.chusan.model.gamedata.GameLoginBonusPreset; import icu.samnyan.aqua.sega.chusan.model.response.CodeResp; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem; import icu.samnyan.aqua.sega.chusan.model.userdata.UserLoginBonus; import icu.samnyan.aqua.sega.chusan.service.*; @@ -63,7 +63,7 @@ public class GameLoginHandler implements BaseHandler { @Override public String handle(Map request) throws JsonProcessingException { String userId = (String) request.get("userId"); - Optional userDataOptional = userDataService.getUserByExtId(userId); + Optional userDataOptional = userDataService.getUserByExtId(userId); boolean userPresent = userDataOptional.isPresent(); if (userPresent){ userDataService.updateLoginTime(userDataOptional.get()); @@ -105,7 +105,7 @@ public class GameLoginHandler implements BaseHandler { Optional gameLoginBonus = this.gameLoginBonusService.getGameLoginBonusByDay(preset.getId(), bonusCount); if(gameLoginBonus.isPresent()){ GameLoginBonus gameLoginBonusResult = gameLoginBonus.get(); - UserData userData = this.userDataService.getUserByExtId(userId).orElseThrow(); + Chu3UserData userData = this.userDataService.getUserByExtId(userId).orElseThrow(); UserItem userItem = new UserItem(userData); userItem.setItemId(gameLoginBonusResult.getPresentId()); userItem.setItemKind(6); diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GetUserDataHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GetUserDataHandler.java index 5374cfdb..571757ef 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GetUserDataHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GetUserDataHandler.java @@ -2,7 +2,7 @@ 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.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import icu.samnyan.aqua.sega.chusan.service.UserDataService; import icu.samnyan.aqua.sega.util.jackson.StringMapper; import org.slf4j.Logger; @@ -35,12 +35,12 @@ public class GetUserDataHandler implements BaseHandler { @Override public String handle(Map request) throws JsonProcessingException { String userId = (String) request.get("userId"); - Optional userDataOptional = userDataService.getUserByExtId(userId); + Optional userDataOptional = userDataService.getUserByExtId(userId); if (userDataOptional.isPresent()) { Map resultMap = new LinkedHashMap<>(); resultMap.put("userId", userId); - UserData user = userDataOptional.get(); + Chu3UserData user = userDataOptional.get(); resultMap.put("userData", user); String json = mapper.write(resultMap); diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GetUserPreviewHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GetUserPreviewHandler.java index b626cfde..c1b59e5b 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GetUserPreviewHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/GetUserPreviewHandler.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import icu.samnyan.aqua.sega.general.BaseHandler; import icu.samnyan.aqua.sega.chusan.model.response.GetUserPreviewResp; import icu.samnyan.aqua.sega.chusan.model.userdata.UserCharacter; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import icu.samnyan.aqua.sega.chusan.model.userdata.UserGameOption; import icu.samnyan.aqua.sega.chusan.service.UserCharacterService; import icu.samnyan.aqua.sega.chusan.service.UserDataService; @@ -53,13 +53,13 @@ public class GetUserPreviewHandler implements BaseHandler { public String handle(Map request) throws JsonProcessingException { String userId = (String) request.get("userId"); - Optional userData = userDataService.getUserByExtId(userId); + Optional userData = userDataService.getUserByExtId(userId); if (userData.isEmpty()) { return null; } - UserData user = userData.get(); + Chu3UserData user = userData.get(); GetUserPreviewResp resp = new GetUserPreviewResp(); resp.setUserId(userId); 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 index ff7d04fb..d59da683 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/UpsertUserAllHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/UpsertUserAllHandler.java @@ -15,7 +15,6 @@ import icu.samnyan.aqua.sega.util.jackson.StringMapper; import lombok.AllArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.nio.charset.StandardCharsets; @@ -61,15 +60,15 @@ public class UpsertUserAllHandler implements BaseHandler { // Not all field will be sent. Check if they are exist first. - UserData newUserData; + Chu3UserData newUserData; // UserData if (upsertUserAll.getUserData() == null) { return null; } else { newUserData = upsertUserAll.getUserData().get(0); - UserData userData = userDataService.getUserByExtId(userId).orElseGet(() -> { - var data = new UserData(); + Chu3UserData userData = userDataService.getUserByExtId(userId).orElseGet(() -> { + var data = new Chu3UserData(); Card card = cardService.getCardByExtId(userId).orElseThrow(); data.setCard(card); return data; diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/UpsertUserChargelogHandler.java b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/UpsertUserChargelogHandler.java index fca81900..9bb85c05 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/handler/UpsertUserChargelogHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/handler/UpsertUserChargelogHandler.java @@ -4,7 +4,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import icu.samnyan.aqua.sega.general.BaseHandler; import icu.samnyan.aqua.sega.chusan.model.response.CodeResp; import icu.samnyan.aqua.sega.chusan.model.userdata.UserCharge; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import icu.samnyan.aqua.sega.chusan.service.UserChargeService; import icu.samnyan.aqua.sega.chusan.service.UserDataService; import icu.samnyan.aqua.sega.util.jackson.StringMapper; @@ -36,7 +36,7 @@ public class UpsertUserChargelogHandler implements BaseHandler { @Override public String handle(Map request) throws JsonProcessingException { String userId = (String) request.get("userId"); - UserData user = userDataService.getUserByExtId(userId).orElseThrow(); + Chu3UserData user = userDataService.getUserByExtId(userId).orElseThrow(); Map userChargeMap = (Map) request.get("userCharge"); String chargeId = (String) userChargeMap.get("chargeId"); diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/Repos.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/Repos.kt index 576613b0..940ad1a0 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/Repos.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/Repos.kt @@ -4,6 +4,7 @@ package icu.samnyan.aqua.sega.chusan.model import icu.samnyan.aqua.net.games.GenericPlaylogRepo import icu.samnyan.aqua.net.games.GenericUserDataRepo +import icu.samnyan.aqua.net.games.IUserRepo import icu.samnyan.aqua.sega.chusan.model.gamedata.* import icu.samnyan.aqua.sega.chusan.model.userdata.* import org.springframework.data.domain.Page @@ -16,12 +17,10 @@ import java.util.* @NoRepositoryBean -interface UserLinked : JpaRepository { +interface Chu3UserLinked : IUserRepo { fun findByUser_Card_ExtId(extId: Long): List fun findSingleByUser_Card_ExtId(extId: Long): Optional fun findByUser_Card_ExtId(extId: Long, pageable: Pageable): Page - fun findByUser(user: UserData): List - fun findSingleByUser(user: UserData): Optional } @@ -39,62 +38,62 @@ interface Chu3UserLoginBonusRepo : JpaRepository { fun findLoginBonus(userId: Int, version: Int, presetId: Int): Optional } -interface Chu3UserActivityRepo : UserLinked { - fun findTopByUserAndActivityIdAndKindOrderByIdDesc(user: UserData, activityId: Int, kind: Int): Optional +interface Chu3UserActivityRepo : Chu3UserLinked { + fun findTopByUserAndActivityIdAndKindOrderByIdDesc(user: Chu3UserData, activityId: Int, kind: Int): Optional fun findAllByUser_Card_ExtIdAndKindOrderBySortNumberDesc(extId: Long, kind: Int): List } -interface Chu3UserCardPrintStateRepo : UserLinked { +interface Chu3UserCardPrintStateRepo : Chu3UserLinked { fun findByUser_Card_ExtIdAndHasCompleted(extId: Long, hasCompleted: Boolean): List - fun findByUserAndGachaIdAndHasCompleted(userData: UserData, gachaId: Int, hasCompleted: Boolean): List + fun findByUserAndGachaIdAndHasCompleted(userData: Chu3UserData, gachaId: Int, hasCompleted: Boolean): List } -interface Chu3UserCharacterRepo : UserLinked { - fun findTopByUserAndCharacterIdOrderByIdDesc(user: UserData, characterId: Int): Optional +interface Chu3UserCharacterRepo : Chu3UserLinked { + fun findTopByUserAndCharacterIdOrderByIdDesc(user: Chu3UserData, characterId: Int): Optional } -interface Chu3UserChargeRepo : UserLinked { - fun findByUserAndChargeId(extId: UserData, chargeId: Int): Optional +interface Chu3UserChargeRepo : Chu3UserLinked { + fun findByUserAndChargeId(extId: Chu3UserData, chargeId: Int): Optional } -interface Chu3UserCourseRepo : UserLinked { - fun findTopByUserAndCourseIdOrderByIdDesc(user: UserData, courseId: Int): Optional +interface Chu3UserCourseRepo : Chu3UserLinked { + fun findTopByUserAndCourseIdOrderByIdDesc(user: Chu3UserData, courseId: Int): Optional } -interface Chu3UserDataRepo : GenericUserDataRepo +interface Chu3UserDataRepo : GenericUserDataRepo -interface Chu3UserDuelRepo : UserLinked { - fun findTopByUserAndDuelIdOrderByIdDesc(user: UserData, duelId: Int): Optional +interface Chu3UserDuelRepo : Chu3UserLinked { + fun findTopByUserAndDuelIdOrderByIdDesc(user: Chu3UserData, duelId: Int): Optional } -interface Chu3UserGachaRepo : UserLinked { - fun findByUserAndGachaId(extId: UserData, gachaId: Int): Optional +interface Chu3UserGachaRepo : Chu3UserLinked { + fun findByUserAndGachaId(extId: Chu3UserData, gachaId: Int): Optional } -interface Chu3UserGameOptionRepo : UserLinked +interface Chu3UserGameOptionRepo : Chu3UserLinked -interface Chu3UserGeneralDataRepo : UserLinked { - fun findByUserAndPropertyKey(user: UserData, key: String): Optional +interface Chu3UserGeneralDataRepo : Chu3UserLinked { + fun findByUserAndPropertyKey(user: Chu3UserData, key: String): Optional fun findByUser_Card_ExtIdAndPropertyKey(extId: Long, key: String): Optional } -interface Chu3UserItemRepo : UserLinked { - fun findTopByUserAndItemIdAndItemKindOrderByIdDesc(user: UserData, itemId: Int, itemKind: Int): Optional +interface Chu3UserItemRepo : Chu3UserLinked { + fun findTopByUserAndItemIdAndItemKindOrderByIdDesc(user: Chu3UserData, itemId: Int, itemKind: Int): Optional fun findAllByUser_Card_ExtIdAndItemKind(extId: Long, itemKind: Int, pageable: Pageable): Page fun findAllByUser_Card_ExtIdAndItemKind(extId: Long, itemKind: Int): List } -interface Chu3UserMapAreaRepo : UserLinked { - fun findTopByUserAndMapAreaIdOrderByIdDesc(user: UserData, mapAreaId: Int): Optional +interface Chu3UserMapAreaRepo : Chu3UserLinked { + fun findTopByUserAndMapAreaIdOrderByIdDesc(user: Chu3UserData, mapAreaId: Int): Optional } -interface Chu3UserMusicDetailRepo : UserLinked { - fun findTopByUserAndMusicIdAndLevelOrderByIdDesc(user: UserData, musicId: Int, level: Int): Optional +interface Chu3UserMusicDetailRepo : Chu3UserLinked { + fun findTopByUserAndMusicIdAndLevelOrderByIdDesc(user: Chu3UserData, musicId: Int, level: Int): Optional fun findByUser_Card_ExtIdAndMusicId(extId: Long, musicId: Int): List } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserAll.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserAll.java index 7c0a27d2..9268e2dd 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserAll.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserAll.java @@ -21,7 +21,7 @@ import java.util.Map; public class UpsertUserAll implements Serializable { @Nullable - private List userData; + private List userData; @Nullable private List userGameOption; diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserGacha.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserGacha.java index 8824e546..5e8c2aba 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserGacha.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/request/UpsertUserGacha.java @@ -2,7 +2,7 @@ package icu.samnyan.aqua.sega.chusan.model.request; import com.fasterxml.jackson.annotation.JsonProperty; import icu.samnyan.aqua.sega.chusan.model.gamedata.GameGachaCard; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import icu.samnyan.aqua.sega.chusan.model.userdata.UserGacha; import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem; import lombok.AllArgsConstructor; @@ -22,7 +22,7 @@ import java.util.List; public class UpsertUserGacha implements Serializable { @Nullable - private UserData userData; + private Chu3UserData userData; @Nullable private UserGacha userGacha; diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserData.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3UserData.java similarity index 98% rename from src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserData.java rename to src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3UserData.java index 5ce0ee46..079ef93f 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserData.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/Chu3UserData.java @@ -5,7 +5,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import icu.samnyan.aqua.net.games.IGenericUserData; +import icu.samnyan.aqua.net.games.IUserData; import icu.samnyan.aqua.sega.chusan.model.response.data.UserEmoney; import icu.samnyan.aqua.sega.general.model.Card; import icu.samnyan.aqua.sega.util.jackson.AccessCodeSerializer; @@ -126,7 +126,7 @@ import java.util.List; "rankUpChallengeResults", "isNetBattleHost", "netBattleEndState" }) -public class UserData implements Serializable, IGenericUserData { +public class Chu3UserData implements Serializable, IUserData { @Serial private static final long serialVersionUID = 1L; diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserActivity.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserActivity.java index 4bf3de56..c30dc75e 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserActivity.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserActivity.java @@ -31,7 +31,7 @@ public class UserActivity implements Serializable { @JsonIgnore @ManyToOne @JoinColumn(name = "user_id") - private UserData user; + private Chu3UserData user; private int kind; @@ -49,7 +49,7 @@ public class UserActivity implements Serializable { private int param4; - public UserActivity(UserData userData) { + public UserActivity(Chu3UserData userData) { user = userData; } } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCMission.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCMission.java index bf0151dd..28fd353d 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCMission.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCMission.java @@ -20,7 +20,7 @@ public class UserCMission { @JsonIgnore @ManyToOne @JoinColumn(name = "user_id") - private UserData user; + private Chu3UserData user; @Column(name = "mission_id") private int missionId; diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCMissionProgress.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCMissionProgress.java index 3ff182eb..8ab9a694 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCMissionProgress.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCMissionProgress.java @@ -20,7 +20,7 @@ public class UserCMissionProgress { @JsonIgnore @ManyToOne @JoinColumn(name = "user_id") - private UserData user; + private Chu3UserData user; @Column(name = "mission_id") private int missionId; diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCardPrintState.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCardPrintState.java index 92912cb9..b49d6946 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCardPrintState.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCardPrintState.java @@ -30,7 +30,7 @@ public class UserCardPrintState implements Serializable { @JsonIgnore @ManyToOne @JoinColumn(name = "user_id") - private UserData user; + private Chu3UserData user; private boolean hasCompleted; private LocalDateTime limitDate; @@ -38,7 +38,7 @@ public class UserCardPrintState implements Serializable { private int cardId; private int gachaId; - public UserCardPrintState(UserData user) { + public UserCardPrintState(Chu3UserData user) { this.user = user; } } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCharacter.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCharacter.java index 2be68083..1f5b832f 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCharacter.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCharacter.java @@ -31,7 +31,7 @@ public class UserCharacter implements Serializable { @JsonIgnore @ManyToOne @JoinColumn(name = "user_id") - private UserData user; + private Chu3UserData user; @Column(name = "character_id") private int characterId; @@ -56,7 +56,7 @@ public class UserCharacter implements Serializable { private int param2 = 0; - public UserCharacter(UserData userData) { + public UserCharacter(Chu3UserData userData) { user = userData; } } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCharge.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCharge.java index 6797e7f3..deb2f5e2 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCharge.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCharge.java @@ -31,7 +31,7 @@ public class UserCharge implements Serializable { @JsonIgnore @ManyToOne @JoinColumn(name = "user_id") - private UserData user; + private Chu3UserData user; @Column(name = "charge_id") private int chargeId; @@ -48,7 +48,7 @@ public class UserCharge implements Serializable { private LocalDateTime paramDate; - public UserCharge(UserData user) { + public UserCharge(Chu3UserData user) { this.user = user; } } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCourse.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCourse.java index 3845ab71..c41ee930 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCourse.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserCourse.java @@ -27,7 +27,7 @@ public class UserCourse { @JsonIgnore @ManyToOne @JoinColumn(name = "user_id") - private UserData user; + private Chu3UserData user; @Column(name = "course_id") private int courseId; @@ -70,7 +70,7 @@ public class UserCourse { @JsonProperty("isClear") private boolean isClear; - public UserCourse(UserData userData) { + public UserCourse(Chu3UserData userData) { user = userData; } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserDuel.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserDuel.java index 34e3a139..32b8adad 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserDuel.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserDuel.java @@ -27,7 +27,7 @@ public class UserDuel { @JsonIgnore @ManyToOne @JoinColumn(name = "user_id") - private UserData user; + private Chu3UserData user; @Column(name = "duel_id") private int duelId; @@ -49,7 +49,7 @@ public class UserDuel { private int param4; - public UserDuel(UserData userData) { + public UserDuel(Chu3UserData userData) { user = userData; } } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserGacha.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserGacha.java index e297a04e..1e9e4084 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserGacha.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserGacha.java @@ -29,7 +29,7 @@ public class UserGacha implements Serializable { @JsonIgnore @ManyToOne @JoinColumn(name = "user_id") - private UserData user; + private Chu3UserData user; @Column(name = "gacha_id") private int gachaId; @@ -46,7 +46,7 @@ public class UserGacha implements Serializable { private LocalDateTime dailyGachaDate; - public UserGacha(UserData user) { + public UserGacha(Chu3UserData user) { this.user = user; } } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserGameOption.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserGameOption.java index db0e90cd..05f4400e 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserGameOption.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserGameOption.java @@ -81,7 +81,7 @@ public class UserGameOption implements Serializable { @JsonIgnore @ManyToOne @JoinColumn(name = "user_id") - private UserData user; + private Chu3UserData user; private int bgInfo; @@ -183,7 +183,7 @@ public class UserGameOption implements Serializable { private int ext10; - public UserGameOption(UserData userData) { + public UserGameOption(Chu3UserData userData) { user = userData; } } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserGeneralData.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserGeneralData.java index 76ddd30a..222bf559 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserGeneralData.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserGeneralData.java @@ -29,14 +29,14 @@ public class UserGeneralData implements Serializable { @JsonIgnore @ManyToOne @JoinColumn(name = "user_id") - private UserData user; + private Chu3UserData user; private String propertyKey; @Column(columnDefinition = "TEXT") private String propertyValue; - public UserGeneralData(UserData userData, String key) { + public UserGeneralData(Chu3UserData userData, String key) { this.user = userData; this.propertyKey = key; this.propertyValue = ""; diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserItem.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserItem.java index 2e477785..7e71a410 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserItem.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserItem.java @@ -31,7 +31,7 @@ public class UserItem implements Serializable { @JsonIgnore @ManyToOne @JoinColumn(name = "user_id") - private UserData user; + private Chu3UserData user; // Kind ,Type @Column(name = "item_kind") @@ -45,7 +45,7 @@ public class UserItem implements Serializable { @JsonProperty("isValid") private boolean isValid = true; - public UserItem(UserData userData) { + public UserItem(Chu3UserData userData) { user = userData; } } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserMapArea.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserMapArea.java index edd33fe2..b473af78 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserMapArea.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserMapArea.java @@ -39,7 +39,7 @@ public class UserMapArea implements Serializable { @JsonIgnore @ManyToOne @JoinColumn(name = "user_id") - private UserData user; + private Chu3UserData user; @Column(name = "map_area_id") private int mapAreaId; @@ -58,7 +58,7 @@ public class UserMapArea implements Serializable { @JsonProperty("isLocked") private boolean isLocked; - public UserMapArea(UserData userData) { + public UserMapArea(Chu3UserData userData) { user = userData; } } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserMusicDetail.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserMusicDetail.java index 45536812..d2e51cf1 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserMusicDetail.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserMusicDetail.java @@ -48,7 +48,7 @@ public class UserMusicDetail implements Serializable { @JsonIgnore @ManyToOne @JoinColumn(name = "user_id") - private UserData user; + private Chu3UserData user; @Column(name = "music_id") private int musicId; @@ -86,7 +86,7 @@ public class UserMusicDetail implements Serializable { private int ext1; - public UserMusicDetail(UserData userData) { + public UserMusicDetail(Chu3UserData userData) { user = userData; } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserPlaylog.java b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserPlaylog.java index 8d01dc0c..a41d8554 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserPlaylog.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserPlaylog.java @@ -32,7 +32,7 @@ public class UserPlaylog implements Serializable, IGenericGamePlaylog { @JsonIgnore @ManyToOne @JoinColumn(name = "user_id") - private UserData user; + private Chu3UserData user; private String romVersion; @@ -155,7 +155,7 @@ public class UserPlaylog implements Serializable, IGenericGamePlaylog { // SUN PLUS private int ticketId; - public UserPlaylog(UserData userData) { + public UserPlaylog(Chu3UserData userData) { user = userData; } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserActivityService.java b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserActivityService.java index 8d051e1e..c80ceafe 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserActivityService.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserActivityService.java @@ -2,7 +2,7 @@ package icu.samnyan.aqua.sega.chusan.service; import icu.samnyan.aqua.sega.chusan.model.Chu3UserActivityRepo; import icu.samnyan.aqua.sega.chusan.model.userdata.UserActivity; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -30,7 +30,7 @@ public class UserActivityService { return userActivityRepository.saveAll(userActivityList); } - public Optional getByUserAndActivityIdAndKind(UserData user, int activityId, int kind) { + public Optional getByUserAndActivityIdAndKind(Chu3UserData user, int activityId, int kind) { return userActivityRepository.findTopByUserAndActivityIdAndKindOrderByIdDesc(user, activityId, kind); } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserCharacterService.java b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserCharacterService.java index 8aa55fd3..37503da1 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserCharacterService.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserCharacterService.java @@ -2,7 +2,7 @@ package icu.samnyan.aqua.sega.chusan.service; import icu.samnyan.aqua.sega.chusan.model.Chu3UserCharacterRepo; import icu.samnyan.aqua.sega.chusan.model.userdata.UserCharacter; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -42,7 +42,7 @@ public class UserCharacterService { return userCharacterRepository.findByUser_Card_ExtId(Long.parseLong(userId), pageable); } - public Optional getByUserAndCharacterId(UserData user, int characterId) { + public Optional getByUserAndCharacterId(Chu3UserData user, int characterId) { return userCharacterRepository.findTopByUserAndCharacterIdOrderByIdDesc(user, characterId); } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserChargeService.java b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserChargeService.java index 3bb8639b..1abfb80c 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserChargeService.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserChargeService.java @@ -2,7 +2,7 @@ package icu.samnyan.aqua.sega.chusan.service; import icu.samnyan.aqua.sega.chusan.model.Chu3UserChargeRepo; import icu.samnyan.aqua.sega.chusan.model.userdata.UserCharge; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import org.springframework.stereotype.Service; import java.util.List; @@ -32,7 +32,7 @@ public class UserChargeService { return userChargeRepository.findByUser_Card_ExtId(Long.parseLong(userId)); } - public Optional getByUserAndChargeId(UserData user, int chargeId) { + public Optional getByUserAndChargeId(Chu3UserData user, int chargeId) { return userChargeRepository.findByUserAndChargeId(user, chargeId); } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserCourseService.java b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserCourseService.java index 0c0e3a33..64f5c48f 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserCourseService.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserCourseService.java @@ -2,7 +2,7 @@ package icu.samnyan.aqua.sega.chusan.service; import icu.samnyan.aqua.sega.chusan.model.Chu3UserCourseRepo; import icu.samnyan.aqua.sega.chusan.model.userdata.UserCourse; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -42,7 +42,7 @@ public class UserCourseService { return userCourseRepository.findByUser_Card_ExtId(Long.parseLong(userId), page); } - public Optional getByUserAndCourseId(UserData user, int courseId) { + public Optional getByUserAndCourseId(Chu3UserData user, int courseId) { return userCourseRepository.findTopByUserAndCourseIdOrderByIdDesc(user, courseId); } } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserDataService.java b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserDataService.java index 75540bda..e64e0977 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserDataService.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserDataService.java @@ -1,7 +1,7 @@ package icu.samnyan.aqua.sega.chusan.service; import icu.samnyan.aqua.sega.chusan.model.Chu3UserDataRepo; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import icu.samnyan.aqua.sega.general.model.Card; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -22,23 +22,23 @@ public class UserDataService { this.userDataRepository = userDataRepository; } - public UserData saveUserData(UserData userData) { + public Chu3UserData saveUserData(Chu3UserData userData) { return userDataRepository.save(userData); } - public UserData saveAndFlushUserData(UserData userData) { + public Chu3UserData saveAndFlushUserData(Chu3UserData userData) { return userDataRepository.saveAndFlush(userData); } - public Optional getUserByExtId(String aimeId) { + public Optional getUserByExtId(String aimeId) { return userDataRepository.findByCard_ExtId(Long.parseLong(aimeId)); } - public Optional getUserByCard(Card card) { + public Optional getUserByCard(Card card) { return Optional.ofNullable(userDataRepository.findByCard(card)); } - public void updateLoginTime(UserData userData) { + public void updateLoginTime(Chu3UserData userData) { userData.setLastLoginDate(LocalDateTime.now()); userDataRepository.save(userData); } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserDuelService.java b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserDuelService.java index d7134700..682e864a 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserDuelService.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserDuelService.java @@ -1,7 +1,7 @@ package icu.samnyan.aqua.sega.chusan.service; import icu.samnyan.aqua.sega.chusan.model.Chu3UserDuelRepo; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import icu.samnyan.aqua.sega.chusan.model.userdata.UserDuel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -22,7 +22,7 @@ public class UserDuelService { this.userDuelRepository = userDuelRepository; } - public Optional getByUserAndDuelId(UserData user, int duelId) { + public Optional getByUserAndDuelId(Chu3UserData user, int duelId) { return userDuelRepository.findTopByUserAndDuelIdOrderByIdDesc(user, duelId); } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserGachaService.java b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserGachaService.java index 185984eb..9801cb5e 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserGachaService.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserGachaService.java @@ -1,7 +1,7 @@ package icu.samnyan.aqua.sega.chusan.service; import icu.samnyan.aqua.sega.chusan.model.Chu3UserGachaRepo; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import icu.samnyan.aqua.sega.chusan.model.userdata.UserGacha; import org.springframework.stereotype.Service; @@ -32,7 +32,7 @@ public class UserGachaService { return userGachaRepository.findByUser_Card_ExtId(Long.parseLong(userId)); } - public Optional getByUserAndGachaId(UserData user, int gachaId) { + public Optional getByUserAndGachaId(Chu3UserData user, int gachaId) { return userGachaRepository.findByUserAndGachaId(user, gachaId); } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserGameOptionService.java b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserGameOptionService.java index d9891bd7..3e618cb5 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserGameOptionService.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserGameOptionService.java @@ -1,7 +1,7 @@ package icu.samnyan.aqua.sega.chusan.service; import icu.samnyan.aqua.sega.chusan.model.Chu3UserGameOptionRepo; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import icu.samnyan.aqua.sega.chusan.model.userdata.UserGameOption; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -25,7 +25,7 @@ public class UserGameOptionService { return userGameOptionRepository.save(userGameOption); } - public Optional getByUser(UserData user) { + public Optional getByUser(Chu3UserData user) { return userGameOptionRepository.findSingleByUser(user); } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserGeneralDataService.java b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserGeneralDataService.java index 1423096e..614fe680 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserGeneralDataService.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserGeneralDataService.java @@ -1,7 +1,7 @@ package icu.samnyan.aqua.sega.chusan.service; import icu.samnyan.aqua.sega.chusan.model.Chu3UserGeneralDataRepo; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import icu.samnyan.aqua.sega.chusan.model.userdata.UserGeneralData; import org.springframework.stereotype.Service; @@ -23,7 +23,7 @@ public class UserGeneralDataService { return userGeneralDataRepository.save(userGeneralData); } - public Optional getByUserAndKey(UserData user, String key) { + public Optional getByUserAndKey(Chu3UserData user, String key) { return userGeneralDataRepository.findByUserAndPropertyKey(user, key); } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserItemService.java b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserItemService.java index 2e207b47..7f257ab6 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserItemService.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserItemService.java @@ -1,7 +1,7 @@ package icu.samnyan.aqua.sega.chusan.service; import icu.samnyan.aqua.sega.chusan.model.Chu3UserItemRepo; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import icu.samnyan.aqua.sega.chusan.model.userdata.UserItem; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; @@ -39,7 +39,7 @@ public class UserItemService { return userItemList; } - public Optional getByUserAndItemIdAndKind(UserData user, int itemId, int itemKind) { + public Optional getByUserAndItemIdAndKind(Chu3UserData user, int itemId, int itemKind) { return userItemRepository.findTopByUserAndItemIdAndItemKindOrderByIdDesc(user, itemId, itemKind); } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserMapAreaService.java b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserMapAreaService.java index fc650c67..f747422a 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserMapAreaService.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserMapAreaService.java @@ -1,7 +1,7 @@ package icu.samnyan.aqua.sega.chusan.service; import icu.samnyan.aqua.sega.chusan.model.Chu3UserMapAreaRepo; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import icu.samnyan.aqua.sega.chusan.model.userdata.UserMapArea; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -30,7 +30,7 @@ public class UserMapAreaService { return userMapRepository.saveAll(userMap); } - public List getByUser(UserData user) { + public List getByUser(Chu3UserData user) { return userMapRepository.findByUser(user); } @@ -38,7 +38,7 @@ public class UserMapAreaService { return userMapRepository.findByUser_Card_ExtId(Long.parseLong(userId)); } - public Optional getByUserAndMapAreaId(UserData user, int mapId) { + public Optional getByUserAndMapAreaId(Chu3UserData user, int mapId) { return userMapRepository.findTopByUserAndMapAreaIdOrderByIdDesc(user, mapId); } } diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserMusicDetailService.java b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserMusicDetailService.java index 266e9ca7..6126ec77 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserMusicDetailService.java +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/service/UserMusicDetailService.java @@ -1,7 +1,7 @@ package icu.samnyan.aqua.sega.chusan.service; import icu.samnyan.aqua.sega.chusan.model.Chu3UserMusicDetailRepo; -import icu.samnyan.aqua.sega.chusan.model.userdata.UserData; +import icu.samnyan.aqua.sega.chusan.model.userdata.Chu3UserData; import icu.samnyan.aqua.sega.chusan.model.userdata.UserMusicDetail; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; @@ -44,7 +44,7 @@ public class UserMusicDetailService { return userMusicDetailRepository.findByUser_Card_ExtIdAndMusicId(Long.parseLong(userId), musicId); } - public Optional getByUserAndMusicIdAndLevel(UserData user, int musicId, int level) { + public Optional getByUserAndMusicIdAndLevel(Chu3UserData user, int musicId, int level) { return userMusicDetailRepository.findTopByUserAndMusicIdAndLevelOrderByIdDesc(user, musicId, level); } } diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/Repos.kt b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/Repos.kt index ccd3f95f..1a4d7d32 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/Repos.kt +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/Repos.kt @@ -4,6 +4,7 @@ package icu.samnyan.aqua.sega.maimai2.model import icu.samnyan.aqua.net.games.GenericPlaylogRepo import icu.samnyan.aqua.net.games.GenericUserDataRepo +import icu.samnyan.aqua.net.games.IUserRepo import icu.samnyan.aqua.sega.general.model.Card import icu.samnyan.aqua.sega.maimai2.model.userdata.* import org.springframework.data.domain.Page @@ -16,8 +17,7 @@ import org.springframework.transaction.annotation.Transactional import java.util.* @NoRepositoryBean -interface UserLinked: JpaRepository { - fun findByUser(user: Mai2UserDetail): List +interface Mai2UserLinked: JpaRepository, IUserRepo { fun findSingleByUser(user: Mai2UserDetail): Optional fun findByUser_Card_ExtId(userId: Long): List fun findByUser_Card_ExtId(userId: Long, page: Pageable): Page @@ -26,25 +26,25 @@ interface UserLinked: JpaRepository { fun deleteByUser(user: Mai2UserDetail) } -interface Mai2MapEncountNpcRepo : UserLinked +interface Mai2MapEncountNpcRepo : Mai2UserLinked -interface Mai2UserActRepo : UserLinked { +interface Mai2UserActRepo : Mai2UserLinked { fun findByUserAndKindAndActivityId(user: Mai2UserDetail, kind: Int, id: Int): Optional fun findByUser_Card_ExtIdAndKind(userId: Long, kind: Int): List } -interface Mai2UserCardRepo : UserLinked { +interface Mai2UserCardRepo : Mai2UserLinked { fun findByUserAndCardId(user: Mai2UserDetail, cardId: Int): Optional } -interface Mai2UserCharacterRepo : UserLinked { +interface Mai2UserCharacterRepo : Mai2UserLinked { fun findByUserAndCharacterId(user: Mai2UserDetail, characterId: Int): Optional } -interface Mai2UserChargeRepo : UserLinked +interface Mai2UserChargeRepo : Mai2UserLinked -interface Mai2UserCourseRepo : UserLinked { +interface Mai2UserCourseRepo : Mai2UserLinked { fun findByUserAndCourseId(user: Mai2UserDetail, courseId: Int): Optional } @@ -56,54 +56,54 @@ interface Mai2UserDataRepo : GenericUserDataRepo { fun deleteByCard(card: Card): Void } -interface Mai2UserExtendRepo : UserLinked +interface Mai2UserExtendRepo : Mai2UserLinked -interface Mai2UserFavoriteRepo : UserLinked { +interface Mai2UserFavoriteRepo : Mai2UserLinked { fun findByUserAndItemKind(user: Mai2UserDetail, kind: Int): Optional fun findByUserIdAndItemKind(userId: Long, kind: Int): List } -interface Mai2UserFriendSeasonRankingRepo : UserLinked { +interface Mai2UserFriendSeasonRankingRepo : Mai2UserLinked { fun findByUserAndSeasonId(user: Mai2UserDetail, seasonId: Int): Optional } -interface Mai2UserGeneralDataRepo : UserLinked { +interface Mai2UserGeneralDataRepo : Mai2UserLinked { fun findByUserAndPropertyKey(user: Mai2UserDetail, key: String): Optional fun findByUser_Card_ExtIdAndPropertyKey(userId: Long, key: String): Optional } -interface Mai2UserItemRepo : UserLinked { +interface Mai2UserItemRepo : Mai2UserLinked { fun findByUserCardExtIdAndItemKind(userId: Long, kind: Int): List fun findByUserAndItemKindAndItemId(user: Mai2UserDetail, itemKind: Int, itemId: Int): Optional fun findByUser_Card_ExtIdAndItemKind(userId: Long, kind: Int, page: Pageable): Page } -interface Mai2UserLoginBonusRepo : UserLinked { +interface Mai2UserLoginBonusRepo : Mai2UserLinked { fun findByUserAndBonusId(user: Mai2UserDetail, bonusId: Int): Optional } -interface Mai2UserMapRepo : UserLinked { +interface Mai2UserMapRepo : Mai2UserLinked { fun findByUserAndMapId(user: Mai2UserDetail, mapId: Int): Optional } -interface Mai2UserMusicDetailRepo : UserLinked { +interface Mai2UserMusicDetailRepo : Mai2UserLinked { fun findByUser_Card_ExtIdAndMusicId(userId: Long, id: Int): List fun findByUserAndMusicIdAndLevel(user: Mai2UserDetail, musicId: Int, level: Int): Optional } -interface Mai2UserOptionRepo : UserLinked +interface Mai2UserOptionRepo : Mai2UserLinked -interface Mai2UserPlaylogRepo : GenericPlaylogRepo, UserLinked { +interface Mai2UserPlaylogRepo : GenericPlaylogRepo, Mai2UserLinked { fun findByUser_Card_ExtIdAndMusicIdAndLevel(userId: Long, musicId: Int, level: Int): List } interface Mai2UserPrintDetailRepo : JpaRepository -interface Mai2UserUdemaeRepo : UserLinked +interface Mai2UserUdemaeRepo : Mai2UserLinked interface Mai2GameChargeRepo : JpaRepository diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/Mai2UserDetail.kt b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/Mai2UserDetail.kt index 8c75027b..03707470 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/Mai2UserDetail.kt +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/Mai2UserDetail.kt @@ -5,7 +5,7 @@ import com.fasterxml.jackson.annotation.JsonInclude import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.databind.annotation.JsonSerialize import icu.samnyan.aqua.net.games.BaseEntity -import icu.samnyan.aqua.net.games.IGenericUserData +import icu.samnyan.aqua.net.games.IUserData import icu.samnyan.aqua.sega.general.IntegerListConverter import icu.samnyan.aqua.sega.general.model.Card import icu.samnyan.aqua.sega.util.jackson.AccessCodeSerializer @@ -149,7 +149,7 @@ class Mai2UserDetail( // TODO: Make these non-nullable with default value var currentPlayCount: Int? = 0, var renameCredit: Int? = 0 -) : BaseEntity(), IGenericUserData { +) : BaseEntity(), IUserData { @get:JsonIgnore override val totalScore: Long get() = totalDeluxscore diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/UserEntities.kt b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/UserEntities.kt index f900e254..60f4004b 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/UserEntities.kt +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/model/userdata/UserEntities.kt @@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonPropertyOrder import icu.samnyan.aqua.net.games.BaseEntity import icu.samnyan.aqua.net.games.IGenericGamePlaylog +import icu.samnyan.aqua.net.games.IUserEntity import icu.samnyan.aqua.sega.general.IntegerListConverter import jakarta.persistence.* import lombok.AllArgsConstructor @@ -15,11 +16,11 @@ import lombok.Data import lombok.NoArgsConstructor @MappedSuperclass -open class Mai2UserEntity : BaseEntity() { +open class Mai2UserEntity : BaseEntity(), IUserEntity { @JsonIgnore @ManyToOne @JoinColumn(name = "user_id") - open var user: Mai2UserDetail = Mai2UserDetail() + override var user: Mai2UserDetail = Mai2UserDetail() } diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserData.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserData.java index 287dae23..0e4fdf0d 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserData.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserData.java @@ -3,7 +3,7 @@ package icu.samnyan.aqua.sega.ongeki.model.userdata; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonSerialize; -import icu.samnyan.aqua.net.games.IGenericUserData; +import icu.samnyan.aqua.net.games.IUserData; import icu.samnyan.aqua.sega.general.model.Card; import icu.samnyan.aqua.sega.util.jackson.AccessCodeSerializer; import lombok.AllArgsConstructor; @@ -21,7 +21,7 @@ import java.io.Serializable; @Data @NoArgsConstructor @AllArgsConstructor -public class UserData implements Serializable, IGenericUserData { +public class UserData implements Serializable, IUserData { private static final long serialVersionUID = 1L; diff --git a/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/WaccaUser.kt b/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/WaccaUser.kt index 0f3c95ba..c37b4684 100644 --- a/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/WaccaUser.kt +++ b/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/WaccaUser.kt @@ -5,7 +5,7 @@ import ext.ls import ext.sec import ext.toDate import icu.samnyan.aqua.net.games.BaseEntity -import icu.samnyan.aqua.net.games.IGenericUserData +import icu.samnyan.aqua.net.games.IUserData import icu.samnyan.aqua.sega.general.IntegerListConverter import icu.samnyan.aqua.sega.general.model.Card import jakarta.persistence.* @@ -15,7 +15,7 @@ import java.util.* * General user information */ @Entity @Table(name = "wacca_user") -class WaccaUser : BaseEntity(), IGenericUserData { +class WaccaUser : BaseEntity(), IUserData { @OneToOne @JoinColumn(name = "aime_card_id", unique = true) override var card: Card? = Card()