From c7436d0ea370ce3ef48a12c1792b15d59b5dc0de Mon Sep 17 00:00:00 2001 From: Dennis Aulenbacher Date: Wed, 16 Mar 2022 17:03:02 +0100 Subject: [PATCH 1/3] bug5510: Extended error handling in case of timeout --- .../chargebee/ChargebeeSubscriptionViewPresenter.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/subscription/chargebee/ChargebeeSubscriptionViewPresenter.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/subscription/chargebee/ChargebeeSubscriptionViewPresenter.java index 3192a0712b6..3aaecb50e4c 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/subscription/chargebee/ChargebeeSubscriptionViewPresenter.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/subscription/chargebee/ChargebeeSubscriptionViewPresenter.java @@ -84,7 +84,10 @@ public class ChargebeeSubscriptionViewPresenter implements SubscriptionViewPrese private int counter = 0; @Override public void run() { - if (counter == 10 || updateProcessed.get()) { + if (counter == 10) { + view.onUnfinishedPayment(StringMessages.INSTANCE.errorPollingCheckoutResults()); + this.cancel(); + }else if (updateProcessed.get()){ this.cancel(); } service.isUserInPossessionOfRoles(planId, new AsyncCallback() { From eb567743be89e14d9de77a728076ab024184ca3e Mon Sep 17 00:00:00 2001 From: Dennis Aulenbacher Date: Wed, 16 Mar 2022 21:58:16 +0100 Subject: [PATCH 2/3] bug5510: Implemented mutual exclusivity and one time trial status for plans --- .../subscription/SailingSubscriptionPlan.java | 12 ++++++---- .../UserSubscriptionsPresenter.java | 2 +- .../sap/sse/security/shared/impl/User.java | 4 +++- .../subscription/SSESubscriptionPlan.java | 6 +++-- .../shared/subscription/SubscriptionPlan.java | 23 +++++++++++++++++-- .../sap/sse/security/interfaces/UserImpl.java | 17 +++++++++++--- .../subscription/SubscriptionService.java | 4 ++-- .../SubscriptionServiceAsync.java | 4 ++-- .../subscription/SubscriptionServiceImpl.java | 16 ++++++++----- .../ChargebeeSubscriptionServiceImpl.java | 21 ++++++++--------- ...ChargebeeSubscriptionWriteServiceImpl.java | 2 +- .../userstore/mongodb/impl/UserProxy.java | 8 ++++++- .../security/impl/SecurityServiceImpl.java | 7 +++--- 13 files changed, 86 insertions(+), 40 deletions(-) diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/subscription/SailingSubscriptionPlan.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/subscription/SailingSubscriptionPlan.java index 5146272d0ed..805544c5665 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/subscription/SailingSubscriptionPlan.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/subscription/SailingSubscriptionPlan.java @@ -36,25 +36,27 @@ public class SailingSubscriptionPlan extends SubscriptionPlan { private static final String YEARLY_PLAN_ITEMPRICE_ID = "yearly_premium_usd_yearly"; private static final Map plansById = new HashMap<>(); - private SailingSubscriptionPlan(String id, Set prices, SubscriptionPlanRole... roles) { - super(id, prices, roles); + private SailingSubscriptionPlan(String id, Set prices, Set excludesPlanIds, + Boolean isOneTimePlan, SubscriptionPlanRole... roles) { + super(id, prices, excludesPlanIds, isOneTimePlan, roles); plansById.put(id, this); } public static final SubscriptionPlan YEARLY = new SailingSubscriptionPlan(YEARLY_PLAN_ID, Stream.of(new SubscriptionPrice(YEARLY_PLAN_ITEMPRICE_ID, YEARLY_PLAN_PRICE, USD_CURRENCY_CODE, - PaymentInterval.YEAR)).collect(Collectors.toSet()), + PaymentInterval.YEAR)).collect(Collectors.toSet()), Stream.of(PlanCategory.PREMIUM).collect(Collectors.toSet()), false, new SubscriptionPlanRole(PremiumRole.getRoleId())); public static final SubscriptionPlan WEEKLY = new SailingSubscriptionPlan(WEEKLY_PLAN_ID, Stream.of(new SubscriptionPrice(WEEKLY_PLAN_ITEMPRICE_ID, WEEKLY_PLAN_PRICE, USD_CURRENCY_CODE, - PaymentInterval.WEEK)).collect(Collectors.toSet()), + PaymentInterval.WEEK)).collect(Collectors.toSet()), Stream.of(PlanCategory.PREMIUM).collect(Collectors.toSet()), false, new SubscriptionPlanRole(PremiumRole.getRoleId())); public static final SubscriptionPlan TRIAL = new SailingSubscriptionPlan(TRIAL_PLAN_ID, Stream.of(new SubscriptionPrice(TRIAL_PLAN_ITEMPRICE_ID, TRIAL_PLAN_PRICE, USD_CURRENCY_CODE, - PaymentInterval.DAY)).collect(Collectors.toSet()), + PaymentInterval.DAY)).collect(Collectors.toSet()), Stream.of(PlanCategory.PREMIUM).collect(Collectors.toSet()), false, new SubscriptionPlanRole(PremiumRole.getRoleId())); public static Map getAllInstances() { return Collections.unmodifiableMap(plansById); } + } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/profile/subscriptions/UserSubscriptionsPresenter.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/profile/subscriptions/UserSubscriptionsPresenter.java index 4c829dc3c0f..ee73d509660 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/profile/subscriptions/UserSubscriptionsPresenter.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/home/shared/places/user/profile/subscriptions/UserSubscriptionsPresenter.java @@ -84,7 +84,7 @@ public class UserSubscriptionsPresenter() { + factory.getDefaultAsyncService().getSubscriptions(false, new AsyncCallback() { @Override public void onSuccess(final SubscriptionListDTO result) { if (result != null && result.getError() != null && !result.getError().isEmpty()) { diff --git a/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/impl/User.java b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/impl/User.java index f62551d8524..dd8afabca9c 100755 --- a/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/impl/User.java +++ b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/impl/User.java @@ -115,7 +115,9 @@ public interface User extends SecurityUser { Iterable getSubscriptions(); - boolean hasActiveSubscription(); + boolean hasActiveSubscription(String planId); + + boolean hasAnySubscription(String planId); void setSubscriptions(Subscription[] subscriptions); diff --git a/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/subscription/SSESubscriptionPlan.java b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/subscription/SSESubscriptionPlan.java index 43231d68163..ecc72284d52 100644 --- a/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/subscription/SSESubscriptionPlan.java +++ b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/subscription/SSESubscriptionPlan.java @@ -5,6 +5,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import java.util.Set; /** * Payment subscription plans. A subscription plan has a name, a {@link String}-based ID, and a set of @@ -19,8 +20,9 @@ public class SSESubscriptionPlan extends SubscriptionPlan { private static final long serialVersionUID = 9061666338780737555L; private static final Map plansById = new HashMap(); - private SSESubscriptionPlan(String id, HashSet prices, SubscriptionPlanRole... roles) { - super(id, prices, roles); + private SSESubscriptionPlan(String id, HashSet prices, Set planCategories, + Boolean isOneTimePlan, SubscriptionPlanRole... roles) { + super(id, prices, planCategories, isOneTimePlan, roles); plansById.put(id, this); } diff --git a/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/subscription/SubscriptionPlan.java b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/subscription/SubscriptionPlan.java index bba62171f27..5b0c1f1399d 100644 --- a/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/subscription/SubscriptionPlan.java +++ b/java/com.sap.sse.security.common/src/com/sap/sse/security/shared/subscription/SubscriptionPlan.java @@ -20,15 +20,27 @@ public abstract class SubscriptionPlan implements Serializable{ private static final long serialVersionUID = -555811806344107292L; private final String id; private final Set prices; + private final Set planCategory; + private final Boolean isOneTimePlan; /** * Roles assigned for this plan, if user subscribe to the plan then the user will be assigned these roles */ private final SubscriptionPlanRole[] roles; - protected SubscriptionPlan(String id, Set prices, SubscriptionPlanRole[] roles) { + /* + * Used to make Plans of the same category mutually exclusive. + */ + public enum PlanCategory { + PREMIUM; + } + + protected SubscriptionPlan(String id, Set prices, Set planCategory, + Boolean isOneTimePlan, SubscriptionPlanRole[] roles) { this.id = id; this.roles = roles; this.prices = prices; + this.planCategory = planCategory; + this.isOneTimePlan = isOneTimePlan; } public String getId() { @@ -43,6 +55,14 @@ public abstract class SubscriptionPlan implements Serializable{ return roles; } + public Set getPlanCategories() { + return planCategory; + } + + public Boolean getIsOneTimePlan() { + return isOneTimePlan; + } + public boolean isUserInPossessionOfRoles(User user) { boolean foundAll = true; for (SubscriptionPlanRole planRole : getRoles()) { @@ -88,5 +108,4 @@ public abstract class SubscriptionPlan implements Serializable{ return false; return true; } - } diff --git a/java/com.sap.sse.security.interface/src/com/sap/sse/security/interfaces/UserImpl.java b/java/com.sap.sse.security.interface/src/com/sap/sse/security/interfaces/UserImpl.java index 5a2a8912a83..e203e1ece39 100644 --- a/java/com.sap.sse.security.interface/src/com/sap/sse/security/interfaces/UserImpl.java +++ b/java/com.sap.sse.security.interface/src/com/sap/sse/security/interfaces/UserImpl.java @@ -421,13 +421,14 @@ public class UserImpl extends SecurityUserImpl 0) { for (Subscription subscription : subscriptions) { - if (subscription.isActiveSubscription()) { + if (subscription.isActiveSubscription() && subscription.getPlanId() != null + && subscription.getPlanId().equals(planId)) { result = true; break; } @@ -435,4 +436,14 @@ public class UserImpl extends SecurityUserImpl extends RemoteService { /** * Fetch user current subscription data from database */ - public SubscriptionListDTO getSubscriptions(); + public SubscriptionListDTO getSubscriptions(Boolean activeOnly); public ArrayList getAllSubscriptionPlans(); public ArrayList getUnlockingSubscriptionplans(WildcardPermission permission) throws UserManagementException; - SubscriptionPlanDTO getSubscriptionPlanById(String planId); + SubscriptionPlanDTO getSubscriptionPlanDTOById(String planId); boolean isUserInPossessionOfRoles(String planId) throws UserManagementException; diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/subscription/SubscriptionServiceAsync.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/subscription/SubscriptionServiceAsync.java index 7a0d58c753c..9c7b742f3c3 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/subscription/SubscriptionServiceAsync.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/subscription/SubscriptionServiceAsync.java @@ -10,7 +10,7 @@ import com.sap.sse.security.ui.shared.subscription.SubscriptionPlanDTO; public interface SubscriptionServiceAsync { public void prepareCheckout(String planId, AsyncCallback

data); - public void getSubscriptions(AsyncCallback subscription); + public void getSubscriptions(Boolean activeOnly, AsyncCallback subscription); public void getConfiguration(AsyncCallback callback); @@ -18,7 +18,7 @@ public interface SubscriptionServiceAsync { public void getUnlockingSubscriptionplans(WildcardPermission permission, AsyncCallback> callback); - public void getSubscriptionPlanById(String planId, AsyncCallback callback); + public void getSubscriptionPlanDTOById(String planId, AsyncCallback callback); void isUserInPossessionOfRoles(String planId, AsyncCallback callback); } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/subscription/SubscriptionServiceImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/subscription/SubscriptionServiceImpl.java index 4db2d336ce1..1d9f948d36e 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/subscription/SubscriptionServiceImpl.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/subscription/SubscriptionServiceImpl.java @@ -131,11 +131,15 @@ public abstract class SubscriptionServiceImpl extends RemoteServiceServlet getSecurityService().updateUserSubscription(user.getName(), subscription); } - /** - * Return true if user already subscribed to plan - */ - protected boolean isUserSubscribedToPlan(User user, String planId) { - return isValidSubscription(user.getSubscriptionByPlan(planId)); + protected boolean isSubscribedToMutuallyExclusivePlan(User user, SubscriptionPlan newPlan) { + for (Subscription sub : user.getSubscriptions()) { + SubscriptionPlan subscribedPlan = getSecurityService().getSubscriptionPlanById(sub.getPlanId()); + if (isValidSubscription(sub) && !isSubscriptionCancelled(sub) + && Util.containsAny(subscribedPlan.getPlanCategories(), newPlan.getPlanCategories())) { + return true; + } + } + return false; } /** @@ -222,5 +226,5 @@ public abstract class SubscriptionServiceImpl extends RemoteServiceServlet protected abstract String getProviderName(); - + protected abstract boolean isSubscriptionCancelled(Subscription subscription); } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/subscription/chargebee/ChargebeeSubscriptionServiceImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/subscription/chargebee/ChargebeeSubscriptionServiceImpl.java index 9993abf624d..37eb9292696 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/subscription/chargebee/ChargebeeSubscriptionServiceImpl.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/subscription/chargebee/ChargebeeSubscriptionServiceImpl.java @@ -66,9 +66,11 @@ public class ChargebeeSubscriptionServiceImpl extends final SubscriptionPlan planForPrice = getSecurityService().getSubscriptionPlanByItemPriceId(priceId); if(planForPrice == null) { throw new IllegalArgumentException("No matching subscription plan found for given price id"); - } - if (!isUserSubscribedToPlan(user, planForPrice.getId()) - || isSubscriptionCancelled(user.getSubscriptionByPlan(planForPrice.getId()))) { + }else if(planForPrice.getIsOneTimePlan() && user.hasAnySubscription(planForPrice.getId())) { + throw new IllegalArgumentException("Plan can only be subscribed for once"); + }else if(isSubscribedToMutuallyExclusivePlan(user, planForPrice)) { + throw new IllegalArgumentException("User has already subscribed to mutually exclusive plan"); + }else { final Pair usernames = getUserFirstAndLastName(user); final String locale = user.getLocaleOrDefault().getLanguage(); final Result result = HostedPage.checkoutNewForItems() @@ -79,9 +81,6 @@ public class ChargebeeSubscriptionServiceImpl extends .customerLocale(locale).billingAddressFirstName(usernames.getA()) .billingAddressLastName(usernames.getB()).billingAddressCountry("US").request(); response.setHostedPageJSONString(result.hostedPage().toJson()); - } else { - response.setError( - "User has already subscribed to " + planForPrice.getId() + " plan"); } } catch (final Exception e) { logger.log(Level.SEVERE, "Error in generating Chargebee hosted page data ", e); @@ -91,7 +90,7 @@ public class ChargebeeSubscriptionServiceImpl extends } @Override - public SubscriptionListDTO getSubscriptions() { + public SubscriptionListDTO getSubscriptions(Boolean activeOnly) { SubscriptionListDTO subscriptionDto = null; try { final User user = getCurrentUser(); @@ -99,7 +98,7 @@ public class ChargebeeSubscriptionServiceImpl extends if (subscriptions != null) { final List itemList = new ArrayList<>(); for (final Subscription subscription : subscriptions) { - if (subscription.hasSubscriptionId() && !isSubscriptionCancelled(subscription)) { + if (subscription.hasSubscriptionId() && (!activeOnly || !isSubscriptionCancelled(subscription))) { itemList.add( new ChargebeeSubscriptionDTO(subscription.getPlanId(), subscription.getSubscriptionId(), subscription.getSubscriptionStatus(), subscription.getPaymentStatus(), @@ -117,7 +116,6 @@ public class ChargebeeSubscriptionServiceImpl extends logger.log(Level.SEVERE, "Error in getting subscription ", e); subscriptionDto = new SubscriptionListDTO(null, e.getMessage()); } - return subscriptionDto; } @@ -125,14 +123,15 @@ public class ChargebeeSubscriptionServiceImpl extends protected String getProviderName() { return ChargebeeSubscriptionProvider.PROVIDER_NAME; } - + + @Override protected boolean isSubscriptionCancelled(final Subscription subscription) { return subscription != null && subscription.getSubscriptionStatus().equalsIgnoreCase(ChargebeeSubscription.SUBSCRIPTION_STATUS_CANCELLED); } @Override - public SubscriptionPlanDTO getSubscriptionPlanById(final String planId) { + public SubscriptionPlanDTO getSubscriptionPlanDTOById(final String planId) { final SubscriptionPlan subscriptionPlanById = getSecurityService().getSubscriptionPlanById(planId); return subscriptionPlanById == null ? null : convertToDto(subscriptionPlanById); } diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/subscription/chargebee/ChargebeeSubscriptionWriteServiceImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/subscription/chargebee/ChargebeeSubscriptionWriteServiceImpl.java index 20639d0e866..5cb0fec0906 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/subscription/chargebee/ChargebeeSubscriptionWriteServiceImpl.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/subscription/chargebee/ChargebeeSubscriptionWriteServiceImpl.java @@ -89,7 +89,7 @@ public class ChargebeeSubscriptionWriteServiceImpl extends ChargebeeSubscription getTime(contentSubscription.nextBillingAt()), getTime(contentSubscription.currentTermEnd()), getTime(contentSubscription.cancelledAt()), Subscription.emptyTime(), Subscription.emptyTime()); updateUserSubscription(user, subscription); - subscriptionDto = getSubscriptions(); + subscriptionDto = getSubscriptions(true); } catch (Exception e) { logger.log(Level.SEVERE, "Error in saving subscription", e); subscriptionDto = new SubscriptionListDTO(null, e.getMessage()); diff --git a/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/impl/UserProxy.java b/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/impl/UserProxy.java index 269a5a1a61a..ce30f7cee4c 100644 --- a/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/impl/UserProxy.java +++ b/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/impl/UserProxy.java @@ -230,7 +230,13 @@ public class UserProxy implements User { } @Override - public boolean hasActiveSubscription() { + public boolean hasAnySubscription(String planId) { + throw new UnsupportedOperationException(); + } + + + @Override + public boolean hasActiveSubscription(String planId) { throw new UnsupportedOperationException(); } } diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java b/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java index acc379ce055..7fc5be3a9cc 100755 --- a/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java @@ -2881,9 +2881,10 @@ implements ReplicableSecurityService, ClearStateTestSupport { result = false; } else if (currentSubscription == null) { // A case when there's no current subscription for a plan, if the plan's new subscription is active then - // user roles need to be updated with granted new roles, otherwise if currently user has active subscription - // then premium roles need to be removed - result = newSubscription.isActiveSubscription() || user.hasActiveSubscription(); + // user roles need to be updated with granted new roles. Further, if the user is + // somehow in possession of roles he should not posess, the roles must be removed + final SubscriptionPlan subscriptionPlanById = getSubscriptionPlanById(newSubscription.getPlanId()); + result = newSubscription.isActiveSubscription() || subscriptionPlanById.isUserInPossessionOfRoles(user); } else if (newSubscription == null) { // In case new subscription is null, user's subscriptions won't be changed result = false; From 6abe7332c273754b02b1d6ebd367d9f7b890e3d3 Mon Sep 17 00:00:00 2001 From: Dennis Aulenbacher Date: Wed, 16 Mar 2022 22:16:51 +0100 Subject: [PATCH 3/3] bug5510: Changed SubscriptionPlan "Trial" to be a one time plan. --- .../domain/common/subscription/SailingSubscriptionPlan.java | 2 +- .../chargebee/ChargebeeSubscriptionServiceImpl.java | 2 +- .../src/com/sap/sse/security/impl/SecurityServiceImpl.java | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/subscription/SailingSubscriptionPlan.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/subscription/SailingSubscriptionPlan.java index 805544c5665..a43e44df848 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/subscription/SailingSubscriptionPlan.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/subscription/SailingSubscriptionPlan.java @@ -52,7 +52,7 @@ public class SailingSubscriptionPlan extends SubscriptionPlan { new SubscriptionPlanRole(PremiumRole.getRoleId())); public static final SubscriptionPlan TRIAL = new SailingSubscriptionPlan(TRIAL_PLAN_ID, Stream.of(new SubscriptionPrice(TRIAL_PLAN_ITEMPRICE_ID, TRIAL_PLAN_PRICE, USD_CURRENCY_CODE, - PaymentInterval.DAY)).collect(Collectors.toSet()), Stream.of(PlanCategory.PREMIUM).collect(Collectors.toSet()), false, + PaymentInterval.DAY)).collect(Collectors.toSet()), Stream.of(PlanCategory.PREMIUM).collect(Collectors.toSet()), true, new SubscriptionPlanRole(PremiumRole.getRoleId())); public static Map getAllInstances() { diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/subscription/chargebee/ChargebeeSubscriptionServiceImpl.java b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/subscription/chargebee/ChargebeeSubscriptionServiceImpl.java index 37eb9292696..d816fa99bfd 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/subscription/chargebee/ChargebeeSubscriptionServiceImpl.java +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/server/subscription/chargebee/ChargebeeSubscriptionServiceImpl.java @@ -67,7 +67,7 @@ public class ChargebeeSubscriptionServiceImpl extends if(planForPrice == null) { throw new IllegalArgumentException("No matching subscription plan found for given price id"); }else if(planForPrice.getIsOneTimePlan() && user.hasAnySubscription(planForPrice.getId())) { - throw new IllegalArgumentException("Plan can only be subscribed for once"); + throw new IllegalArgumentException("Plan can only be subscribed once"); }else if(isSubscribedToMutuallyExclusivePlan(user, planForPrice)) { throw new IllegalArgumentException("User has already subscribed to mutually exclusive plan"); }else { diff --git a/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java b/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java index 7fc5be3a9cc..515972d1730 100755 --- a/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java +++ b/java/com.sap.sse.security/src/com/sap/sse/security/impl/SecurityServiceImpl.java @@ -2879,15 +2879,15 @@ implements ReplicableSecurityService, ClearStateTestSupport { final boolean result; if (currentSubscription == null && newSubscription == null) { result = false; + } else if (newSubscription == null) { + // In case new subscription is null, user's subscriptions won't be changed + result = false; } else if (currentSubscription == null) { // A case when there's no current subscription for a plan, if the plan's new subscription is active then // user roles need to be updated with granted new roles. Further, if the user is // somehow in possession of roles he should not posess, the roles must be removed final SubscriptionPlan subscriptionPlanById = getSubscriptionPlanById(newSubscription.getPlanId()); result = newSubscription.isActiveSubscription() || subscriptionPlanById.isUserInPossessionOfRoles(user); - } else if (newSubscription == null) { - // In case new subscription is null, user's subscriptions won't be changed - result = false; } else { assert currentSubscription.getPlanId().equals(newSubscription.getPlanId()); // in this case user roles will be needed to update only when subscription active status is changed