浏览代码

remove Bill.payment fk. fix indexes, add DbInit to core suite

tags/v0.1.6
Jonathan Cobb 4 年前
父节点
当前提交
a1e5fdcadb
共有 7 个文件被更改,包括 25 次插入22 次删除
  1. +11
    -12
      bubble-server/src/main/java/bubble/cloud/payment/PaymentDriverBase.java
  2. +5
    -0
      bubble-server/src/main/java/bubble/dao/bill/AccountPaymentDAO.java
  3. +3
    -0
      bubble-server/src/main/java/bubble/model/bill/AccountPayment.java
  4. +3
    -8
      bubble-server/src/main/java/bubble/model/bill/Bill.java
  5. +1
    -1
      bubble-server/src/main/java/bubble/model/cloud/CloudServiceData.java
  6. +1
    -0
      bubble-server/src/test/java/bubble/test/BubbleCoreSuite.java
  7. +1
    -1
      utils/cobbzilla-wizard

+ 11
- 12
bubble-server/src/main/java/bubble/cloud/payment/PaymentDriverBase.java 查看文件

@@ -83,12 +83,11 @@ public abstract class PaymentDriverBase<T> extends CloudServiceDriverBase<T> imp
return true;
}

if (bill.hasPayment()) {
final AccountPayment existing = accountPaymentDAO.findByUuid(bill.getPayment());
if (existing != null) {
log.warn("purchase: existing AccountPayment found (returning true): " + existing.getUuid());
return true;
}
final AccountPayment successfulPayment = accountPaymentDAO.findByAccountAndAccountPlanAndBillAndSuccess(accountPlan.getAccount(), accountPlanUuid, bill.getUuid());
if (successfulPayment != null) {
log.warn("purchase: successful AccountPayment found (marking Bill "+bill.getUuid()+" as paid and returning true): " + successfulPayment.getUuid());
billDAO.update(bill.setStatus(BillStatus.paid));
return true;
}

final String chargeInfo;
@@ -132,7 +131,7 @@ public abstract class PaymentDriverBase<T> extends CloudServiceDriverBase<T> imp
.setInfo(chargeInfo));

// mark the bill as paid, enable the plan
billDAO.update(bill.setPayment(accountPayment.getUuid()).setStatus(BillStatus.paid));
billDAO.update(bill.setStatus(BillStatus.paid));

// if there are no unpaid bills, we can (re-)enable the plan
final List<Bill> unpaidBills = billDAO.findUnpaidByAccountPlan(accountPlan.getUuid());
@@ -159,8 +158,9 @@ public abstract class PaymentDriverBase<T> extends CloudServiceDriverBase<T> imp
}

// Was the recent bill paid?
final AccountPayment successfulPayment = accountPaymentDAO.findByAccountAndAccountPlanAndBillAndSuccess(accountPlan.getAccount(), accountPlanUuid, bill.getUuid());
if (bill.unpaid()) {
if (bill.hasPayment()) {
if (successfulPayment != null) {
// should never happen
throw invalidEx("err.refund.unpaidBillHasPayment");
}
@@ -169,14 +169,13 @@ public abstract class PaymentDriverBase<T> extends CloudServiceDriverBase<T> imp
}

// What payment was used to pay the bill?
final AccountPayment payment = accountPaymentDAO.findByUuid(bill.getPayment());
if (payment == null) {
if (successfulPayment == null) {
log.warn("refund: AccountPlanPayment not found for paid bill ("+bill.getUuid()+") accountPlan: "+accountPlanUuid);
throw invalidEx("err.refund.paymentNotFound");
}

// Is the payment method associated with the bill still active?
final AccountPaymentMethod paymentMethod = paymentMethodDAO.findByUuid(payment.getPaymentMethod());
final AccountPaymentMethod paymentMethod = paymentMethodDAO.findByUuid(successfulPayment.getPaymentMethod());
if (paymentMethod == null || paymentMethod.deleted()) {
log.warn("refund: cannot refund: AccountPaymentMethod not found or deleted for paid bill ("+bill.getUuid()+") accountPlan: "+accountPlanUuid);
throw invalidEx("err.refund.paymentMethodNotFound");
@@ -198,7 +197,7 @@ public abstract class PaymentDriverBase<T> extends CloudServiceDriverBase<T> imp

final String refundInfo;
try {
refundInfo = refund(accountPlan, payment, paymentMethod, bill, refundAmount);
refundInfo = refund(accountPlan, successfulPayment, paymentMethod, bill, refundAmount);
} catch (RuntimeException e) {
// record failed payment, rethrow
accountPaymentDAO.create(new AccountPayment()


+ 5
- 0
bubble-server/src/main/java/bubble/dao/bill/AccountPaymentDAO.java 查看文件

@@ -2,6 +2,7 @@ package bubble.dao.bill;

import bubble.dao.account.AccountOwnedEntityDAO;
import bubble.model.bill.AccountPayment;
import bubble.model.bill.AccountPaymentStatus;
import org.hibernate.criterion.Order;
import org.springframework.stereotype.Repository;

@@ -29,4 +30,8 @@ public class AccountPaymentDAO extends AccountOwnedEntityDAO<AccountPayment> {
return findByFields("account", accountUuid, "accountPlan", accountPlanUuid, "bill", billUuid);
}

public AccountPayment findByAccountAndAccountPlanAndBillAndSuccess(String accountUuid, String accountPlanUuid, String billUuid) {
return findByUniqueFields("account", accountUuid, "accountPlan", accountPlanUuid, "bill", billUuid, "status", AccountPaymentStatus.success);
}

}

+ 3
- 0
bubble-server/src/main/java/bubble/model/bill/AccountPayment.java 查看文件

@@ -20,6 +20,9 @@ import static org.cobbzilla.wizard.model.crypto.EncryptedTypes.*;

@ECType(root=true) @ECTypeURIs(listFields={"account", "paymentMethod", "amount"})
@ECTypeFields(list={"account", "paymentMethod", "amount"})
@ECIndexes({
@ECIndex(name="account_payment_uniq_bill_success", unique=true, of={"bill"}, where="status = 'success'")
})
@Entity @NoArgsConstructor @Accessors(chain=true)
public class AccountPayment extends IdentifiableBase implements HasAccountNoName {



+ 3
- 8
bubble-server/src/main/java/bubble/model/bill/Bill.java 查看文件

@@ -16,11 +16,11 @@ import javax.persistence.*;
import static org.cobbzilla.util.daemon.ZillaRuntime.big;
import static org.cobbzilla.wizard.model.crypto.EncryptedTypes.*;

@ECType(root=true) @ECTypeURIs(listFields={"name", "status", "type", "quantity", "price", "period"})
@ECTypeFields(list={"name", "Status", "type", "quantity", "price", "period"})
@ECType(root=true) @ECTypeURIs(listFields={"name", "status", "type", "quantity", "price", "periodStart"})
@ECTypeFields(list={"name", "status", "type", "quantity", "price", "periodStart"})
@Entity @NoArgsConstructor @Accessors(chain=true)
@ECIndexes({
@ECIndex(unique=true, of={"account", "plan", "type", "period"})
@ECIndex(unique=true, of={"account", "plan", "type", "periodStart"})
})
public class Bill extends IdentifiableBase implements HasAccountNoName {

@@ -42,11 +42,6 @@ public class Bill extends IdentifiableBase implements HasAccountNoName {
public boolean paid() { return status == BillStatus.paid; }
public boolean unpaid() { return !paid(); }

@ECForeignKey(entity=AccountPayment.class, cascade=false)
@Column(length=UUID_MAXLEN)
@Getter @Setter private String payment;
public boolean hasPayment () { return payment != null; }

@ECIndex @Enumerated(EnumType.STRING)
@Column(nullable=false, updatable=false, length=20)
@Getter @Setter private BillItemType type;


+ 1
- 1
bubble-server/src/main/java/bubble/model/cloud/CloudServiceData.java 查看文件

@@ -28,7 +28,7 @@ import static org.cobbzilla.wizard.model.crypto.EncryptedTypes.ENC_PAD;
@ECTypeURIs(baseURI=EP_DATA, listFields={"key", "data", "expiration"})
@ECTypeFields(list={"key", "data", "expiration"})
@Entity @NoArgsConstructor @Accessors(chain=true)
@ECIndexes({ @ECIndex(unique=true, of={"cloudService", "key"}) })
@ECIndexes({ @ECIndex(unique=true, of={"cloud", "key"}) })
public class CloudServiceData extends IdentifiableBase implements HasAccount {

public static final String[] CREATE_FIELDS = {"account", "key", "data", "expiration"};


+ 1
- 0
bubble-server/src/test/java/bubble/test/BubbleCoreSuite.java 查看文件

@@ -5,6 +5,7 @@ import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({
DbInit.class,
AuthTest.class,
PaymentTest.class,
S3StorageTest.class,


+ 1
- 1
utils/cobbzilla-wizard

@@ -1 +1 @@
Subproject commit ea4b74c95d3f0d20bff6639fb75884ed88f8dedb
Subproject commit 74af88a87447e0a6661c8e5940f08a43d1fdf042

正在加载...
取消
保存