diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/accountlink/AccountLinkController.java b/app/proprietary/src/main/java/stirling/software/proprietary/accountlink/AccountLinkController.java index 7a4c7cd3ed..09bc9dd8db 100644 --- a/app/proprietary/src/main/java/stirling/software/proprietary/accountlink/AccountLinkController.java +++ b/app/proprietary/src/main/java/stirling/software/proprietary/accountlink/AccountLinkController.java @@ -63,6 +63,8 @@ public class AccountLinkController { this.properties = properties; } + public record LinkRequest(String supabaseJwt, String name) {} + /** {@code callbackUrl} is the portal telling us where its own callback route lives. */ public record ConnectStartRequest(String name, String callbackUrl) {} diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/accountlink/ConnectService.java b/app/proprietary/src/main/java/stirling/software/proprietary/accountlink/ConnectService.java index 978d6d494e..0ad9a20a61 100644 --- a/app/proprietary/src/main/java/stirling/software/proprietary/accountlink/ConnectService.java +++ b/app/proprietary/src/main/java/stirling/software/proprietary/accountlink/ConnectService.java @@ -12,20 +12,21 @@ import java.util.Base64; import java.util.Locale; import java.util.Optional; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; +import io.quarkus.arc.profile.IfBuildProfile; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.transaction.Transactional; import lombok.extern.slf4j.Slf4j; import stirling.software.common.model.ApplicationProperties; /** Browser-mediated account linking, instance side. */ +// Arc cannot gate a bean on a runtime property, so the account-link flag no longer removes this +// bean; only the flag-gated endpoints reach it, so nothing links while the flag is off. @Slf4j -@Service -@Profile("!saas") -@ConditionalOnProperty(name = "stirling.billing.account-link.enabled", havingValue = "true") +@ApplicationScoped +@IfBuildProfile("!saas") public class ConnectService { /** Frontend route that consumes the callback fragment. */ @@ -184,7 +185,7 @@ public class ConnectService { }; } - @Transactional(readOnly = true) + @Transactional public ConnectStatus status() { Optional credential = credentialStore.get(); if (credential.isPresent()) { diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/accountlink/ConnectStateRepository.java b/app/proprietary/src/main/java/stirling/software/proprietary/accountlink/ConnectStateRepository.java index 995dfccde1..10668dda66 100644 --- a/app/proprietary/src/main/java/stirling/software/proprietary/accountlink/ConnectStateRepository.java +++ b/app/proprietary/src/main/java/stirling/software/proprietary/accountlink/ConnectStateRepository.java @@ -1,6 +1,21 @@ package stirling.software.proprietary.accountlink; -import org.springframework.data.jpa.repository.JpaRepository; +import io.quarkus.hibernate.orm.panache.PanacheRepositoryBase; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.transaction.Transactional; /** Data access for the singleton {@link ConnectState} row. */ -public interface ConnectStateRepository extends JpaRepository {} +@ApplicationScoped +public class ConnectStateRepository implements PanacheRepositoryBase { + + /** Spring Data's {@code save}: the id is assigned, so a detached row has to merge. */ + @Transactional + public ConnectState save(ConnectState state) { + if (state.getId() == null || getEntityManager().contains(state)) { + persist(state); + return state; + } + return getEntityManager().merge(state); + } +} diff --git a/app/proprietary/src/main/java/stirling/software/proprietary/cluster/valkey/ValkeyJobStore.java b/app/proprietary/src/main/java/stirling/software/proprietary/cluster/valkey/ValkeyJobStore.java index 4b01714049..e4a9ebdd0c 100644 --- a/app/proprietary/src/main/java/stirling/software/proprietary/cluster/valkey/ValkeyJobStore.java +++ b/app/proprietary/src/main/java/stirling/software/proprietary/cluster/valkey/ValkeyJobStore.java @@ -11,10 +11,6 @@ import java.util.List; import java.util.Map; import java.util.Optional; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; - import io.quarkus.redis.datasource.RedisDataSource; import io.quarkus.redis.datasource.hash.HashCommands; import io.quarkus.redis.datasource.keys.KeyCommands;