Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using Grand.Domain.Permissions;
using Grand.Web.Common.Controllers;
using Grand.Web.Common.Filters;
using Grand.Web.Common.Helpers;
using Grand.Web.Common.Security.Authorization;
using Microsoft.AspNetCore.Mvc;
using Payments.BrainTree.Models;
Expand All @@ -18,11 +19,11 @@ public class PaymentBrainTreeController : BasePaymentController

public PaymentBrainTreeController(ISettingService settingService,
ITranslationService translationService,
BrainTreePaymentSettings brainTreePaymentSettings)
IAdminStoreService adminStoreService)
{
_settingService = settingService;
_translationService = translationService;
_brainTreePaymentSettings = brainTreePaymentSettings;
_adminStoreService = adminStoreService;
}

#endregion
Expand All @@ -31,23 +32,28 @@ public PaymentBrainTreeController(ISettingService settingService,

private readonly ISettingService _settingService;
private readonly ITranslationService _translationService;
private readonly BrainTreePaymentSettings _brainTreePaymentSettings;
private readonly IAdminStoreService _adminStoreService;

#endregion

#region Methods

public IActionResult Configure()
public async Task<IActionResult> Configure()
{
//load settings for a chosen store scope - the injected settings instance would always be the
//one of the store hosting the admin panel, which ignores the scope the admin selected
var storeScope = await _adminStoreService.GetActiveStore();
var brainTreePaymentSettings = await _settingService.LoadSetting<BrainTreePaymentSettings>(storeScope);

var model = new ConfigurationModel {
Use3DS = _brainTreePaymentSettings.Use3DS,
UseSandBox = _brainTreePaymentSettings.UseSandBox,
PublicKey = _brainTreePaymentSettings.PublicKey,
PrivateKey = _brainTreePaymentSettings.PrivateKey,
MerchantId = _brainTreePaymentSettings.MerchantId,
AdditionalFee = _brainTreePaymentSettings.AdditionalFee,
AdditionalFeePercentage = _brainTreePaymentSettings.AdditionalFeePercentage,
DisplayOrder = _brainTreePaymentSettings.DisplayOrder
Use3DS = brainTreePaymentSettings.Use3DS,
UseSandBox = brainTreePaymentSettings.UseSandBox,
PublicKey = brainTreePaymentSettings.PublicKey,
PrivateKey = brainTreePaymentSettings.PrivateKey,
MerchantId = brainTreePaymentSettings.MerchantId,
AdditionalFee = brainTreePaymentSettings.AdditionalFee,
AdditionalFeePercentage = brainTreePaymentSettings.AdditionalFeePercentage,
DisplayOrder = brainTreePaymentSettings.DisplayOrder
};

return View(model);
Expand All @@ -58,23 +64,30 @@ public IActionResult Configure()
public async Task<IActionResult> Configure(ConfigurationModel model)
{
if (!ModelState.IsValid)
return Configure();
return await Configure();

//load settings for a chosen store scope
var storeScope = await _adminStoreService.GetActiveStore();
var brainTreePaymentSettings = await _settingService.LoadSetting<BrainTreePaymentSettings>(storeScope);

//save settings
_brainTreePaymentSettings.Use3DS = model.Use3DS;
_brainTreePaymentSettings.UseSandBox = model.UseSandBox;
_brainTreePaymentSettings.PublicKey = model.PublicKey;
_brainTreePaymentSettings.PrivateKey = model.PrivateKey;
_brainTreePaymentSettings.MerchantId = model.MerchantId;
_brainTreePaymentSettings.AdditionalFee = model.AdditionalFee;
_brainTreePaymentSettings.AdditionalFeePercentage = model.AdditionalFeePercentage;
_brainTreePaymentSettings.DisplayOrder = model.DisplayOrder;
brainTreePaymentSettings.Use3DS = model.Use3DS;
brainTreePaymentSettings.UseSandBox = model.UseSandBox;
brainTreePaymentSettings.PublicKey = model.PublicKey;
brainTreePaymentSettings.PrivateKey = model.PrivateKey;
brainTreePaymentSettings.MerchantId = model.MerchantId;
brainTreePaymentSettings.AdditionalFee = model.AdditionalFee;
brainTreePaymentSettings.AdditionalFeePercentage = model.AdditionalFeePercentage;
brainTreePaymentSettings.DisplayOrder = model.DisplayOrder;

await _settingService.SaveSetting(brainTreePaymentSettings, storeScope);

await _settingService.SaveSetting(_brainTreePaymentSettings);
//now clear settings cache
await _settingService.ClearCache();

Success(_translationService.GetResource("Admin.Plugins.Saved"));

return Configure();
return await Configure();
}

#endregion
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
Layout = "_ConfigurePlugin";
}
@model Payments.BrainTree.Models.ConfigurationModel
@await Component.InvokeAsync("StoreScope")
<input id="active-menu-item" type="hidden" value="/Admin/Payment/Methods"/>
<form asp-controller="PaymentBrainTree" asp-action="Configure" method="post">

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
using Grand.Business.Core.Interfaces.Common.Configuration;
using Grand.Business.Core.Interfaces.Common.Localization;
using Grand.Domain.Permissions;
using Grand.Infrastructure;
using Grand.Web.Common.Controllers;
using Grand.Web.Common.Filters;
using Grand.Web.Common.Security.Authorization;
using Microsoft.AspNetCore.Mvc;
using Payments.BrainTree.Models;

namespace Payments.BrainTree.Areas.Store.Controllers;

/// <summary>
/// Store-manager configuration of the BrainTree payment method.
/// <para>
/// The settings - the gateway credentials included - are read and written for the store the
/// manager is bound to (<see cref="CurrentStoreId" />), so each store transacts on its own
/// BrainTree account. The provider builds a <c>BraintreeGateway</c> per call from the settings
/// instance the container resolved for the current store, so no further change is needed for
/// the payment itself to use them. Note that the first save creates a store row covering the
/// whole settings class, after which this store stops inheriting later global changes to it.
/// </para>
/// </summary>
[Area("Store")]
[AuthorizeStore]
[AuthorizeMenu]
[PermissionAuthorize(PermissionSystemName.PaymentMethods)]
public class PaymentBrainTreeController : BasePaymentController
{
#region Ctor

public PaymentBrainTreeController(ISettingService settingService,
ITranslationService translationService,
IContextAccessor contextAccessor)
{
_settingService = settingService;
_translationService = translationService;
_contextAccessor = contextAccessor;
}

#endregion

#region Fields

private readonly ISettingService _settingService;
private readonly ITranslationService _translationService;
private readonly IContextAccessor _contextAccessor;

/// <summary>
/// The store the current store manager is bound to. AuthorizeStore already rejects a
/// customer without one, so this is never empty here.
/// </summary>
private string CurrentStoreId => _contextAccessor.WorkContext.CurrentCustomer.StaffStoreId;

#endregion

#region Methods

public async Task<IActionResult> Configure()
{
var brainTreePaymentSettings = await _settingService.LoadSetting<BrainTreePaymentSettings>(CurrentStoreId);

var model = new ConfigurationModel {
Use3DS = brainTreePaymentSettings.Use3DS,
UseSandBox = brainTreePaymentSettings.UseSandBox,
PublicKey = brainTreePaymentSettings.PublicKey,
PrivateKey = brainTreePaymentSettings.PrivateKey,
MerchantId = brainTreePaymentSettings.MerchantId,
AdditionalFee = brainTreePaymentSettings.AdditionalFee,
AdditionalFeePercentage = brainTreePaymentSettings.AdditionalFeePercentage,
DisplayOrder = brainTreePaymentSettings.DisplayOrder
};

return View(model);
}

[HttpPost]
[AutoValidateAntiforgeryToken]
public async Task<IActionResult> Configure(ConfigurationModel model)
{
if (!ModelState.IsValid)
return await Configure();

var brainTreePaymentSettings = await _settingService.LoadSetting<BrainTreePaymentSettings>(CurrentStoreId);

//save settings
brainTreePaymentSettings.Use3DS = model.Use3DS;
brainTreePaymentSettings.UseSandBox = model.UseSandBox;
brainTreePaymentSettings.PublicKey = model.PublicKey;
brainTreePaymentSettings.PrivateKey = model.PrivateKey;
brainTreePaymentSettings.MerchantId = model.MerchantId;
brainTreePaymentSettings.AdditionalFee = model.AdditionalFee;
brainTreePaymentSettings.AdditionalFeePercentage = model.AdditionalFeePercentage;
brainTreePaymentSettings.DisplayOrder = model.DisplayOrder;

await _settingService.SaveSetting(brainTreePaymentSettings, CurrentStoreId);

//now clear settings cache
await _settingService.ClearCache();

Success(_translationService.GetResource("Admin.Plugins.Saved"));

return await Configure();
}

#endregion
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
@model Payments.BrainTree.Models.ConfigurationModel
@{
Layout = "~/Areas/Store/Views/Shared/_StoreLayout.cshtml";
ViewBag.Title = Loc["Admin.Configuration.Payment.Methods"];
}
<input id="active-menu-item" type="hidden" value="/Store/Payment/Index"/>

<div class="row">
<div class="col-md-12">
<div class="x_panel light form-fit">
<div class="x_title">
<div class="caption level-caption">
<i class="fa fa-money"></i>
@Loc["Payments.BrainTree.FriendlyName"]
</div>
</div>
<div class="x_content form">
<form asp-controller="PaymentBrainTree" asp-action="Configure" asp-area="Store" method="post">
<div class="form-horizontal">
<div class="form-body">
<div class="form-group">
<div class="col-md-3 col-sm-3 text-right">
<admin-label asp-for="Use3DS" class="control-label"/>
</div>
<div class="col-md-9 col-sm-9">
<admin-input asp-for="Use3DS"/>
<span asp-validation-for="Use3DS"></span>
</div>
</div>
<div class="form-group">
<div class="col-md-3 col-sm-3 text-right">
<admin-label asp-for="UseSandBox" class="control-label"/>
</div>
<div class="col-md-9 col-sm-9">
<admin-input asp-for="UseSandBox"/>
<span asp-validation-for="UseSandBox"></span>
</div>
</div>
<div class="form-group">
<div class="col-md-3 col-sm-3 text-right">
<admin-label asp-for="MerchantId" class="control-label"/>
</div>
<div class="col-md-9 col-sm-9">
<admin-input asp-for="MerchantId"/>
<span asp-validation-for="MerchantId"></span>
</div>
</div>
<div class="form-group">
<div class="col-md-3 col-sm-3 text-right">
<admin-label asp-for="PrivateKey" class="control-label"/>
</div>
<div class="col-md-9 col-sm-9">
<admin-input asp-for="PrivateKey"/>
<span asp-validation-for="PrivateKey"></span>
</div>
</div>
<div class="form-group">
<div class="col-md-3 col-sm-3 text-right">
<admin-label asp-for="PublicKey" class="control-label"/>
</div>
<div class="col-md-9 col-sm-9">
<admin-input asp-for="PublicKey"/>
<span asp-validation-for="PublicKey"></span>
</div>
</div>
<div class="form-group">
<div class="col-md-3 col-sm-3 text-right">
<admin-label asp-for="AdditionalFee" class="control-label"/>
</div>
<div class="col-md-9 col-sm-9">
<admin-input asp-for="AdditionalFee"/>
<span asp-validation-for="AdditionalFee"></span>
</div>
</div>
<div class="form-group">
<div class="col-md-3 col-sm-3 text-right">
<admin-label asp-for="AdditionalFeePercentage" class="control-label"/>
</div>
<div class="col-md-9 col-sm-9">
<admin-input asp-for="AdditionalFeePercentage"/>
<span asp-validation-for="AdditionalFeePercentage"></span>
</div>
</div>
<div class="form-group">
<div class="col-md-3 col-sm-3 text-right">
<admin-label asp-for="DisplayOrder" class="control-label"/>
</div>
<div class="col-md-9 col-sm-9">
<admin-input asp-for="DisplayOrder"/>
<span asp-validation-for="DisplayOrder"></span>
</div>
</div>
</div>
<div class="form-actions">
<div class="row">
<div class="offset-md-3 offset-sm-3 col-md-9 col-sm-9">
<input type="submit" name="save" class="btn green" value="@Loc["Admin.Common.Save"]"/>
</div>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, Grand.Web.Common

@using Microsoft.AspNetCore.Mvc.ViewFeatures
@using Grand.Infrastructure.Extensions
@using Grand.Web.Common.Localization

@inject LocService Loc
Loading
Loading