Skip to content

Commit e95300d

Browse files
committed
Add integrations support for Umbraco 13
1 parent 2f92b4b commit e95300d

34 files changed

+1364
-256
lines changed

src/Umbraco.Forms.Integrations.Automation.Zapier/Umbraco.Forms.Integrations.Automation.Zapier.csproj

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFramework>net6.0</TargetFramework>
4+
<TargetFramework>net8.0</TargetFramework>
55
</PropertyGroup>
66

77
<PropertyGroup>
@@ -11,7 +11,7 @@
1111
<PackageIconUrl></PackageIconUrl>
1212
<PackageProjectUrl>https://github.com/umbraco/Umbraco.Forms.Integrations/tree/main-v10/src/Umbraco.Forms.Integrations.Automation.Zapier</PackageProjectUrl>
1313
<RepositoryUrl>https://github.com/umbraco/Umbraco.Forms.Integrations</RepositoryUrl>
14-
<Version>2.0.6</Version>
14+
<Version>3.0.0</Version>
1515
<Authors>Umbraco HQ</Authors>
1616
<Company>Umbraco</Company>
1717
<PackageTags>Umbraco;Umbraco-Marketplace</PackageTags>
@@ -20,9 +20,12 @@
2020
</PropertyGroup>
2121

2222
<ItemGroup>
23-
<PackageReference Include="Umbraco.Cms.Web.Website" version="10.1.0" />
24-
<PackageReference Include="Umbraco.Cms.Core" version="10.1.0" />
25-
<PackageReference Include="Umbraco.Forms.Core" version="10.1.0" />
23+
<!--<PackageReference Include="Umbraco.Cms.Web.Website" version="[13.0.0,14)" />
24+
<PackageReference Include="Umbraco.Cms.Core" version="[13.0.0,14)" />
25+
<PackageReference Include="Umbraco.Forms.Core" version="[13.0.0,14)" />-->
26+
<PackageReference Include="Umbraco.Cms.Web.Website" version="13.0.0-rc1" />
27+
<PackageReference Include="Umbraco.Cms.Core" version="13.0.0-rc1" />
28+
<PackageReference Include="Umbraco.Forms.Core" version="13.0.0-rc1" />
2629
</ItemGroup>
2730

2831
<ItemGroup>

src/Umbraco.Forms.Integrations.Commerce.EMerchantPay/Controllers/PaymentProviderController.cs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,12 @@ public PaymentProviderController(PaymentService paymentService, IRecordStorage r
3636
}
3737

3838
[HttpPost]
39-
public HttpResponseMessage NotifyPayment(string formId, string recordUniqueId, string statusFieldId, bool approve, [FromForm] NotificationDto notificationDto)
39+
public async Task<HttpResponseMessage> NotifyPaymentAsync(string formId, string recordUniqueId, string statusFieldId, bool approve, [FromForm] NotificationDto notificationDto)
4040
{
4141
try
4242
{
4343
// reconcile
44-
var reconcileTask =
45-
Task.Run(async () => await _paymentService.Reconcile(notificationDto.UniqueId));
46-
47-
var reconcileResponse = reconcileTask.Result;
44+
var reconcileResponse = await _paymentService.Reconcile(notificationDto.UniqueId);
4845

4946
// get record with uniqueId and update status
5047
var form = _formService.Get(Guid.Parse(formId));
@@ -59,7 +56,7 @@ public HttpResponseMessage NotifyPayment(string formId, string recordUniqueId, s
5956

6057
if (approve && notificationDto.Status == Constants.PaymentStatus.Approved)
6158
{
62-
_recordService.Approve(record, form);
59+
await _recordService.ApproveAsync(record, form);
6360
}
6461

6562
if (reconcileResponse.Status == Constants.ErrorCode.WorkflowError)
@@ -71,7 +68,7 @@ public HttpResponseMessage NotifyPayment(string formId, string recordUniqueId, s
7168
Content = new StringContent(notificationXml, Encoding.UTF8, "application/xml")
7269
};
7370
}
74-
catch (Exception ex)
71+
catch (Exception ex)
7572
{
7673
return new HttpResponseMessage(HttpStatusCode.InternalServerError);
7774
}

src/Umbraco.Forms.Integrations.Commerce.EMerchantPay/PaymentProviderWorkflow.cs

Lines changed: 114 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -118,123 +118,119 @@ public PaymentProviderWorkflow(
118118
_logger = logger;
119119
}
120120

121-
public override WorkflowExecutionStatus Execute(WorkflowExecutionContext context)
122-
{
123-
if (!_mappingService.TryParse(CustomerDetailsMappings, out var mappings)) return WorkflowExecutionStatus.Failed;
124-
125-
try
126-
{
127-
var mappingBuilder = new MappingBuilder()
128-
.SetValues(context.Record, mappings)
129-
.Build();
130-
131-
// step 1. Create or Retrieve Consumer
132-
var consumer = new ConsumerDto { Email = mappingBuilder.Email };
133-
134-
// step 1. Create Consumer
135-
var createConsumerTask = Task.Run(async () => await _consumerService.Create(consumer));
136-
137-
var result = createConsumerTask.Result;
138-
if (result.Status.Contains("error") && result.Code != Constants.ErrorCode.ConsumerExists)
139-
{
140-
_logger.LogError($"Failed to create consumer: {result.TechnicalMessage}.");
141-
142-
return WorkflowExecutionStatus.Failed;
143-
}
144-
145-
if (result.Code == Constants.ErrorCode.ConsumerExists)
146-
{
147-
// step 1.1. Get Consumer
148-
var retrieveConsumerTask = Task.Run(async () => await _consumerService.Retrieve(consumer));
149-
consumer = retrieveConsumerTask.Result;
150-
}
151-
else
152-
{
153-
consumer.Id = result.Id;
154-
}
155-
156-
// step 2. Create Payment
157-
var random = new Random();
158-
var transactionId = $"uc-{random.Next(1000000, 999999999)}";
159-
160-
var formHelper = new FormHelper(context.Record);
161-
162-
var formId = formHelper.GetFormId();
163-
var recordUniqueId = formHelper.GetRecordUniqueId();
164-
165-
var uniqueIdKey = UniqueId;
166-
var statusKey = RecordStatus;
167-
168-
var numberOfItems = string.IsNullOrEmpty(NumberOfItems)
169-
? 0
170-
: int.Parse(formHelper.GetRecordFieldValue(NumberOfItems));
171-
172-
var payment = new PaymentDto
173-
{
174-
TransactionId = transactionId.ToString(),
175-
Usage = _paymentProviderSettings.Usage,
176-
NotificationUrl = $"{_paymentProviderSettings.UmbracoBaseUrl}umbraco/api/paymentprovider/notifypayment" +
177-
$"?formId={formId}&recordUniqueId={recordUniqueId}&statusFieldId={statusKey}&approve={(bool.TryParse(Approve, out bool approve) ? approve : false)}",
178-
ReturnSuccessUrl = _urlHelper.GetPageUrl(int.Parse(SuccessUrl)),
179-
ReturnFailureUrl = _urlHelper.GetPageUrl(int.Parse(FailureUrl)),
180-
ReturnCancelUrl = _urlHelper.GetPageUrl(int.Parse(CancelUrl)),
181-
Amount = numberOfItems != 0
182-
? numberOfItems * int.Parse(Amount)
183-
: int.Parse(Amount),
184-
Currency = Currency,
185-
ConsumerId = consumer.Id,
186-
CustomerEmail = consumer.Email,
187-
CustomerPhone = mappingBuilder.Phone,
188-
BillingAddress = new AddressDto
189-
{
190-
FirstName = mappingBuilder.FirstName,
191-
LastName = mappingBuilder.LastName,
192-
Address1 = mappingBuilder.Address,
193-
Address2 = string.Empty,
194-
ZipCode = mappingBuilder.ZipCode,
195-
City = mappingBuilder.City,
196-
State = mappingBuilder.State,
197-
Country = mappingBuilder.Country
198-
},
199-
BusinessAttribute = new BusinessAttribute { NameOfTheSupplier = _paymentProviderSettings.Supplier },
200-
TransactionTypes = new TransactionTypeDto
201-
{
202-
TransactionTypes = _parser.AsEnumerable(nameof(PaymentProviderSettings.TransactionTypes))
203-
.Select(p => new TransactionTypeRecordDto { TransactionType = p })
204-
.ToList()
205-
}
206-
};
207-
208-
var createPaymentTask = Task.Run(async () => await _paymentService.Create(payment));
209-
210-
var createPaymentResult = createPaymentTask.Result;
211-
212-
if (createPaymentResult.Status != "error")
213-
{
214-
// add unique ID and status to record
215-
formHelper.UpdateRecordFieldValue(uniqueIdKey, createPaymentResult.UniqueId);
216-
formHelper.UpdateRecordFieldValue(statusKey, createPaymentResult.Status);
217-
218-
_httpContextAccessor.HttpContext.Items[Core.Constants.ItemKeys.RedirectAfterFormSubmitUrl] = createPaymentResult.RedirectUrl;
219-
220-
return WorkflowExecutionStatus.Completed;
221-
}
222-
223-
formHelper.UpdateRecordFieldValue(statusKey, "error");
224-
225-
_logger.LogError($"Failed to create payment: {createPaymentResult.TechnicalMessage}.");
226-
227-
return WorkflowExecutionStatus.Failed;
228-
}
229-
catch(Exception ex)
230-
{
231-
_logger.LogError($"Workflow failed: {ex.Message}.");
232-
233-
return WorkflowExecutionStatus.Failed;
234-
}
235-
}
236-
237-
public override List<Exception> ValidateSettings()
121+
public override async Task<WorkflowExecutionStatus> ExecuteAsync(WorkflowExecutionContext context)
122+
{
123+
if (!_mappingService.TryParse(CustomerDetailsMappings, out var mappings)) return WorkflowExecutionStatus.Failed;
124+
125+
try
126+
{
127+
var mappingBuilder = new MappingBuilder()
128+
.SetValues(context.Record, mappings)
129+
.Build();
130+
131+
// step 1. Create or Retrieve Consumer
132+
var consumer = new ConsumerDto { Email = mappingBuilder.Email };
133+
134+
// step 1. Create Consumer
135+
var createConsumerResult = await _consumerService.Create(consumer);
136+
137+
if (createConsumerResult.Status.Contains("error") && createConsumerResult.Code != Constants.ErrorCode.ConsumerExists)
138+
{
139+
_logger.LogError($"Failed to create consumer: {createConsumerResult.TechnicalMessage}.");
140+
141+
return WorkflowExecutionStatus.Failed;
142+
}
143+
144+
if (createConsumerResult.Code == Constants.ErrorCode.ConsumerExists)
145+
{
146+
// step 1.1. Get Consumer
147+
consumer = await _consumerService.Retrieve(consumer);
148+
}
149+
else
150+
{
151+
consumer.Id = createConsumerResult.Id;
152+
}
153+
154+
// step 2. Create Payment
155+
var random = new Random();
156+
var transactionId = $"uc-{random.Next(1000000, 999999999)}";
157+
158+
var formHelper = new FormHelper(context.Record);
159+
160+
var formId = formHelper.GetFormId();
161+
var recordUniqueId = formHelper.GetRecordUniqueId();
162+
163+
var uniqueIdKey = UniqueId;
164+
var statusKey = RecordStatus;
165+
166+
var numberOfItems = string.IsNullOrEmpty(NumberOfItems)
167+
? 0
168+
: int.Parse(formHelper.GetRecordFieldValue(NumberOfItems));
169+
170+
var payment = new PaymentDto
171+
{
172+
TransactionId = transactionId.ToString(),
173+
Usage = _paymentProviderSettings.Usage,
174+
NotificationUrl = $"{_paymentProviderSettings.UmbracoBaseUrl}umbraco/api/paymentprovider/notifypaymentasync" +
175+
$"?formId={formId}&recordUniqueId={recordUniqueId}&statusFieldId={statusKey}&approve={(bool.TryParse(Approve, out bool approve) ? approve : false)}",
176+
ReturnSuccessUrl = _urlHelper.GetPageUrl(int.Parse(SuccessUrl)),
177+
ReturnFailureUrl = _urlHelper.GetPageUrl(int.Parse(FailureUrl)),
178+
ReturnCancelUrl = _urlHelper.GetPageUrl(int.Parse(CancelUrl)),
179+
Amount = numberOfItems != 0
180+
? numberOfItems * int.Parse(Amount)
181+
: int.Parse(Amount),
182+
Currency = Currency,
183+
ConsumerId = consumer.Id,
184+
CustomerEmail = consumer.Email,
185+
CustomerPhone = mappingBuilder.Phone,
186+
BillingAddress = new AddressDto
187+
{
188+
FirstName = mappingBuilder.FirstName,
189+
LastName = mappingBuilder.LastName,
190+
Address1 = mappingBuilder.Address,
191+
Address2 = string.Empty,
192+
ZipCode = mappingBuilder.ZipCode,
193+
City = mappingBuilder.City,
194+
State = mappingBuilder.State,
195+
Country = mappingBuilder.Country
196+
},
197+
BusinessAttribute = new BusinessAttribute { NameOfTheSupplier = _paymentProviderSettings.Supplier },
198+
TransactionTypes = new TransactionTypeDto
199+
{
200+
TransactionTypes = _parser.AsEnumerable(nameof(PaymentProviderSettings.TransactionTypes))
201+
.Select(p => new TransactionTypeRecordDto { TransactionType = p })
202+
.ToList()
203+
}
204+
};
205+
206+
var createPaymentResult = await _paymentService.Create(payment);
207+
208+
if (createPaymentResult.Status != "error")
209+
{
210+
// add unique ID and status to record
211+
formHelper.UpdateRecordFieldValue(uniqueIdKey, createPaymentResult.UniqueId);
212+
formHelper.UpdateRecordFieldValue(statusKey, createPaymentResult.Status);
213+
214+
_httpContextAccessor.HttpContext.Items[Core.Constants.ItemKeys.RedirectAfterFormSubmitUrl] = createPaymentResult.RedirectUrl;
215+
216+
return WorkflowExecutionStatus.Completed;
217+
}
218+
219+
formHelper.UpdateRecordFieldValue(statusKey, "error");
220+
221+
_logger.LogError($"Failed to create payment: {createPaymentResult.TechnicalMessage}.");
222+
223+
return WorkflowExecutionStatus.Failed;
224+
}
225+
catch (Exception ex)
226+
{
227+
_logger.LogError($"Workflow failed: {ex.Message}.");
228+
229+
return WorkflowExecutionStatus.Failed;
230+
}
231+
}
232+
233+
public override List<Exception> ValidateSettings()
238234
{
239235
var list = new List<Exception>();
240236

@@ -261,5 +257,5 @@ public override List<Exception> ValidateSettings()
261257

262258
return list;
263259
}
264-
}
260+
}
265261
}

src/Umbraco.Forms.Integrations.Commerce.EMerchantPay/Umbraco.Forms.Integrations.Commerce.EMerchantPay.csproj

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>net60;net70</TargetFrameworks>
4+
<TargetFrameworks>net8.0</TargetFrameworks>
55
</PropertyGroup>
66

77
<PropertyGroup>
@@ -11,26 +11,23 @@
1111
<PackageIconUrl></PackageIconUrl>
1212
<PackageProjectUrl>https://github.com/umbraco/Umbraco.Forms.Integrations/tree/main-v10/src/Umbraco.Forms.Integrations.Commerce.EMerchantPay</PackageProjectUrl>
1313
<RepositoryUrl>https://github.com/umbraco/Umbraco.Forms.Integrations</RepositoryUrl>
14-
<Version>2.1.0</Version>
14+
<Version>3.0.0</Version>
1515
<Authors>Umbraco HQ</Authors>
1616
<Company>Umbraco</Company>
1717
<PackageTags>Umbraco;Umbraco-Marketplace</PackageTags>
1818
<PackageIcon>emerchantpay.png</PackageIcon>
1919
<PackageReadmeFile>readme.md</PackageReadmeFile>
2020
</PropertyGroup>
2121

22-
<ItemGroup Condition="'$(TargetFramework)' == 'net60'">
23-
<PackageReference Include="Umbraco.Cms.Web.Website" version="[10.1.0,11)" />
24-
<PackageReference Include="Umbraco.Cms.Web.BackOffice" version="[10.1.0,11)" />
25-
<PackageReference Include="Umbraco.Forms" version="[10.1.0,11)" />
26-
<PackageReference Include="Umbraco.Forms.Core" version="[10.1.0,11)" />
27-
</ItemGroup>
28-
29-
<ItemGroup Condition="'$(TargetFramework)' == 'net70'">
30-
<PackageReference Include="Umbraco.Cms.Web.Website" version="[11.0.0,12]" />
31-
<PackageReference Include="Umbraco.Cms.Web.BackOffice" version="[11.0.0,12]" />
32-
<PackageReference Include="Umbraco.Forms" version="[11.0.0,12]" />
33-
<PackageReference Include="Umbraco.Forms.Core" version="[11.0.0,12]" />
22+
<ItemGroup>
23+
<!--<PackageReference Include="Umbraco.Cms.Web.Website" version="[13.0.0,14)" />
24+
<PackageReference Include="Umbraco.Cms.Web.BackOffice" version="[13.0.0,14)" />
25+
<PackageReference Include="Umbraco.Forms" version="[13.0.0,14)" />
26+
<PackageReference Include="Umbraco.Forms.Core" version="[13.0.0,14)" />-->
27+
<PackageReference Include="Umbraco.Cms.Web.Website" version="13.0.0-rc1" />
28+
<PackageReference Include="Umbraco.Cms.Web.BackOffice" version="13.0.0-rc1" />
29+
<PackageReference Include="Umbraco.Forms" version="13.0.0-rc1" />
30+
<PackageReference Include="Umbraco.Forms.Core" version="13.0.0-rc1" />
3431
</ItemGroup>
3532

3633
<ItemGroup>

0 commit comments

Comments
 (0)