From a12ec079170f27b23a10c2d2fc5f94bbdb6964c4 Mon Sep 17 00:00:00 2001 From: asterisk727 <59166650+asterisk727@users.noreply.github.com> Date: Sat, 5 Sep 2026 15:38:53 +0900 Subject: [PATCH] fix: ongeki technical challenge records stored and deduped by chart difficulty --- .../icu/samnyan/aqua/sega/ongeki/OngekiRepos.kt | 3 ++- .../aqua/sega/ongeki/OngekiUpsertAllApi.kt | 5 +++-- .../sega/ongeki/model/OngekiUserEntities.kt | 5 ++++- ...1000_90__ongeki_event_music_level_unique.sql | 17 +++++++++++++++++ 4 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/db/120/V1000_90__ongeki_event_music_level_unique.sql 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 0a0e95dd..3b5c3522 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiRepos.kt +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiRepos.kt @@ -58,7 +58,8 @@ interface OgkUserEventMusicRepo : OngekiUserLinked { userData: UserData, eventId: Int, type: Int, - musicId: Int + musicId: Int, + level: Int ): UserEventMusic? } 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 0ebcf3f0..be5c51c4 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiUpsertAllApi.kt +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/OngekiUpsertAllApi.kt @@ -197,8 +197,9 @@ fun OngekiController.initUpsertAll() { // UserEventMusicList userEventMusicList?.let { list -> - db.eventMusic.saveAll(list.distinctBy { it.eventId to it.type to it.musicId }.mapApply { - id = db.eventMusic.findByUserAndEventIdAndTypeAndMusicId(u, eventId, type, musicId)?.id ?: 0 }) } + db.eventMusic.saveAll(list.distinctBy { it.eventId to it.type to it.musicId to it.level }.mapApply { + id = db.eventMusic.findByUserAndEventIdAndTypeAndMusicId(u, eventId, type, musicId, level)?.id ?: 0 + }) } // UserTechEventList userTechEventList?.let { list -> 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 286a5991..f472c1dd 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 @@ -197,7 +197,10 @@ class UserDeck : OngekiUserEntity() { } @Entity(name = "OngekiUserEventMusic") -@Table(name = "ongeki_user_event_music") +@Table( + name = "ongeki_user_event_music", + uniqueConstraints = [UniqueConstraint(columnNames = ["user_id", "event_id", "type", "music_id", "level"])] +) class UserEventMusic : OngekiUserEntity() { var eventId = 0 var type = 0 diff --git a/src/main/resources/db/120/V1000_90__ongeki_event_music_level_unique.sql b/src/main/resources/db/120/V1000_90__ongeki_event_music_level_unique.sql new file mode 100644 index 00000000..2f1d9710 --- /dev/null +++ b/src/main/resources/db/120/V1000_90__ongeki_event_music_level_unique.sql @@ -0,0 +1,17 @@ +-- allow separate Technical Challenge records for each chart difficulty +-- drop the old constraint and dedupe with the new constraint just in case again +ALTER TABLE ongeki_user_event_music + DROP INDEX UKo5PU3BgZeTKB8SNykq9U7xjfshp; + +DELETE FROM ongeki_user_event_music +WHERE id NOT IN ( + SELECT id + FROM ( + SELECT MAX(id) AS id + FROM ongeki_user_event_music + GROUP BY user_id, event_id, type, music_id, level + ) AS rows_to_keep +); + +ALTER TABLE ongeki_user_event_music + ADD UNIQUE KEY uniq_ongeki_user_event_music (user_id, event_id, type, music_id, level);