Page MenuHomePhabricator

D10688.id25680.diff
No OneTemporary

D10688.id25680.diff

diff --git a/resources/sql/autopatches/20141012.phortunecartxaction.sql b/resources/sql/autopatches/20141012.phortunecartxaction.sql
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20141012.phortunecartxaction.sql
@@ -0,0 +1,19 @@
+CREATE TABLE {$NAMESPACE}_phortune.phortune_carttransaction (
+ id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ phid VARCHAR(64) COLLATE utf8_bin NOT NULL,
+ authorPHID VARCHAR(64) COLLATE utf8_bin NOT NULL,
+ objectPHID VARCHAR(64) COLLATE utf8_bin NOT NULL,
+ viewPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL,
+ editPolicy VARCHAR(64) COLLATE utf8_bin NOT NULL,
+ commentPHID VARCHAR(64) COLLATE utf8_bin DEFAULT NULL,
+ commentVersion INT UNSIGNED NOT NULL,
+ transactionType VARCHAR(32) COLLATE utf8_bin NOT NULL,
+ oldValue LONGTEXT COLLATE utf8_bin NOT NULL,
+ newValue LONGTEXT COLLATE utf8_bin NOT NULL,
+ contentSource LONGTEXT COLLATE utf8_bin NOT NULL,
+ metadata LONGTEXT COLLATE utf8_bin NOT NULL,
+ dateCreated INT UNSIGNED NOT NULL,
+ dateModified INT UNSIGNED NOT NULL,
+ UNIQUE KEY `key_phid` (`phid`),
+ KEY `key_object` (`objectPHID`)
+) ENGINE=InnoDB, COLLATE utf8_general_ci;
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -2563,11 +2563,14 @@
'PhortuneCartCancelController' => 'applications/phortune/controller/PhortuneCartCancelController.php',
'PhortuneCartCheckoutController' => 'applications/phortune/controller/PhortuneCartCheckoutController.php',
'PhortuneCartController' => 'applications/phortune/controller/PhortuneCartController.php',
+ 'PhortuneCartEditor' => 'applications/phortune/editor/PhortuneCartEditor.php',
'PhortuneCartImplementation' => 'applications/phortune/cart/PhortuneCartImplementation.php',
'PhortuneCartListController' => 'applications/phortune/controller/PhortuneCartListController.php',
'PhortuneCartPHIDType' => 'applications/phortune/phid/PhortuneCartPHIDType.php',
'PhortuneCartQuery' => 'applications/phortune/query/PhortuneCartQuery.php',
'PhortuneCartSearchEngine' => 'applications/phortune/query/PhortuneCartSearchEngine.php',
+ 'PhortuneCartTransaction' => 'applications/phortune/storage/PhortuneCartTransaction.php',
+ 'PhortuneCartTransactionQuery' => 'applications/phortune/query/PhortuneCartTransactionQuery.php',
'PhortuneCartUpdateController' => 'applications/phortune/controller/PhortuneCartUpdateController.php',
'PhortuneCartViewController' => 'applications/phortune/controller/PhortuneCartViewController.php',
'PhortuneCharge' => 'applications/phortune/storage/PhortuneCharge.php',
@@ -5631,10 +5634,13 @@
'PhortuneCartCancelController' => 'PhortuneCartController',
'PhortuneCartCheckoutController' => 'PhortuneCartController',
'PhortuneCartController' => 'PhortuneController',
+ 'PhortuneCartEditor' => 'PhabricatorApplicationTransactionEditor',
'PhortuneCartListController' => 'PhortuneController',
'PhortuneCartPHIDType' => 'PhabricatorPHIDType',
'PhortuneCartQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
'PhortuneCartSearchEngine' => 'PhabricatorApplicationSearchEngine',
+ 'PhortuneCartTransaction' => 'PhabricatorApplicationTransaction',
+ 'PhortuneCartTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
'PhortuneCartUpdateController' => 'PhortuneCartController',
'PhortuneCartViewController' => 'PhortuneCartController',
'PhortuneCharge' => array(
diff --git a/src/applications/phortune/controller/PhortuneAccountViewController.php b/src/applications/phortune/controller/PhortuneAccountViewController.php
--- a/src/applications/phortune/controller/PhortuneAccountViewController.php
+++ b/src/applications/phortune/controller/PhortuneAccountViewController.php
@@ -267,14 +267,10 @@
->withObjectPHIDs(array($account->getPHID()))
->execute();
- $engine = id(new PhabricatorMarkupEngine())
- ->setViewer($user);
-
$xaction_view = id(new PhabricatorApplicationTransactionView())
->setUser($user)
->setObjectPHID($account->getPHID())
- ->setTransactions($xactions)
- ->setMarkupEngine($engine);
+ ->setTransactions($xactions);
return $xaction_view;
}
diff --git a/src/applications/phortune/controller/PhortuneCartViewController.php b/src/applications/phortune/controller/PhortuneCartViewController.php
--- a/src/applications/phortune/controller/PhortuneCartViewController.php
+++ b/src/applications/phortune/controller/PhortuneCartViewController.php
@@ -160,11 +160,23 @@
$this->addAccountCrumb($crumbs, $cart->getAccount());
$crumbs->addTextCrumb(pht('Cart %d', $cart->getID()));
+ $xactions = id(new PhortuneCartTransactionQuery())
+ ->setViewer($viewer)
+ ->withObjectPHIDs(array($cart->getPHID()))
+ ->execute();
+
+ $xaction_view = id(new PhabricatorApplicationTransactionView())
+ ->setUser($viewer)
+ ->setObjectPHID($cart->getPHID())
+ ->setTransactions($xactions)
+ ->setShouldTerminate(true);
+
return $this->buildApplicationPage(
array(
$crumbs,
$cart_box,
$charges,
+ $xaction_view,
),
array(
'title' => pht('Cart'),
diff --git a/src/applications/phortune/editor/PhortuneCartEditor.php b/src/applications/phortune/editor/PhortuneCartEditor.php
new file mode 100644
--- /dev/null
+++ b/src/applications/phortune/editor/PhortuneCartEditor.php
@@ -0,0 +1,95 @@
+<?php
+
+final class PhortuneCartEditor
+ extends PhabricatorApplicationTransactionEditor {
+
+ public function getEditorApplicationClass() {
+ return 'PhabricatorPhortuneApplication';
+ }
+
+ public function getEditorObjectsDescription() {
+ return pht('Phortune Carts');
+ }
+
+ public function getTransactionTypes() {
+ $types = parent::getTransactionTypes();
+
+ $types[] = PhortuneCartTransaction::TYPE_CREATED;
+ $types[] = PhortuneCartTransaction::TYPE_PURCHASED;
+ $types[] = PhortuneCartTransaction::TYPE_HOLD;
+ $types[] = PhortuneCartTransaction::TYPE_REVIEW;
+ $types[] = PhortuneCartTransaction::TYPE_CANCEL;
+ $types[] = PhortuneCartTransaction::TYPE_REFUND;
+
+ return $types;
+ }
+
+ protected function getCustomTransactionOldValue(
+ PhabricatorLiskDAO $object,
+ PhabricatorApplicationTransaction $xaction) {
+
+ switch ($xaction->getTransactionType()) {
+ case PhortuneCartTransaction::TYPE_CREATED:
+ case PhortuneCartTransaction::TYPE_PURCHASED:
+ case PhortuneCartTransaction::TYPE_HOLD:
+ case PhortuneCartTransaction::TYPE_REVIEW:
+ case PhortuneCartTransaction::TYPE_CANCEL:
+ case PhortuneCartTransaction::TYPE_REFUND:
+ return null;
+ }
+
+ return parent::getCustomTransactionOldValue($object, $xaction);
+ }
+
+ protected function getCustomTransactionNewValue(
+ PhabricatorLiskDAO $object,
+ PhabricatorApplicationTransaction $xaction) {
+
+ switch ($xaction->getTransactionType()) {
+ case PhortuneCartTransaction::TYPE_CREATED:
+ case PhortuneCartTransaction::TYPE_PURCHASED:
+ case PhortuneCartTransaction::TYPE_HOLD:
+ case PhortuneCartTransaction::TYPE_REVIEW:
+ case PhortuneCartTransaction::TYPE_CANCEL:
+ case PhortuneCartTransaction::TYPE_REFUND:
+ return $xaction->getNewValue();
+ }
+
+ return parent::getCustomTransactionNewValue($object, $xaction);
+ }
+
+ protected function applyCustomInternalTransaction(
+ PhabricatorLiskDAO $object,
+ PhabricatorApplicationTransaction $xaction) {
+
+ switch ($xaction->getTransactionType()) {
+ case PhortuneCartTransaction::TYPE_CREATED:
+ case PhortuneCartTransaction::TYPE_PURCHASED:
+ case PhortuneCartTransaction::TYPE_HOLD:
+ case PhortuneCartTransaction::TYPE_REVIEW:
+ case PhortuneCartTransaction::TYPE_CANCEL:
+ case PhortuneCartTransaction::TYPE_REFUND:
+ return;
+ }
+
+ return parent::applyCustomInternalTransaction($object, $xaction);
+ }
+
+ protected function applyCustomExternalTransaction(
+ PhabricatorLiskDAO $object,
+ PhabricatorApplicationTransaction $xaction) {
+
+ switch ($xaction->getTransactionType()) {
+ case PhortuneCartTransaction::TYPE_CREATED:
+ case PhortuneCartTransaction::TYPE_PURCHASED:
+ case PhortuneCartTransaction::TYPE_HOLD:
+ case PhortuneCartTransaction::TYPE_REVIEW:
+ case PhortuneCartTransaction::TYPE_CANCEL:
+ case PhortuneCartTransaction::TYPE_REFUND:
+ return;
+ }
+
+ return parent::applyCustomExternalTransaction($object, $xaction);
+ }
+
+}
diff --git a/src/applications/phortune/query/PhortuneCartTransactionQuery.php b/src/applications/phortune/query/PhortuneCartTransactionQuery.php
new file mode 100644
--- /dev/null
+++ b/src/applications/phortune/query/PhortuneCartTransactionQuery.php
@@ -0,0 +1,10 @@
+<?php
+
+final class PhortuneCartTransactionQuery
+ extends PhabricatorApplicationTransactionQuery {
+
+ public function getTemplateApplicationTransaction() {
+ return new PhortuneCartTransaction();
+ }
+
+}
diff --git a/src/applications/phortune/storage/PhortuneCart.php b/src/applications/phortune/storage/PhortuneCart.php
--- a/src/applications/phortune/storage/PhortuneCart.php
+++ b/src/applications/phortune/storage/PhortuneCart.php
@@ -70,7 +70,26 @@
}
public function activateCart() {
- $this->setStatus(self::STATUS_READY)->save();
+ $this->openTransaction();
+ $this->beginReadLocking();
+
+ $copy = clone $this;
+ $copy->reload();
+
+ if ($copy->getStatus() !== self::STATUS_BUILDING) {
+ throw new Exception(
+ pht(
+ 'Cart has wrong status ("%s") to call willApplyCharge().',
+ $copy->getStatus()));
+ }
+
+ $this->setStatus(self::STATUS_READY)->save();
+
+ $this->endReadLocking();
+ $this->saveTransaction();
+
+ $this->recordCartTransaction(PhortuneCartTransaction::TYPE_CREATED);
+
return $this;
}
@@ -140,6 +159,8 @@
$this->endReadLocking();
$this->saveTransaction();
+
+ $this->recordCartTransaction(PhortuneCartTransaction::TYPE_HOLD);
}
public function didApplyCharge(PhortuneCharge $charge) {
@@ -199,7 +220,7 @@
$this->endReadLocking();
$this->saveTransaction();
- // TODO: Notify merchant to review order.
+ $this->recordCartTransaction(PhortuneCartTransaction::TYPE_REVIEW);
return $this;
}
@@ -228,6 +249,8 @@
$this->endReadLocking();
$this->saveTransaction();
+ $this->recordCartTransaction(PhortuneCartTransaction::TYPE_PURCHASED);
+
return $this;
}
@@ -384,6 +407,30 @@
$this->saveTransaction();
}
+ private function recordCartTransaction($type) {
+ $omnipotent_user = PhabricatorUser::getOmnipotentUser();
+ $phortune_phid = id(new PhabricatorPhortuneApplication())->getPHID();
+
+ $xactions = array();
+
+ $xactions[] = id(new PhortuneCartTransaction())
+ ->setTransactionType($type)
+ ->setNewValue(true);
+
+ $content_source = PhabricatorContentSource::newForSource(
+ PhabricatorContentSource::SOURCE_PHORTUNE,
+ array());
+
+ $editor = id(new PhortuneCartEditor())
+ ->setActor($omnipotent_user)
+ ->setActingAsPHID($phortune_phid)
+ ->setContentSource($content_source)
+ ->setContinueOnMissingFields(true)
+ ->setContinueOnNoEffect(true);
+
+ $editor->applyTransactions($this, $xactions);
+ }
+
public function getName() {
return $this->getImplementation()->getName($this);
}
diff --git a/src/applications/phortune/storage/PhortuneCartTransaction.php b/src/applications/phortune/storage/PhortuneCartTransaction.php
new file mode 100644
--- /dev/null
+++ b/src/applications/phortune/storage/PhortuneCartTransaction.php
@@ -0,0 +1,48 @@
+<?php
+
+final class PhortuneCartTransaction
+ extends PhabricatorApplicationTransaction {
+
+ const TYPE_CREATED = 'cart:created';
+ const TYPE_HOLD = 'cart:hold';
+ const TYPE_REVIEW = 'cart:review';
+ const TYPE_CANCEL = 'cart:cancel';
+ const TYPE_REFUND = 'cart:refund';
+ const TYPE_PURCHASED = 'cart:purchased';
+
+ public function getApplicationName() {
+ return 'phortune';
+ }
+
+ public function getApplicationTransactionType() {
+ return PhortuneCartPHIDType::TYPECONST;
+ }
+
+ public function getApplicationTransactionCommentObject() {
+ return null;
+ }
+
+ public function getTitle() {
+ $old = $this->getOldValue();
+ $new = $this->getNewValue();
+
+ switch ($this->getTransactionType()) {
+ case self::TYPE_CREATED:
+ return pht('This order was created.');
+ case self::TYPE_HOLD:
+ return pht('This order was put on hold until payment clears.');
+ case self::TYPE_REVIEW:
+ return pht(
+ 'This order was flagged for manual processing by the merchant.');
+ case self::TYPE_CANCEL:
+ return pht('This order was cancelled.');
+ case self::TYPE_REFUND:
+ return pht('This order was refunded.');
+ case self::TYPE_PURCHASED:
+ return pht('Payment for this order was completed.');
+ }
+
+ return parent::getTitle();
+ }
+
+}

File Metadata

Mime Type
text/plain
Expires
Mar 25 2025, 12:20 AM (6 w, 3 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7384051
Default Alt Text
D10688.id25680.diff (12 KB)

Event Timeline