From 93ef3f8666a31ee4e412023c4306110b3fee7ead Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 06:40:57 +0000 Subject: [PATCH 1/3] Bump org.springframework.boot from 3.3.8 to 3.4.4 Bumps [org.springframework.boot](https://github.com/spring-projects/spring-boot) from 3.3.8 to 3.4.4. - [Release notes](https://github.com/spring-projects/spring-boot/releases) - [Commits](https://github.com/spring-projects/spring-boot/compare/v3.3.8...v3.4.4) --- updated-dependencies: - dependency-name: org.springframework.boot dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 6705228f2..1d548db36 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ buildscript { plugins { id "java" - id "org.springframework.boot" version "3.3.8" + id "org.springframework.boot" version "3.4.4" id "idea" id "com.adarshr.test-logger" version "4.0.0" } From 9ea746fcda5285e04b2d3e276ccdd05fb1c1a03d Mon Sep 17 00:00:00 2001 From: Sheikah45 Date: Sun, 15 Jun 2025 10:19:41 -0400 Subject: [PATCH 2/3] Add lifecycle hook to remove memberships from players --- .../com/faforever/api/data/ClanElideTest.java | 7 +----- .../com/faforever/api/data/domain/Clan.java | 9 +++++--- .../com/faforever/api/data/hook/ClanHook.java | 23 +++++++++++++++++++ 3 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/faforever/api/data/hook/ClanHook.java diff --git a/src/inttest/java/com/faforever/api/data/ClanElideTest.java b/src/inttest/java/com/faforever/api/data/ClanElideTest.java index 3fb4f86e6..fe10d42ad 100644 --- a/src/inttest/java/com/faforever/api/data/ClanElideTest.java +++ b/src/inttest/java/com/faforever/api/data/ClanElideTest.java @@ -167,14 +167,9 @@ private String generateTransferLeadershipContent(int clanId, int newLeaderId) { @Test public void canDeleteClanAsLeader() throws Exception { - Clan clan = clanRepository.findOneByName("Alpha Clan") + clanRepository.findOneByName("Alpha Clan") .orElseThrow(() -> new IllegalStateException("Alpha Clan could not be found")); - List clanMember = new ArrayList<>(); - clan.getMemberships().stream() - .map(ClanMembership::getPlayer) - .forEach(clanMember::add); - mockMvc.perform( delete("/data/clan/1") .with(getOAuthTokenForUserId(USERID_CLAN_LEADER))) diff --git a/src/main/java/com/faforever/api/data/domain/Clan.java b/src/main/java/com/faforever/api/data/domain/Clan.java index 0c2ab2664..081aa8665 100644 --- a/src/main/java/com/faforever/api/data/domain/Clan.java +++ b/src/main/java/com/faforever/api/data/domain/Clan.java @@ -2,6 +2,7 @@ import com.faforever.api.data.checks.IsEntityOwner; import com.faforever.api.data.checks.Prefab; +import com.faforever.api.data.hook.ClanHook; import com.faforever.api.data.listeners.ClanChangeListener; import com.faforever.api.data.listeners.ClanEnricherListener; import com.faforever.api.data.validation.IsLeaderInClan; @@ -9,10 +10,8 @@ import com.yahoo.elide.annotation.CreatePermission; import com.yahoo.elide.annotation.DeletePermission; import com.yahoo.elide.annotation.Include; +import com.yahoo.elide.annotation.LifeCycleHookBinding; import com.yahoo.elide.annotation.UpdatePermission; -import lombok.Setter; -import org.hibernate.annotations.BatchSize; - import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -26,6 +25,9 @@ import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; +import lombok.Setter; +import org.hibernate.annotations.BatchSize; + import java.util.Set; @Entity @@ -36,6 +38,7 @@ @Setter @IsLeaderInClan @EntityListeners({ClanEnricherListener.class, ClanChangeListener.class}) +@LifeCycleHookBinding(operation = LifeCycleHookBinding.Operation.DELETE, phase = LifeCycleHookBinding.TransactionPhase.PREFLUSH, hook = ClanHook.class) public class Clan extends AbstractEntity implements OwnableEntity { public static final String TYPE_NAME = "clan"; diff --git a/src/main/java/com/faforever/api/data/hook/ClanHook.java b/src/main/java/com/faforever/api/data/hook/ClanHook.java new file mode 100644 index 000000000..9e45941f7 --- /dev/null +++ b/src/main/java/com/faforever/api/data/hook/ClanHook.java @@ -0,0 +1,23 @@ +package com.faforever.api.data.hook; + +import com.faforever.api.data.domain.Clan; +import com.faforever.api.data.domain.ClanMembership; +import com.yahoo.elide.annotation.LifeCycleHookBinding.Operation; +import com.yahoo.elide.annotation.LifeCycleHookBinding.TransactionPhase; +import com.yahoo.elide.core.lifecycle.LifeCycleHook; +import com.yahoo.elide.core.security.ChangeSpec; +import com.yahoo.elide.core.security.RequestScope; +import org.springframework.stereotype.Component; + +import java.util.Optional; + +@Component +public class ClanHook implements LifeCycleHook { + + @Override + public void execute(Operation operation, TransactionPhase phase, Clan clan, RequestScope requestScope, Optional changes) { + if (operation == Operation.DELETE) { + clan.getMemberships().stream().map(ClanMembership::getPlayer).forEach(player -> player.setClanMembership(null)); + } + } +} From 90daa32a6dbd19272653eaca266e756afc9ec5ad Mon Sep 17 00:00:00 2001 From: Sheikah45 Date: Sun, 15 Jun 2025 10:24:50 -0400 Subject: [PATCH 3/3] Update to spring boot 3.5.0 --- build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1d548db36..fd21a5a3a 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ buildscript { plugins { id "java" - id "org.springframework.boot" version "3.4.4" + id "org.springframework.boot" version "3.5.0" id "idea" id "com.adarshr.test-logger" version "4.0.0" } @@ -140,6 +140,7 @@ dependencies { testAnnotationProcessor("org.projectlombok:lombok") testAnnotationProcessor("org.springframework.boot:spring-boot-configuration-processor") + implementation("org.checkerframework:checker-qual:3.49.4") implementation("org.springframework.boot:spring-boot-starter-oauth2-resource-server") implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("org.springframework.boot:spring-boot-starter-web")