Преглед на файлове

claim invite codes by account+plan. updates to support UI payments

tags/v0.1.6
Jonathan Cobb преди 5 години
родител
ревизия
992e29713c
променени са 10 файла, в които са добавени 38 реда и са изтрити 20 реда
  1. +6
    -6
      bubble-server/src/main/java/bubble/cloud/payment/code/CodePaymentDriver.java
  2. +2
    -2
      bubble-server/src/main/java/bubble/cloud/payment/code/CodePaymentToken.java
  3. +7
    -0
      bubble-server/src/main/java/bubble/dao/bill/AccountPaymentMethodDAO.java
  4. +1
    -0
      bubble-server/src/main/java/bubble/model/bill/AccountPaymentMethod.java
  5. +7
    -2
      bubble-server/src/main/java/bubble/resources/account/AccountOwnedResource.java
  6. +7
    -7
      bubble-server/src/main/java/bubble/resources/account/AuthResource.java
  7. +4
    -0
      bubble-server/src/main/java/bubble/resources/bill/AccountPaymentMethodsResource.java
  8. +2
    -1
      bubble-server/src/main/resources/message_templates/server/en_US/post_auth/ResourceMessages.properties
  9. +1
    -1
      bubble-web
  10. +1
    -1
      utils/cobbzilla-utils

+ 6
- 6
bubble-server/src/main/java/bubble/cloud/payment/code/CodePaymentDriver.java Целия файл

@@ -42,14 +42,14 @@ public class CodePaymentDriver extends PaymentDriverBase<DefaultPaymentDriverCon
final CodePaymentToken cpToken = readToken(configuration, accountPaymentMethod, new ValidationResult(), paymentCloud);
if (cpToken == null) return new PaymentValidationResult("err.purchase.tokenNotFound");

if (cpToken.hasAccountPaymentMethod()) {
if (!cpToken.getAccountPaymentMethod().equals(accountPaymentMethod.getUuid())) {
if (cpToken.hasAccount()) {
if (!cpToken.getAccount().equals(accountPaymentMethod.getAccount())) {
// already claimed
return new PaymentValidationResult("err.purchase.tokenUsed");
}
} else {
final CloudServiceDataDAO dataDAO = configuration.getBean(CloudServiceDataDAO.class);
cpToken.setAccountPaymentMethod(accountPaymentMethod.getUuid());
cpToken.setAccount(accountPaymentMethod.getAccount());
dataDAO.update(cpToken.getCloudServiceData().setData(json(cpToken)));
}
return new PaymentValidationResult(accountPaymentMethod);
@@ -63,8 +63,8 @@ public class CodePaymentDriver extends PaymentDriverBase<DefaultPaymentDriverCon
final CodePaymentToken cpToken = readToken(configuration, paymentMethod, new ValidationResult(), paymentCloud);
if (cpToken == null) return new PaymentValidationResult("err.purchase.tokenNotFound");

if (cpToken.hasAccountPaymentMethod()) {
if (!cpToken.getAccountPaymentMethod().equals(paymentMethod.getUuid())) {
if (cpToken.hasAccount()) {
if (!cpToken.getAccount().equals(accountPlan.getAccount())) {
// already claimed
return new PaymentValidationResult("err.purchase.tokenUsed");
}
@@ -75,7 +75,7 @@ public class CodePaymentDriver extends PaymentDriverBase<DefaultPaymentDriverCon
}
} else {
final CloudServiceDataDAO dataDAO = configuration.getBean(CloudServiceDataDAO.class);
cpToken.setAccountPaymentMethod(paymentMethod.getUuid());
cpToken.setAccount(accountPlan.getAccount());
cpToken.setAccountPlan(accountPlan.getUuid());
dataDAO.update(cpToken.getCloudServiceData().setData(json(cpToken)));
}


+ 2
- 2
bubble-server/src/main/java/bubble/cloud/payment/code/CodePaymentToken.java Целия файл

@@ -14,8 +14,8 @@ public class CodePaymentToken {

@Getter @Setter private String token;

@Getter @Setter private String accountPaymentMethod;
public boolean hasAccountPaymentMethod() { return accountPaymentMethod != null; }
@Getter @Setter private String account;
public boolean hasAccount() { return account != null; }

@Getter @Setter private String accountPlan;
public boolean hasAccountPlan() { return accountPlan != null; }


+ 7
- 0
bubble-server/src/main/java/bubble/dao/bill/AccountPaymentMethodDAO.java Целия файл

@@ -23,6 +23,13 @@ public class AccountPaymentMethodDAO extends AccountOwnedEntityDAO<AccountPaymen
@Autowired private CloudServiceDAO cloudDAO;
@Autowired private BubbleConfiguration configuration;

public AccountPaymentMethod findByAccountAndPaymentInfo(String account, String paymentInfo) {
return findByAccount(account).stream()
.filter(apm -> apm.getPaymentInfo().equals(paymentInfo))
.findFirst()
.orElse(null);
}

@Override public Object preCreate(AccountPaymentMethod paymentMethod) {
if (paymentMethod.getPaymentMethodType().requiresClaim()) {
final CloudService paymentService = cloudDAO.findByUuid(paymentMethod.getCloud());


+ 1
- 0
bubble-server/src/main/java/bubble/model/bill/AccountPaymentMethod.java Целия файл

@@ -65,6 +65,7 @@ public class AccountPaymentMethod extends IdentifiableBase implements HasAccount

@Type(type=ENCRYPTED_STRING) @Column(updatable=false, columnDefinition="varchar("+(100000+ENC_PAD)+") NOT NULL")
@Getter @Setter private String paymentInfo;
public boolean hasPaymentInfo () { return paymentInfo != null; }

public static final String DEFAULT_MASKED_PAYMENT_INFO = "XXXX-".repeat(3)+"XXXX";
@Type(type=ENCRYPTED_STRING) @Column(updatable=false, columnDefinition="varchar("+(100+ENC_PAD)+") NOT NULL")


+ 7
- 2
bubble-server/src/main/java/bubble/resources/account/AccountOwnedResource.java Целия файл

@@ -111,9 +111,12 @@ public class AccountOwnedResource<E extends HasAccount, DAO extends AccountOwned
@Context ContainerRequest ctx,
E request) {
final Account caller = checkEditable(ctx);
final E found = find(ctx, request.getName());
E found = find(ctx, request.getName());
if (found == null) {
found = findAlternate(ctx, request);
}
if (found != null) {
if (!canUpdate(ctx, caller, found, request)) return invalid("err.cannotUpdate", "Update entity not allowed", request.getName());
if (!canUpdate(ctx, caller, found, request)) return ok(found);
found.update(request);
return ok(getDao().update(found));
}
@@ -124,6 +127,8 @@ public class AccountOwnedResource<E extends HasAccount, DAO extends AccountOwned
return ok(daoCreate(toCreate));
}

protected E findAlternate(ContainerRequest ctx, E request) { return null; }

protected Object daoCreate(E toCreate) { return getDao().create(toCreate); }

protected E setReferences(ContainerRequest ctx, Account caller, E e) { return e; }


+ 7
- 7
bubble-server/src/main/java/bubble/resources/account/AuthResource.java Целия файл

@@ -38,9 +38,8 @@ import javax.ws.rs.*;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Response;
import java.io.File;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import static bubble.ApiConstants.*;
@@ -50,7 +49,6 @@ import static bubble.model.cloud.BubbleNetwork.TAG_PARENT_ACCOUNT;
import static bubble.model.cloud.notify.NotificationType.retrieve_backup;
import static bubble.server.BubbleServer.getRestoreKey;
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.apache.http.HttpHeaders.ACCEPT_LANGUAGE;
import static org.cobbzilla.util.daemon.ZillaRuntime.empty;
import static org.cobbzilla.util.daemon.ZillaRuntime.now;
import static org.cobbzilla.util.http.HttpContentTypes.APPLICATION_JSON;
@@ -353,10 +351,10 @@ public class AuthResource {
@GET @Path("/detect/locale")
public Response detectLocale(@Context Request req,
@Context ContainerRequest ctx) {
final Map<String, String> locales = new HashMap<>();
final List<String> locales = new ArrayList<>();

final String langHeader = normalizeLangHeader(req);
if (langHeader != null) locales.put(ACCEPT_LANGUAGE, langHeader);
if (langHeader != null) locales.add(langHeader);

final String remoteHost = getRemoteHost(req);
try {
@@ -365,7 +363,9 @@ public class AuthResource {
if (loc != null) {
final List<String> found = LocaleUtil.getDefaultLocales(loc.getCountry());
for (int i=0; i<found.size(); i++) {
locales.put("geolocation_"+i, found.get(i));
if (!locales.contains(found.get(i))) {
locales.add(found.get(i));
}
}
}
} catch (SimpleViolationException e) {
@@ -374,7 +374,7 @@ public class AuthResource {
} catch (Exception e) {
log.warn("detectLocale: "+e);
}
return ok(locales.values());
return ok(locales);
}

@GET @Path("/detect/timezone")


+ 4
- 0
bubble-server/src/main/java/bubble/resources/bill/AccountPaymentMethodsResource.java Целия файл

@@ -32,6 +32,10 @@ public class AccountPaymentMethodsResource extends AccountOwnedResource<AccountP
return found == null || found.deleted() ? null : found;
}

@Override protected AccountPaymentMethod findAlternate(ContainerRequest ctx, AccountPaymentMethod request) {
return !request.hasPaymentInfo() ? null : getDao().findByAccountAndPaymentInfo(getAccountUuid(ctx), request.getPaymentInfo());
}

@Override protected List<AccountPaymentMethod> list(ContainerRequest ctx) {
return super.list(ctx).stream().filter(AccountPaymentMethod::notDeleted).collect(Collectors.toList());
}


+ 2
- 1
bubble-server/src/main/resources/message_templates/server/en_US/post_auth/ResourceMessages.properties Целия файл

@@ -30,8 +30,8 @@ table_row_networks_action_view=View
table_row_networks_action_start=Start
table_row_networks_action_stop=Stop
table_row_networks_action_delete=Delete
empty_networks=Create your first Bubble!
button_label_new_network=Create Bubble
message_empty_networks=Create your first Bubble!

# New Network page
form_label_title_new_network=New Bubble
@@ -71,6 +71,7 @@ payment_description_free=Enjoy Bubble for FREE!
# Payment fields
field_payment_invite_code=Invitation Code
button_label_submit_invite_code=Use Invite Code
message_verified_invite_code=Invite Code Successfully Verified

# Error messages from API server
err.accountContactsJson.length=Account contacts length violation


+ 1
- 1
bubble-web

@@ -1 +1 @@
Subproject commit a7a0fbb20bc83b243bb5f99ee219a1be2c0fbeed
Subproject commit f1432a512d90c5e3986393da247916f034a8513a

+ 1
- 1
utils/cobbzilla-utils

@@ -1 +1 @@
Subproject commit 51b557f242ea52ed339ac6469adbc42b8873a3e9
Subproject commit dd0fcf4cd9a5b1f1ccaff29697494e9c5930bd06

Зареждане…
Отказ
Запис