diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiRepos.kt b/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiRepos.kt index cdd81796..0a0e95dd 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiRepos.kt +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiRepos.kt @@ -162,7 +162,10 @@ interface OgkUserGachaRepo : OngekiUserLinked { } // Re:Fresh -interface OgkUserEventMapRepo : OngekiUserLinked +interface OgkUserEventMapRepo : OngekiUserLinked { + fun findByUserAndEventIdAndMapId(user: UserData, eventId: Int, mapId: Int): UserEventMap? + fun findByUser_Card_ExtIdAndEventIdAndMapId(extId: Long, eventId: Int, mapId: Int): UserEventMap? +} interface OgkUserSkinRepo : OngekiUserLinked diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiUpsertAllApi.kt b/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiUpsertAllApi.kt index 67f11000..0ebcf3f0 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiUpsertAllApi.kt +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiUpsertAllApi.kt @@ -74,7 +74,9 @@ fun OngekiController.initUpsertAll() { // UserEventMap userEventMap?.let { db.eventMap.save(it.apply { - id = db.eventMap.findSingleByUser(u)?.id ?: 0 }) } + id = db.eventMap.findByUserAndEventIdAndMapId(u, it.eventId, it.mapId)?.id ?: 0 + }) + } // UserPlaylogList userPlaylogList?.let { db.playlog.saveAll(it) } diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiUserApis.kt b/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiUserApis.kt index ffef4f40..c79a1fda 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiUserApis.kt +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiUserApis.kt @@ -17,7 +17,14 @@ fun OngekiController.initUser() { "GetUserData" { mapOf("userId" to uid, "userData" to db.data.findByCard_ExtId(uid)) } "GetUserOption" { mapOf("userId" to uid, "userOption" to db.option.findSingleByUser_Card_ExtId(uid)) } - "GetUserEventMap" { mapOf("userId" to uid, "userEventMap" to db.eventMap.findSingleByUser_Card_ExtId(uid)) } + "GetUserEventMap" { + val eventId = parsing { data["eventId"]!!.int } + val mapId = parsing { data["mapId"]!!.int } + mapOf( + "userId" to uid, + "userEventMap" to db.eventMap.findByUser_Card_ExtIdAndEventIdAndMapId(uid, eventId, mapId) + ) + } "GetUserTechEvent".unpaged { db.techEvent.findByUser_Card_ExtId(uid) } "GetUserBoss".unpaged { db.boss.findByUser_Card_ExtId(uid) } diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/OngekiUserEntities.kt b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/OngekiUserEntities.kt index 1759cfc5..286a5991 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/OngekiUserEntities.kt +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/OngekiUserEntities.kt @@ -498,7 +498,10 @@ class UserTrainingRoom : OngekiUserEntity() { // Re:Fresh @Entity(name = "OngekiUserEventMap") -@Table(name = "ongeki_user_event_map") +@Table( + name = "ongeki_user_event_map", + uniqueConstraints = [UniqueConstraint(columnNames = ["user_id", "event_id", "map_id"])] +) class UserEventMap : OngekiUserEntity() { var eventId = 0 var mapId = 0 diff --git a/src/main/resources/db/120/V1000_89__ongeki_event_map_unique.sql b/src/main/resources/db/120/V1000_89__ongeki_event_map_unique.sql new file mode 100644 index 00000000..19a74856 --- /dev/null +++ b/src/main/resources/db/120/V1000_89__ongeki_event_map_unique.sql @@ -0,0 +1,13 @@ +-- dedupe before adding new constraint just in case +DELETE FROM ongeki_user_event_map +WHERE id NOT IN ( + SELECT id + FROM ( + SELECT MAX(id) AS id + FROM ongeki_user_event_map + GROUP BY user_id, event_id, map_id + ) AS rows_to_keep +); + +ALTER TABLE ongeki_user_event_map + ADD UNIQUE KEY uniq_ongeki_user_event_map (user_id, event_id, map_id);