diff --git a/src/main/java/icu/samnyan/aqua/api/model/resp/sega/maimai2/external/Maimai2DataExport.java b/src/main/java/icu/samnyan/aqua/api/model/resp/sega/maimai2/external/Maimai2DataExport.java index 391d1ed2..f3b10bc1 100644 --- a/src/main/java/icu/samnyan/aqua/api/model/resp/sega/maimai2/external/Maimai2DataExport.java +++ b/src/main/java/icu/samnyan/aqua/api/model/resp/sega/maimai2/external/Maimai2DataExport.java @@ -5,6 +5,8 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.lang.reflect.Field; +import java.util.Arrays; import java.util.List; /** @@ -14,24 +16,22 @@ import java.util.List; @AllArgsConstructor @NoArgsConstructor public class Maimai2DataExport { - private String gameId = "SDEZ"; - private UserDetail userData; - private UserExtend userExtend; - private UserOption userOption; - private List mapEncountNpcList; - private List userActList; - private List userCharacterList; - private List userChargeList; - private List userCourseList; - private List userFavoriteList; - private List userFriendSeasonRankingList; - private List userGeneralDataList; - private List userGhostList; - private List userItemList; - private List userLoginBonusList; - private List userMapList; - private List userMusicDetailList; - private List userPlaylogList; - private List userRateList; - private UserUdemae userUdemae; + public String gameId = "SDEZ"; + public UserDetail userData; + public UserExtend userExtend; + public UserOption userOption; + public List mapEncountNpcList; + public List userActList; + public List userCharacterList; + public List userChargeList; + public List userCourseList; + public List userFavoriteList; + public List userFriendSeasonRankingList; + public List userGeneralDataList; + public List userItemList; + public List userLoginBonusList; + public List userMapList; + public List userMusicDetailList; + public List userPlaylogList; + public UserUdemae userUdemae; } diff --git a/src/main/java/icu/samnyan/aqua/net/db/AquaNetUser.kt b/src/main/java/icu/samnyan/aqua/net/db/AquaNetUser.kt index 645ad85a..c9f07221 100644 --- a/src/main/java/icu/samnyan/aqua/net/db/AquaNetUser.kt +++ b/src/main/java/icu/samnyan/aqua/net/db/AquaNetUser.kt @@ -2,6 +2,7 @@ package icu.samnyan.aqua.net.db import com.fasterxml.jackson.annotation.JsonIgnore import ext.* +import icu.samnyan.aqua.net.components.JWT import icu.samnyan.aqua.sega.allnet.AllNetProps import icu.samnyan.aqua.sega.allnet.KeyChipRepo import icu.samnyan.aqua.sega.allnet.KeychipSession @@ -112,7 +113,8 @@ class AquaUserServices( val cardRepo: CardRepository, val hasher: PasswordEncoder, val keyChipRepo: KeyChipRepo, - val allNetProps: AllNetProps + val allNetProps: AllNetProps, + val jwt: JWT ) { companion object { val SETTING_FIELDS = AquaUserServices::class.functions diff --git a/src/main/java/icu/samnyan/aqua/net/games/Maimai2.kt b/src/main/java/icu/samnyan/aqua/net/games/Maimai2.kt index 585df105..9d3b16a0 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/Maimai2.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/Maimai2.kt @@ -3,13 +3,17 @@ package icu.samnyan.aqua.net.games import ext.API import ext.RP import ext.Str +import ext.minus +import icu.samnyan.aqua.api.model.resp.sega.maimai2.external.Maimai2DataExport import icu.samnyan.aqua.net.db.AquaUserServices import icu.samnyan.aqua.net.utils.* import icu.samnyan.aqua.sega.maimai2.model.* -import icu.samnyan.aqua.sega.maimai2.model.Mai2UserDataRepo -import icu.samnyan.aqua.sega.maimai2.model.Mai2UserGeneralDataRepo -import icu.samnyan.aqua.sega.maimai2.model.Mai2UserPlaylogRepo import org.springframework.web.bind.annotation.RestController +import java.lang.reflect.Field +import java.util.* +import kotlin.reflect.full.declaredMembers +import kotlin.reflect.full.isSubclassOf +import kotlin.reflect.jvm.jvmErasure @RestController @API("api/v2/game/mai2") @@ -17,7 +21,8 @@ class Maimai2( override val us: AquaUserServices, override val playlogRepo: Mai2UserPlaylogRepo, override val userDataRepo: Mai2UserDataRepo, - val userGeneralDataRepository: Mai2UserGeneralDataRepo + val userGeneralDataRepository: Mai2UserGeneralDataRepo, + val repos: Mai2Repos ): GameApiController("mai2") { override suspend fun trend(@RP username: Str): List = us.cardByName(username) { card -> @@ -39,4 +44,27 @@ class Maimai2( genericUserSummary(card, ratingComposition) } + + // Use reflection to get all properties in Mai2Repos with matching names in Maimai2DataExport + var exportFields: Map> = listOf(*Maimai2DataExport::class.java.declaredFields) + .filter { it.name !in arrayOf("gameId", "userData") } + .associateWith { Mai2Repos::class.declaredMembers + .filter { f -> f.returnType.jvmErasure.isSubclassOf(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}") + } + + @API("export") + fun exportAllUserData(@RP token: Str) = us.jwt.auth(token) { u -> + try { + Maimai2DataExport().apply { + gameId = "SDEZ" + userData = repos.userData.findByCard(u.ghostCard) ?: (404 - "User not found") + exportFields.forEach { (f, u) -> + f.set(this, if (f.type == List::class.java) u.findByUser(userData) + else u.findSingleByUser(userData).orElse(null)) + } + } + } catch (e: Exception) { 500 - "Error during data export. Reason: ${e.message}" } + } } \ No newline at end of file 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 8cd606ac..576613b0 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 @@ -11,6 +11,7 @@ import org.springframework.data.domain.Pageable import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.Query import org.springframework.data.repository.NoRepositoryBean +import org.springframework.stereotype.Component import java.util.* @@ -154,4 +155,37 @@ interface Chu3GameNamePlateRepo : JpaRepository interface Chu3GameSystemVoiceRepo : JpaRepository -interface Chu3GameTrophyRepo : JpaRepository \ No newline at end of file +interface Chu3GameTrophyRepo : JpaRepository + +@Component +class Chu3Repos( + val userLoginBonus: Chu3UserLoginBonusRepo, + val userActivity: Chu3UserActivityRepo, + val userCardPrintState: Chu3UserCardPrintStateRepo, + val userCharacter: Chu3UserCharacterRepo, + val userCharge: Chu3UserChargeRepo, + val userCourse: Chu3UserCourseRepo, + val userData: Chu3UserDataRepo, + val userDuel: Chu3UserDuelRepo, + val userGacha: Chu3UserGachaRepo, + val userGameOption: Chu3UserGameOptionRepo, + val userGeneralData: Chu3UserGeneralDataRepo, + val userItem: Chu3UserItemRepo, + val userMapArea: Chu3UserMapAreaRepo, + val userMusicDetail: Chu3UserMusicDetailRepo, + val userPlaylog: Chu3UserPlaylogRepo, + val gameAvatarAcc: Chu3GameAvatarAccRepo, + val gameCharacter: Chu3GameCharacterRepo, + val gameCharge: Chu3GameChargeRepo, + val gameEvent: Chu3GameEventRepo, + val gameFrame: Chu3GameFrameRepo, + val gameGachaCard: Chu3GameGachaCardRepo, + val gameGacha: Chu3GameGachaRepo, + val gameLoginBonusPresets: Chu3GameLoginBonusPresetsRepo, + val gameLoginBonus: Chu3GameLoginBonusRepo, + val gameMapIcon: Chu3GameMapIconRepo, + val gameMusic: Chu3GameMusicRepo, + val gameNamePlate: Chu3GameNamePlateRepo, + val gameSystemVoice: Chu3GameSystemVoiceRepo, + val gameTrophy: Chu3GameTrophyRepo +) \ No newline at end of file diff --git a/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/impl/UpsertUserAllHandler.java b/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/impl/UpsertUserAllHandler.java index c111fb51..6de57d22 100644 --- a/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/impl/UpsertUserAllHandler.java +++ b/src/main/java/icu/samnyan/aqua/sega/maimai2/handler/impl/UpsertUserAllHandler.java @@ -103,7 +103,7 @@ public class UpsertUserAllHandler implements BaseHandler { if (userAll.getUserExtend() != null) { UserExtend newUserExtend = userAll.getUserExtend().get(0); - Optional userExtendOptional = userExtendRepository.findByUser(newUserData); + Optional userExtendOptional = userExtendRepository.findSingleByUser(newUserData); UserExtend userExtend = userExtendOptional.orElseGet(() -> new UserExtend(newUserData)); newUserExtend.setId(userExtend.getId()); @@ -116,7 +116,7 @@ public class UpsertUserAllHandler implements BaseHandler { if (userAll.getUserOption() != null) { UserOption newUserOption = userAll.getUserOption().get(0); - Optional userOptionOptional = userOptionRepository.findByUser(newUserData); + Optional userOptionOptional = userOptionRepository.findSingleByUser(newUserData); UserOption userOption = userOptionOptional.orElseGet(() -> new UserOption(newUserData)); newUserOption.setId(userOption.getId()); @@ -185,7 +185,7 @@ public class UpsertUserAllHandler implements BaseHandler { //Udemae UserUdemae newUserUdemae = userRating.getUdemae(); - Optional udemaeOptional = userUdemaeRepository.findByUser(newUserData); + Optional udemaeOptional = userUdemaeRepository.findSingleByUser(newUserData); UserUdemae userUdemae = udemaeOptional.orElseGet(() -> new UserUdemae(newUserData)); newUserUdemae.setId(userUdemae.getId()); 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 03480672..3b6659fb 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 @@ -13,12 +13,14 @@ import org.springframework.data.domain.Page import org.springframework.data.domain.Pageable import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.repository.NoRepositoryBean +import org.springframework.stereotype.Component import org.springframework.transaction.annotation.Transactional import java.util.* @NoRepositoryBean interface UserLinked: JpaRepository { - fun findByUser(user: UserDetail): Optional + fun findByUser(user: UserDetail): List + fun findSingleByUser(user: UserDetail): Optional fun findByUser_Card_ExtId(userId: Long): List fun findByUser_Card_ExtId(userId: Long, page: Pageable): Page fun findSingleByUser_Card_ExtId(userId: Long): Optional @@ -109,4 +111,30 @@ interface Mai2GameEventRepo : JpaRepository { fun findByTypeAndEnable(type: Int, enable: Boolean): List } -interface Mai2GameSellingCardRepo : JpaRepository \ No newline at end of file +interface Mai2GameSellingCardRepo : JpaRepository + +@Component +class Mai2Repos( + val mapEncountNpc: Mai2MapEncountNpcRepo, + val userAct: Mai2UserActRepo, + val userCard: Mai2UserCardRepo, + val userCharacter: Mai2UserCharacterRepo, + val userCharge: Mai2UserChargeRepo, + val userCourse: Mai2UserCourseRepo, + val userData: Mai2UserDataRepo, + val userExtend: Mai2UserExtendRepo, + val userFavorite: Mai2UserFavoriteRepo, + val userFriendSeasonRanking: Mai2UserFriendSeasonRankingRepo, + val userGeneralData: Mai2UserGeneralDataRepo, + val userItem: Mai2UserItemRepo, + val userLoginBonus: Mai2UserLoginBonusRepo, + val userMap: Mai2UserMapRepo, + val userMusicDetail: Mai2UserMusicDetailRepo, + val userOption: Mai2UserOptionRepo, + val userPlaylog: Mai2UserPlaylogRepo, + val userPrintDetail: Mai2UserPrintDetailRepo, + val userUdemae: Mai2UserUdemaeRepo, + val gameCharge: Mai2GameChargeRepo, + val gameEvent: Mai2GameEventRepo, + val gameSellingCard: Mai2GameSellingCardRepo +)