From 4eefdf950727a3023a8d70a8e732401f0af315c1 Mon Sep 17 00:00:00 2001 From: Mikira Sora Date: Fri, 6 Jan 2023 14:06:44 +0000 Subject: [PATCH] [ongeki] Fix foreign key in user rival table --- .../ongeki/ApiOngekiPlayerDataController.java | 9 +++++--- .../dao/userdata/UserRivalDataRepository.java | 2 +- .../sega/ongeki/model/userdata/UserRival.java | 6 +++--- ...223__fix_ongeki_user_rival_foreign_key.sql | 3 +++ ...223__fix_ongeki_user_rival_foreign_key.sql | 3 +++ ...223__fix_ongeki_user_rival_foreign_key.sql | 21 +++++++++++++++++++ .../dao/userdata/OngekiRepositoryTest.java | 10 ++++++++- 7 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/db/migration/mariadb/V223__fix_ongeki_user_rival_foreign_key.sql create mode 100644 src/main/resources/db/migration/mysql/V223__fix_ongeki_user_rival_foreign_key.sql create mode 100644 src/main/resources/db/migration/sqlite/V223__fix_ongeki_user_rival_foreign_key.sql diff --git a/src/main/java/icu/samnyan/aqua/api/controller/sega/game/ongeki/ApiOngekiPlayerDataController.java b/src/main/java/icu/samnyan/aqua/api/controller/sega/game/ongeki/ApiOngekiPlayerDataController.java index c0d1bad5..272a3723 100644 --- a/src/main/java/icu/samnyan/aqua/api/controller/sega/game/ongeki/ApiOngekiPlayerDataController.java +++ b/src/main/java/icu/samnyan/aqua/api/controller/sega/game/ongeki/ApiOngekiPlayerDataController.java @@ -343,7 +343,7 @@ public class ApiOngekiPlayerDataController { public List getRival(@RequestParam long aimeId) { var rivalUserIds = userRivalDataRepository.findByUser_Card_ExtId(aimeId) .stream() - .map(x -> x.getRivalUserId()) + .map(x -> x.getRivalUserExtId()) .collect(Collectors.toList()); var rivalDataList = userDataRepository.findByCard_ExtIdIn(rivalUserIds) @@ -356,7 +356,7 @@ public class ApiOngekiPlayerDataController { @DeleteMapping("rival") public MessageResponse deleteRival(@RequestParam long aimeId, @RequestParam long rivalAimeId) { - userRivalDataRepository.removeByUser_Card_ExtIdAndRivalUserId(aimeId, rivalAimeId); + userRivalDataRepository.removeByUser_Card_ExtIdAndRivalUserExtId(aimeId, rivalAimeId); return new MessageResponse(); } @@ -376,9 +376,12 @@ public class ApiOngekiPlayerDataController { return new ObjectMessageResponse<>("Rival user isn't ongeki player."); var rivalUser = rivalUserOpt.get(); + if(user == rivalUser) + return new ObjectMessageResponse<>("Can't add yourself as an rival."); + var rival = new UserRival(); rival.setUser(user); - rival.setRivalUserId(rivalUser.getCard().getExtId()); + rival.setRivalUserExtId(rivalUser.getCard().getExtId()); userRivalDataRepository.save(rival); return new ObjectMessageResponse<>(new UserRivalData(rivalUser.getCard().getExtId(), rivalUser.getUserName())); diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/UserRivalDataRepository.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/UserRivalDataRepository.java index 72b91e10..91b4e0e8 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/UserRivalDataRepository.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/UserRivalDataRepository.java @@ -17,7 +17,7 @@ public interface UserRivalDataRepository extends JpaRepository List findByUser_Card_ExtId(long userId); @Transactional - void removeByUser_Card_ExtIdAndRivalUserId(long userId,long rivalUserId); + void removeByUser_Card_ExtIdAndRivalUserExtId(long userId,long rivalUserId); @Transactional void deleteByUser(UserData user); diff --git a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserRival.java b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserRival.java index b025167a..ee5555c4 100644 --- a/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserRival.java +++ b/src/main/java/icu/samnyan/aqua/sega/ongeki/model/userdata/UserRival.java @@ -32,7 +32,7 @@ public class UserRival implements Serializable { @JoinColumn(name = "user_id") private UserData user; - @JoinColumn(name = "rival_user_id") + @JoinColumn(name = "rival_user_ext_id") @JsonProperty("rivalUserId") - private long rivalUserId; -} + private long rivalUserExtId; +} \ No newline at end of file diff --git a/src/main/resources/db/migration/mariadb/V223__fix_ongeki_user_rival_foreign_key.sql b/src/main/resources/db/migration/mariadb/V223__fix_ongeki_user_rival_foreign_key.sql new file mode 100644 index 00000000..b6c5d05e --- /dev/null +++ b/src/main/resources/db/migration/mariadb/V223__fix_ongeki_user_rival_foreign_key.sql @@ -0,0 +1,3 @@ +ALTER TABLE `ongeki_user_rival` DROP FOREIGN KEY `FK__ongeki_user_data_2`; +ALTER TABLE `ongeki_user_rival` ADD CONSTRAINT `FK__ongeki_user_data_2` FOREIGN KEY (rival_user_id) REFERENCES `sega_card` (`ext_id`) ON DELETE CASCADE ON UPDATE NO ACTION; +ALTER TABLE `ongeki_user_rival` RENAME COLUMN `rival_user_id` TO `rival_user_ext_id`; \ No newline at end of file diff --git a/src/main/resources/db/migration/mysql/V223__fix_ongeki_user_rival_foreign_key.sql b/src/main/resources/db/migration/mysql/V223__fix_ongeki_user_rival_foreign_key.sql new file mode 100644 index 00000000..b6c5d05e --- /dev/null +++ b/src/main/resources/db/migration/mysql/V223__fix_ongeki_user_rival_foreign_key.sql @@ -0,0 +1,3 @@ +ALTER TABLE `ongeki_user_rival` DROP FOREIGN KEY `FK__ongeki_user_data_2`; +ALTER TABLE `ongeki_user_rival` ADD CONSTRAINT `FK__ongeki_user_data_2` FOREIGN KEY (rival_user_id) REFERENCES `sega_card` (`ext_id`) ON DELETE CASCADE ON UPDATE NO ACTION; +ALTER TABLE `ongeki_user_rival` RENAME COLUMN `rival_user_id` TO `rival_user_ext_id`; \ No newline at end of file diff --git a/src/main/resources/db/migration/sqlite/V223__fix_ongeki_user_rival_foreign_key.sql b/src/main/resources/db/migration/sqlite/V223__fix_ongeki_user_rival_foreign_key.sql new file mode 100644 index 00000000..35d55572 --- /dev/null +++ b/src/main/resources/db/migration/sqlite/V223__fix_ongeki_user_rival_foreign_key.sql @@ -0,0 +1,21 @@ +-- This migration that recreate(alter) table which foreign key "rival_user_id" reference will be modified from "ongeki_user_data"("id") to "sega_card"("ext_id") +-- Before commit 687df8f57b59e1a06393f87f3dd734f5a9b3c732 , the type of UserRival.rivalUser is UserData and FK "rival_user_id" is right. +-- After this commit, UserRival.rivalUser is rename as UserRival.rivalUserId and FK "rival_user_id" must be modified. + +CREATE TABLE "ongeki_user_rival_new" ( + "id" INTEGER NOT NULL, + "rival_user_ext_id" BIGINT, + "user_id" BIGINT, + FOREIGN KEY("user_id") REFERENCES "ongeki_user_data"("id") ON DELETE CASCADE, + FOREIGN KEY("rival_user_ext_id") REFERENCES "sega_card"("ext_id") ON DELETE CASCADE, + PRIMARY KEY("id" AUTOINCREMENT), + CONSTRAINT "ongeki_user_rival_uq" UNIQUE("user_id","rival_user_ext_id") ON CONFLICT REPLACE +); + +-- copy data from old to new. +INSERT INTO ongeki_user_rival_new(id,rival_user_ext_id,user_id) SELECT id,rival_user_id,user_id FROM ongeki_user_rival; + +-- rename current to backup. +ALTER TABLE ongeki_user_rival RENAME TO ongeki_user_rival_old; +-- rename new as current. +ALTER TABLE ongeki_user_rival_new RENAME TO ongeki_user_rival; \ No newline at end of file diff --git a/src/test/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/OngekiRepositoryTest.java b/src/test/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/OngekiRepositoryTest.java index f92b86ba..ece9e15f 100644 --- a/src/test/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/OngekiRepositoryTest.java +++ b/src/test/java/icu/samnyan/aqua/sega/ongeki/dao/userdata/OngekiRepositoryTest.java @@ -345,7 +345,6 @@ class OngekiRepositoryTest { var u = getNewRandomValidUser(); var r1 = getNewRandomValidUser(); var r2 = getNewRandomValidUser(); - var r3 = getNewRandomValidUser(); userRivalDataRepository.saveAll(List.of( getUserRival(u, r1), @@ -359,6 +358,15 @@ class OngekiRepositoryTest { var find = userRivalDataRepository.findByUser_Card_ExtId(u.getCard().getExtId()); assertThat(find).hasSize(2); + + var find2 = userRivalDataRepository.findByUser_Card_ExtId(r1.getCard().getExtId()); + assertThat(find2).hasSize(1); + + //remove r1's rival + userRivalDataRepository.removeByUser_Card_ExtIdAndRivalUserExtId(r1.getCard().getExtId(), r2.getCard().getExtId()); + + var find3 = userRivalDataRepository.findByUser_Card_ExtId(r1.getCard().getExtId()); + assertThat(find3).hasSize(0); } private UserData getUser(Card c) {