[RF] move userMusicFromList to GameApiController and add GenericUserM… (#102)

pull/103/head
Azalea 2025-01-05 07:26:31 -05:00 committed by GitHub
commit 7824ab907b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 42 additions and 18 deletions

View File

@ -22,6 +22,7 @@ abstract class GameApiController<T : IUserData>(val name: String, userDataClass:
abstract val us: AquaUserServices abstract val us: AquaUserServices
abstract val userDataRepo: GenericUserDataRepo<T> abstract val userDataRepo: GenericUserDataRepo<T>
abstract val playlogRepo: GenericPlaylogRepo<*> abstract val playlogRepo: GenericPlaylogRepo<*>
abstract val userMusicRepo: GenericUserMusicRepo<*>
abstract val shownRanks: List<Pair<Int, String>> abstract val shownRanks: List<Pair<Int, String>>
abstract val settableFields: Map<String, (T, String) -> Unit> abstract val settableFields: Map<String, (T, String) -> Unit>
open val gettableFields: Set<String> = setOf() open val gettableFields: Set<String> = setOf()
@ -133,6 +134,11 @@ abstract class GameApiController<T : IUserData>(val name: String, userDataClass:
} }
} }
@API("user-music-from-list")
suspend fun userMusicFromList(@RP username: Str, @RB musicList: List<Int>) = us.cardByName(username) { card ->
userMusicRepo.findByUser_Card_ExtIdAndMusicIdIn(card.extId, musicList)
}
fun genericUserSummary(card: Card, ratingComp: Map<String, String>, rival: Boolean? = null): GenericGameSummary { fun genericUserSummary(card: Card, ratingComp: Map<String, String>, rival: Boolean? = null): GenericGameSummary {
// Summary values: total plays, player rating, server-wide ranking // Summary values: total plays, player rating, server-wide ranking
// number of each rank, max combo, number of full combo, number of all perfect // number of each rank, max combo, number of full combo, number of all perfect

View File

@ -107,6 +107,10 @@ interface IGenericGamePlaylog {
val isAllPerfect: Boolean val isAllPerfect: Boolean
} }
interface IGenericUserMusic {
val musicId: Int
}
@MappedSuperclass @MappedSuperclass
open class BaseEntity( open class BaseEntity(
@Id @Id
@ -132,4 +136,10 @@ interface GenericPlaylogRepo<T: IGenericGamePlaylog> : JpaRepository<T, Long> {
fun findByUserCardExtId(extId: Long, page: Pageable): Page<T> fun findByUserCardExtId(extId: Long, page: Pageable): Page<T>
} }
@NoRepositoryBean
interface GenericUserMusicRepo<T: IGenericUserMusic> : JpaRepository<T, Long> {
fun findByUserCardExtId(extId: Long): List<T>
fun findByUser_Card_ExtIdAndMusicIdIn(userId: Long, musicId: List<Int>): List<T>
}
data class ImportResult(val errors: List<String>, val warnings: List<String>, val json: String) data class ImportResult(val errors: List<String>, val warnings: List<String>, val json: String)

View File

@ -14,6 +14,7 @@ class Chusan(
override val us: AquaUserServices, override val us: AquaUserServices,
override val playlogRepo: Chu3UserPlaylogRepo, override val playlogRepo: Chu3UserPlaylogRepo,
override val userDataRepo: Chu3UserDataRepo, override val userDataRepo: Chu3UserDataRepo,
override val userMusicRepo: Chu3UserMusicDetailRepo,
val rp: Chu3Repos val rp: Chu3Repos
): GameApiController<Chu3UserData>("chu3", Chu3UserData::class) { ): GameApiController<Chu3UserData>("chu3", Chu3UserData::class) {
override suspend fun trend(@RP username: Str): List<TrendOut> = us.cardByName(username) { card -> override suspend fun trend(@RP username: Str): List<TrendOut> = us.cardByName(username) { card ->

View File

@ -16,6 +16,7 @@ class Maimai2(
override val us: AquaUserServices, override val us: AquaUserServices,
override val playlogRepo: Mai2UserPlaylogRepo, override val playlogRepo: Mai2UserPlaylogRepo,
override val userDataRepo: Mai2UserDataRepo, override val userDataRepo: Mai2UserDataRepo,
override val userMusicRepo: Mai2UserMusicDetailRepo,
val repos: Mai2Repos, val repos: Mai2Repos,
) : GameApiController<Mai2UserDetail>("mai2", Mai2UserDetail::class) { ) : GameApiController<Mai2UserDetail>("mai2", Mai2UserDetail::class) {
override suspend fun trend(@RP username: Str): List<TrendOut> = us.cardByName(username) { card -> override suspend fun trend(@RP username: Str): List<TrendOut> = us.cardByName(username) { card ->
@ -99,11 +100,6 @@ class Maimai2(
repos.userFavorite.findByUser_Card_ExtId(card.extId) repos.userFavorite.findByUser_Card_ExtId(card.extId)
} }
@API("user-music-from-list")
suspend fun userMusicFromList(@RP username: Str, @RB musicList: List<Int>) = us.cardByName(username) { card ->
repos.userMusicDetail.findByUser_Card_ExtIdAndMusicIdIn(card.extId, musicList)
}
@PostMapping("change-name") @PostMapping("change-name")
suspend fun changeName(@RP token: String, @RP newName: String) = us.jwt.auth(token) { u -> suspend fun changeName(@RP token: String, @RP newName: String) = us.jwt.auth(token) { u ->
val newNameFull = toFullWidth(newName) val newNameFull = toFullWidth(newName)

View File

@ -6,6 +6,7 @@ import icu.samnyan.aqua.net.games.*
import icu.samnyan.aqua.net.utils.* import icu.samnyan.aqua.net.utils.*
import icu.samnyan.aqua.sega.ongeki.dao.userdata.UserDataRepository 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.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.dao.userdata.UserPlaylogRepository
import icu.samnyan.aqua.sega.ongeki.model.userdata.UserData import icu.samnyan.aqua.sega.ongeki.model.userdata.UserData
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController
@ -16,6 +17,7 @@ class Ongeki(
override val us: AquaUserServices, override val us: AquaUserServices,
override val playlogRepo: UserPlaylogRepository, override val playlogRepo: UserPlaylogRepository,
override val userDataRepo: UserDataRepository, override val userDataRepo: UserDataRepository,
override val userMusicRepo: UserMusicDetailRepository,
val userGeneralDataRepository: UserGeneralDataRepository val userGeneralDataRepository: UserGeneralDataRepository
): GameApiController<UserData>("ongeki", UserData::class) { ): GameApiController<UserData>("ongeki", UserData::class) {
override suspend fun trend(username: String) = us.cardByName(username) { card -> override suspend fun trend(username: String) = us.cardByName(username) { card ->

View File

@ -5,6 +5,7 @@ import icu.samnyan.aqua.net.db.AquaUserServices
import icu.samnyan.aqua.net.games.* import icu.samnyan.aqua.net.games.*
import icu.samnyan.aqua.net.utils.waccaScores import icu.samnyan.aqua.net.utils.waccaScores
import icu.samnyan.aqua.sega.wacca.model.db.WaccaUser 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.WcUserPlayLogRepo
import icu.samnyan.aqua.sega.wacca.model.db.WcUserRepo import icu.samnyan.aqua.sega.wacca.model.db.WcUserRepo
import org.springframework.web.bind.annotation.RestController import org.springframework.web.bind.annotation.RestController
@ -15,6 +16,7 @@ class Wacca(
override val us: AquaUserServices, override val us: AquaUserServices,
override val playlogRepo: WcUserPlayLogRepo, override val playlogRepo: WcUserPlayLogRepo,
override val userDataRepo: WcUserRepo, override val userDataRepo: WcUserRepo,
override val userMusicRepo: WcUserBestScoreRepo,
): GameApiController<WaccaUser>("wacca", WaccaUser::class) { ): GameApiController<WaccaUser>("wacca", WaccaUser::class) {
override val settableFields: Map<String, (WaccaUser, String) -> Unit> by lazy { mapOf( override val settableFields: Map<String, (WaccaUser, String) -> Unit> by lazy { mapOf(
"userName" to usernameCheck(WACCA_USERNAME_CHARS), "userName" to usernameCheck(WACCA_USERNAME_CHARS),

View File

@ -4,8 +4,10 @@ package icu.samnyan.aqua.sega.chusan.model
import icu.samnyan.aqua.net.games.GenericPlaylogRepo import icu.samnyan.aqua.net.games.GenericPlaylogRepo
import icu.samnyan.aqua.net.games.GenericUserDataRepo 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.net.games.IUserRepo
import icu.samnyan.aqua.sega.chusan.model.userdata.* 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.Page
import org.springframework.data.domain.Pageable import org.springframework.data.domain.Pageable
import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.JpaRepository
@ -104,7 +106,7 @@ interface Chu3UserMapRepo : Chu3UserLinked<UserMap> {
fun findAllByUserCardExtIdAndMapAreaIdIn(user: Long, mapAreaIds: List<Int>): List<UserMap> fun findAllByUserCardExtIdAndMapAreaIdIn(user: Long, mapAreaIds: List<Int>): List<UserMap>
} }
interface Chu3UserMusicDetailRepo : Chu3UserLinked<UserMusicDetail> { interface Chu3UserMusicDetailRepo : Chu3UserLinked<UserMusicDetail>, GenericUserMusicRepo<UserMusicDetail> {
fun findTopByUserAndMusicIdAndLevelOrderByIdDesc(user: Chu3UserData, musicId: Int, level: Int): Optional<UserMusicDetail> fun findTopByUserAndMusicIdAndLevelOrderByIdDesc(user: Chu3UserData, musicId: Int, level: Int): Optional<UserMusicDetail>
fun findByUserAndMusicIdAndLevel(user: Chu3UserData, musicId: Int, level: Int): UserMusicDetail? fun findByUserAndMusicIdAndLevel(user: Chu3UserData, musicId: Int, level: Int): UserMusicDetail?

View File

@ -2,6 +2,7 @@ package icu.samnyan.aqua.sega.chusan.model.userdata
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.databind.annotation.JsonDeserialize import com.fasterxml.jackson.databind.annotation.JsonDeserialize
import icu.samnyan.aqua.net.games.IGenericUserMusic
import icu.samnyan.aqua.sega.util.jackson.BooleanToIntegerDeserializer import icu.samnyan.aqua.sega.util.jackson.BooleanToIntegerDeserializer
import jakarta.persistence.Entity import jakarta.persistence.Entity
import jakarta.persistence.Table import jakarta.persistence.Table
@ -15,8 +16,8 @@ import jakarta.persistence.UniqueConstraint
name = "chusan_user_music_detail", name = "chusan_user_music_detail",
uniqueConstraints = [UniqueConstraint(columnNames = ["user_id", "music_id", "level"])] uniqueConstraints = [UniqueConstraint(columnNames = ["user_id", "music_id", "level"])]
) )
class UserMusicDetail : Chu3UserEntity() { class UserMusicDetail : Chu3UserEntity(), IGenericUserMusic {
var musicId = 0 override var musicId = 0
var level = 0 var level = 0
var playCount = 0 var playCount = 0
var scoreMax = 0 var scoreMax = 0

View File

@ -4,6 +4,7 @@ package icu.samnyan.aqua.sega.maimai2.model
import icu.samnyan.aqua.net.games.GenericPlaylogRepo import icu.samnyan.aqua.net.games.GenericPlaylogRepo
import icu.samnyan.aqua.net.games.GenericUserDataRepo 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.net.games.IUserRepo
import icu.samnyan.aqua.sega.general.model.Card import icu.samnyan.aqua.sega.general.model.Card
import icu.samnyan.aqua.sega.maimai2.model.userdata.* import icu.samnyan.aqua.sega.maimai2.model.userdata.*
@ -90,13 +91,11 @@ interface Mai2UserMapRepo : Mai2UserLinked<Mai2UserMap> {
fun findByUserAndMapId(user: Mai2UserDetail, mapId: Int): Optional<Mai2UserMap> fun findByUserAndMapId(user: Mai2UserDetail, mapId: Int): Optional<Mai2UserMap>
} }
interface Mai2UserMusicDetailRepo : Mai2UserLinked<Mai2UserMusicDetail> { interface Mai2UserMusicDetailRepo : Mai2UserLinked<Mai2UserMusicDetail>, GenericUserMusicRepo<Mai2UserMusicDetail> {
fun findByUser_Card_ExtIdAndMusicId(userId: Long, id: Int): List<Mai2UserMusicDetail> fun findByUser_Card_ExtIdAndMusicId(userId: Long, id: Int): List<Mai2UserMusicDetail>
fun findByUserAndMusicIdAndLevel(user: Mai2UserDetail, musicId: Int, level: Int): Optional<Mai2UserMusicDetail> fun findByUserAndMusicIdAndLevel(user: Mai2UserDetail, musicId: Int, level: Int): Optional<Mai2UserMusicDetail>
fun findByUser_Card_ExtIdAndMusicIdIn(userId: Long, musicId: List<Int>): List<Mai2UserMusicDetail>
fun findByUserId(userId: Long): List<Mai2UserMusicDetail> fun findByUserId(userId: Long): List<Mai2UserMusicDetail>
} }

View File

@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.JsonProperty
import com.fasterxml.jackson.annotation.JsonPropertyOrder import com.fasterxml.jackson.annotation.JsonPropertyOrder
import icu.samnyan.aqua.net.games.BaseEntity import icu.samnyan.aqua.net.games.BaseEntity
import icu.samnyan.aqua.net.games.IGenericGamePlaylog 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.net.games.IUserEntity
import icu.samnyan.aqua.sega.general.IntegerListConverter import icu.samnyan.aqua.sega.general.IntegerListConverter
import jakarta.persistence.* import jakarta.persistence.*
@ -294,9 +295,9 @@ class Mai2UserMap : Mai2UserEntity() {
@Table(name = "maimai2_user_music_detail") @Table(name = "maimai2_user_music_detail")
@Data @Entity @Data @Entity
class Mai2UserMusicDetail : Mai2UserEntity() { class Mai2UserMusicDetail : Mai2UserEntity(), IGenericUserMusic {
var musicId = 0 override var musicId = 0
var level = 0 var level = 0
var playCount = 0 var playCount = 0
var achievement = 0 var achievement = 0

View File

@ -1,5 +1,6 @@
package icu.samnyan.aqua.sega.ongeki.dao.userdata; 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.UserData;
import icu.samnyan.aqua.sega.ongeki.model.userdata.UserMusicDetail; import icu.samnyan.aqua.sega.ongeki.model.userdata.UserMusicDetail;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
@ -15,7 +16,7 @@ import java.util.Optional;
* @author samnyan (privateamusement@protonmail.com) * @author samnyan (privateamusement@protonmail.com)
*/ */
@Repository("OngekiUserMusicDetailRepository") @Repository("OngekiUserMusicDetailRepository")
public interface UserMusicDetailRepository extends JpaRepository<UserMusicDetail, Long> { public interface UserMusicDetailRepository extends JpaRepository<UserMusicDetail, Long>, GenericUserMusicRepo<UserMusicDetail> {
List<UserMusicDetail> findByUser_Card_ExtId(long userId); List<UserMusicDetail> findByUser_Card_ExtId(long userId);

View File

@ -2,6 +2,7 @@ package icu.samnyan.aqua.sega.ongeki.model.userdata;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import icu.samnyan.aqua.net.games.IGenericUserMusic;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -17,7 +18,7 @@ import java.io.Serializable;
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class UserMusicDetail implements Serializable { public class UserMusicDetail implements Serializable, IGenericUserMusic {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;

View File

@ -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.GenericPlaylogRepo
import icu.samnyan.aqua.net.games.GenericUserDataRepo import icu.samnyan.aqua.net.games.GenericUserDataRepo
import icu.samnyan.aqua.net.games.GenericUserMusicRepo
import jakarta.transaction.Transactional import jakarta.transaction.Transactional
import org.springframework.data.jpa.repository.JpaRepository import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query import org.springframework.data.jpa.repository.Query
@ -32,7 +33,7 @@ interface WcUserItemRepo : IWaccaUserLinked<WcUserItem> {
fun findByUserAndType(user: WaccaUser, type: Int): List<WcUserItem> fun findByUserAndType(user: WaccaUser, type: Int): List<WcUserItem>
fun findByUserAndItemIdAndType(user: WaccaUser, itemId: Int, type: Int): WcUserItem? fun findByUserAndItemIdAndType(user: WaccaUser, itemId: Int, type: Int): WcUserItem?
} }
interface WcUserBestScoreRepo : IWaccaUserLinked<WcUserScore> { interface WcUserBestScoreRepo : IWaccaUserLinked<WcUserScore>, GenericUserMusicRepo<WcUserScore> {
fun findByUserAndMusicIdAndLevel(user: WaccaUser, songId: Int, level: Int): WcUserScore? fun findByUserAndMusicIdAndLevel(user: WaccaUser, songId: Int, level: Int): WcUserScore?
@Query("SELECT SUM(achievement) FROM WcUserScore WHERE user = :user") @Query("SELECT SUM(achievement) FROM WcUserScore WHERE user = :user")
fun sumScoreByUser(user: WaccaUser): Long fun sumScoreByUser(user: WaccaUser): Long

View File

@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore
import ext.* import ext.*
import icu.samnyan.aqua.net.games.BaseEntity import icu.samnyan.aqua.net.games.BaseEntity
import icu.samnyan.aqua.net.games.IGenericGamePlaylog 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.general.IntegerListConverter
import icu.samnyan.aqua.sega.wacca.WaccaItemType import icu.samnyan.aqua.sega.wacca.WaccaItemType
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"])]) @Entity @Table(name = "wacca_user_score", uniqueConstraints = [UC("", ["user_id", "music_id", "level"])])
class WcUserScore : WaccaUserEntity() { class WcUserScore : WaccaUserEntity(), IGenericUserMusic {
var musicId = 0 override var musicId = 0
var level = 0 // aka difficulty var level = 0 // aka difficulty
var achievement = 0 var achievement = 0