diff --git a/server/src/main/java/org/eclipse/openvsx/UserService.java b/server/src/main/java/org/eclipse/openvsx/UserService.java index 464ba3b8f..07e6b9873 100644 --- a/server/src/main/java/org/eclipse/openvsx/UserService.java +++ b/server/src/main/java/org/eclipse/openvsx/UserService.java @@ -32,6 +32,7 @@ import org.eclipse.openvsx.storage.StorageUtilService; import org.eclipse.openvsx.util.*; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.beans.factory.annotation.Value; import org.springframework.cache.annotation.CacheEvict; import org.springframework.security.core.context.SecurityContextHolder; @@ -55,13 +56,15 @@ public class UserService { private final RepositoryService repositories; private final StorageUtilService storageUtil; private final CacheService cache; + private final ApplicationEventPublisher eventPublisher; private final ExtensionValidator validator; private final ClientRegistrationRepository clientRegistrationRepository; private final OAuth2AttributesConfig attributesConfig; @Value("${ovsx.token-prefix:}") String tokenPrefix; - + + @Autowired public UserService( EntityManager entityManager, RepositoryService repositories, @@ -78,6 +81,7 @@ public UserService( this.validator = validator; this.clientRegistrationRepository = clientRegistrationRepository; this.attributesConfig = attributesConfig; + this.eventPublisher = eventPublisher; } public UserData findLoggedInUser() { @@ -144,6 +148,7 @@ public ResultJson removeNamespaceMember(Namespace namespace, UserData user) thro throw new ErrorResultException("User " + user.getLoginName() + " is not a member of " + namespace.getName() + "."); } entityManager.remove(membership); + eventPublisher.publishEvent(new org.eclipse.openvsx.events.NamespaceMembershipChangedEvent(this, namespace)); return ResultJson.success("Removed " + user.getLoginName() + " from namespace " + namespace.getName() + "."); } @@ -159,6 +164,7 @@ public ResultJson addNamespaceMember(Namespace namespace, UserData user, String throw new ErrorResultException("User " + user.getLoginName() + " already has the role " + role + "."); } membership.setRole(role); + eventPublisher.publishEvent(new org.eclipse.openvsx.events.NamespaceMembershipChangedEvent(this, namespace)); return ResultJson.success("Changed role of " + user.getLoginName() + " in " + namespace.getName() + " to " + role + "."); } membership = new NamespaceMembership(); @@ -166,6 +172,7 @@ public ResultJson addNamespaceMember(Namespace namespace, UserData user, String membership.setUser(user); membership.setRole(role); entityManager.persist(membership); + eventPublisher.publishEvent(new org.eclipse.openvsx.events.NamespaceMembershipChangedEvent(this, namespace)); return ResultJson.success("Added " + user.getLoginName() + " as " + role + " of " + namespace.getName() + "."); } diff --git a/server/src/main/java/org/eclipse/openvsx/events/NamespaceMebershipChangedListener.java b/server/src/main/java/org/eclipse/openvsx/events/NamespaceMebershipChangedListener.java new file mode 100644 index 000000000..01fc3c0df --- /dev/null +++ b/server/src/main/java/org/eclipse/openvsx/events/NamespaceMebershipChangedListener.java @@ -0,0 +1,25 @@ +package org.eclipse.openvsx.events; + +import org.eclipse.openvsx.cache.CacheService; +import org.eclipse.openvsx.entities.Namespace; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionalEventListener; +import org.springframework.transaction.event.TransactionPhase; + +@Component +public class NamespaceMembershipChangedListener { + private final CacheService cacheService; + + @Autowired + public NamespaceMembershipChangedListener(CacheService cacheService) { + this.cacheService = cacheService; + } + + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + public void onNamespaceMembershipChanged(NamespaceMembershipChangedEvent event) { + Namespace namespace = event.getNamespace(); + cacheService.evictNamespaceDetails(namespace); + } +} \ No newline at end of file diff --git a/server/src/main/java/org/eclipse/openvsx/events/NamespaceMembershipChangedEvent.java b/server/src/main/java/org/eclipse/openvsx/events/NamespaceMembershipChangedEvent.java new file mode 100644 index 000000000..a132cb7a9 --- /dev/null +++ b/server/src/main/java/org/eclipse/openvsx/events/NamespaceMembershipChangedEvent.java @@ -0,0 +1,17 @@ +package org.eclipse.openvsx.events; + +import org.eclipse.openvsx.entities.Namespace; +import org.springframework.context.ApplicationEvent; + +public class NamespaceMembershipChangedEvent extends ApplicationEvent { + private final Namespace namespace; + + public NamespaceMembershipChangedEvent(Object source, Namespace namespace) { + super(source); + this.namespace = namespace; + } + + public Namespace getNamespace() { + return namespace; + } +}