1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-25 23:10:57 +01:00
phorge-phorge/src/applications/phortune/controller/PhortuneProviderEditController.php
epriestley 9aa5a8cb7b Make payment providers a configurable property of Merchants in Phortune
Summary:
Ref T2787. Instead of making providers global configuration, make them a thing on merchants with web configuration.

Payment methods and some of the pyament workflow needs to be retooled a bit after this, but this seemed like a reasonable cutoff point for this diff.

Test Plan: See screenshots.

Reviewers: btrahan

Reviewed By: btrahan

Subscribers: epriestley

Maniphest Tasks: T2787

Differential Revision: https://secure.phabricator.com/D10649
2014-10-07 14:41:41 -07:00

292 lines
8.6 KiB
PHP

<?php
final class PhortuneProviderEditController
extends PhortuneMerchantController {
private $id;
public function willProcessRequest(array $data) {
$this->id = idx($data, 'id');
}
public function processRequest() {
$request = $this->getRequest();
$viewer = $request->getUser();
if ($this->id) {
$provider_config = id(new PhortunePaymentProviderConfigQuery())
->setViewer($viewer)
->withIDs(array($this->id))
->requireCapabilities(
array(
PhabricatorPolicyCapability::CAN_VIEW,
PhabricatorPolicyCapability::CAN_EDIT,
))
->executeOne();
if (!$provider_config) {
return new Aphront404Response();
}
$is_new = false;
$is_choose_type = false;
$merchant = $provider_config->getMerchant();
$merchant_id = $merchant->getID();
$cancel_uri = $this->getApplicationURI("merchant/{$merchant_id}/");
} else {
$merchant = id(new PhortuneMerchantQuery())
->setViewer($viewer)
->withIDs(array($request->getStr('merchantID')))
->requireCapabilities(
array(
PhabricatorPolicyCapability::CAN_VIEW,
PhabricatorPolicyCapability::CAN_EDIT,
))
->executeOne();
if (!$merchant) {
return new Aphront404Response();
}
$merchant_id = $merchant->getID();
$current_providers = id(new PhortunePaymentProviderConfigQuery())
->setViewer($viewer)
->withMerchantPHIDs(array($merchant->getPHID()))
->execute();
$current_map = mgroup($current_providers, 'getProviderClass');
$provider_config = PhortunePaymentProviderConfig::initializeNewProvider(
$merchant);
$is_new = true;
$classes = PhortunePaymentProvider::getAllProviders();
$class = $request->getStr('class');
if (empty($classes[$class]) || isset($current_map[$class])) {
return $this->processChooseClassRequest(
$request,
$merchant,
$current_map);
}
$provider_config->setProviderClass($class);
$cancel_uri = $this->getApplicationURI(
'provider/edit/?merchantID='.$merchant_id);
}
$provider = $provider_config->buildProvider();
if ($is_new) {
$title = pht('Create Payment Provider');
$button_text = pht('Create Provider');
} else {
$title = pht(
'Edit Payment Provider %d %s',
$provider_config->getID(),
$provider->getName());
$button_text = pht('Save Changes');
}
$errors = array();
if ($request->isFormPost() && $request->getStr('edit')) {
$form_values = $provider->readEditFormValuesFromRequest($request);
list($errors, $issues, $xaction_values) = $provider->processEditForm(
$request,
$form_values);
if (!$errors) {
// Find any secret fields which we're about to set to "*******"
// (indicating that the user did not edit the value) and remove them
// from the list of properties to update (so we don't write "******"
// to permanent configuration.
$secrets = $provider->getAllConfigurableSecretProperties();
$secrets = array_fuse($secrets);
foreach ($xaction_values as $key => $value) {
if ($provider->isConfigurationSecret($value)) {
unset($xaction_values[$key]);
}
}
if ($provider->canRunConfigurationTest()) {
$proxy = clone $provider;
$proxy_config = clone $provider_config;
$proxy_config->setMetadata(
$xaction_values + $provider_config->getMetadata());
$proxy->setProviderConfig($proxy_config);
try {
$proxy->runConfigurationTest();
} catch (Exception $ex) {
$errors[] = pht('Unable to connect to payment provider:');
$errors[] = $ex->getMessage();
}
}
if (!$errors) {
$template = id(new PhortunePaymentProviderConfigTransaction())
->setTransactionType(
PhortunePaymentProviderConfigTransaction::TYPE_PROPERTY);
$xactions = array();
$xactions[] = id(new PhortunePaymentProviderConfigTransaction())
->setTransactionType(
PhortunePaymentProviderConfigTransaction::TYPE_CREATE)
->setNewValue(true);
foreach ($xaction_values as $key => $value) {
$xactions[] = id(clone $template)
->setMetadataValue(
PhortunePaymentProviderConfigTransaction::PROPERTY_KEY,
$key)
->setNewValue($value);
}
$editor = id(new PhortunePaymentProviderConfigEditor())
->setActor($viewer)
->setContentSourceFromRequest($request)
->setContinueOnNoEffect(true);
$editor->applyTransactions($provider_config, $xactions);
$merchant_uri = $this->getApplicationURI(
'merchant/'.$merchant->getID().'/');
return id(new AphrontRedirectResponse())->setURI($merchant_uri);
}
}
} else {
$form_values = $provider->readEditFormValuesFromProviderConfig();
$issues = array();
}
$form = id(new AphrontFormView())
->setUser($viewer)
->addHiddenInput('merchantID', $merchant->getID())
->addHiddenInput('class', $provider_config->getProviderClass())
->addHiddenInput('edit', true)
->appendChild(
id(new AphrontFormMarkupControl())
->setLabel(pht('Provider Type'))
->setValue($provider->getName()));
$provider->extendEditForm($request, $form, $form_values, $issues);
$form
->appendChild(
id(new AphrontFormSubmitControl())
->setValue($button_text)
->addCancelButton($cancel_uri))
->appendChild(
id(new AphrontFormDividerControl()))
->appendRemarkupInstructions(
$provider->getConfigureInstructions());
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb($merchant->getName(), $cancel_uri);
if ($is_new) {
$crumbs->addTextCrumb(pht('Add Provider'));
} else {
$crumbs->addTextCrumb(
pht('Edit Provider %d', $provider_config->getID()));
}
$box = id(new PHUIObjectBoxView())
->setFormErrors($errors)
->setHeaderText($title)
->appendChild($form);
return $this->buildApplicationPage(
array(
$crumbs,
$box,
),
array(
'title' => $title,
));
}
private function processChooseClassRequest(
AphrontRequest $request,
PhortuneMerchant $merchant,
array $current_map) {
$viewer = $request->getUser();
$providers = PhortunePaymentProvider::getAllProviders();
$v_class = null;
$errors = array();
if ($request->isFormPost()) {
$v_class = $request->getStr('class');
if (!isset($providers[$v_class])) {
$errors[] = pht('You must select a valid provider type.');
}
}
$merchant_id = $merchant->getID();
$cancel_uri = $this->getApplicationURI("merchant/{$merchant_id}/");
if (!$v_class) {
$v_class = key($providers);
}
$panel_classes = id(new AphrontFormRadioButtonControl())
->setName('class')
->setValue($v_class);
$providers = msort($providers, 'getConfigureName');
foreach ($providers as $class => $provider) {
$disabled = isset($current_map[$class]);
if ($disabled) {
$description = phutil_tag(
'em',
array(),
pht(
'This merchant already has a payment account configured '.
'with this provider.'));
} else {
$description = $provider->getConfigureDescription();
}
$panel_classes->addButton(
$class,
$provider->getConfigureName(),
$description,
null,
$disabled);
}
$form = id(new AphrontFormView())
->setUser($viewer)
->addHiddenInput('merchantID', $merchant->getID())
->appendRemarkupInstructions(
pht(
'Choose the type of payment provider to add:'))
->appendChild($panel_classes)
->appendChild(
id(new AphrontFormSubmitControl())
->setValue(pht('Continue'))
->addCancelButton($cancel_uri));
$title = pht('Add Payment Provider');
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb($merchant->getName(), $cancel_uri);
$crumbs->addTextCrumb($title);
$box = id(new PHUIObjectBoxView())
->setHeaderText($title)
->setFormErrors($errors)
->setForm($form);
return $this->buildApplicationPage(
array(
$crumbs,
$box,
),
array(
'title' => $title,
));
}
}