mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-25 00:02:41 +01:00
9aa5a8cb7b
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
292 lines
8.6 KiB
PHP
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,
|
|
));
|
|
}
|
|
|
|
}
|