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 e37d2569..8c4bead1 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/GameApiController.kt @@ -22,6 +22,7 @@ abstract class GameApiController(val name: String, userDataClass: abstract val us: AquaUserServices abstract val userDataRepo: GenericUserDataRepo abstract val playlogRepo: GenericPlaylogRepo<*> + abstract val userMusicRepo: GenericUserMusicRepo<*> abstract val shownRanks: List> abstract val settableFields: Map Unit> open val gettableFields: Set = setOf() @@ -133,6 +134,11 @@ abstract class GameApiController(val name: String, userDataClass: } } + @API("user-music-from-list") + suspend fun userMusicFromList(@RP username: Str, @RB musicList: List) = us.cardByName(username) { card -> + userMusicRepo.findByUser_Card_ExtIdAndMusicIdIn(card.extId, musicList) + } + fun genericUserSummary(card: Card, ratingComp: Map, rival: Boolean? = null): GenericGameSummary { // Summary values: total plays, player rating, server-wide ranking // number of each rank, max combo, number of full combo, number of all perfect 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 15f0e1d3..82ce9058 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/Models.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/Models.kt @@ -107,6 +107,10 @@ interface IGenericGamePlaylog { val isAllPerfect: Boolean } +interface IGenericUserMusic { + val musicId: Int +} + @MappedSuperclass open class BaseEntity( @Id @@ -132,4 +136,10 @@ interface GenericPlaylogRepo : JpaRepository { fun findByUserCardExtId(extId: Long, page: Pageable): Page } +@NoRepositoryBean +interface GenericUserMusicRepo : JpaRepository { + fun findByUserCardExtId(extId: Long): List + fun findByUser_Card_ExtIdAndMusicIdIn(userId: Long, musicId: List): List +} + data class ImportResult(val errors: List, val warnings: List, val json: String) 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 13102502..4db8a745 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 @@ -14,6 +14,7 @@ class Chusan( override val us: AquaUserServices, override val playlogRepo: Chu3UserPlaylogRepo, override val userDataRepo: Chu3UserDataRepo, + override val userMusicRepo: Chu3UserMusicDetailRepo, val rp: Chu3Repos ): GameApiController("chu3", Chu3UserData::class) { override suspend fun trend(@RP username: Str): List = us.cardByName(username) { card -> 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 03113c50..6ca68a85 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 @@ -16,6 +16,7 @@ class Maimai2( override val us: AquaUserServices, override val playlogRepo: Mai2UserPlaylogRepo, override val userDataRepo: Mai2UserDataRepo, + override val userMusicRepo: Mai2UserMusicDetailRepo, val repos: Mai2Repos, ) : GameApiController("mai2", Mai2UserDetail::class) { override suspend fun trend(@RP username: Str): List = us.cardByName(username) { card -> @@ -99,11 +100,6 @@ class Maimai2( repos.userFavorite.findByUser_Card_ExtId(card.extId) } - @API("user-music-from-list") - suspend fun userMusicFromList(@RP username: Str, @RB musicList: List) = us.cardByName(username) { card -> - repos.userMusicDetail.findByUser_Card_ExtIdAndMusicIdIn(card.extId, musicList) - } - @PostMapping("change-name") suspend fun changeName(@RP token: String, @RP newName: String) = us.jwt.auth(token) { u -> val newNameFull = toFullWidth(newName) diff --git a/src/main/java/icu/samnyan/aqua/net/games/ongeki/Ongeki.kt b/src/main/java/icu/samnyan/aqua/net/games/ongeki/Ongeki.kt index 4cca0091..c1f3db9e 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/ongeki/Ongeki.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/ongeki/Ongeki.kt @@ -6,6 +6,7 @@ import icu.samnyan.aqua.net.games.* import icu.samnyan.aqua.net.utils.* import icu.samnyan.aqua.sega.ongeki.dao.userdata.UserDataRepository import icu.samnyan.aqua.sega.ongeki.dao.userdata.UserGeneralDataRepository +import icu.samnyan.aqua.sega.ongeki.dao.userdata.UserMusicDetailRepository import icu.samnyan.aqua.sega.ongeki.dao.userdata.UserPlaylogRepository import icu.samnyan.aqua.sega.ongeki.model.userdata.UserData import org.springframework.web.bind.annotation.RestController @@ -16,6 +17,7 @@ class Ongeki( override val us: AquaUserServices, override val playlogRepo: UserPlaylogRepository, override val userDataRepo: UserDataRepository, + override val userMusicRepo: UserMusicDetailRepository, val userGeneralDataRepository: UserGeneralDataRepository ): GameApiController("ongeki", UserData::class) { override suspend fun trend(username: String) = us.cardByName(username) { card -> diff --git a/src/main/java/icu/samnyan/aqua/net/games/wacca/Wacca.kt b/src/main/java/icu/samnyan/aqua/net/games/wacca/Wacca.kt index ee2a5346..84c3b5b2 100644 --- a/src/main/java/icu/samnyan/aqua/net/games/wacca/Wacca.kt +++ b/src/main/java/icu/samnyan/aqua/net/games/wacca/Wacca.kt @@ -5,6 +5,7 @@ import icu.samnyan.aqua.net.db.AquaUserServices import icu.samnyan.aqua.net.games.* import icu.samnyan.aqua.net.utils.waccaScores import icu.samnyan.aqua.sega.wacca.model.db.WaccaUser +import icu.samnyan.aqua.sega.wacca.model.db.WcUserBestScoreRepo import icu.samnyan.aqua.sega.wacca.model.db.WcUserPlayLogRepo import icu.samnyan.aqua.sega.wacca.model.db.WcUserRepo import org.springframework.web.bind.annotation.RestController @@ -15,6 +16,7 @@ class Wacca( override val us: AquaUserServices, override val playlogRepo: WcUserPlayLogRepo, override val userDataRepo: WcUserRepo, + override val userMusicRepo: WcUserBestScoreRepo, ): GameApiController("wacca", WaccaUser::class) { override val settableFields: Map Unit> by lazy { mapOf( "userName" to usernameCheck(WACCA_USERNAME_CHARS), diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3Repos.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3Repos.kt index 4396b026..ad81288b 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3Repos.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/Chu3Repos.kt @@ -4,8 +4,10 @@ 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.GenericUserMusicRepo import icu.samnyan.aqua.net.games.IUserRepo import icu.samnyan.aqua.sega.chusan.model.userdata.* +import icu.samnyan.aqua.sega.maimai2.model.userdata.Mai2UserMusicDetail import org.springframework.data.domain.Page import org.springframework.data.domain.Pageable import org.springframework.data.jpa.repository.JpaRepository @@ -104,7 +106,7 @@ interface Chu3UserMapRepo : Chu3UserLinked { fun findAllByUserCardExtIdAndMapAreaIdIn(user: Long, mapAreaIds: List): List } -interface Chu3UserMusicDetailRepo : Chu3UserLinked { +interface Chu3UserMusicDetailRepo : Chu3UserLinked, GenericUserMusicRepo { fun findTopByUserAndMusicIdAndLevelOrderByIdDesc(user: Chu3UserData, musicId: Int, level: Int): Optional fun findByUserAndMusicIdAndLevel(user: Chu3UserData, musicId: Int, level: Int): UserMusicDetail? diff --git a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserMusicDetail.kt b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserMusicDetail.kt index 14884f48..3bf3933c 100644 --- a/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserMusicDetail.kt +++ b/src/main/java/icu/samnyan/aqua/sega/chusan/model/userdata/UserMusicDetail.kt @@ -2,6 +2,7 @@ package icu.samnyan.aqua.sega.chusan.model.userdata import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.databind.annotation.JsonDeserialize +import icu.samnyan.aqua.net.games.IGenericUserMusic import icu.samnyan.aqua.sega.util.jackson.BooleanToIntegerDeserializer import jakarta.persistence.Entity import jakarta.persistence.Table @@ -15,8 +16,8 @@ import jakarta.persistence.UniqueConstraint name = "chusan_user_music_detail", uniqueConstraints = [UniqueConstraint(columnNames = ["user_id", "music_id", "level"])] ) -class UserMusicDetail : Chu3UserEntity() { - var musicId = 0 +class UserMusicDetail : Chu3UserEntity(), IGenericUserMusic { + override var musicId = 0 var level = 0 var playCount = 0 var scoreMax = 0 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 cc4d061c..84371be5 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.GenericUserMusicRepo import icu.samnyan.aqua.net.games.IUserRepo import icu.samnyan.aqua.sega.general.model.Card import icu.samnyan.aqua.sega.maimai2.model.userdata.* @@ -90,13 +91,11 @@ interface Mai2UserMapRepo : Mai2UserLinked { fun findByUserAndMapId(user: Mai2UserDetail, mapId: Int): Optional } -interface Mai2UserMusicDetailRepo : Mai2UserLinked { +interface Mai2UserMusicDetailRepo : Mai2UserLinked, GenericUserMusicRepo { fun findByUser_Card_ExtIdAndMusicId(userId: Long, id: Int): List fun findByUserAndMusicIdAndLevel(user: Mai2UserDetail, musicId: Int, level: Int): Optional - fun findByUser_Card_ExtIdAndMusicIdIn(userId: Long, musicId: List): List - fun findByUserId(userId: Long): List } 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 c0e5b8cf..9990db16 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.IGenericUserMusic import icu.samnyan.aqua.net.games.IUserEntity import icu.samnyan.aqua.sega.general.IntegerListConverter import jakarta.persistence.* @@ -294,9 +295,9 @@ class Mai2UserMap : Mai2UserEntity() { @Table(name = "maimai2_user_music_detail") @Data @Entity -class Mai2UserMusicDetail : Mai2UserEntity() { +class Mai2UserMusicDetail : Mai2UserEntity(), IGenericUserMusic { - var musicId = 0 + override var musicId = 0 var level = 0 var playCount = 0 var achievement = 0 diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/UserMusicDetailRepository.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/UserMusicDetailRepository.java index 52443909..3216606b 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/UserMusicDetailRepository.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/UserMusicDetailRepository.java @@ -1,5 +1,6 @@ package icu.samnyan.aqua.sega.ongeki.dao.userdata; +import icu.samnyan.aqua.net.games.GenericUserMusicRepo; import icu.samnyan.aqua.sega.ongeki.model.userdata.UserData; import icu.samnyan.aqua.sega.ongeki.model.userdata.UserMusicDetail; import org.springframework.data.domain.Page; @@ -15,7 +16,7 @@ * @author samnyan (privateamusement@protonmail.com) */ @Repository("OngekiUserMusicDetailRepository") -public interface UserMusicDetailRepository extends JpaRepository { +public interface UserMusicDetailRepository extends JpaRepository, GenericUserMusicRepo { List findByUser_Card_ExtId(long userId); diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserMusicDetail.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserMusicDetail.java index 8aa54679..e11894aa 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserMusicDetail.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserMusicDetail.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; +import icu.samnyan.aqua.net.games.IGenericUserMusic; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -17,7 +18,7 @@ @Data @NoArgsConstructor @AllArgsConstructor -public class UserMusicDetail implements Serializable { +public class UserMusicDetail implements Serializable, IGenericUserMusic { private static final long serialVersionUID = 1L; diff --git a/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/Repos.kt b/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/Repos.kt index 44c45dc1..ca599394 100644 --- a/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/Repos.kt +++ b/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/Repos.kt @@ -2,6 +2,7 @@ package icu.samnyan.aqua.sega.wacca.model.db import icu.samnyan.aqua.net.games.GenericPlaylogRepo import icu.samnyan.aqua.net.games.GenericUserDataRepo +import icu.samnyan.aqua.net.games.GenericUserMusicRepo import jakarta.transaction.Transactional import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.Query @@ -32,7 +33,7 @@ interface WcUserItemRepo : IWaccaUserLinked { fun findByUserAndType(user: WaccaUser, type: Int): List fun findByUserAndItemIdAndType(user: WaccaUser, itemId: Int, type: Int): WcUserItem? } -interface WcUserBestScoreRepo : IWaccaUserLinked { +interface WcUserBestScoreRepo : IWaccaUserLinked, GenericUserMusicRepo { fun findByUserAndMusicIdAndLevel(user: WaccaUser, songId: Int, level: Int): WcUserScore? @Query("SELECT SUM(achievement) FROM WcUserScore WHERE user = :user") fun sumScoreByUser(user: WaccaUser): Long diff --git a/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/WaccaUserModels.kt b/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/WaccaUserModels.kt index 349e3e17..fe7e7668 100644 --- a/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/WaccaUserModels.kt +++ b/src/main/java/icu/samnyan/aqua/sega/wacca/model/db/WaccaUserModels.kt @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore import ext.* import icu.samnyan.aqua.net.games.BaseEntity import icu.samnyan.aqua.net.games.IGenericGamePlaylog +import icu.samnyan.aqua.net.games.IGenericUserMusic import icu.samnyan.aqua.sega.general.IntegerListConverter import icu.samnyan.aqua.sega.wacca.WaccaItemType import icu.samnyan.aqua.sega.wacca.WaccaItemType.* @@ -92,8 +93,8 @@ class WcUserItem( } @Entity @Table(name = "wacca_user_score", uniqueConstraints = [UC("", ["user_id", "music_id", "level"])]) -class WcUserScore : WaccaUserEntity() { - var musicId = 0 +class WcUserScore : WaccaUserEntity(), IGenericUserMusic { + override var musicId = 0 var level = 0 // aka difficulty var achievement = 0