Skip to content

Commit 0c7660b

Browse files
authored
Merge pull request #11 from umbraco/feature/zapier-v9
Zapier Forms integration migration to V9 with testsite.
2 parents b2ad5b5 + 57c6a1e commit 0c7660b

17 files changed

+1021
-44
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System.Collections.Specialized;
2+
3+
namespace Umbraco.Forms.Integrations.Automation.Zapier.Configuration
4+
{
5+
public class ZapierSettings
6+
{
7+
public ZapierSettings()
8+
{
9+
10+
}
11+
12+
public ZapierSettings(NameValueCollection appSettings)
13+
{
14+
UserGroup = appSettings[Constants.UmbracoFormsIntegrationsAutomationZapierUserGroup];
15+
}
16+
17+
public string UserGroup { get; set; }
18+
}
19+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+

2+
namespace Umbraco.Forms.Integrations.Automation.Zapier
3+
{
4+
public class Constants
5+
{
6+
public const string UmbracoFormsIntegrationsAutomationZapierUserGroup = "Umbraco.Forms.Integrations.Automation.Zapier.UserGroup";
7+
8+
public static class Configuration
9+
{
10+
public const string Settings = "Umbraco:Forms:Integrations:Automation:Zapier:Settings";
11+
}
12+
}
13+
}

src/Umbraco.Forms.Integrations.Automation.Zapier/Controllers/AuthController.cs

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,67 @@
11
using System.Configuration;
22
using System.Linq;
3+
using System.Threading.Tasks;
4+
using Umbraco.Forms.Integrations.Automation.Zapier.Configuration;
5+
using Umbraco.Forms.Integrations.Automation.Zapier.Models;
6+
7+
8+
#if NETCOREAPP
9+
using Microsoft.AspNetCore.Mvc;
10+
using Microsoft.Extensions.Options;
11+
using Umbraco.Cms.Web.Common.Controllers;
12+
using Umbraco.Cms.Core.Security;
13+
using Umbraco.Cms.Core.Services;
14+
#else
315
using System.Web.Http;
416

5-
using Umbraco.Core.Services;
6-
using Umbraco.Forms.Integrations.Automation.Zapier.Models;
717
using Umbraco.Web.WebApi;
18+
using Umbraco.Core.Services;
19+
#endif
820

921
namespace Umbraco.Forms.Integrations.Automation.Zapier.Controllers
1022
{
1123
public class AuthController : UmbracoApiController
1224
{
13-
private const string UmbracoCmsIntegrationsAutomationZapierUserGroup = "Umbraco.Cms.Integrations.Automation.Zapier.UserGroup";
25+
private readonly ZapierSettings Options;
26+
27+
private readonly IUserService _userService;
28+
29+
#if NETCOREAPP
30+
private readonly IBackOfficeUserManager _backOfficeUserManager;
31+
32+
public AuthController(IBackOfficeUserManager backOfficeUserManager, IUserService userService, IOptions<ZapierSettings> options)
33+
{
34+
_backOfficeUserManager = backOfficeUserManager;
35+
36+
_userService = userService;
37+
38+
Options = options.Value;
39+
}
40+
#else
41+
public AuthController(IUserService userService)
42+
{
43+
Options = new ZapierSettings(ConfigurationManager.AppSettings);
44+
45+
_userService = userService;
46+
}
47+
#endif
1448

1549
[HttpPost]
16-
public bool ValidateUser([FromBody] UserModel userModel)
50+
public async Task<bool> ValidateUser([FromBody] UserModel userModel)
1751
{
52+
#if NETCOREAPP
53+
var isUserValid =
54+
await _backOfficeUserManager.ValidateCredentialsAsync(userModel.Username, userModel.Password);
55+
#else
1856
var isUserValid = Security.ValidateBackOfficeCredentials(userModel.Username, userModel.Password);
57+
#endif
58+
1959
if (!isUserValid) return false;
2060

21-
var userGroup = ConfigurationManager.AppSettings[UmbracoCmsIntegrationsAutomationZapierUserGroup];
61+
var userGroup = Options.UserGroup;
2262
if (!string.IsNullOrEmpty(userGroup))
2363
{
24-
IUserService userService = Services.UserService;
25-
26-
var user = userService.GetByUsername(userModel.Username);
64+
var user = _userService.GetByUsername(userModel.Username);
2765

2866
return user != null && user.Groups.Any(p => p.Name == userGroup);
2967
}

src/Umbraco.Forms.Integrations.Automation.Zapier/Services/FieldMappingBuilder.cs

Lines changed: 58 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,25 @@
44

55
using Newtonsoft.Json;
66

7-
using Umbraco.Core.Models.PublishedContent;
7+
88
using Umbraco.Forms.Core;
9+
using Umbraco.Forms.Core.Models;
10+
using Umbraco.Forms.Core.Persistence.Dtos;
911
using Umbraco.Forms.Core.Providers.Models;
12+
13+
#if NETCOREAPP
14+
using Umbraco.Cms.Core.Models.PublishedContent;
15+
using Umbraco.Cms.Core.Web;
16+
using Umbraco.Cms.Web.Common.UmbracoContext;
17+
using Umbraco.Cms.Core.Routing;
18+
using Umbraco.Cms.Web.Common;
19+
using Umbraco.Extensions;
20+
using Umbraco.Cms.Core;
21+
#else
1022
using Umbraco.Web;
23+
using Umbraco.Forms.Core.Providers.Models;
24+
using Umbraco.Core.Models.PublishedContent;
25+
#endif
1126

1227
namespace Umbraco.Forms.Integrations.Automation.Zapier.Services
1328
{
@@ -18,6 +33,22 @@ public class FieldMappingBuilder: IFieldMappingBuilder
1833
{
1934
private readonly Dictionary<string, string> _content;
2035

36+
37+
38+
#if NETCOREAPP
39+
private readonly IUmbracoHelperAccessor _umbracoHelperAccessor;
40+
41+
private readonly IPublishedUrlProvider _publishedUrlProvider;
42+
43+
public FieldMappingBuilder(IUmbracoHelperAccessor umbracoHelperAccessor, IPublishedUrlProvider publishedUrlProvider)
44+
{
45+
_umbracoHelperAccessor = umbracoHelperAccessor;
46+
47+
_publishedUrlProvider = publishedUrlProvider;
48+
49+
_content = new Dictionary<string, string>();
50+
}
51+
#else
2152
private readonly IUmbracoContextAccessor _umbracoContextAccessor;
2253

2354
public FieldMappingBuilder(IUmbracoContextAccessor umbracoContextAccessor)
@@ -27,20 +58,23 @@ public FieldMappingBuilder(IUmbracoContextAccessor umbracoContextAccessor)
2758
_content = new Dictionary<string, string>();
2859
}
2960

61+
#endif
62+
63+
3064
/// <summary>
3165
/// Add form fields to the request content sent to Zapier. If no propery is mapped, all fields will be included by their alias.
3266
/// </summary>
3367
/// <param name="mappings">Serialized details of the form fields</param>
3468
/// <param name="e">Form record details</param>
3569
/// <returns></returns>
36-
public IFieldMappingBuilder IncludeFieldsMappings(string mappings, RecordEventArgs e)
70+
public IFieldMappingBuilder IncludeFieldsMappings(string mappings, Record record)
3771
{
3872
var mappingsList = JsonConvert.DeserializeObject<List<FieldMapping>>(mappings);
3973
if (mappingsList.Any())
4074
{
4175
foreach (var mapping in mappingsList)
4276
{
43-
var fieldRecord = !string.IsNullOrEmpty(mapping.Value) ? e.Record.RecordFields[Guid.Parse(mapping.Value)] : null;
77+
var fieldRecord = !string.IsNullOrEmpty(mapping.Value) ? record.RecordFields[Guid.Parse(mapping.Value)] : null;
4478

4579
_content.Add(mapping.Alias,
4680
fieldRecord != null
@@ -51,7 +85,7 @@ public IFieldMappingBuilder IncludeFieldsMappings(string mappings, RecordEventAr
5185
}
5286
else
5387
{
54-
foreach (var recordField in e.Record.RecordFields)
88+
foreach (var recordField in record.RecordFields)
5589
{
5690
_content.Add(recordField.Value.Alias, recordField.Value.ValuesAsString());
5791
}
@@ -60,13 +94,15 @@ public IFieldMappingBuilder IncludeFieldsMappings(string mappings, RecordEventAr
6094
return this;
6195
}
6296

97+
private readonly IUmbracoContextFactory _umbracoContextFactory;
98+
6399
/// <summary>
64100
/// Add form standard fields - that are set as Included in the settings of the workflow - to the request content sent to Zapier.
65101
/// </summary>
66102
/// <param name="mappings">Serialized details of the form standard fields</param>
67103
/// <param name="e">Form record details</param>
68104
/// <returns></returns>
69-
public IFieldMappingBuilder IncludeStandardFieldsMappings(string mappings, RecordEventArgs e)
105+
public IFieldMappingBuilder IncludeStandardFieldsMappings(string mappings, Record record, Form form)
70106
{
71107
if (!string.IsNullOrEmpty(mappings))
72108
{
@@ -78,18 +114,30 @@ public IFieldMappingBuilder IncludeStandardFieldsMappings(string mappings, Recor
78114
switch (fieldMapping.Field)
79115
{
80116
case StandardField.FormId:
81-
_content.Add(fieldMapping.KeyName, e.Form.Id.ToString());
117+
_content.Add(fieldMapping.KeyName, form.Id.ToString());
82118
break;
83119
case StandardField.FormName:
84-
_content.Add(fieldMapping.KeyName, e.Form.Name);
120+
_content.Add(fieldMapping.KeyName, form.Name);
85121
break;
86122
case StandardField.PageUrl:
123+
#if NETCOREAPP
124+
if (_umbracoHelperAccessor.TryGetUmbracoHelper(out UmbracoHelper umbracoHelper))
125+
{
126+
IPublishedContent publishedContent = umbracoHelper.Content(record.UmbracoPageId);
127+
if (publishedContent != null)
128+
{
129+
var pageUrl = publishedContent.Url(_publishedUrlProvider, mode: UrlMode.Absolute);
130+
_content.Add(fieldMapping.KeyName, pageUrl);
131+
}
132+
}
133+
#else
87134
UmbracoContext umbracoContext = _umbracoContextAccessor.UmbracoContext;
88-
var pageUrl = umbracoContext.UrlProvider.GetUrl(e.Record.UmbracoPageId, UrlMode.Absolute);
135+
var pageUrl = umbracoContext.UrlProvider.GetUrl(record.UmbracoPageId, UrlMode.Absolute);
89136
_content.Add(fieldMapping.KeyName, pageUrl);
90-
break;
137+
#endif
138+
break;
91139
case StandardField.SubmissionDate:
92-
_content.Add(fieldMapping.KeyName, e.Record.Created.ToString());
140+
_content.Add(fieldMapping.KeyName, record.Created.ToString());
93141
break;
94142
default:
95143
throw new InvalidOperationException(

src/Umbraco.Forms.Integrations.Automation.Zapier/Services/IFieldMappingBuilder.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
using System.Collections.Generic;
22

3-
using Umbraco.Forms.Core;
3+
using Umbraco.Forms.Core.Models;
4+
using Umbraco.Forms.Core.Persistence.Dtos;
45

56
namespace Umbraco.Forms.Integrations.Automation.Zapier.Services
67
{
78
public interface IFieldMappingBuilder
89
{
9-
IFieldMappingBuilder IncludeFieldsMappings(string mappings, RecordEventArgs e);
10+
IFieldMappingBuilder IncludeFieldsMappings(string mappings, Record record);
1011

11-
IFieldMappingBuilder IncludeStandardFieldsMappings(string mappings, RecordEventArgs e);
12+
IFieldMappingBuilder IncludeStandardFieldsMappings(string mappings, Record record, Form form);
1213

1314
Dictionary<string, string> Map();
1415
}
Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

3-
<PropertyGroup>
4-
<TargetFramework>net472</TargetFramework>
5-
</PropertyGroup>
3+
<PropertyGroup>
4+
<TargetFrameworks>net472;net50</TargetFrameworks>
5+
</PropertyGroup>
66

77
<PropertyGroup>
88
<PackageId>Umbraco.Forms.Integrations.Automation.Zapier</PackageId>
@@ -16,14 +16,22 @@
1616
<Company>Umbraco</Company>
1717
</PropertyGroup>
1818

19-
<ItemGroup>
20-
<PackageReference Include="UmbracoCms.Web" Version="8.1.0" />
21-
<PackageReference Include="UmbracoCms.Core" Version="8.1.0" />
22-
<PackageReference Include="UmbracoForms.Core" Version="8.9.1" />
23-
</ItemGroup>
19+
<ItemGroup Condition="'$(TargetFramework)' == 'net472'">
20+
<PackageReference Include="UmbracoCms.Web" Version="8.1.0" />
21+
<PackageReference Include="UmbracoCms.Core" Version="8.1.0" />
22+
<PackageReference Include="UmbracoForms.Core" Version="8.9.1" />
23+
</ItemGroup>
24+
25+
<ItemGroup Condition="'$(TargetFramework)' == 'net50'">
26+
<PackageReference Include="Umbraco.Cms.Web.Website" version="9.0.1" />
27+
<PackageReference Include="Umbraco.Cms.Web.BackOffice" version="9.0.1" />
28+
<PackageReference Include="Umbraco.Forms.Core.Providers" version="9.1.0" />
29+
</ItemGroup>
2430

25-
<ItemGroup>
26-
<Folder Include="App_Plugins\UmbracoForms.Integrations\Automation\Zapier\" />
27-
</ItemGroup>
31+
<Target Name="RemoveLuceneAnalyzer" BeforeTargets="CoreCompile">
32+
<ItemGroup>
33+
<Analyzer Remove="@(Analyzer)" Condition="%(FileName) == 'Lucene.Net.CodeAnalysis.CSharp'" />
34+
</ItemGroup>
35+
</Target>
2836

2937
</Project>
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
#if NETCOREAPP
2+
using Microsoft.Extensions.DependencyInjection;
3+
4+
using Umbraco.Cms.Core.Composing;
5+
using Umbraco.Cms.Core.DependencyInjection;
6+
using Umbraco.Forms.Core.Providers;
7+
using Umbraco.Forms.Integrations.Automation.Zapier.Configuration;
8+
#else
9+
using Umbraco.Core.Composing;
10+
#endif
11+
12+
namespace Umbraco.Forms.Integrations.Automation.Zapier
13+
{
14+
public class ZapierComposer : IComposer
15+
{
16+
#if NETCOREAPP
17+
public void Compose(IUmbracoBuilder builder)
18+
{
19+
var options = builder.Services
20+
.AddOptions<ZapierSettings>()
21+
.Bind(builder.Config.GetSection(Constants.Configuration.Settings));
22+
23+
builder.WithCollectionBuilder<WorkflowCollectionBuilder>().Add<ZapierWorkflow>();
24+
}
25+
#else
26+
public void Compose(Composition composition)
27+
{
28+
29+
}
30+
#endif
31+
}
32+
}

0 commit comments

Comments
 (0)